diff --git a/CONTRIB.en.md b/CONTRIB.en.md
new file mode 100644
index 0000000000000000000000000000000000000000..634253fd687291484ca7470433ad0d2b1e304e55
--- /dev/null
+++ b/CONTRIB.en.md
@@ -0,0 +1,175 @@
+# Contribute to source code
+
+## Content
+* [Prerequisite](#Prerequisite)
+* [Create your own copy of the project](#Create-your-own-copy-of-the-project)
+* [How to contribute to the source code](#How-to-contribute-to-the source-code)
+* [Create a new skin](#Create-a-new-skin)
+
+## Prerequisite
+
+AFI & BIBLIBRE developpment teams use the opensource [forge](https://fr.wikipedia.org/wiki/Forge_%28informatique%29) libre [GitLab](https://www.gitlab.com) and the[SCM](https://fr.wikipedia.org/wiki/Gestion_de_versions) [Git](http://www.git-scm.com). Ce document décrit l'utilisation minimale nécessaire de ces deux outils pour pouvoir contribuer au code des projets maintenus par AFI et Biblibre. Néanmoins nous vous invitons à lire le livre [Pro Git](http://git-scm.com/book/fr).
+
+Source code are hosted on https://git.afi-sa.fr. Public projects are accessible here https://git.afi-sa.fr/public.
+
+
+## Create your own copy of the project
+
+### Create a gitlab account
+
+From the [Sign Up](http://git.afi-sa.fr/users/sign_up) page, you can create your account.  You will receive a confirmation email. 
+
+
+### Clone the project
+
+Once connected, from the [OPACCE project page](http://git.afi-sa.fr/afi/opacce), clic on the **Fork repository** button. You can also clone the project  [here](http://git.afi-sa.fr/afi/opacce/fork).
+
+This will create your own public copy of the project accessible through http://git.afi-sa.fr/my-account/opacce.
+
+
+The SSH access is given from your project home page. for example git@git.afi-sa.fr:my_account/opacce.git
+
+
+### Installing SSH access
+
+In order to upload modifications on the gitlab you need SSH access.  On  [Your account page](http://git.afi-sa.fr/profile), in the [SSH Keys](http://git.afi-sa.fr/profile/keys) tab, use the link [Add SSH Key](http://git.afi-sa.fr/profile/keys/new).
+
+#### Create & register your key
+
+If you already have a key on your workstation in  **~/.ssh/id_rsa.pub**, copy it.
+
+otherwise, [ generate a key ](http://git.afi-sa.fr/help/ssh), with the following command:
+```bash
+ssh-keygen -t rsa -C "addresse_email@domaine.ext"
+```
+
+to show the content:
+```bash
+cat ~/.ssh/id_rsa.pub
+```
+
+#### configure SSH access
+
+SS access uses  **2950** port. Create or modify the **~/.ssh/config** file to add the following lines:
+```
+Host git.afi-sa.fr
+  Hostname git.afi-sa.fr
+  Port 2950
+  User git
+  IdentityFile ~/.ssh/id_rsa
+
+```
+
+## How to contribute to the source code
+
+### Install your own copy of the project
+
+The install process is described [Installation instructions](INSTALL.en.md), unlike described in the [Downloading source code](INSTALL.en.md#Downloading-source-code) section, you should use your own depository:
+```bash
+cd /var/www
+git clone git@git.afi-sa.fr:mon_compte/opacce.git
+```
+
+### Update files and push them to  gitlab
+
+Once  your done with your udpates, the file upload is done in two steps.
+
+1. Commit your modifications locally
+```bash
+git commit -a -m "Commentaires des modifications"
+```
+
+2. Push your master branch to gitlab (origin):
+```bash
+git push origin master
+```
+
+For more details please check [Pro Git](http://git-scm.com/book/fr)
+
+
+### Propose patches to the release team
+
+On your private GitLab page, **Merge Requests** tab, clic on the link **+ New Merge Request** and fill the form to describe your patch. 
+
+
+### retrieve the last official release
+
+Declate the official version depository (upstream) in your local project:
+```bash
+git remote add upstream git@git.afi-sa.fr:afi/opacce.git
+```
+
+Merge modifications:
+
+```bash
+# Download all modification from the master project
+git fetch upstream master
+# Merge the modifications in your local project
+git merge upstream/master
+# Push the result on the depository
+git push origin master
+```
+
+
+
+## Create a new skin
+
+### Create
+
+Go to the skin directory in the root folder and duplicate it
+
+```bash
+cd skins
+cp -a ../public/opac/skins/modele mon_skin
+```
+
+Go the the profil config page in the opac back office, you should see your skin in the combo.
+
+
+### Save you skin on GitLab
+
+Create a project on [GitLab](https://git.afi-sa.fr) to store the sourcecode. For exemple https://git.afi-sa.fr/mon_compte/mon_skin.
+
+Go to my_skin and initialise the depository:
+
+```bash
+cd mon_skin
+git init
+git remote add origin -t master git@git.afi-sa.fr:mon_compte/mon_skin.git
+git add *
+git commit -m "Premier commit"
+git push origin master
+```
+
+Now, new files should be acessible from  https://git.afi-sa.fr/mon_compte/mon_skin/files
+
+
+### Folder description
+
+* **css/** contains the global.css file where to work. Other files are deprecated.
+* **images/** icons **images/support/** for doc types. Files must be named: **support_id_.png**, for exemple **support_1.png** for books.
+* **templates/** Box template on the home page. Files must be named with **_**, the liste will appear in the combo **Box style**. Every template can include tags **{TITRE}**, **{RSS}**, **{CONTENU}**. Pour avoir un rendu conditionnel, le fichier peut inclure les conditions **{IF-TITRE}**, **{IF-RSS}**, **{IF-CONTENU}** suivi de la balise **{ENDIF}**
+
+```html
+<div class="right-box">
+	<div class="right-box-inner">
+		{IF-TITRE}
+		<div class="header">
+			<div><h1>{TITRE}</h1></div>
+			<div class="rss">{RSS}</div>
+		</div>
+		{ENDIF}
+		<div class="content">
+			{CONTENU}
+		</div>
+	</div>
+</div>
+```
+
+
+All files can be renamed in **application/modules/opac/views/scripts** . main files are:
+* **footer.phtml** pour le pied de page
+* **banniere.phtml** pour l'en-tête
+* **skin_head.phtml** pour rajouter des éléments dans la balise **head** du site
+* **accueil.phtml** pour la page d'accueil
+* **contenu.phtml** pour les autres pages
\ No newline at end of file
diff --git a/CONTRIB.fr.md b/CONTRIB.fr.md
index 2e858475f8f47b15ab7ea0a2bddb1c815945f9ad..635adde00d7d68bf3ab7cfc458fad9c2e4bf7e89 100644
--- a/CONTRIB.fr.md
+++ b/CONTRIB.fr.md
@@ -64,7 +64,7 @@ Host git.afi-sa.fr
 
 ### Installer sa copie de l'OPAC
 
-L'installation se déroule comme décrit [dans la procédure d'installation](INSTALL.md), excepté que la commande pour cloner le projet décrite dans la section [Récupération des sources](INSTALL.md#Récupération-des-sources) utilise votre propre dépôt:
+L'installation se déroule comme décrit [dans la procédure d'installation](INSTALL.fr.md), excepté que la commande pour cloner le projet décrite dans la section [Récupération des sources](INSTALL.md#Récupération-des-sources) utilise votre propre dépôt:
 ```bash
 cd /var/www
 git clone git@git.afi-sa.fr:mon_compte/opacce.git
diff --git a/INSTALL.en.md b/INSTALL.en.md
new file mode 100644
index 0000000000000000000000000000000000000000..9cfdb1b6a3f1edd030bbe0368cb535ea4d7fe457
--- /dev/null
+++ b/INSTALL.en.md
@@ -0,0 +1,179 @@
+This procedure is meant for Ubuntu et Debian GNU/Linux 
+
+
+# Necessary packages :
+
+##  Ubuntu
+Requirements: Bokeh needs PHP 5.4 which is not present by default in ubuntu. Repository must be declared below with the last version of php:
+
+```
+apt-get install python-software-properties
+add-apt-repository ppa:ondrej/php5
+apt-get update
+apt-get install php5 php5-gd php5-imagick php5-xdebug php-pear php5-mysql php5-xhprof graphviz apache2 mysql-server libapache2-mod-php5 subversion php5-mcrypt
+```
+
+## Debian
+```
+apt-get install php5 php5-gd php5-imagick php5-xdebug php-pear php5-mysql php5-xhprof graphviz apache2 mysql-server libapache2-mod-php5 subversion php5-mcrypt
+```		
+
+## ArchLinux
+```
+yaourt -S php php-gd php-imagick xdebug php-pear apache mysql php-apache php-xhprof graphviz subversion
+```
+
+## CentOS
+```
+rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
+yum install php54w php54w-gd php54w-pear php54w-mysql php54w-pecl-xdebug php54w-xml php54w-soap php54w-mbstring
+```
+
+You need to build Imagick extension from scratch
+
+
+# Install PHPUnit (Account root / sudo):
+
+```
+  cd /usr/local/bin
+  wget https://phar.phpunit.de/phpunit.phar
+  mv phpunit.phar phpunit
+```
+
+# Downloading source code
+```
+cd /var/www
+git clone http://git.afi-sa.fr/afi/opacce.git opacce
+```
+
+Launch update.sh script
+
+```
+cd opacce
+./update.sh
+```
+
+
+
+#  Apache / PHP Configuration:
+
+## Activate the following modules :
+
+### Debian
+```
+a2enmod headers rewrite php5
+```
+### ArchLinux:
+
+Modify /etc/httpd/conf/http.conf and add the line: 
+
+```
+LoadModule php5_module modules/libphp5.so
+```
+
+Deactivate negotiation module which is in conflict with Zend Framework on index/index urls:
+
+```  
+a2dismod negotiation
+```
+
+## Configure PHP
+
+In /etc/php5/apache2/php.ini (ArchLinux: /etc/php/php.ini), configure the following variables:
+```
+post_max_size = 10M
+upload_max_filesize = 10M
+error_reporting  =  E_ALL & ~E_NOTICE & ~E_DEPRECATED
+```
+
+Activate the following extensions: calendar, curl, gd, gettext, iconv, mcrypt, mysql, pdo_mysql, openssl, soap, imagick
+
+
+## Configure Apache
+
+In Apache conf, delete indexes option (file list) and authorise .htaccess: 
+
+```
+<Directory /var/www/>
+  Options FollowSymLinks
+  AllowOverride All
+  Order allow,deny
+  Allow from all
+</Directory>
+```
+
+Warning: For apache 2.4
+
+```
+<Directory /var/www/>
+  Options FollowSymLinks
+  AllowOverride All
+  Require all granted
+</Directory>
+```
+
+
+# User rights on temp folder
+
+```
+chmod -R 777 opacce/temp
+```
+  
+# MySQL config
+  
+Modifier /etc/mysql/my.cnf et ajouter dans la section et forcer l'indexation fulltext à partir de 1 lettre dans la section [mysqld]
+
+```
+ft_min_word_len = 1
+```
+Restart mysql.
+
+
+Warning: If you have encoding problems, in Cosmogramme, you can force UTF8 like this:
+
+```
+skip-character-set-client-handshake
+character-set-server=utf8
+```
+
+Connect to mysql and import the db schema
+
+```
+mysql -uroot -ppass
+mysql> create database opac;
+mysql> connect opac;
+mysql> source opacce/scripts/opac2.sql;
+```
+
+#  OPAC Config
+  
+In the opacce directory, copy and configure
+
+```
+cp config.ini.default config.ini
+touch local.php
+```
+
+#  Cosmogramme Config
+  
+ In the cosmogramme folder, copy and configure
+
+```
+cp config.ref.php config.php 
+```
+
+  go to http://localhost/opacce/cosmogramme
+
+ connnect with the account admin/achanger and click on the patch update link
+
+
+# connect to the opac
+  
+  Use the account compte admin/achanger
+go to http://localhost/opacce/admin
+
+# TO run the tests:
+```
+cd opacce/tests/
+phpunit
+```
\ No newline at end of file
diff --git a/INSTALL.md b/INSTALL.fr.md
similarity index 100%
rename from INSTALL.md
rename to INSTALL.fr.md
diff --git a/VERSIONS b/VERSIONS
index 2707d2864ae75ae47ad17d1f39399ae2136e4b5e..9f681cd256bee9e70c7355f780954bb4ca9f6382 100644
--- a/VERSIONS
+++ b/VERSIONS
@@ -1,3 +1,91 @@
+14/10/2014 - v6.54.2
+
+- ticket #16765: Performance des Kiosque: la requête SQL qui récupère les identifiants de notices ne génère plus de table temporaire
+
+
+13/10/2014 - v6.54.1
+
+- ticket #16171: Cosmogramme : ajout d'un captage de perte de connection mysql et reconnection si l'homogénéisation Z39.50 est trop longue lors des traitements d'intégration.
+
+- ticket #16822: modification de la couche Zend Framework pour passer l'option de conversion native des int et float php pour conserver l'homogénéité des resultats entre requêtes préparées et non préparées. ATTENTION : ceci nécessite l'utilisation de la librairie mysqlnd au lieu de libmysqlclient.
+
+
+13/10/2014 - v6.54.0
+
+- ticket #16320: Boîte calendrier /affichage du calendrier: ajout d'un nouveau paramètre permettant de d'activer ou de désactiver la redirection vers la les listes d'articles. La désactivation du paramètre vous permet de rester sur la page courante lors des clics sur les jours ou le mois affiché.
+
+- ticket #16260: authentification Lectura
+
+- ticket #14008: ajout de la variable TEXT_REPLACEMENTS qui permet de définir des remplacements de textes globalement dans Bokeh. Par exemple, si on veut changer le terme "panier" par "sélection", on peut définir les remplacements comme suit:
+
+					aucun panier;aucune sélection
+					du panier;de la sélection
+					panier;sélection
+
+-ticket #15962: Résultat de recherche: le libelle de la boîte nuage de tag se met correctement à jour avec la configuration de la boîte
+
+
+06/10/2014 - v6.53.4
+
+- ticket #16628: Cosmogramme : Correction de la perte des centres d'intérêt lors de la mise à jour des notices
+
+- ticket #166171: Amélioration des performances des intégrations Cosmogramme. Diminution globale du nombre de requêtes SQL.
+
+
+02/10/2014 - v6.53.2
+
+- ticket #16667: Mise à jour des fichiers de traduction et ajout de la langue "es"
+
+- ticket #16456: Les webthumbnails sont récupérés de manière asynchrone pour éviter un timeout lors d'une recherche.
+
+
+30/09/2014 - v6.53.1
+
+- correction compatiblité PHP5.4
+
+
+29/09/2014 - v6.53.0
+
+- ticket #15884: Boite article ou calendrier nouveau mode d'affichage 'diaporama avec navigation':
+    - ajout d'un nouveau mode de bouton: miniature
+    - ajout de l'option défilement automatique en millisecondes
+
+- ticket #14885: Le message de confirmation ou d'erreur après prolongation dans l'espace abonné est désormais une popup modale pour être plus visible.
+
+- ticket #14409: Boîte calendrier: le calendrier peut être filtré par mois, lieu et champs personnalisés.
+
+- ticket #12996: Champs personnalisés : nouveau type de champ 'Zone de texte HTML'
+
+- ticket #16434: Prefix l'identifiant css des zones d'edition utilisant CKEditor avec 'cke-' pour éviter des conflits CSS avec les skins personnalisés.
+
+- ticket #16358: correction du processus de mise à jour des notices dans cosmogramme
+
+
+
+25/09/2014 - v6.52.6
+
+- ticket #16463: Correction d'un bug dans la génération des flux RSS lorsque le titre contient des balises HTML ou des caractères spéciaux (<, &, ...)
+
+- ticket #16319: la boîte bibliothèque numérique affiche les albums dans l'ordre des titres
+
+
+20/09/2014 - v6.52.5
+
+- ticket #14149: Cosmogramme / Aloes: ajout d'une option pour ne pas envoyer le code annexe pour la réservation des exemplaires. Ce qui permet de contourner le bug du web service Aloes qui gère mal l'option site de retrait = site de l'abonné.
+
+- ticket #16344: Activation de la coloration syntaxique dans l'éditeur CSS.
+
+- ticket #16117: Suppressions du paramètre "titre" du kiosque (inutilisés) dans les liens notices des kiosques qui pouvaient provoquer une erreur si Apache n'est pas pas configuré avec "AllowEncodedSlashes=On" et que le titre du kiosque contient un caractère / encodé en %2F
+
+- ticket #16016: Correction accès bibliothèque numérique cyberlibris sur tablette Android: correction affichage erreurs 404.
+
+
+17/09/2014 - v6.52.4
+
+- ticket #16241: correction régression de la duplication d'un article
+- ticket #15762: correction de l'import de notices marc21
+
+
 15/09/2014 - v6.52.0
 
 - ticket #15526: Changement du nom de la variable GOOGLE_ANALYTICS en JS_STAT et correction de la description
@@ -17,8 +105,6 @@
 
 - ticket #16118: Sur une sous-page d'un profil smartphone, le bouton accueil redirige vers le profil parent
 
-- ticket #16016: Correction accès bibliothèque numérique cyberlibris sur tablette Android. Correction affichage erreurs 404.
-
 - ticket #16112: Lorsqu'on accède à un profil privé et qu'on se retrouve sur la page d'authentification, une fois connecté on est redirigé sur la page d'accueil de ce profil et non plus l'interface d'administration
 
 - ticket #15969: Quand l'utilisateur se trouve sur une sous-page d'un profil, le lien du bandeau pointe sur la page d'accueil du profil parent et non la sous-page
@@ -149,13 +235,13 @@
 - ticket #12992: Champs personnalisés
   - L'objectif de ce développement est de pouvoir rajouter des champs aux modèles de données de l'OPAC.
   - Côté accès pro., une nouvelle entrée "Champs personnalisés" dans le bloc "Système" permet d'ajouter des champs pour les formations, articles et groupes d'utilisateurs (d'autres données suivront par la suite).
-  - La documentation est disponible sur le mediawiki de Bokeh http://mediawiki.afi-sa.fr/index.php?title=Gestion_des_champs_personnalis%C3%A9s
+  - La documentation est disponible sur le mediawiki de Bokeh http://wiki.bokeh-library-portal.org/index.php/Gestion_des_champs_personnalis%C3%A9s
 
 - ticket #15273: Rapports statistiques
   - L'objectif de ce développement est de pouvoir générer des rapports sur les champs personnalisés.
   - Côté accès pro., une nouvelle entrée "Rapports statitiques" dans le menu "Système" à fait son aparition.
   - La collecte des données du rapport doivent pour l'instant être écrite en language javascript, des connaissances techniques sont donc requises
-  - La documentation est disponible sur le mediawiki de Bokeh http://mediawiki.afi-sa.fr/index.php?title=Rapports_statistiques
+  - La documentation est disponible sur le mediawiki de Bokeh http://wiki.bokeh-library-portal.org/index.php/Rapports_statistiques
 
 
 
diff --git a/amber/afi/js/AFI-OPAC.deploy.js b/amber/afi/js/AFI-OPAC.deploy.js
index 8efd5b0989861a5396a95085b2a3288477b41062..15d163c86314ae0e76ef5534ee92ebceea2c74e5 100755
--- a/amber/afi/js/AFI-OPAC.deploy.js
+++ b/amber/afi/js/AFI-OPAC.deploy.js
@@ -221,11 +221,14 @@ smalltalk.method({
 selector: "setEditorOn:",
 fn: function (aTextarea){
 var self=this;
-var params=nil;
-(params=smalltalk.HashedCollection._fromPairs_([smalltalk.send("theme", "__minus_gt", ["jtalk"]),smalltalk.send("lineNumbers", "__minus_gt", [true]),smalltalk.send("enterMode", "__minus_gt", ["flat"]),smalltalk.send("matchBrackets", "__minus_gt", [true]),smalltalk.send("electricChars", "__minus_gt", [false]),smalltalk.send("onChange", "__minus_gt", [(function(editor, data){return smalltalk.send(self, "_editorChanged", []);})])]));
-self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);
-	 console.log(params);
-return self;}
+var params;
+params=smalltalk.HashedCollection._fromPairs_([smalltalk.send("mode","__minus_gt",["css"]),smalltalk.send("lineNumbers","__minus_gt",[true]),smalltalk.send("enterMode","__minus_gt",["flat"]),smalltalk.send("matchBrackets","__minus_gt",[true]),smalltalk.send("electricChars","__minus_gt",[false])]);
+self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);;
+;
+smalltalk.send(self["@editor"],"_on_do_",["change",(function(){
+return smalltalk.send(self,"_editorChanged",[]);
+})]);
+return self}
 }),
 smalltalk.AFISourceArea);
 
diff --git a/amber/afi/js/AFI-OPAC.js b/amber/afi/js/AFI-OPAC.js
index f9f9358eb6dce556aaa2755cc8b46e47521a5e23..83e67fedddcc23d86697ca4f793cd42114fb4a31 100755
--- a/amber/afi/js/AFI-OPAC.js
+++ b/amber/afi/js/AFI-OPAC.js
@@ -307,14 +307,17 @@ selector: "setEditorOn:",
 category: 'not yet classified',
 fn: function (aTextarea){
 var self=this;
-var params=nil;
-(params=smalltalk.HashedCollection._fromPairs_([smalltalk.send("theme", "__minus_gt", ["jtalk"]),smalltalk.send("lineNumbers", "__minus_gt", [true]),smalltalk.send("enterMode", "__minus_gt", ["flat"]),smalltalk.send("matchBrackets", "__minus_gt", [true]),smalltalk.send("electricChars", "__minus_gt", [false]),smalltalk.send("onChange", "__minus_gt", [(function(editor, data){return smalltalk.send(self, "_editorChanged", []);})])]));
-self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);
-	 console.log(params);
-return self;},
+var params;
+params=smalltalk.HashedCollection._fromPairs_([smalltalk.send("mode","__minus_gt",["css"]),smalltalk.send("lineNumbers","__minus_gt",[true]),smalltalk.send("enterMode","__minus_gt",["flat"]),smalltalk.send("matchBrackets","__minus_gt",[true]),smalltalk.send("electricChars","__minus_gt",[false])]);
+self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);;
+;
+smalltalk.send(self["@editor"],"_on_do_",["change",(function(){
+return smalltalk.send(self,"_editorChanged",[]);
+})]);
+return self},
 args: ["aTextarea"],
-source: "setEditorOn: aTextarea\x0a\x09|params|\x0a\x09params := #{ 'theme' -> 'jtalk'.\x0a                \x09\x09'lineNumbers' -> true.\x0a                \x09\x09'enterMode' -> 'flat'.\x0a                \x09\x09'matchBrackets' -> true.\x0a                \x09\x09'electricChars' -> false.\x0a\x09\x09\x09\x09'onChange' -> [:editor :data | self editorChanged]\x09}.\x0a\x0a\x09<self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);\x0a\x09 console.log(params)>",
-messageSends: ["->", "editorChanged"],
+source: "setEditorOn: aTextarea\x0a\x09|params|\x0a\x09params := #{\x0a    \x09\x09\x09\x09\x09'mode' -> 'css'.\x0a                \x09\x09'lineNumbers' -> true.\x0a                \x09\x09'enterMode' -> 'flat'.\x0a                \x09\x09'matchBrackets' -> true.\x0a                \x09\x09'electricChars' -> false\x09}.\x0a                        \x0a\x09<self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);>.\x0a    editor on: 'change' do: [self editorChanged].",
+messageSends: ["->", "on:do:", "editorChanged"],
 referencedClasses: []
 }),
 smalltalk.AFISourceArea);
diff --git a/amber/afi/st/AFI-OPAC.st b/amber/afi/st/AFI-OPAC.st
index 659ef14636cad211cddd422e8d923f3510699af9..872db47d5a2b4ff93f4158dd6da93b9c3b6ea1b0 100755
--- a/amber/afi/st/AFI-OPAC.st
+++ b/amber/afi/st/AFI-OPAC.st
@@ -128,14 +128,14 @@ onChange: aBlock
 
 setEditorOn: aTextarea
 	|params|
-	params := #{ 'theme' -> 'jtalk'.
+	params := #{
+    					'mode' -> 'css'.
                 		'lineNumbers' -> true.
                 		'enterMode' -> 'flat'.
                 		'matchBrackets' -> true.
-                		'electricChars' -> false.
-				'onChange' -> [:editor :data | self editorChanged]	}.
-
-	<self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);
-	 console.log(params)>
+                		'electricChars' -> false	}.
+                        
+	<self['@editor'] = CodeMirror.fromTextArea(aTextarea,  params);>.
+    editor on: 'change' do: [self editorChanged].
 ! !
 
diff --git a/amber/src/js/amber.js b/amber/src/js/amber.js
index d8d317c74e2af7762e35d2c2ee91defad31e04e0..c28abeaa551fe1e1e64b507ee4127a8be31a54d3 100755
--- a/amber/src/js/amber.js
+++ b/amber/src/js/amber.js
@@ -169,6 +169,7 @@ amber = (function() {
 		addJSToLoad('lib/jQuery/jquery.textarea.js');
 		addJSToLoad('lib/CodeMirror/codemirror.js');
 		addJSToLoad('lib/CodeMirror/smalltalk.js');
+		addJSToLoad('lib/CodeMirror/css.js');
 		loadCSS('lib/CodeMirror/codemirror.css', 'js');
 		loadCSS('lib/CodeMirror/amber.css', 'js');
 	};
diff --git a/amber/src/js/lib/CodeMirror/codemirror.css b/amber/src/js/lib/CodeMirror/codemirror.css
old mode 100755
new mode 100644
index 05ad0ed01321b933705bf0996ae4f5462af516c2..6b9ca0238da6acd1f9614198bc8c733853b53bcd
--- a/amber/src/js/lib/CodeMirror/codemirror.css
+++ b/amber/src/js/lib/CodeMirror/codemirror.css
@@ -1,173 +1,309 @@
+/* BASICS */
+
 .CodeMirror {
-  line-height: 1em;
+  /* Set height, width, borders, and global font properties here */
   font-family: monospace;
+  height: 300px;
+}
+.CodeMirror-scroll {
+  /* Set scrolling behaviour here */
+  overflow: auto;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+  padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+  padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+  border-right: 1px solid #ddd;
+  background-color: #f7f7f7;
+  white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+  padding: 0 3px 0 5px;
+  min-width: 20px;
+  text-align: right;
+  color: #999;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+  border-left: 1px solid black;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+  border-left: 1px solid silver;
+}
+.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
+  width: auto;
+  border: 0;
+  background: #7e7;
+}
+.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursors {
+  z-index: 1;
+}
+
+.cm-animate-fat-cursor {
+  width: auto;
+  border: 0;
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
+@-moz-keyframes blink {
+  0% { background: #7e7; }
+  50% { background: none; }
+  100% { background: #7e7; }
+}
+@-webkit-keyframes blink {
+  0% { background: #7e7; }
+  50% { background: none; }
+  100% { background: #7e7; }
+}
+@keyframes blink {
+  0% { background: #7e7; }
+  50% { background: none; }
+  100% { background: #7e7; }
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+div.CodeMirror-overwrite div.CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; }
+
+.CodeMirror-ruler {
+  border-left: 1px solid #ccc;
+  position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
 
-  /* Necessary so the scrollbar can be absolutely positioned within the wrapper on Lion. */
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+   the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+  line-height: 1;
   position: relative;
-  /* This prevents unwanted scrollbars from showing up on the body and wrapper in IE. */
   overflow: hidden;
+  background: white;
+  color: black;
 }
 
 .CodeMirror-scroll {
-  overflow: auto;
-  height: 300px;
-  /* This is needed to prevent an IE[67] bug where the scrolled content
-     is visible outside of the scrolling box. */
+  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* See overflow: hidden in .CodeMirror */
+  margin-bottom: -30px; margin-right: -30px;
+  padding-bottom: 30px;
+  height: 100%;
+  outline: none; /* Prevent dragging from highlighting the element */
   position: relative;
-  outline: none;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+.CodeMirror-sizer {
+  position: relative;
+  border-right: 30px solid transparent;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
 }
 
-/* Vertical scrollbar */
-.CodeMirror-scrollbar {
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+   before actuall scrolling happens, thus preventing shaking and
+   flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
   position: absolute;
+  z-index: 6;
+  display: none;
+}
+.CodeMirror-vscrollbar {
   right: 0; top: 0;
   overflow-x: hidden;
   overflow-y: scroll;
-  z-index: 5;
-}
-.CodeMirror-scrollbar-inner {
-  /* This needs to have a nonzero width in order for the scrollbar to appear
-     in Firefox and IE9. */
-  width: 1px;
 }
-.CodeMirror-scrollbar.cm-sb-overlap {
-  /* Ensure that the scrollbar appears in Lion, and that it overlaps the content
-     rather than sitting to the right of it. */
-  position: absolute;
-  z-index: 1;
-  float: none;
-  right: 0;
-  min-width: 12px;
+.CodeMirror-hscrollbar {
+  bottom: 0; left: 0;
+  overflow-y: hidden;
+  overflow-x: scroll;
 }
-.CodeMirror-scrollbar.cm-sb-nonoverlap {
-  min-width: 12px;
+.CodeMirror-scrollbar-filler {
+  right: 0; bottom: 0;
 }
-.CodeMirror-scrollbar.cm-sb-ie7 {
-  min-width: 18px;
+.CodeMirror-gutter-filler {
+  left: 0; bottom: 0;
 }
 
-.CodeMirror-gutter {
+.CodeMirror-gutters {
   position: absolute; left: 0; top: 0;
-  z-index: 10;
-  background-color: #f7f7f7;
-  border-right: 1px solid #eee;
-  min-width: 2em;
+  padding-bottom: 30px;
+  z-index: 3;
+}
+.CodeMirror-gutter {
+  white-space: normal;
   height: 100%;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  padding-bottom: 30px;
+  margin-bottom: -32px;
+  display: inline-block;
+  /* Hack to make IE7 behave */
+  *zoom:1;
+  *display:inline;
 }
-.CodeMirror-gutter-text {
-  color: #aaa;
-  text-align: right;
-  padding: .4em .2em .4em .4em;
-  white-space: pre !important;
+.CodeMirror-gutter-elt {
+  position: absolute;
   cursor: default;
+  z-index: 4;
 }
+
 .CodeMirror-lines {
-  padding: .4em;
-  white-space: pre;
   cursor: text;
+  min-height: 1px; /* prevents collapsing before first draw */
 }
-
 .CodeMirror pre {
-  -moz-border-radius: 0;
-  -webkit-border-radius: 0;
-  -o-border-radius: 0;
-  border-radius: 0;
-  border-width: 0; margin: 0; padding: 0; background: transparent;
+  /* Reset some styles that the rest of the page might have set */
+  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+  border-width: 0;
+  background: transparent;
   font-family: inherit;
   font-size: inherit;
-  padding: 0; margin: 0;
+  margin: 0;
   white-space: pre;
   word-wrap: normal;
   line-height: inherit;
   color: inherit;
+  z-index: 2;
+  position: relative;
+  overflow: visible;
 }
-
 .CodeMirror-wrap pre {
   word-wrap: break-word;
   white-space: pre-wrap;
   word-break: normal;
 }
+
+.CodeMirror-linebackground {
+  position: absolute;
+  left: 0; right: 0; top: 0; bottom: 0;
+  z-index: 0;
+}
+
+.CodeMirror-linewidget {
+  position: relative;
+  z-index: 2;
+  overflow: auto;
+}
+
+.CodeMirror-widget {}
+
 .CodeMirror-wrap .CodeMirror-scroll {
   overflow-x: hidden;
 }
 
-.CodeMirror textarea {
-  outline: none !important;
+.CodeMirror-measure {
+  position: absolute;
+  width: 100%;
+  height: 0;
+  overflow: hidden;
+  visibility: hidden;
 }
+.CodeMirror-measure pre { position: static; }
 
-.CodeMirror pre.CodeMirror-cursor {
-  z-index: 10;
+.CodeMirror div.CodeMirror-cursor {
   position: absolute;
-  visibility: hidden;
-  border-left: 1px solid black;
   border-right: none;
   width: 0;
 }
-.cm-keymap-fat-cursor pre.CodeMirror-cursor {
-  width: auto;
-  border: 0;
-  background: transparent;
-  background: rgba(0, 200, 0, .4);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
-}
-/* Kludge to turn off filter in ie9+, which also accepts rgba */
-.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+
+div.CodeMirror-cursors {
+  visibility: hidden;
+  position: relative;
+  z-index: 3;
 }
-.CodeMirror pre.CodeMirror-cursor.CodeMirror-overwrite {}
-.CodeMirror-focused pre.CodeMirror-cursor {
+.CodeMirror-focused div.CodeMirror-cursors {
   visibility: visible;
 }
 
-div.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused div.CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
 
-.CodeMirror-searching {
+.cm-searching {
   background: #ffa;
   background: rgba(255, 255, 0, .4);
 }
 
-/* Default theme */
-
-.cm-s-default span.cm-keyword {color: #708;}
-.cm-s-default span.cm-atom {color: #219;}
-.cm-s-default span.cm-number {color: #164;}
-.cm-s-default span.cm-def {color: #00f;}
-.cm-s-default span.cm-variable {color: black;}
-.cm-s-default span.cm-variable-2 {color: #05a;}
-.cm-s-default span.cm-variable-3 {color: #085;}
-.cm-s-default span.cm-property {color: black;}
-.cm-s-default span.cm-operator {color: black;}
-.cm-s-default span.cm-comment {color: #a50;}
-.cm-s-default span.cm-string {color: #a11;}
-.cm-s-default span.cm-string-2 {color: #f50;}
-.cm-s-default span.cm-meta {color: #555;}
-.cm-s-default span.cm-error {color: #f00;}
-.cm-s-default span.cm-qualifier {color: #555;}
-.cm-s-default span.cm-builtin {color: #30a;}
-.cm-s-default span.cm-bracket {color: #997;}
-.cm-s-default span.cm-tag {color: #170;}
-.cm-s-default span.cm-attribute {color: #00c;}
-.cm-s-default span.cm-header {color: blue;}
-.cm-s-default span.cm-quote {color: #090;}
-.cm-s-default span.cm-hr {color: #999;}
-.cm-s-default span.cm-link {color: #00c;}
-
-span.cm-header, span.cm-strong {font-weight: bold;}
-span.cm-em {font-style: italic;}
-span.cm-emstrong {font-style: italic; font-weight: bold;}
-span.cm-link {text-decoration: underline;}
-
-span.cm-invalidchar {color: #f00;}
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
 
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
 
 @media print {
-
   /* Hide the cursor when printing */
-  .CodeMirror pre.CodeMirror-cursor {
+  .CodeMirror div.CodeMirror-cursors {
     visibility: hidden;
   }
-
 }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; }
diff --git a/amber/src/js/lib/CodeMirror/codemirror.js b/amber/src/js/lib/CodeMirror/codemirror.js
old mode 100755
new mode 100644
index 5f9724cab7188fc655173703adfcae03e55ddc94..97f6668e73fd6494aafc4c5ead8d2c772b259b51
--- a/amber/src/js/lib/CodeMirror/codemirror.js
+++ b/amber/src/js/lib/CodeMirror/codemirror.js
@@ -1,2033 +1,4573 @@
-// CodeMirror version 2.34
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+// This is CodeMirror (http://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    module.exports = mod();
+  else if (typeof define == "function" && define.amd) // AMD
+    return define([], mod);
+  else // Plain browser env
+    this.CodeMirror = mod();
+})(function() {
+  "use strict";
 
-// All functions that need access to the editor's state live inside
-// the CodeMirror function. Below that, at the bottom of the file,
-// some utilities are defined.
+  // BROWSER SNIFFING
 
-// CodeMirror is the only global var we claim
-window.CodeMirror = (function() {
-  "use strict";
-  // This is the function that produces an editor instance. Its
-  // closure is used to store the editor state.
-  function CodeMirror(place, givenOptions) {
+  // Kludges for bugs and behavior differences that can't be feature
+  // detected are enabled based on userAgent etc sniffing.
+
+  var gecko = /gecko\/\d/i.test(navigator.userAgent);
+  // ie_uptoN means Internet Explorer version N or lower
+  var ie_upto10 = /MSIE \d/.test(navigator.userAgent);
+  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);
+  var ie = ie_upto10 || ie_11up;
+  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : ie_11up[1]);
+  var webkit = /WebKit\//.test(navigator.userAgent);
+  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(navigator.userAgent);
+  var chrome = /Chrome\//.test(navigator.userAgent);
+  var presto = /Opera\//.test(navigator.userAgent);
+  var safari = /Apple Computer/.test(navigator.vendor);
+  var khtml = /KHTML\//.test(navigator.userAgent);
+  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent);
+  var phantom = /PhantomJS/.test(navigator.userAgent);
+
+  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
+  // This is woefully incomplete. Suggestions for alternative methods welcome.
+  var mobile = ios || /Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent);
+  var mac = ios || /Mac/.test(navigator.platform);
+  var windows = /win/i.test(navigator.platform);
+
+  var presto_version = presto && navigator.userAgent.match(/Version\/(\d*\.\d*)/);
+  if (presto_version) presto_version = Number(presto_version[1]);
+  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+  var captureRightClick = gecko || (ie && ie_version >= 9);
+
+  // Optimize some code when these features are not used.
+  var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+  // EDITOR CONSTRUCTOR
+
+  // A CodeMirror instance represents an editor. This is the object
+  // that user code is usually dealing with.
+
+  function CodeMirror(place, options) {
+    if (!(this instanceof CodeMirror)) return new CodeMirror(place, options);
+
+    this.options = options = options || {};
     // Determine effective options based on given values and defaults.
-    var options = {}, defaults = CodeMirror.defaults;
-    for (var opt in defaults)
-      if (defaults.hasOwnProperty(opt))
-        options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
+    copyObj(defaults, options, false);
+    setGuttersForLineNumbers(options);
+
+    var doc = options.value;
+    if (typeof doc == "string") doc = new Doc(doc, options.mode);
+    this.doc = doc;
+
+    var display = this.display = new Display(place, doc);
+    display.wrapper.CodeMirror = this;
+    updateGutters(this);
+    themeChanged(this);
+    if (options.lineWrapping)
+      this.display.wrapper.className += " CodeMirror-wrap";
+    if (options.autofocus && !mobile) focusInput(this);
+
+    this.state = {
+      keyMaps: [],  // stores maps added by addKeyMap
+      overlays: [], // highlighting overlays, as added by addOverlay
+      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
+      overwrite: false, focused: false,
+      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
+      pasteIncoming: false, cutIncoming: false, // help recognize paste/cut edits in readInput
+      draggingText: false,
+      highlight: new Delayed() // stores highlight worker timeout
+    };
+
+    // Override magic textarea content restore that IE sometimes does
+    // on our hidden textarea on reload
+    if (ie && ie_version < 11) setTimeout(bind(resetInput, this, true), 20);
+
+    registerEventHandlers(this);
+    ensureGlobalHandlers();
+
+    var cm = this;
+    runInOp(this, function() {
+      cm.curOp.forceUpdate = true;
+      attachDoc(cm, doc);
+
+      if ((options.autofocus && !mobile) || activeElt() == display.input)
+        setTimeout(bind(onFocus, cm), 20);
+      else
+        onBlur(cm);
+
+      for (var opt in optionHandlers) if (optionHandlers.hasOwnProperty(opt))
+        optionHandlers[opt](cm, options[opt], Init);
+      maybeUpdateLineNumberWidth(cm);
+      for (var i = 0; i < initHooks.length; ++i) initHooks[i](cm);
+    });
+  }
+
+  // DISPLAY CONSTRUCTOR
+
+  // The display handles the DOM integration, both for input reading
+  // and content drawing. It holds references to DOM nodes and
+  // display-related state.
+
+  function Display(place, doc) {
+    var d = this;
+
+    // The semihidden textarea that is focused when the editor is
+    // focused, and receives input.
+    var input = d.input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em; outline: none");
+    // The textarea is kept positioned near the cursor to prevent the
+    // fact that it'll be scrolled into view on input from scrolling
+    // our fake cursor out of view. On webkit, when wrap=off, paste is
+    // very slow. So make the area wide instead.
+    if (webkit) input.style.width = "1000px";
+    else input.setAttribute("wrap", "off");
+    // If border: 0; -- iOS fails to open keyboard (issue #1287)
+    if (ios) input.style.border = "1px solid black";
+    input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off"); input.setAttribute("spellcheck", "false");
 
-    var input = elt("textarea", null, null, "position: absolute; padding: 0; width: 1px; height: 1em");
-    input.setAttribute("wrap", "off"); input.setAttribute("autocorrect", "off"); input.setAttribute("autocapitalize", "off");
     // Wraps and hides input textarea
-    var inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
-    // The empty scrollbar content, used solely for managing the scrollbar thumb.
-    var scrollbarInner = elt("div", null, "CodeMirror-scrollbar-inner");
-    // The vertical scrollbar. Horizontal scrolling is handled by the scroller itself.
-    var scrollbar = elt("div", [scrollbarInner], "CodeMirror-scrollbar");
-    // DIVs containing the selection and the actual code
-    var lineDiv = elt("div"), selectionDiv = elt("div", null, null, "position: relative; z-index: -1");
-    // Blinky cursor, and element used to ensure cursor fits at the end of a line
-    var cursor = elt("pre", "\u00a0", "CodeMirror-cursor"), widthForcer = elt("pre", "\u00a0", "CodeMirror-cursor", "visibility: hidden");
-    // Used to measure text size
-    var measure = elt("div", null, null, "position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden;");
-    var lineSpace = elt("div", [measure, cursor, widthForcer, selectionDiv, lineDiv], null, "position: relative; z-index: 0");
-    var gutterText = elt("div", null, "CodeMirror-gutter-text"), gutter = elt("div", [gutterText], "CodeMirror-gutter");
-    // Moved around its parent to cover visible view
-    var mover = elt("div", [gutter, elt("div", [lineSpace], "CodeMirror-lines")], null, "position: relative");
-    // Set to the height of the text, causes scrolling
-    var sizer = elt("div", [mover], null, "position: relative");
-    // Provides scrolling
-    var scroller = elt("div", [sizer], "CodeMirror-scroll");
-    scroller.setAttribute("tabIndex", "-1");
+    d.inputDiv = elt("div", [input], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+    // The fake scrollbar elements.
+    d.scrollbarH = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
+    d.scrollbarV = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
+    // Covers bottom-right square when both scrollbars are present.
+    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+    // Covers bottom of gutter when coverGutterNextToScrollbar is on
+    // and h scrollbar is present.
+    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+    // Will contain the actual code, positioned to cover the viewport.
+    d.lineDiv = elt("div", null, "CodeMirror-code");
+    // Elements are added to these to represent selection and cursors.
+    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
+    // A visibility: hidden element used to find the size of things.
+    d.measure = elt("div", null, "CodeMirror-measure");
+    // When lines outside of the viewport are measured, they are drawn in this.
+    d.lineMeasure = elt("div", null, "CodeMirror-measure");
+    // Wraps everything that needs to exist inside the vertically-padded coordinate system
+    d.lineSpace = elt("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
+                      null, "position: relative; outline: none");
+    // Moved around its parent to cover visible view.
+    d.mover = elt("div", [elt("div", [d.lineSpace], "CodeMirror-lines")], null, "position: relative");
+    // Set to the height of the document, allowing scrolling.
+    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+    // Behavior of elts with overflow: auto and padding is
+    // inconsistent across browsers. This is used to ensure the
+    // scrollable area is big enough.
+    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerCutOff + "px; width: 1px;");
+    // Will contain the gutters, if any.
+    d.gutters = elt("div", null, "CodeMirror-gutters");
+    d.lineGutter = null;
+    // Actual scrollable element.
+    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+    d.scroller.setAttribute("tabIndex", "-1");
     // The element in which the editor lives.
-    var wrapper = elt("div", [inputDiv, scrollbar, scroller], "CodeMirror" + (options.lineWrapping ? " CodeMirror-wrap" : ""));
-    if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
+    d.wrapper = elt("div", [d.inputDiv, d.scrollbarH, d.scrollbarV,
+                            d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
 
-    themeChanged(); keyMapChanged();
+    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
+    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
     // Needed to hide big blue blinking cursor on Mobile Safari
     if (ios) input.style.width = "0px";
-    if (!webkit) scroller.draggable = true;
-    lineSpace.style.outline = "none";
-    if (options.tabindex != null) input.tabIndex = options.tabindex;
-    if (options.autofocus) focusInput();
-    if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
+    if (!webkit) d.scroller.draggable = true;
     // Needed to handle Tab key in KHTML
-    if (khtml) inputDiv.style.height = "1px", inputDiv.style.position = "absolute";
+    if (khtml) { d.inputDiv.style.height = "1px"; d.inputDiv.style.position = "absolute"; }
+    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+    if (ie && ie_version < 8) d.scrollbarH.style.minHeight = d.scrollbarV.style.minWidth = "18px";
+
+    if (place.appendChild) place.appendChild(d.wrapper);
+    else place(d.wrapper);
+
+    // Current rendered range (may be bigger than the view window).
+    d.viewFrom = d.viewTo = doc.first;
+    // Information about the rendered lines.
+    d.view = [];
+    // Holds info about a single rendered line when it was rendered
+    // for measurement, while not in view.
+    d.externalMeasured = null;
+    // Empty space (in pixels) above the view
+    d.viewOffset = 0;
+    d.lastSizeC = 0;
+    d.updateLineNumbers = null;
+
+    // Used to only resize the line number gutter when necessary (when
+    // the amount of lines crosses a boundary that makes its width change)
+    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+    // See readInput and resetInput
+    d.prevInput = "";
+    // Set to true when a non-horizontal-scrolling line widget is
+    // added. As an optimization, line widget aligning is skipped when
+    // this is false.
+    d.alignWidgets = false;
+    // Flag that indicates whether we expect input to appear real soon
+    // now (after some event like 'keypress' or 'input') and are
+    // polling intensively.
+    d.pollingFast = false;
+    // Self-resetting timeout for the poller
+    d.poll = new Delayed();
+
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+
+    // Tracks when resetInput has punted to just putting a short
+    // string into the textarea instead of the full selection.
+    d.inaccurateSelection = false;
+
+    // Tracks the maximum line length so that the horizontal scrollbar
+    // can be kept static when scrolling.
+    d.maxLine = null;
+    d.maxLineLength = 0;
+    d.maxLineChanged = false;
+
+    // Used for measuring wheel scrolling granularity
+    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+    // True when shift is held down.
+    d.shift = false;
+
+    // Used to track whether anything happened since the context menu
+    // was opened.
+    d.selForContextMenu = null;
+  }
+
+  // STATE UPDATES
+
+  // Used to get the editor into a consistent state again when options change.
+
+  function loadMode(cm) {
+    cm.doc.mode = CodeMirror.getMode(cm.options, cm.doc.modeOption);
+    resetModeState(cm);
+  }
+
+  function resetModeState(cm) {
+    cm.doc.iter(function(line) {
+      if (line.stateAfter) line.stateAfter = null;
+      if (line.styles) line.styles = null;
+    });
+    cm.doc.frontier = cm.doc.first;
+    startWorker(cm, 100);
+    cm.state.modeGen++;
+    if (cm.curOp) regChange(cm);
+  }
+
+  function wrappingChanged(cm) {
+    if (cm.options.lineWrapping) {
+      addClass(cm.display.wrapper, "CodeMirror-wrap");
+      cm.display.sizer.style.minWidth = "";
+    } else {
+      rmClass(cm.display.wrapper, "CodeMirror-wrap");
+      findMaxLine(cm);
+    }
+    estimateLineHeights(cm);
+    regChange(cm);
+    clearCaches(cm);
+    setTimeout(function(){updateScrollbars(cm);}, 100);
+  }
+
+  // Returns a function that estimates the height of a line, to use as
+  // first approximation until the line becomes visible (and is thus
+  // properly measurable).
+  function estimateHeight(cm) {
+    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+    return function(line) {
+      if (lineIsHidden(cm.doc, line)) return 0;
+
+      var widgetsHeight = 0;
+      if (line.widgets) for (var i = 0; i < line.widgets.length; i++) {
+        if (line.widgets[i].height) widgetsHeight += line.widgets[i].height;
+      }
+
+      if (wrapping)
+        return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th;
+      else
+        return widgetsHeight + th;
+    };
+  }
+
+  function estimateLineHeights(cm) {
+    var doc = cm.doc, est = estimateHeight(cm);
+    doc.iter(function(line) {
+      var estHeight = est(line);
+      if (estHeight != line.height) updateLineHeight(line, estHeight);
+    });
+  }
+
+  function keyMapChanged(cm) {
+    var map = keyMap[cm.options.keyMap], style = map.style;
+    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
+      (style ? " cm-keymap-" + style : "");
+  }
+
+  function themeChanged(cm) {
+    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+    clearCaches(cm);
+  }
+
+  function guttersChanged(cm) {
+    updateGutters(cm);
+    regChange(cm);
+    setTimeout(function(){alignHorizontally(cm);}, 20);
+  }
+
+  // Rebuild the gutter elements, ensure the margin to the left of the
+  // code matches their width.
+  function updateGutters(cm) {
+    var gutters = cm.display.gutters, specs = cm.options.gutters;
+    removeChildren(gutters);
+    for (var i = 0; i < specs.length; ++i) {
+      var gutterClass = specs[i];
+      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + gutterClass));
+      if (gutterClass == "CodeMirror-linenumbers") {
+        cm.display.lineGutter = gElt;
+        gElt.style.width = (cm.display.lineNumWidth || 1) + "px";
+      }
+    }
+    gutters.style.display = i ? "" : "none";
+    updateGutterSpace(cm);
+  }
+
+  function updateGutterSpace(cm) {
+    var width = cm.display.gutters.offsetWidth;
+    cm.display.sizer.style.marginLeft = width + "px";
+    cm.display.scrollbarH.style.left = cm.options.fixedGutter ? width + "px" : 0;
+  }
+
+  // Compute the character length of a line, taking into account
+  // collapsed ranges (see markText) that might hide parts, and join
+  // other lines onto it.
+  function lineLength(line) {
+    if (line.height == 0) return 0;
+    var len = line.text.length, merged, cur = line;
+    while (merged = collapsedSpanAtStart(cur)) {
+      var found = merged.find(0, true);
+      cur = found.from.line;
+      len += found.from.ch - found.to.ch;
+    }
+    cur = line;
+    while (merged = collapsedSpanAtEnd(cur)) {
+      var found = merged.find(0, true);
+      len -= cur.text.length - found.from.ch;
+      cur = found.to.line;
+      len += cur.text.length - found.to.ch;
+    }
+    return len;
+  }
+
+  // Find the longest line in the document.
+  function findMaxLine(cm) {
+    var d = cm.display, doc = cm.doc;
+    d.maxLine = getLine(doc, doc.first);
+    d.maxLineLength = lineLength(d.maxLine);
+    d.maxLineChanged = true;
+    doc.iter(function(line) {
+      var len = lineLength(line);
+      if (len > d.maxLineLength) {
+        d.maxLineLength = len;
+        d.maxLine = line;
+      }
+    });
+  }
+
+  // Make sure the gutters options contains the element
+  // "CodeMirror-linenumbers" when the lineNumbers option is true.
+  function setGuttersForLineNumbers(options) {
+    var found = indexOf(options.gutters, "CodeMirror-linenumbers");
+    if (found == -1 && options.lineNumbers) {
+      options.gutters = options.gutters.concat(["CodeMirror-linenumbers"]);
+    } else if (found > -1 && !options.lineNumbers) {
+      options.gutters = options.gutters.slice(0);
+      options.gutters.splice(found, 1);
+    }
+  }
+
+  // SCROLLBARS
+
+  function hScrollbarTakesSpace(cm) {
+    return cm.display.scroller.clientHeight - cm.display.wrapper.clientHeight < scrollerCutOff - 3;
+  }
+
+  // Prepare DOM reads needed to update the scrollbars. Done in one
+  // shot to minimize update/measure roundtrips.
+  function measureForScrollbars(cm) {
+    var scroll = cm.display.scroller;
+    return {
+      clientHeight: scroll.clientHeight,
+      barHeight: cm.display.scrollbarV.clientHeight,
+      scrollWidth: scroll.scrollWidth, clientWidth: scroll.clientWidth,
+      hScrollbarTakesSpace: hScrollbarTakesSpace(cm),
+      barWidth: cm.display.scrollbarH.clientWidth,
+      docHeight: Math.round(cm.doc.height + paddingVert(cm.display))
+    };
+  }
+
+  // Re-synchronize the fake scrollbars with the actual size of the
+  // content.
+  function updateScrollbars(cm, measure) {
+    if (!measure) measure = measureForScrollbars(cm);
+    var d = cm.display, sWidth = scrollbarWidth(d.measure);
+    var scrollHeight = measure.docHeight + scrollerCutOff;
+    var needsH = measure.scrollWidth > measure.clientWidth;
+    if (needsH && measure.scrollWidth <= measure.clientWidth + 1 &&
+        sWidth > 0 && !measure.hScrollbarTakesSpace)
+      needsH = false; // (Issue #2562)
+    var needsV = scrollHeight > measure.clientHeight;
+
+    if (needsV) {
+      d.scrollbarV.style.display = "block";
+      d.scrollbarV.style.bottom = needsH ? sWidth + "px" : "0";
+      // A bug in IE8 can cause this value to be negative, so guard it.
+      d.scrollbarV.firstChild.style.height =
+        Math.max(0, scrollHeight - measure.clientHeight + (measure.barHeight || d.scrollbarV.clientHeight)) + "px";
+    } else {
+      d.scrollbarV.style.display = "";
+      d.scrollbarV.firstChild.style.height = "0";
+    }
+    if (needsH) {
+      d.scrollbarH.style.display = "block";
+      d.scrollbarH.style.right = needsV ? sWidth + "px" : "0";
+      d.scrollbarH.firstChild.style.width =
+        (measure.scrollWidth - measure.clientWidth + (measure.barWidth || d.scrollbarH.clientWidth)) + "px";
+    } else {
+      d.scrollbarH.style.display = "";
+      d.scrollbarH.firstChild.style.width = "0";
+    }
+    if (needsH && needsV) {
+      d.scrollbarFiller.style.display = "block";
+      d.scrollbarFiller.style.height = d.scrollbarFiller.style.width = sWidth + "px";
+    } else d.scrollbarFiller.style.display = "";
+    if (needsH && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+      d.gutterFiller.style.display = "block";
+      d.gutterFiller.style.height = sWidth + "px";
+      d.gutterFiller.style.width = d.gutters.offsetWidth + "px";
+    } else d.gutterFiller.style.display = "";
+
+    if (!cm.state.checkedOverlayScrollbar && measure.clientHeight > 0) {
+      if (sWidth === 0) {
+        var w = mac && !mac_geMountainLion ? "12px" : "18px";
+        d.scrollbarV.style.minWidth = d.scrollbarH.style.minHeight = w;
+        var barMouseDown = function(e) {
+          if (e_target(e) != d.scrollbarV && e_target(e) != d.scrollbarH)
+            operation(cm, onMouseDown)(e);
+        };
+        on(d.scrollbarV, "mousedown", barMouseDown);
+        on(d.scrollbarH, "mousedown", barMouseDown);
+      }
+      cm.state.checkedOverlayScrollbar = true;
+    }
+  }
+
+  // Compute the lines that are visible in a given viewport (defaults
+  // the the current scroll position). viewport may contain top,
+  // height, and ensure (see op.scrollToPos) properties.
+  function visibleLines(display, doc, viewport) {
+    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
+    top = Math.floor(top - paddingTop(display));
+    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
+
+    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
+    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
+    // forces those lines into the viewport (if possible).
+    if (viewport && viewport.ensure) {
+      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
+      if (ensureFrom < from)
+        return {from: ensureFrom,
+                to: lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight)};
+      if (Math.min(ensureTo, doc.lastLine()) >= to)
+        return {from: lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight),
+                to: ensureTo};
+    }
+    return {from: from, to: Math.max(to, from + 1)};
+  }
+
+  // LINE NUMBERS
+
+  // Re-align line numbers and gutter marks to compensate for
+  // horizontal scrolling.
+  function alignHorizontally(cm) {
+    var display = cm.display, view = display.view;
+    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) return;
+    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+    var gutterW = display.gutters.offsetWidth, left = comp + "px";
+    for (var i = 0; i < view.length; i++) if (!view[i].hidden) {
+      if (cm.options.fixedGutter && view[i].gutter)
+        view[i].gutter.style.left = left;
+      var align = view[i].alignable;
+      if (align) for (var j = 0; j < align.length; j++)
+        align[j].style.left = left;
+    }
+    if (cm.options.fixedGutter)
+      display.gutters.style.left = (comp + gutterW) + "px";
+  }
+
+  // Used to ensure that the line number gutter is still the right
+  // size for the current document size. Returns true when an update
+  // is needed.
+  function maybeUpdateLineNumberWidth(cm) {
+    if (!cm.options.lineNumbers) return false;
+    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+    if (last.length != display.lineNumChars) {
+      var test = display.measure.appendChild(elt("div", [elt("div", last)],
+                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
+      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+      display.lineGutter.style.width = "";
+      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding);
+      display.lineNumWidth = display.lineNumInnerWidth + padding;
+      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+      display.lineGutter.style.width = display.lineNumWidth + "px";
+      updateGutterSpace(cm);
+      return true;
+    }
+    return false;
+  }
+
+  function lineNumberFor(options, i) {
+    return String(options.lineNumberFormatter(i + options.firstLineNumber));
+  }
+
+  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
+  // but using getBoundingClientRect to get a sub-pixel-accurate
+  // result.
+  function compensateForHScroll(display) {
+    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left;
+  }
+
+  // DISPLAY DRAWING
+
+  function DisplayUpdate(cm, viewport, force) {
+    var display = cm.display;
+
+    this.viewport = viewport;
+    // Store some values that we'll need later (but don't want to force a relayout for)
+    this.visible = visibleLines(display, cm.doc, viewport);
+    this.editorIsHidden = !display.wrapper.offsetWidth;
+    this.wrapperHeight = display.wrapper.clientHeight;
+    this.oldViewFrom = display.viewFrom; this.oldViewTo = display.viewTo;
+    this.oldScrollerWidth = display.scroller.clientWidth;
+    this.force = force;
+    this.dims = getDimensions(cm);
+  }
+
+  // Does the actual updating of the line display. Bails out
+  // (returning false) when there is nothing to be done and forced is
+  // false.
+  function updateDisplayIfNeeded(cm, update) {
+    var display = cm.display, doc = cm.doc;
+    if (update.editorIsHidden) {
+      resetView(cm);
+      return false;
+    }
+
+    // Bail out if the visible area is already rendered and nothing changed.
+    if (!update.force &&
+        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
+        countDirtyView(cm) == 0)
+      return false;
+
+    if (maybeUpdateLineNumberWidth(cm)) {
+      resetView(cm);
+      update.dims = getDimensions(cm);
+    }
+
+    // Compute a suitable new viewport (from & to)
+    var end = doc.first + doc.size;
+    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
+    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
+    if (display.viewFrom < from && from - display.viewFrom < 20) from = Math.max(doc.first, display.viewFrom);
+    if (display.viewTo > to && display.viewTo - to < 20) to = Math.min(end, display.viewTo);
+    if (sawCollapsedSpans) {
+      from = visualLineNo(cm.doc, from);
+      to = visualLineEndNo(cm.doc, to);
+    }
+
+    var different = from != display.viewFrom || to != display.viewTo ||
+      display.lastSizeC != update.wrapperHeight;
+    adjustView(cm, from, to);
+
+    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
+    // Position the mover div to align with the current scroll position
+    cm.display.mover.style.top = display.viewOffset + "px";
+
+    var toUpdate = countDirtyView(cm);
+    if (!different && toUpdate == 0 && !update.force &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
+      return false;
+
+    // For big changes, we hide the enclosing element during the
+    // update, since that speeds up the operations on most browsers.
+    var focused = activeElt();
+    if (toUpdate > 4) display.lineDiv.style.display = "none";
+    patchDisplay(cm, display.updateLineNumbers, update.dims);
+    if (toUpdate > 4) display.lineDiv.style.display = "";
+    // There might have been a widget with a focused element that got
+    // hidden or updated, if so re-focus it.
+    if (focused && activeElt() != focused && focused.offsetHeight) focused.focus();
+
+    // Prevent selection and cursors from interfering with the scroll
+    // width.
+    removeChildren(display.cursorDiv);
+    removeChildren(display.selectionDiv);
+
+    if (different) {
+      display.lastSizeC = update.wrapperHeight;
+      startWorker(cm, 400);
+    }
+
+    display.updateLineNumbers = null;
+
+    return true;
+  }
+
+  function postUpdateDisplay(cm, update) {
+    var force = update.force, viewport = update.viewport;
+    for (var first = true;; first = false) {
+      if (first && cm.options.lineWrapping && update.oldScrollerWidth != cm.display.scroller.clientWidth) {
+        force = true;
+      } else {
+        force = false;
+        // Clip forced viewport to actual scrollable area.
+        if (viewport && viewport.top != null)
+          viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - scrollerCutOff -
+                                    cm.display.scroller.clientHeight, viewport.top)};
+        // Updated line heights might result in the drawn area not
+        // actually covering the viewport. Keep looping until it does.
+        update.visible = visibleLines(cm.display, cm.doc, viewport);
+        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
+          break;
+      }
+      if (!updateDisplayIfNeeded(cm, update)) break;
+      updateHeightsInViewport(cm);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      setDocumentHeight(cm, barMeasure);
+      updateScrollbars(cm, barMeasure);
+    }
+
+    signalLater(cm, "update", cm);
+    if (cm.display.viewFrom != update.oldViewFrom || cm.display.viewTo != update.oldViewTo)
+      signalLater(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
+  }
+
+  function updateDisplaySimple(cm, viewport) {
+    var update = new DisplayUpdate(cm, viewport);
+    if (updateDisplayIfNeeded(cm, update)) {
+      updateHeightsInViewport(cm);
+      postUpdateDisplay(cm, update);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      setDocumentHeight(cm, barMeasure);
+      updateScrollbars(cm, barMeasure);
+    }
+  }
+
+  function setDocumentHeight(cm, measure) {
+    cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = measure.docHeight + "px";
+    cm.display.gutters.style.height = Math.max(measure.docHeight, measure.clientHeight - scrollerCutOff) + "px";
+  }
+
+  function checkForWebkitWidthBug(cm, measure) {
+    // Work around Webkit bug where it sometimes reserves space for a
+    // non-existing phantom scrollbar in the scroller (Issue #2420)
+    if (cm.display.sizer.offsetWidth + cm.display.gutters.offsetWidth < cm.display.scroller.clientWidth - 1) {
+      cm.display.sizer.style.minHeight = cm.display.heightForcer.style.top = "0px";
+      cm.display.gutters.style.height = measure.docHeight + "px";
+    }
+  }
+
+  // Read the actual heights of the rendered lines, and update their
+  // stored heights to match.
+  function updateHeightsInViewport(cm) {
+    var display = cm.display;
+    var prevBottom = display.lineDiv.offsetTop;
+    for (var i = 0; i < display.view.length; i++) {
+      var cur = display.view[i], height;
+      if (cur.hidden) continue;
+      if (ie && ie_version < 8) {
+        var bot = cur.node.offsetTop + cur.node.offsetHeight;
+        height = bot - prevBottom;
+        prevBottom = bot;
+      } else {
+        var box = cur.node.getBoundingClientRect();
+        height = box.bottom - box.top;
+      }
+      var diff = cur.line.height - height;
+      if (height < 2) height = textHeight(display);
+      if (diff > .001 || diff < -.001) {
+        updateLineHeight(cur.line, height);
+        updateWidgetHeight(cur.line);
+        if (cur.rest) for (var j = 0; j < cur.rest.length; j++)
+          updateWidgetHeight(cur.rest[j]);
+      }
+    }
+  }
+
+  // Read and store the height of line widgets associated with the
+  // given line.
+  function updateWidgetHeight(line) {
+    if (line.widgets) for (var i = 0; i < line.widgets.length; ++i)
+      line.widgets[i].height = line.widgets[i].node.offsetHeight;
+  }
+
+  // Do a bulk-read of the DOM positions and sizes needed to draw the
+  // view, so that we don't interleave reading and writing to the DOM.
+  function getDimensions(cm) {
+    var d = cm.display, left = {}, width = {};
+    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+      left[cm.options.gutters[i]] = n.offsetLeft;
+      width[cm.options.gutters[i]] = n.offsetWidth;
+    }
+    return {fixedPos: compensateForHScroll(d),
+            gutterTotalWidth: d.gutters.offsetWidth,
+            gutterLeft: left,
+            gutterWidth: width,
+            wrapperWidth: d.wrapper.clientWidth};
+  }
+
+  // Sync the actual display DOM structure with display.view, removing
+  // nodes for lines that are no longer in view, and creating the ones
+  // that are not there yet, and updating the ones that are out of
+  // date.
+  function patchDisplay(cm, updateNumbersFrom, dims) {
+    var display = cm.display, lineNumbers = cm.options.lineNumbers;
+    var container = display.lineDiv, cur = container.firstChild;
+
+    function rm(node) {
+      var next = node.nextSibling;
+      // Works around a throw-scroll bug in OS X Webkit
+      if (webkit && mac && cm.display.currentWheelTarget == node)
+        node.style.display = "none";
+      else
+        node.parentNode.removeChild(node);
+      return next;
+    }
+
+    var view = display.view, lineN = display.viewFrom;
+    // Loop over the elements in the view, syncing cur (the DOM nodes
+    // in display.lineDiv) with the view as we go.
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (lineView.hidden) {
+      } else if (!lineView.node) { // Not drawn yet
+        var node = buildLineElement(cm, lineView, lineN, dims);
+        container.insertBefore(node, cur);
+      } else { // Already drawn
+        while (cur != lineView.node) cur = rm(cur);
+        var updateNumber = lineNumbers && updateNumbersFrom != null &&
+          updateNumbersFrom <= lineN && lineView.lineNumber;
+        if (lineView.changes) {
+          if (indexOf(lineView.changes, "gutter") > -1) updateNumber = false;
+          updateLineForChanges(cm, lineView, lineN, dims);
+        }
+        if (updateNumber) {
+          removeChildren(lineView.lineNumber);
+          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
+        }
+        cur = lineView.node.nextSibling;
+      }
+      lineN += lineView.size;
+    }
+    while (cur) cur = rm(cur);
+  }
+
+  // When an aspect of a line changes, a string is added to
+  // lineView.changes. This updates the relevant part of the line's
+  // DOM structure.
+  function updateLineForChanges(cm, lineView, lineN, dims) {
+    for (var j = 0; j < lineView.changes.length; j++) {
+      var type = lineView.changes[j];
+      if (type == "text") updateLineText(cm, lineView);
+      else if (type == "gutter") updateLineGutter(cm, lineView, lineN, dims);
+      else if (type == "class") updateLineClasses(lineView);
+      else if (type == "widget") updateLineWidgets(lineView, dims);
+    }
+    lineView.changes = null;
+  }
+
+  // Lines with gutter elements, widgets or a background class need to
+  // be wrapped, and have the extra elements added to the wrapper div
+  function ensureLineWrapped(lineView) {
+    if (lineView.node == lineView.text) {
+      lineView.node = elt("div", null, null, "position: relative");
+      if (lineView.text.parentNode)
+        lineView.text.parentNode.replaceChild(lineView.node, lineView.text);
+      lineView.node.appendChild(lineView.text);
+      if (ie && ie_version < 8) lineView.node.style.zIndex = 2;
+    }
+    return lineView.node;
+  }
+
+  function updateLineBackground(lineView) {
+    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+    if (cls) cls += " CodeMirror-linebackground";
+    if (lineView.background) {
+      if (cls) lineView.background.className = cls;
+      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+    } else if (cls) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+    }
+  }
+
+  // Wrapper around buildLineContent which will reuse the structure
+  // in display.externalMeasured when possible.
+  function getLineContent(cm, lineView) {
+    var ext = cm.display.externalMeasured;
+    if (ext && ext.line == lineView.line) {
+      cm.display.externalMeasured = null;
+      lineView.measure = ext.measure;
+      return ext.built;
+    }
+    return buildLineContent(cm, lineView);
+  }
+
+  // Redraw the line's text. Interacts with the background and text
+  // classes because the mode may output tokens that influence these
+  // classes.
+  function updateLineText(cm, lineView) {
+    var cls = lineView.text.className;
+    var built = getLineContent(cm, lineView);
+    if (lineView.text == lineView.node) lineView.node = built.pre;
+    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+    lineView.text = built.pre;
+    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+      lineView.bgClass = built.bgClass;
+      lineView.textClass = built.textClass;
+      updateLineClasses(lineView);
+    } else if (cls) {
+      lineView.text.className = cls;
+    }
+  }
+
+  function updateLineClasses(lineView) {
+    updateLineBackground(lineView);
+    if (lineView.line.wrapClass)
+      ensureLineWrapped(lineView).className = lineView.line.wrapClass;
+    else if (lineView.node != lineView.text)
+      lineView.node.className = "";
+    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+    lineView.text.className = textClass || "";
+  }
+
+  function updateLineGutter(cm, lineView, lineN, dims) {
+    if (lineView.gutter) {
+      lineView.node.removeChild(lineView.gutter);
+      lineView.gutter = null;
+    }
+    var markers = lineView.line.gutterMarkers;
+    if (cm.options.lineNumbers || markers) {
+      var wrap = ensureLineWrapped(lineView);
+      var gutterWrap = lineView.gutter =
+        wrap.insertBefore(elt("div", null, "CodeMirror-gutter-wrapper", "position: absolute; left: " +
+                              (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"),
+                          lineView.text);
+      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+        lineView.lineNumber = gutterWrap.appendChild(
+          elt("div", lineNumberFor(cm.options, lineN),
+              "CodeMirror-linenumber CodeMirror-gutter-elt",
+              "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: "
+              + cm.display.lineNumInnerWidth + "px"));
+      if (markers) for (var k = 0; k < cm.options.gutters.length; ++k) {
+        var id = cm.options.gutters[k], found = markers.hasOwnProperty(id) && markers[id];
+        if (found)
+          gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " +
+                                     dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px"));
+      }
+    }
+  }
+
+  function updateLineWidgets(lineView, dims) {
+    if (lineView.alignable) lineView.alignable = null;
+    for (var node = lineView.node.firstChild, next; node; node = next) {
+      var next = node.nextSibling;
+      if (node.className == "CodeMirror-linewidget")
+        lineView.node.removeChild(node);
+    }
+    insertLineWidgets(lineView, dims);
+  }
+
+  // Build a line's DOM representation from scratch
+  function buildLineElement(cm, lineView, lineN, dims) {
+    var built = getLineContent(cm, lineView);
+    lineView.text = lineView.node = built.pre;
+    if (built.bgClass) lineView.bgClass = built.bgClass;
+    if (built.textClass) lineView.textClass = built.textClass;
+
+    updateLineClasses(lineView);
+    updateLineGutter(cm, lineView, lineN, dims);
+    insertLineWidgets(lineView, dims);
+    return lineView.node;
+  }
+
+  // A lineView may contain multiple logical lines (when merged by
+  // collapsed spans). The widgets for all of them need to be drawn.
+  function insertLineWidgets(lineView, dims) {
+    insertLineWidgetsFor(lineView.line, lineView, dims, true);
+    if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
+      insertLineWidgetsFor(lineView.rest[i], lineView, dims, false);
+  }
+
+  function insertLineWidgetsFor(line, lineView, dims, allowAbove) {
+    if (!line.widgets) return;
+    var wrap = ensureLineWrapped(lineView);
+    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget");
+      if (!widget.handleMouseEvents) node.ignoreEvents = true;
+      positionLineWidget(widget, node, lineView, dims);
+      if (allowAbove && widget.above)
+        wrap.insertBefore(node, lineView.gutter || lineView.text);
+      else
+        wrap.appendChild(node);
+      signalLater(widget, "redraw");
+    }
+  }
+
+  function positionLineWidget(widget, node, lineView, dims) {
+    if (widget.noHScroll) {
+      (lineView.alignable || (lineView.alignable = [])).push(node);
+      var width = dims.wrapperWidth;
+      node.style.left = dims.fixedPos + "px";
+      if (!widget.coverGutter) {
+        width -= dims.gutterTotalWidth;
+        node.style.paddingLeft = dims.gutterTotalWidth + "px";
+      }
+      node.style.width = width + "px";
+    }
+    if (widget.coverGutter) {
+      node.style.zIndex = 5;
+      node.style.position = "relative";
+      if (!widget.noHScroll) node.style.marginLeft = -dims.gutterTotalWidth + "px";
+    }
+  }
+
+  // POSITION OBJECT
+
+  // A Pos instance represents a position within the text.
+  var Pos = CodeMirror.Pos = function(line, ch) {
+    if (!(this instanceof Pos)) return new Pos(line, ch);
+    this.line = line; this.ch = ch;
+  };
+
+  // Compare two positions, return 0 if they are the same, a negative
+  // number when a is less, and a positive number otherwise.
+  var cmp = CodeMirror.cmpPos = function(a, b) { return a.line - b.line || a.ch - b.ch; };
+
+  function copyPos(x) {return Pos(x.line, x.ch);}
+  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
+  function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }
+
+  // SELECTION / CURSOR
+
+  // Selection objects are immutable. A new one is created every time
+  // the selection changes. A selection is one or more non-overlapping
+  // (and non-touching) ranges, sorted, and an integer that indicates
+  // which one is the primary selection (the one that's scrolled into
+  // view, that getCursor returns, etc).
+  function Selection(ranges, primIndex) {
+    this.ranges = ranges;
+    this.primIndex = primIndex;
+  }
+
+  Selection.prototype = {
+    primary: function() { return this.ranges[this.primIndex]; },
+    equals: function(other) {
+      if (other == this) return true;
+      if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) return false;
+      for (var i = 0; i < this.ranges.length; i++) {
+        var here = this.ranges[i], there = other.ranges[i];
+        if (cmp(here.anchor, there.anchor) != 0 || cmp(here.head, there.head) != 0) return false;
+      }
+      return true;
+    },
+    deepCopy: function() {
+      for (var out = [], i = 0; i < this.ranges.length; i++)
+        out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head));
+      return new Selection(out, this.primIndex);
+    },
+    somethingSelected: function() {
+      for (var i = 0; i < this.ranges.length; i++)
+        if (!this.ranges[i].empty()) return true;
+      return false;
+    },
+    contains: function(pos, end) {
+      if (!end) end = pos;
+      for (var i = 0; i < this.ranges.length; i++) {
+        var range = this.ranges[i];
+        if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
+          return i;
+      }
+      return -1;
+    }
+  };
+
+  function Range(anchor, head) {
+    this.anchor = anchor; this.head = head;
+  }
+
+  Range.prototype = {
+    from: function() { return minPos(this.anchor, this.head); },
+    to: function() { return maxPos(this.anchor, this.head); },
+    empty: function() {
+      return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch;
+    }
+  };
+
+  // Take an unsorted, potentially overlapping set of ranges, and
+  // build a selection out of it. 'Consumes' ranges array (modifying
+  // it).
+  function normalizeSelection(ranges, primIndex) {
+    var prim = ranges[primIndex];
+    ranges.sort(function(a, b) { return cmp(a.from(), b.from()); });
+    primIndex = indexOf(ranges, prim);
+    for (var i = 1; i < ranges.length; i++) {
+      var cur = ranges[i], prev = ranges[i - 1];
+      if (cmp(prev.to(), cur.from()) >= 0) {
+        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
+        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
+        if (i <= primIndex) --primIndex;
+        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
+      }
+    }
+    return new Selection(ranges, primIndex);
+  }
+
+  function simpleSelection(anchor, head) {
+    return new Selection([new Range(anchor, head || anchor)], 0);
+  }
+
+  // Most of the external API clips given positions to make sure they
+  // actually exist within the document.
+  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1));}
+  function clipPos(doc, pos) {
+    if (pos.line < doc.first) return Pos(doc.first, 0);
+    var last = doc.first + doc.size - 1;
+    if (pos.line > last) return Pos(last, getLine(doc, last).text.length);
+    return clipToLen(pos, getLine(doc, pos.line).text.length);
+  }
+  function clipToLen(pos, linelen) {
+    var ch = pos.ch;
+    if (ch == null || ch > linelen) return Pos(pos.line, linelen);
+    else if (ch < 0) return Pos(pos.line, 0);
+    else return pos;
+  }
+  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size;}
+  function clipPosArray(doc, array) {
+    for (var out = [], i = 0; i < array.length; i++) out[i] = clipPos(doc, array[i]);
+    return out;
+  }
+
+  // SELECTION UPDATES
+
+  // The 'scroll' parameter given to many of these indicated whether
+  // the new cursor position should be scrolled into view after
+  // modifying the selection.
+
+  // If shift is held or the extend flag is set, extends a range to
+  // include a given position (and optionally a second position).
+  // Otherwise, simply returns the range between the given positions.
+  // Used for cursor motion and such.
+  function extendRange(doc, range, head, other) {
+    if (doc.cm && doc.cm.display.shift || doc.extend) {
+      var anchor = range.anchor;
+      if (other) {
+        var posBefore = cmp(head, anchor) < 0;
+        if (posBefore != (cmp(other, anchor) < 0)) {
+          anchor = head;
+          head = other;
+        } else if (posBefore != (cmp(head, other) < 0)) {
+          head = other;
+        }
+      }
+      return new Range(anchor, head);
+    } else {
+      return new Range(other || head, head);
+    }
+  }
+
+  // Extend the primary selection range, discard the rest.
+  function extendSelection(doc, head, other, options) {
+    setSelection(doc, new Selection([extendRange(doc, doc.sel.primary(), head, other)], 0), options);
+  }
+
+  // Extend all selections (pos is an array of selections with length
+  // equal the number of selections)
+  function extendSelections(doc, heads, options) {
+    for (var out = [], i = 0; i < doc.sel.ranges.length; i++)
+      out[i] = extendRange(doc, doc.sel.ranges[i], heads[i], null);
+    var newSel = normalizeSelection(out, doc.sel.primIndex);
+    setSelection(doc, newSel, options);
+  }
+
+  // Updates a single range in the selection.
+  function replaceOneSelection(doc, i, range, options) {
+    var ranges = doc.sel.ranges.slice(0);
+    ranges[i] = range;
+    setSelection(doc, normalizeSelection(ranges, doc.sel.primIndex), options);
+  }
+
+  // Reset the selection to a single range.
+  function setSimpleSelection(doc, anchor, head, options) {
+    setSelection(doc, simpleSelection(anchor, head), options);
+  }
+
+  // Give beforeSelectionChange handlers a change to influence a
+  // selection update.
+  function filterSelectionChange(doc, sel) {
+    var obj = {
+      ranges: sel.ranges,
+      update: function(ranges) {
+        this.ranges = [];
+        for (var i = 0; i < ranges.length; i++)
+          this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
+                                     clipPos(doc, ranges[i].head));
+      }
+    };
+    signal(doc, "beforeSelectionChange", doc, obj);
+    if (doc.cm) signal(doc.cm, "beforeSelectionChange", doc.cm, obj);
+    if (obj.ranges != sel.ranges) return normalizeSelection(obj.ranges, obj.ranges.length - 1);
+    else return sel;
+  }
+
+  function setSelectionReplaceHistory(doc, sel, options) {
+    var done = doc.history.done, last = lst(done);
+    if (last && last.ranges) {
+      done[done.length - 1] = sel;
+      setSelectionNoUndo(doc, sel, options);
+    } else {
+      setSelection(doc, sel, options);
+    }
+  }
+
+  // Set a new selection.
+  function setSelection(doc, sel, options) {
+    setSelectionNoUndo(doc, sel, options);
+    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
+  }
+
+  function setSelectionNoUndo(doc, sel, options) {
+    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
+      sel = filterSelectionChange(doc, sel);
+
+    var bias = options && options.bias ||
+      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
+    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
+
+    if (!(options && options.scroll === false) && doc.cm)
+      ensureCursorVisible(doc.cm);
+  }
+
+  function setSelectionInner(doc, sel) {
+    if (sel.equals(doc.sel)) return;
+
+    doc.sel = sel;
+
+    if (doc.cm) {
+      doc.cm.curOp.updateInput = doc.cm.curOp.selectionChanged = true;
+      signalCursorActivity(doc.cm);
+    }
+    signalLater(doc, "cursorActivity", doc);
+  }
+
+  // Verify that the selection does not partially select any atomic
+  // marked ranges.
+  function reCheckSelection(doc) {
+    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false), sel_dontScroll);
+  }
+
+  // Return a selection that does not partially select any atomic
+  // ranges.
+  function skipAtomicInSelection(doc, sel, bias, mayClear) {
+    var out;
+    for (var i = 0; i < sel.ranges.length; i++) {
+      var range = sel.ranges[i];
+      var newAnchor = skipAtomic(doc, range.anchor, bias, mayClear);
+      var newHead = skipAtomic(doc, range.head, bias, mayClear);
+      if (out || newAnchor != range.anchor || newHead != range.head) {
+        if (!out) out = sel.ranges.slice(0, i);
+        out[i] = new Range(newAnchor, newHead);
+      }
+    }
+    return out ? normalizeSelection(out, sel.primIndex) : sel;
+  }
+
+  // Ensure a given position is not inside an atomic range.
+  function skipAtomic(doc, pos, bias, mayClear) {
+    var flipped = false, curPos = pos;
+    var dir = bias || 1;
+    doc.cantEdit = false;
+    search: for (;;) {
+      var line = getLine(doc, curPos.line);
+      if (line.markedSpans) {
+        for (var i = 0; i < line.markedSpans.length; ++i) {
+          var sp = line.markedSpans[i], m = sp.marker;
+          if ((sp.from == null || (m.inclusiveLeft ? sp.from <= curPos.ch : sp.from < curPos.ch)) &&
+              (sp.to == null || (m.inclusiveRight ? sp.to >= curPos.ch : sp.to > curPos.ch))) {
+            if (mayClear) {
+              signal(m, "beforeCursorEnter");
+              if (m.explicitlyCleared) {
+                if (!line.markedSpans) break;
+                else {--i; continue;}
+              }
+            }
+            if (!m.atomic) continue;
+            var newPos = m.find(dir < 0 ? -1 : 1);
+            if (cmp(newPos, curPos) == 0) {
+              newPos.ch += dir;
+              if (newPos.ch < 0) {
+                if (newPos.line > doc.first) newPos = clipPos(doc, Pos(newPos.line - 1));
+                else newPos = null;
+              } else if (newPos.ch > line.text.length) {
+                if (newPos.line < doc.first + doc.size - 1) newPos = Pos(newPos.line + 1, 0);
+                else newPos = null;
+              }
+              if (!newPos) {
+                if (flipped) {
+                  // Driven in a corner -- no valid cursor position found at all
+                  // -- try again *with* clearing, if we didn't already
+                  if (!mayClear) return skipAtomic(doc, pos, bias, true);
+                  // Otherwise, turn off editing until further notice, and return the start of the doc
+                  doc.cantEdit = true;
+                  return Pos(doc.first, 0);
+                }
+                flipped = true; newPos = pos; dir = -dir;
+              }
+            }
+            curPos = newPos;
+            continue search;
+          }
+        }
+      }
+      return curPos;
+    }
+  }
+
+  // SELECTION DRAWING
+
+  // Redraw the selection and/or cursor
+  function drawSelection(cm) {
+    var display = cm.display, doc = cm.doc, result = {};
+    var curFragment = result.cursors = document.createDocumentFragment();
+    var selFragment = result.selection = document.createDocumentFragment();
+
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      var range = doc.sel.ranges[i];
+      var collapsed = range.empty();
+      if (collapsed || cm.options.showCursorWhenSelecting)
+        drawSelectionCursor(cm, range, curFragment);
+      if (!collapsed)
+        drawSelectionRange(cm, range, selFragment);
+    }
+
+    // Move the hidden textarea near the cursor to prevent scrolling artifacts
+    if (cm.options.moveInputWithCursor) {
+      var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
+      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
+      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+                                          headPos.top + lineOff.top - wrapOff.top));
+      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+                                           headPos.left + lineOff.left - wrapOff.left));
+    }
+
+    return result;
+  }
+
+  function showSelection(cm, drawn) {
+    removeChildrenAndAdd(cm.display.cursorDiv, drawn.cursors);
+    removeChildrenAndAdd(cm.display.selectionDiv, drawn.selection);
+    if (drawn.teTop != null) {
+      cm.display.inputDiv.style.top = drawn.teTop + "px";
+      cm.display.inputDiv.style.left = drawn.teLeft + "px";
+    }
+  }
+
+  function updateSelection(cm) {
+    showSelection(cm, drawSelection(cm));
+  }
+
+  // Draws a cursor for the given range
+  function drawSelectionCursor(cm, range, output) {
+    var pos = cursorCoords(cm, range.head, "div", null, null, !cm.options.singleCursorHeightPerLine);
+
+    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
+    cursor.style.left = pos.left + "px";
+    cursor.style.top = pos.top + "px";
+    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+
+    if (pos.other) {
+      // Secondary cursor, shown when on a 'jump' in bi-directional text
+      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
+      otherCursor.style.display = "";
+      otherCursor.style.left = pos.other.left + "px";
+      otherCursor.style.top = pos.other.top + "px";
+      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+    }
+  }
+
+  // Draws the given range as a highlighted selection
+  function drawSelectionRange(cm, range, output) {
+    var display = cm.display, doc = cm.doc;
+    var fragment = document.createDocumentFragment();
+    var padding = paddingH(cm.display), leftSide = padding.left, rightSide = display.lineSpace.offsetWidth - padding.right;
+
+    function add(left, top, width, bottom) {
+      if (top < 0) top = 0;
+      top = Math.round(top);
+      bottom = Math.round(bottom);
+      fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
+                               "px; top: " + top + "px; width: " + (width == null ? rightSide - left : width) +
+                               "px; height: " + (bottom - top) + "px"));
+    }
+
+    function drawForLine(line, fromArg, toArg) {
+      var lineObj = getLine(doc, line);
+      var lineLen = lineObj.text.length;
+      var start, end;
+      function coords(ch, bias) {
+        return charCoords(cm, Pos(line, ch), "div", lineObj, bias);
+      }
+
+      iterateBidiSections(getOrder(lineObj), fromArg || 0, toArg == null ? lineLen : toArg, function(from, to, dir) {
+        var leftPos = coords(from, "left"), rightPos, left, right;
+        if (from == to) {
+          rightPos = leftPos;
+          left = right = leftPos.left;
+        } else {
+          rightPos = coords(to - 1, "right");
+          if (dir == "rtl") { var tmp = leftPos; leftPos = rightPos; rightPos = tmp; }
+          left = leftPos.left;
+          right = rightPos.right;
+        }
+        if (fromArg == null && from == 0) left = leftSide;
+        if (rightPos.top - leftPos.top > 3) { // Different lines, draw top part
+          add(left, leftPos.top, null, leftPos.bottom);
+          left = leftSide;
+          if (leftPos.bottom < rightPos.top) add(left, leftPos.bottom, null, rightPos.top);
+        }
+        if (toArg == null && to == lineLen) right = rightSide;
+        if (!start || leftPos.top < start.top || leftPos.top == start.top && leftPos.left < start.left)
+          start = leftPos;
+        if (!end || rightPos.bottom > end.bottom || rightPos.bottom == end.bottom && rightPos.right > end.right)
+          end = rightPos;
+        if (left < leftSide + 1) left = leftSide;
+        add(left, rightPos.top, right - left, rightPos.bottom);
+      });
+      return {start: start, end: end};
+    }
+
+    var sFrom = range.from(), sTo = range.to();
+    if (sFrom.line == sTo.line) {
+      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
+    } else {
+      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
+      var singleVLine = visualLine(fromLine) == visualLine(toLine);
+      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
+      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
+      if (singleVLine) {
+        if (leftEnd.top < rightStart.top - 2) {
+          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
+        } else {
+          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+        }
+      }
+      if (leftEnd.bottom < rightStart.top)
+        add(leftSide, leftEnd.bottom, null, rightStart.top);
+    }
+
+    output.appendChild(fragment);
+  }
+
+  // Cursor-blinking
+  function restartBlink(cm) {
+    if (!cm.state.focused) return;
+    var display = cm.display;
+    clearInterval(display.blinker);
+    var on = true;
+    display.cursorDiv.style.visibility = "";
+    if (cm.options.cursorBlinkRate > 0)
+      display.blinker = setInterval(function() {
+        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
+      }, cm.options.cursorBlinkRate);
+    else if (cm.options.cursorBlinkRate < 0)
+      display.cursorDiv.style.visibility = "hidden";
+  }
+
+  // HIGHLIGHT WORKER
+
+  function startWorker(cm, time) {
+    if (cm.doc.mode.startState && cm.doc.frontier < cm.display.viewTo)
+      cm.state.highlight.set(time, bind(highlightWorker, cm));
+  }
+
+  function highlightWorker(cm) {
+    var doc = cm.doc;
+    if (doc.frontier < doc.first) doc.frontier = doc.first;
+    if (doc.frontier >= cm.display.viewTo) return;
+    var end = +new Date + cm.options.workTime;
+    var state = copyState(doc.mode, getStateBefore(cm, doc.frontier));
+    var changedLines = [];
+
+    doc.iter(doc.frontier, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function(line) {
+      if (doc.frontier >= cm.display.viewFrom) { // Visible
+        var oldStyles = line.styles;
+        var highlighted = highlightLine(cm, line, state, true);
+        line.styles = highlighted.styles;
+        var oldCls = line.styleClasses, newCls = highlighted.classes;
+        if (newCls) line.styleClasses = newCls;
+        else if (oldCls) line.styleClasses = null;
+        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
+          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
+        for (var i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i];
+        if (ischange) changedLines.push(doc.frontier);
+        line.stateAfter = copyState(doc.mode, state);
+      } else {
+        processLine(cm, line.text, state);
+        line.stateAfter = doc.frontier % 5 == 0 ? copyState(doc.mode, state) : null;
+      }
+      ++doc.frontier;
+      if (+new Date > end) {
+        startWorker(cm, cm.options.workDelay);
+        return true;
+      }
+    });
+    if (changedLines.length) runInOp(cm, function() {
+      for (var i = 0; i < changedLines.length; i++)
+        regLineChange(cm, changedLines[i], "text");
+    });
+  }
+
+  // Finds the line to start with when starting a parse. Tries to
+  // find a line with a stateAfter, so that it can start with a
+  // valid state. If that fails, it returns the line with the
+  // smallest indentation, which tends to need the least context to
+  // parse correctly.
+  function findStartLine(cm, n, precise) {
+    var minindent, minline, doc = cm.doc;
+    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+    for (var search = n; search > lim; --search) {
+      if (search <= doc.first) return doc.first;
+      var line = getLine(doc, search - 1);
+      if (line.stateAfter && (!precise || search <= doc.frontier)) return search;
+      var indented = countColumn(line.text, null, cm.options.tabSize);
+      if (minline == null || minindent > indented) {
+        minline = search - 1;
+        minindent = indented;
+      }
+    }
+    return minline;
+  }
+
+  function getStateBefore(cm, n, precise) {
+    var doc = cm.doc, display = cm.display;
+    if (!doc.mode.startState) return true;
+    var pos = findStartLine(cm, n, precise), state = pos > doc.first && getLine(doc, pos-1).stateAfter;
+    if (!state) state = startState(doc.mode);
+    else state = copyState(doc.mode, state);
+    doc.iter(pos, n, function(line) {
+      processLine(cm, line.text, state);
+      var save = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo;
+      line.stateAfter = save ? copyState(doc.mode, state) : null;
+      ++pos;
+    });
+    if (precise) doc.frontier = pos;
+    return state;
+  }
+
+  // POSITION MEASUREMENT
+
+  function paddingTop(display) {return display.lineSpace.offsetTop;}
+  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight;}
+  function paddingH(display) {
+    if (display.cachedPaddingH) return display.cachedPaddingH;
+    var e = removeChildrenAndAdd(display.measure, elt("pre", "x"));
+    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) && !isNaN(data.right)) display.cachedPaddingH = data;
+    return data;
+  }
+
+  // Ensure the lineView.wrapping.heights array is populated. This is
+  // an array of bottom offsets for the lines that make up a drawn
+  // line. When lineWrapping is on, there might be more than one
+  // height.
+  function ensureLineHeights(cm, lineView, rect) {
+    var wrapping = cm.options.lineWrapping;
+    var curWidth = wrapping && cm.display.scroller.clientWidth;
+    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+      var heights = lineView.measure.heights = [];
+      if (wrapping) {
+        lineView.measure.width = curWidth;
+        var rects = lineView.text.firstChild.getClientRects();
+        for (var i = 0; i < rects.length - 1; i++) {
+          var cur = rects[i], next = rects[i + 1];
+          if (Math.abs(cur.bottom - next.bottom) > 2)
+            heights.push((cur.bottom + next.top) / 2 - rect.top);
+        }
+      }
+      heights.push(rect.bottom - rect.top);
+    }
+  }
+
+  // Find a line map (mapping character offsets to text nodes) and a
+  // measurement cache for the given line number. (A line view might
+  // contain multiple lines when collapsed ranges are present.)
+  function mapFromLineView(lineView, line, lineN) {
+    if (lineView.line == line)
+      return {map: lineView.measure.map, cache: lineView.measure.cache};
+    for (var i = 0; i < lineView.rest.length; i++)
+      if (lineView.rest[i] == line)
+        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]};
+    for (var i = 0; i < lineView.rest.length; i++)
+      if (lineNo(lineView.rest[i]) > lineN)
+        return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i], before: true};
+  }
+
+  // Render a line into the hidden node display.externalMeasured. Used
+  // when measurement is needed for a line that's not in the viewport.
+  function updateExternalMeasurement(cm, line) {
+    line = visualLine(line);
+    var lineN = lineNo(line);
+    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+    view.lineN = lineN;
+    var built = view.built = buildLineContent(cm, view);
+    view.text = built.pre;
+    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+    return view;
+  }
+
+  // Get a {top, bottom, left, right} box (in line-local coordinates)
+  // for a given character.
+  function measureChar(cm, line, ch, bias) {
+    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias);
+  }
+
+  // Find a line view that corresponds to the given line number.
+  function findViewForLine(cm, lineN) {
+    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+      return cm.display.view[findViewIndex(cm, lineN)];
+    var ext = cm.display.externalMeasured;
+    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+      return ext;
+  }
+
+  // Measurement can be split in two steps, the set-up work that
+  // applies to the whole line, and the measurement of the actual
+  // character. Functions like coordsChar, that need to do a lot of
+  // measurements in a row, can thus ensure that the set-up work is
+  // only done once.
+  function prepareMeasureForLine(cm, line) {
+    var lineN = lineNo(line);
+    var view = findViewForLine(cm, lineN);
+    if (view && !view.text)
+      view = null;
+    else if (view && view.changes)
+      updateLineForChanges(cm, view, lineN, getDimensions(cm));
+    if (!view)
+      view = updateExternalMeasurement(cm, line);
+
+    var info = mapFromLineView(view, line, lineN);
+    return {
+      line: line, view: view, rect: null,
+      map: info.map, cache: info.cache, before: info.before,
+      hasHeights: false
+    };
+  }
+
+  // Given a prepared measurement object, measures the position of an
+  // actual character (or fetches it from the cache).
+  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+    if (prepared.before) ch = -1;
+    var key = ch + (bias || ""), found;
+    if (prepared.cache.hasOwnProperty(key)) {
+      found = prepared.cache[key];
+    } else {
+      if (!prepared.rect)
+        prepared.rect = prepared.view.text.getBoundingClientRect();
+      if (!prepared.hasHeights) {
+        ensureLineHeights(cm, prepared.view, prepared.rect);
+        prepared.hasHeights = true;
+      }
+      found = measureCharInner(cm, prepared, ch, bias);
+      if (!found.bogus) prepared.cache[key] = found;
+    }
+    return {left: found.left, right: found.right,
+            top: varHeight ? found.rtop : found.top,
+            bottom: varHeight ? found.rbottom : found.bottom};
+  }
+
+  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+  function measureCharInner(cm, prepared, ch, bias) {
+    var map = prepared.map;
+
+    var node, start, end, collapse;
+    // First, search the line map for the text node corresponding to,
+    // or closest to, the target character.
+    for (var i = 0; i < map.length; i += 3) {
+      var mStart = map[i], mEnd = map[i + 1];
+      if (ch < mStart) {
+        start = 0; end = 1;
+        collapse = "left";
+      } else if (ch < mEnd) {
+        start = ch - mStart;
+        end = start + 1;
+      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+        end = mEnd - mStart;
+        start = end - 1;
+        if (ch >= mEnd) collapse = "right";
+      }
+      if (start != null) {
+        node = map[i + 2];
+        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+          collapse = bias;
+        if (bias == "left" && start == 0)
+          while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+            node = map[(i -= 3) + 2];
+            collapse = "left";
+          }
+        if (bias == "right" && start == mEnd - mStart)
+          while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+            node = map[(i += 3) + 2];
+            collapse = "right";
+          }
+        break;
+      }
+    }
+
+    var rect;
+    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+      for (var i = 0; i < 4; i++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+        while (start && isExtendingChar(prepared.line.text.charAt(mStart + start))) --start;
+        while (mStart + end < mEnd && isExtendingChar(prepared.line.text.charAt(mStart + end))) ++end;
+        if (ie && ie_version < 9 && start == 0 && end == mEnd - mStart) {
+          rect = node.parentNode.getBoundingClientRect();
+        } else if (ie && cm.options.lineWrapping) {
+          var rects = range(node, start, end).getClientRects();
+          if (rects.length)
+            rect = rects[bias == "right" ? rects.length - 1 : 0];
+          else
+            rect = nullRect;
+        } else {
+          rect = range(node, start, end).getBoundingClientRect() || nullRect;
+        }
+        if (rect.left || rect.right || start == 0) break;
+        end = start;
+        start = start - 1;
+        collapse = "right";
+      }
+      if (ie && ie_version < 11) rect = maybeUpdateRectForZooming(cm.display.measure, rect);
+    } else { // If it is a widget, simply get the box for the whole widget.
+      if (start > 0) collapse = bias = "right";
+      var rects;
+      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+        rect = rects[bias == "right" ? rects.length - 1 : 0];
+      else
+        rect = node.getBoundingClientRect();
+    }
+    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+      var rSpan = node.parentNode.getClientRects()[0];
+      if (rSpan)
+        rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom};
+      else
+        rect = nullRect;
+    }
+
+    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+    var mid = (rtop + rbot) / 2;
+    var heights = prepared.view.measure.heights;
+    for (var i = 0; i < heights.length - 1; i++)
+      if (mid < heights[i]) break;
+    var top = i ? heights[i - 1] : 0, bot = heights[i];
+    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+                  top: top, bottom: bot};
+    if (!rect.left && !rect.right) result.bogus = true;
+    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+    return result;
+  }
+
+  // Work around problem with bounding client rects on ranges being
+  // returned incorrectly when zoomed on IE10 and below.
+  function maybeUpdateRectForZooming(measure, rect) {
+    if (!window.screen || screen.logicalXDPI == null ||
+        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+      return rect;
+    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+    return {left: rect.left * scaleX, right: rect.right * scaleX,
+            top: rect.top * scaleY, bottom: rect.bottom * scaleY};
+  }
+
+  function clearLineMeasurementCacheFor(lineView) {
+    if (lineView.measure) {
+      lineView.measure.cache = {};
+      lineView.measure.heights = null;
+      if (lineView.rest) for (var i = 0; i < lineView.rest.length; i++)
+        lineView.measure.caches[i] = {};
+    }
+  }
+
+  function clearLineMeasurementCache(cm) {
+    cm.display.externalMeasure = null;
+    removeChildren(cm.display.lineMeasure);
+    for (var i = 0; i < cm.display.view.length; i++)
+      clearLineMeasurementCacheFor(cm.display.view[i]);
+  }
+
+  function clearCaches(cm) {
+    clearLineMeasurementCache(cm);
+    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+    if (!cm.options.lineWrapping) cm.display.maxLineChanged = true;
+    cm.display.lineNumChars = null;
+  }
+
+  function pageScrollX() { return window.pageXOffset || (document.documentElement || document.body).scrollLeft; }
+  function pageScrollY() { return window.pageYOffset || (document.documentElement || document.body).scrollTop; }
+
+  // Converts a {top, bottom, left, right} box from line-local
+  // coordinates into another coordinate system. Context may be one of
+  // "line", "div" (display.lineDiv), "local"/null (editor), or "page".
+  function intoCoordSystem(cm, lineObj, rect, context) {
+    if (lineObj.widgets) for (var i = 0; i < lineObj.widgets.length; ++i) if (lineObj.widgets[i].above) {
+      var size = widgetHeight(lineObj.widgets[i]);
+      rect.top += size; rect.bottom += size;
+    }
+    if (context == "line") return rect;
+    if (!context) context = "local";
+    var yOff = heightAtLine(lineObj);
+    if (context == "local") yOff += paddingTop(cm.display);
+    else yOff -= cm.display.viewOffset;
+    if (context == "page" || context == "window") {
+      var lOff = cm.display.lineSpace.getBoundingClientRect();
+      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+      rect.left += xOff; rect.right += xOff;
+    }
+    rect.top += yOff; rect.bottom += yOff;
+    return rect;
+  }
+
+  // Coverts a box from "div" coords to another coordinate system.
+  // Context may be "window", "page", "div", or "local"/null.
+  function fromCoordSystem(cm, coords, context) {
+    if (context == "div") return coords;
+    var left = coords.left, top = coords.top;
+    // First move into "page" coordinate system
+    if (context == "page") {
+      left -= pageScrollX();
+      top -= pageScrollY();
+    } else if (context == "local" || !context) {
+      var localBox = cm.display.sizer.getBoundingClientRect();
+      left += localBox.left;
+      top += localBox.top;
+    }
+
+    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top};
+  }
+
+  function charCoords(cm, pos, context, lineObj, bias) {
+    if (!lineObj) lineObj = getLine(cm.doc, pos.line);
+    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context);
+  }
+
+  // Returns a box for a given cursor position, which may have an
+  // 'other' property containing the position of the secondary cursor
+  // on a bidi boundary.
+  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+    lineObj = lineObj || getLine(cm.doc, pos.line);
+    if (!preparedMeasure) preparedMeasure = prepareMeasureForLine(cm, lineObj);
+    function get(ch, right) {
+      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+      if (right) m.left = m.right; else m.right = m.left;
+      return intoCoordSystem(cm, lineObj, m, context);
+    }
+    function getBidi(ch, partPos) {
+      var part = order[partPos], right = part.level % 2;
+      if (ch == bidiLeft(part) && partPos && part.level < order[partPos - 1].level) {
+        part = order[--partPos];
+        ch = bidiRight(part) - (part.level % 2 ? 0 : 1);
+        right = true;
+      } else if (ch == bidiRight(part) && partPos < order.length - 1 && part.level < order[partPos + 1].level) {
+        part = order[++partPos];
+        ch = bidiLeft(part) - part.level % 2;
+        right = false;
+      }
+      if (right && ch == part.to && ch > part.from) return get(ch - 1);
+      return get(ch, right);
+    }
+    var order = getOrder(lineObj), ch = pos.ch;
+    if (!order) return get(ch);
+    var partPos = getBidiPartAt(order, ch);
+    var val = getBidi(ch, partPos);
+    if (bidiOther != null) val.other = getBidi(ch, bidiOther);
+    return val;
+  }
+
+  // Used to cheaply estimate the coordinates for a position. Used for
+  // intermediate scroll updates.
+  function estimateCoords(cm, pos) {
+    var left = 0, pos = clipPos(cm.doc, pos);
+    if (!cm.options.lineWrapping) left = charWidth(cm.display) * pos.ch;
+    var lineObj = getLine(cm.doc, pos.line);
+    var top = heightAtLine(lineObj) + paddingTop(cm.display);
+    return {left: left, right: left, top: top, bottom: top + lineObj.height};
+  }
+
+  // Positions returned by coordsChar contain some extra information.
+  // xRel is the relative x position of the input coordinates compared
+  // to the found position (so xRel > 0 means the coordinates are to
+  // the right of the character position, for example). When outside
+  // is true, that means the coordinates lie outside the line's
+  // vertical range.
+  function PosWithInfo(line, ch, outside, xRel) {
+    var pos = Pos(line, ch);
+    pos.xRel = xRel;
+    if (outside) pos.outside = true;
+    return pos;
+  }
+
+  // Compute the character position closest to the given coordinates.
+  // Input must be lineSpace-local ("div" coordinate system).
+  function coordsChar(cm, x, y) {
+    var doc = cm.doc;
+    y += cm.display.viewOffset;
+    if (y < 0) return PosWithInfo(doc.first, 0, true, -1);
+    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+    if (lineN > last)
+      return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, true, 1);
+    if (x < 0) x = 0;
+
+    var lineObj = getLine(doc, lineN);
+    for (;;) {
+      var found = coordsCharInner(cm, lineObj, lineN, x, y);
+      var merged = collapsedSpanAtEnd(lineObj);
+      var mergedPos = merged && merged.find(0, true);
+      if (merged && (found.ch > mergedPos.from.ch || found.ch == mergedPos.from.ch && found.xRel > 0))
+        lineN = lineNo(lineObj = mergedPos.to.line);
+      else
+        return found;
+    }
+  }
+
+  function coordsCharInner(cm, lineObj, lineNo, x, y) {
+    var innerOff = y - heightAtLine(lineObj);
+    var wrongLine = false, adjust = 2 * cm.display.wrapper.clientWidth;
+    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+
+    function getX(ch) {
+      var sp = cursorCoords(cm, Pos(lineNo, ch), "line", lineObj, preparedMeasure);
+      wrongLine = true;
+      if (innerOff > sp.bottom) return sp.left - adjust;
+      else if (innerOff < sp.top) return sp.left + adjust;
+      else wrongLine = false;
+      return sp.left;
+    }
+
+    var bidi = getOrder(lineObj), dist = lineObj.text.length;
+    var from = lineLeft(lineObj), to = lineRight(lineObj);
+    var fromX = getX(from), fromOutside = wrongLine, toX = getX(to), toOutside = wrongLine;
+
+    if (x > toX) return PosWithInfo(lineNo, to, toOutside, 1);
+    // Do a binary search between these bounds.
+    for (;;) {
+      if (bidi ? to == from || to == moveVisually(lineObj, from, 1) : to - from <= 1) {
+        var ch = x < fromX || x - fromX <= toX - x ? from : to;
+        var xDiff = x - (ch == from ? fromX : toX);
+        while (isExtendingChar(lineObj.text.charAt(ch))) ++ch;
+        var pos = PosWithInfo(lineNo, ch, ch == from ? fromOutside : toOutside,
+                              xDiff < -1 ? -1 : xDiff > 1 ? 1 : 0);
+        return pos;
+      }
+      var step = Math.ceil(dist / 2), middle = from + step;
+      if (bidi) {
+        middle = from;
+        for (var i = 0; i < step; ++i) middle = moveVisually(lineObj, middle, 1);
+      }
+      var middleX = getX(middle);
+      if (middleX > x) {to = middle; toX = middleX; if (toOutside = wrongLine) toX += 1000; dist = step;}
+      else {from = middle; fromX = middleX; fromOutside = wrongLine; dist -= step;}
+    }
+  }
+
+  var measureText;
+  // Compute the default text height.
+  function textHeight(display) {
+    if (display.cachedTextHeight != null) return display.cachedTextHeight;
+    if (measureText == null) {
+      measureText = elt("pre");
+      // Measure a bunch of lines, for browsers that compute
+      // fractional heights.
+      for (var i = 0; i < 49; ++i) {
+        measureText.appendChild(document.createTextNode("x"));
+        measureText.appendChild(elt("br"));
+      }
+      measureText.appendChild(document.createTextNode("x"));
+    }
+    removeChildrenAndAdd(display.measure, measureText);
+    var height = measureText.offsetHeight / 50;
+    if (height > 3) display.cachedTextHeight = height;
+    removeChildren(display.measure);
+    return height || 1;
+  }
+
+  // Compute the default character width.
+  function charWidth(display) {
+    if (display.cachedCharWidth != null) return display.cachedCharWidth;
+    var anchor = elt("span", "xxxxxxxxxx");
+    var pre = elt("pre", [anchor]);
+    removeChildrenAndAdd(display.measure, pre);
+    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
+    if (width > 2) display.cachedCharWidth = width;
+    return width || 10;
+  }
+
+  // OPERATIONS
+
+  // Operations are used to wrap a series of changes to the editor
+  // state in such a way that each change won't have to update the
+  // cursor and display (which would be awkward, slow, and
+  // error-prone). Instead, display updates are batched and then all
+  // combined and executed at once.
+
+  var operationGroup = null;
+
+  var nextOpId = 0;
+  // Start a new operation.
+  function startOperation(cm) {
+    cm.curOp = {
+      cm: cm,
+      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
+      startHeight: cm.doc.height, // Used to detect need to update scrollbar
+      forceUpdate: false,      // Used to force a redraw
+      updateInput: null,       // Whether to reset the input textarea
+      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
+      changeObjs: null,        // Accumulated changes, for firing change events
+      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
+      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
+      selectionChanged: false, // Whether the selection needs to be redrawn
+      updateMaxLine: false,    // Set when the widest line needs to be determined anew
+      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
+      scrollToPos: null,       // Used to scroll to a specific position
+      id: ++nextOpId           // Unique ID
+    };
+    if (operationGroup) {
+      operationGroup.ops.push(cm.curOp);
+    } else {
+      cm.curOp.ownsGroup = operationGroup = {
+        ops: [cm.curOp],
+        delayedCallbacks: []
+      };
+    }
+  }
+
+  function fireCallbacksForOps(group) {
+    // Calls delayed callbacks and cursorActivity handlers until no
+    // new ones appear
+    var callbacks = group.delayedCallbacks, i = 0;
+    do {
+      for (; i < callbacks.length; i++)
+        callbacks[i]();
+      for (var j = 0; j < group.ops.length; j++) {
+        var op = group.ops[j];
+        if (op.cursorActivityHandlers)
+          while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+            op.cursorActivityHandlers[op.cursorActivityCalled++](op.cm);
+      }
+    } while (i < callbacks.length);
+  }
+
+  // Finish an operation, updating the display and signalling delayed events
+  function endOperation(cm) {
+    var op = cm.curOp, group = op.ownsGroup;
+    if (!group) return;
+
+    try { fireCallbacksForOps(group); }
+    finally {
+      operationGroup = null;
+      for (var i = 0; i < group.ops.length; i++)
+        group.ops[i].cm.curOp = null;
+      endOperations(group);
+    }
+  }
+
+  // The DOM updates done when an operation finishes are batched so
+  // that the minimum number of relayouts are required.
+  function endOperations(group) {
+    var ops = group.ops;
+    for (var i = 0; i < ops.length; i++) // Read DOM
+      endOperation_R1(ops[i]);
+    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
+      endOperation_W1(ops[i]);
+    for (var i = 0; i < ops.length; i++) // Read DOM
+      endOperation_R2(ops[i]);
+    for (var i = 0; i < ops.length; i++) // Write DOM (maybe)
+      endOperation_W2(ops[i]);
+    for (var i = 0; i < ops.length; i++) // Read DOM
+      endOperation_finish(ops[i]);
+  }
+
+  function endOperation_R1(op) {
+    var cm = op.cm, display = cm.display;
+    if (op.updateMaxLine) findMaxLine(cm);
+
+    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
+      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
+                         op.scrollToPos.to.line >= display.viewTo) ||
+      display.maxLineChanged && cm.options.lineWrapping;
+    op.update = op.mustUpdate &&
+      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
+  }
+
+  function endOperation_W1(op) {
+    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
+  }
+
+  function endOperation_R2(op) {
+    var cm = op.cm, display = cm.display;
+    if (op.updatedDisplay) updateHeightsInViewport(cm);
+
+    op.barMeasure = measureForScrollbars(cm);
+
+    // If the max line changed since it was last measured, measure it,
+    // and ensure the document's width matches it.
+    // updateDisplay_W2 will use these properties to do the actual resizing
+    if (display.maxLineChanged && !cm.options.lineWrapping) {
+      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
+      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo +
+                                  scrollerCutOff - display.scroller.clientWidth);
+    }
+
+    if (op.updatedDisplay || op.selectionChanged)
+      op.newSelectionNodes = drawSelection(cm);
+  }
+
+  function endOperation_W2(op) {
+    var cm = op.cm;
+
+    if (op.adjustWidthTo != null) {
+      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
+      if (op.maxScrollLeft < cm.doc.scrollLeft)
+        setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true);
+      cm.display.maxLineChanged = false;
+    }
+
+    if (op.newSelectionNodes)
+      showSelection(cm, op.newSelectionNodes);
+    if (op.updatedDisplay)
+      setDocumentHeight(cm, op.barMeasure);
+    if (op.updatedDisplay || op.startHeight != cm.doc.height)
+      updateScrollbars(cm, op.barMeasure);
+
+    if (op.selectionChanged) restartBlink(cm);
+
+    if (cm.state.focused && op.updateInput)
+      resetInput(cm, op.typing);
+  }
+
+  function endOperation_finish(op) {
+    var cm = op.cm, display = cm.display, doc = cm.doc;
+
+    if (op.adjustWidthTo != null && Math.abs(op.barMeasure.scrollWidth - cm.display.scroller.scrollWidth) > 1)
+      updateScrollbars(cm);
+
+    if (op.updatedDisplay) postUpdateDisplay(cm, op.update);
+
+    // Abort mouse wheel delta measurement, when scrolling explicitly
+    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
+      display.wheelStartX = display.wheelStartY = null;
+
+    // Propagate the scroll position to the actual DOM scroller
+    if (op.scrollTop != null && (display.scroller.scrollTop != op.scrollTop || op.forceScroll)) {
+      var top = Math.max(0, Math.min(display.scroller.scrollHeight - display.scroller.clientHeight, op.scrollTop));
+      display.scroller.scrollTop = display.scrollbarV.scrollTop = doc.scrollTop = top;
+    }
+    if (op.scrollLeft != null && (display.scroller.scrollLeft != op.scrollLeft || op.forceScroll)) {
+      var left = Math.max(0, Math.min(display.scroller.scrollWidth - display.scroller.clientWidth, op.scrollLeft));
+      display.scroller.scrollLeft = display.scrollbarH.scrollLeft = doc.scrollLeft = left;
+      alignHorizontally(cm);
+    }
+    // If we need to scroll a specific position into view, do so.
+    if (op.scrollToPos) {
+      var coords = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
+                                     clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
+      if (op.scrollToPos.isCursor && cm.state.focused) maybeScrollWindow(cm, coords);
+    }
+
+    // Fire events for markers that are hidden/unidden by editing or
+    // undoing
+    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+    if (hidden) for (var i = 0; i < hidden.length; ++i)
+      if (!hidden[i].lines.length) signal(hidden[i], "hide");
+    if (unhidden) for (var i = 0; i < unhidden.length; ++i)
+      if (unhidden[i].lines.length) signal(unhidden[i], "unhide");
+
+    if (display.wrapper.offsetHeight)
+      doc.scrollTop = cm.display.scroller.scrollTop;
+
+    // Apply workaround for two webkit bugs
+    if (op.updatedDisplay && webkit) {
+      if (cm.options.lineWrapping)
+        checkForWebkitWidthBug(cm, op.barMeasure); // (Issue #2420)
+      if (op.barMeasure.scrollWidth > op.barMeasure.clientWidth &&
+          op.barMeasure.scrollWidth < op.barMeasure.clientWidth + 1 &&
+          !hScrollbarTakesSpace(cm))
+        updateScrollbars(cm); // (Issue #2562)
+    }
+
+    // Fire change events, and delayed event handlers
+    if (op.changeObjs)
+      signal(cm, "changes", cm, op.changeObjs);
+  }
+
+  // Run the given function in an operation
+  function runInOp(cm, f) {
+    if (cm.curOp) return f();
+    startOperation(cm);
+    try { return f(); }
+    finally { endOperation(cm); }
+  }
+  // Wraps a function in an operation. Returns the wrapped function.
+  function operation(cm, f) {
+    return function() {
+      if (cm.curOp) return f.apply(cm, arguments);
+      startOperation(cm);
+      try { return f.apply(cm, arguments); }
+      finally { endOperation(cm); }
+    };
+  }
+  // Used to add methods to editor and doc instances, wrapping them in
+  // operations.
+  function methodOp(f) {
+    return function() {
+      if (this.curOp) return f.apply(this, arguments);
+      startOperation(this);
+      try { return f.apply(this, arguments); }
+      finally { endOperation(this); }
+    };
+  }
+  function docMethodOp(f) {
+    return function() {
+      var cm = this.cm;
+      if (!cm || cm.curOp) return f.apply(this, arguments);
+      startOperation(cm);
+      try { return f.apply(this, arguments); }
+      finally { endOperation(cm); }
+    };
+  }
+
+  // VIEW TRACKING
+
+  // These objects are used to represent the visible (currently drawn)
+  // part of the document. A LineView may correspond to multiple
+  // logical lines, if those are connected by collapsed ranges.
+  function LineView(doc, line, lineN) {
+    // The starting line
+    this.line = line;
+    // Continuing lines, if any
+    this.rest = visualLineContinued(line);
+    // Number of logical lines in this visual line
+    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+    this.node = this.text = null;
+    this.hidden = lineIsHidden(doc, line);
+  }
+
+  // Create a range of LineView objects for the given lines.
+  function buildViewArray(cm, from, to) {
+    var array = [], nextPos;
+    for (var pos = from; pos < to; pos = nextPos) {
+      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+      nextPos = pos + view.size;
+      array.push(view);
+    }
+    return array;
+  }
+
+  // Updates the display.view data structure for a given change to the
+  // document. From and to are in pre-change coordinates. Lendiff is
+  // the amount of lines added or subtracted by the change. This is
+  // used for changes that span multiple lines, or change the way
+  // lines are divided into visual lines. regLineChange (below)
+  // registers single-line changes.
+  function regChange(cm, from, to, lendiff) {
+    if (from == null) from = cm.doc.first;
+    if (to == null) to = cm.doc.first + cm.doc.size;
+    if (!lendiff) lendiff = 0;
+
+    var display = cm.display;
+    if (lendiff && to < display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers > from))
+      display.updateLineNumbers = from;
+
+    cm.curOp.viewChanged = true;
+
+    if (from >= display.viewTo) { // Change after
+      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
+        resetView(cm);
+    } else if (to <= display.viewFrom) { // Change before
+      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
+        resetView(cm);
+      } else {
+        display.viewFrom += lendiff;
+        display.viewTo += lendiff;
+      }
+    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
+      resetView(cm);
+    } else if (from <= display.viewFrom) { // Top overlap
+      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cut) {
+        display.view = display.view.slice(cut.index);
+        display.viewFrom = cut.lineN;
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    } else if (to >= display.viewTo) { // Bottom overlap
+      var cut = viewCuttingPoint(cm, from, from, -1);
+      if (cut) {
+        display.view = display.view.slice(0, cut.index);
+        display.viewTo = cut.lineN;
+      } else {
+        resetView(cm);
+      }
+    } else { // Gap in the middle
+      var cutTop = viewCuttingPoint(cm, from, from, -1);
+      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cutTop && cutBot) {
+        display.view = display.view.slice(0, cutTop.index)
+          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
+          .concat(display.view.slice(cutBot.index));
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    }
+
+    var ext = display.externalMeasured;
+    if (ext) {
+      if (to < ext.lineN)
+        ext.lineN += lendiff;
+      else if (from < ext.lineN + ext.size)
+        display.externalMeasured = null;
+    }
+  }
+
+  // Register a change to a single line. Type must be one of "text",
+  // "gutter", "class", "widget"
+  function regLineChange(cm, line, type) {
+    cm.curOp.viewChanged = true;
+    var display = cm.display, ext = cm.display.externalMeasured;
+    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
+      display.externalMeasured = null;
+
+    if (line < display.viewFrom || line >= display.viewTo) return;
+    var lineView = display.view[findViewIndex(cm, line)];
+    if (lineView.node == null) return;
+    var arr = lineView.changes || (lineView.changes = []);
+    if (indexOf(arr, type) == -1) arr.push(type);
+  }
+
+  // Clear the view.
+  function resetView(cm) {
+    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
+    cm.display.view = [];
+    cm.display.viewOffset = 0;
+  }
+
+  // Find the view element corresponding to a given line. Return null
+  // when the line isn't visible.
+  function findViewIndex(cm, n) {
+    if (n >= cm.display.viewTo) return null;
+    n -= cm.display.viewFrom;
+    if (n < 0) return null;
+    var view = cm.display.view;
+    for (var i = 0; i < view.length; i++) {
+      n -= view[i].size;
+      if (n < 0) return i;
+    }
+  }
+
+  function viewCuttingPoint(cm, oldN, newN, dir) {
+    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
+    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
+      return {index: index, lineN: newN};
+    for (var i = 0, n = cm.display.viewFrom; i < index; i++)
+      n += view[i].size;
+    if (n != oldN) {
+      if (dir > 0) {
+        if (index == view.length - 1) return null;
+        diff = (n + view[index].size) - oldN;
+        index++;
+      } else {
+        diff = n - oldN;
+      }
+      oldN += diff; newN += diff;
+    }
+    while (visualLineNo(cm.doc, newN) != newN) {
+      if (index == (dir < 0 ? 0 : view.length - 1)) return null;
+      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
+      index += dir;
+    }
+    return {index: index, lineN: newN};
+  }
+
+  // Force the view to cover a given range, adding empty view element
+  // or clipping off existing ones as needed.
+  function adjustView(cm, from, to) {
+    var display = cm.display, view = display.view;
+    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
+      display.view = buildViewArray(cm, from, to);
+      display.viewFrom = from;
+    } else {
+      if (display.viewFrom > from)
+        display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view);
+      else if (display.viewFrom < from)
+        display.view = display.view.slice(findViewIndex(cm, from));
+      display.viewFrom = from;
+      if (display.viewTo < to)
+        display.view = display.view.concat(buildViewArray(cm, display.viewTo, to));
+      else if (display.viewTo > to)
+        display.view = display.view.slice(0, findViewIndex(cm, to));
+    }
+    display.viewTo = to;
+  }
+
+  // Count the number of lines in the view whose DOM representation is
+  // out of date (or nonexistent).
+  function countDirtyView(cm) {
+    var view = cm.display.view, dirty = 0;
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (!lineView.hidden && (!lineView.node || lineView.changes)) ++dirty;
+    }
+    return dirty;
+  }
+
+  // INPUT HANDLING
+
+  // Poll for input changes, using the normal rate of polling. This
+  // runs as long as the editor is focused.
+  function slowPoll(cm) {
+    if (cm.display.pollingFast) return;
+    cm.display.poll.set(cm.options.pollInterval, function() {
+      readInput(cm);
+      if (cm.state.focused) slowPoll(cm);
+    });
+  }
+
+  // When an event has just come in that is likely to add or change
+  // something in the input textarea, we poll faster, to ensure that
+  // the change appears on the screen quickly.
+  function fastPoll(cm) {
+    var missed = false;
+    cm.display.pollingFast = true;
+    function p() {
+      var changed = readInput(cm);
+      if (!changed && !missed) {missed = true; cm.display.poll.set(60, p);}
+      else {cm.display.pollingFast = false; slowPoll(cm);}
+    }
+    cm.display.poll.set(20, p);
+  }
+
+  // This will be set to an array of strings when copying, so that,
+  // when pasting, we know what kind of selections the copied text
+  // was made out of.
+  var lastCopied = null;
+
+  // Read input from the textarea, and update the document to match.
+  // When something is selected, it is present in the textarea, and
+  // selected (unless it is huge, in which case a placeholder is
+  // used). When nothing is selected, the cursor sits after previously
+  // seen text (can be empty), which is stored in prevInput (we must
+  // not reset the textarea when typing, because that breaks IME).
+  function readInput(cm) {
+    var input = cm.display.input, prevInput = cm.display.prevInput, doc = cm.doc;
+    // Since this is called a *lot*, try to bail out as cheaply as
+    // possible when it is clear that nothing happened. hasSelection
+    // will be the case when there is a lot of text in the textarea,
+    // in which case reading its value would be expensive.
+    if (!cm.state.focused || (hasSelection(input) && !prevInput) || isReadOnly(cm) || cm.options.disableInput)
+      return false;
+    // See paste handler for more on the fakedLastChar kludge
+    if (cm.state.pasteIncoming && cm.state.fakedLastChar) {
+      input.value = input.value.substring(0, input.value.length - 1);
+      cm.state.fakedLastChar = false;
+    }
+    var text = input.value;
+    // If nothing changed, bail.
+    if (text == prevInput && !cm.somethingSelected()) return false;
+    // Work around nonsensical selection resetting in IE9/10, and
+    // inexplicable appearance of private area unicode characters on
+    // some key combos in Mac (#2689).
+    if (ie && ie_version >= 9 && cm.display.inputHasSelection === text ||
+        mac && /[\uf700-\uf7ff]/.test(text)) {
+      resetInput(cm);
+      return false;
+    }
+
+    var withOp = !cm.curOp;
+    if (withOp) startOperation(cm);
+    cm.display.shift = false;
+
+    if (text.charCodeAt(0) == 0x200b && doc.sel == cm.display.selForContextMenu && !prevInput)
+      prevInput = "\u200b";
+    // Find the part of the input that is actually new
+    var same = 0, l = Math.min(prevInput.length, text.length);
+    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) ++same;
+    var inserted = text.slice(same), textLines = splitLines(inserted);
+
+    // When pasing N lines into N selections, insert one line per selection
+    var multiPaste = null;
+    if (cm.state.pasteIncoming && doc.sel.ranges.length > 1) {
+      if (lastCopied && lastCopied.join("\n") == inserted)
+        multiPaste = doc.sel.ranges.length % lastCopied.length == 0 && map(lastCopied, splitLines);
+      else if (textLines.length == doc.sel.ranges.length)
+        multiPaste = map(textLines, function(l) { return [l]; });
+    }
+
+    // Normal behavior is to insert the new text into every selection
+    for (var i = doc.sel.ranges.length - 1; i >= 0; i--) {
+      var range = doc.sel.ranges[i];
+      var from = range.from(), to = range.to();
+      // Handle deletion
+      if (same < prevInput.length)
+        from = Pos(from.line, from.ch - (prevInput.length - same));
+      // Handle overwrite
+      else if (cm.state.overwrite && range.empty() && !cm.state.pasteIncoming)
+        to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length));
+      var updateInput = cm.curOp.updateInput;
+      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i % multiPaste.length] : textLines,
+                         origin: cm.state.pasteIncoming ? "paste" : cm.state.cutIncoming ? "cut" : "+input"};
+      makeChange(cm.doc, changeEvent);
+      signalLater(cm, "inputRead", cm, changeEvent);
+      // When an 'electric' character is inserted, immediately trigger a reindent
+      if (inserted && !cm.state.pasteIncoming && cm.options.electricChars &&
+          cm.options.smartIndent && range.head.ch < 100 &&
+          (!i || doc.sel.ranges[i - 1].head.line != range.head.line)) {
+        var mode = cm.getModeAt(range.head);
+        var end = changeEnd(changeEvent);
+        if (mode.electricChars) {
+          for (var j = 0; j < mode.electricChars.length; j++)
+            if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
+              indentLine(cm, end.line, "smart");
+              break;
+            }
+        } else if (mode.electricInput) {
+          if (mode.electricInput.test(getLine(doc, end.line).text.slice(0, end.ch)))
+            indentLine(cm, end.line, "smart");
+        }
+      }
+    }
+    ensureCursorVisible(cm);
+    cm.curOp.updateInput = updateInput;
+    cm.curOp.typing = true;
+
+    // Don't leave long text in the textarea, since it makes further polling slow
+    if (text.length > 1000 || text.indexOf("\n") > -1) input.value = cm.display.prevInput = "";
+    else cm.display.prevInput = text;
+    if (withOp) endOperation(cm);
+    cm.state.pasteIncoming = cm.state.cutIncoming = false;
+    return true;
+  }
+
+  // Reset the input to correspond to the selection (or to be empty,
+  // when not typing and nothing is selected)
+  function resetInput(cm, typing) {
+    var minimal, selected, doc = cm.doc;
+    if (cm.somethingSelected()) {
+      cm.display.prevInput = "";
+      var range = doc.sel.primary();
+      minimal = hasCopyEvent &&
+        (range.to().line - range.from().line > 100 || (selected = cm.getSelection()).length > 1000);
+      var content = minimal ? "-" : selected || cm.getSelection();
+      cm.display.input.value = content;
+      if (cm.state.focused) selectInput(cm.display.input);
+      if (ie && ie_version >= 9) cm.display.inputHasSelection = content;
+    } else if (!typing) {
+      cm.display.prevInput = cm.display.input.value = "";
+      if (ie && ie_version >= 9) cm.display.inputHasSelection = null;
+    }
+    cm.display.inaccurateSelection = minimal;
+  }
+
+  function focusInput(cm) {
+    if (cm.options.readOnly != "nocursor" && (!mobile || activeElt() != cm.display.input))
+      cm.display.input.focus();
+  }
+
+  function ensureFocus(cm) {
+    if (!cm.state.focused) { focusInput(cm); onFocus(cm); }
+  }
+
+  function isReadOnly(cm) {
+    return cm.options.readOnly || cm.doc.cantEdit;
+  }
+
+  // EVENT HANDLERS
+
+  // Attach the necessary event handlers when initializing the editor
+  function registerEventHandlers(cm) {
+    var d = cm.display;
+    on(d.scroller, "mousedown", operation(cm, onMouseDown));
+    // Older IE's will not fire a second mousedown for a double click
+    if (ie && ie_version < 11)
+      on(d.scroller, "dblclick", operation(cm, function(e) {
+        if (signalDOMEvent(cm, e)) return;
+        var pos = posFromMouse(cm, e);
+        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) return;
+        e_preventDefault(e);
+        var word = cm.findWordAt(pos);
+        extendSelection(cm.doc, word.anchor, word.head);
+      }));
+    else
+      on(d.scroller, "dblclick", function(e) { signalDOMEvent(cm, e) || e_preventDefault(e); });
+    // Prevent normal selection in the editor (we handle our own)
+    on(d.lineSpace, "selectstart", function(e) {
+      if (!eventInWidget(d, e)) e_preventDefault(e);
+    });
+    // Some browsers fire contextmenu *after* opening the menu, at
+    // which point we can't mess with it anymore. Context menu is
+    // handled in onMouseDown for these browsers.
+    if (!captureRightClick) on(d.scroller, "contextmenu", function(e) {onContextMenu(cm, e);});
+
+    // Sync scrolling between fake scrollbars and real scrollable
+    // area, ensure viewport is updated when scrolling.
+    on(d.scroller, "scroll", function() {
+      if (d.scroller.clientHeight) {
+        setScrollTop(cm, d.scroller.scrollTop);
+        setScrollLeft(cm, d.scroller.scrollLeft, true);
+        signal(cm, "scroll", cm);
+      }
+    });
+    on(d.scrollbarV, "scroll", function() {
+      if (d.scroller.clientHeight) setScrollTop(cm, d.scrollbarV.scrollTop);
+    });
+    on(d.scrollbarH, "scroll", function() {
+      if (d.scroller.clientHeight) setScrollLeft(cm, d.scrollbarH.scrollLeft);
+    });
 
-    // Check for OS X >= 10.7. This has transparent scrollbars, so the
-    // overlaying of one scrollbar with another won't work. This is a
-    // temporary hack to simply turn off the overlay scrollbar. See
-    // issue #727.
-    if (mac_geLion) { scrollbar.style.zIndex = -2; scrollbar.style.visibility = "hidden"; }
-    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
-    else if (ie_lt8) scrollbar.style.minWidth = "18px";
-
-    // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
-    var poll = new Delayed(), highlight = new Delayed(), blinker;
-
-    // mode holds a mode API object. doc is the tree of Line objects,
-    // frontier is the point up to which the content has been parsed,
-    // and history the undo history (instance of History constructor).
-    var mode, doc = new BranchChunk([new LeafChunk([new Line("")])]), frontier = 0, focused;
-    loadMode();
-    // The selection. These are always maintained to point at valid
-    // positions. Inverted is used to remember that the user is
-    // selecting bottom-to-top.
-    var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
-    // Selection-related flags. shiftSelecting obviously tracks
-    // whether the user is holding shift.
-    var shiftSelecting, lastClick, lastDoubleClick, lastScrollTop = 0, draggingText,
-        overwrite = false, suppressEdits = false;
-    // Variables used by startOperation/endOperation to track what
-    // happened during the operation.
-    var updateInput, userSelChange, changes, textChanged, selectionChanged,
-        gutterDirty, callbacks;
-    // Current visible range (may be bigger than the view window).
-    var displayOffset = 0, showingFrom = 0, showingTo = 0, lastSizeC = 0;
-    // bracketHighlighted is used to remember that a bracket has been
-    // marked.
-    var bracketHighlighted;
-    // Tracks the maximum line length so that the horizontal scrollbar
-    // can be kept static when scrolling.
-    var maxLine = getLine(0), updateMaxLine = false, maxLineChanged = true;
-    var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
-    var goalColumn = null;
-
-    // Initialize the content.
-    operation(function(){setValue(options.value || ""); updateInput = false;})();
-    var history = new History();
-
-    // Register our event handlers.
-    connect(scroller, "mousedown", operation(onMouseDown));
-    connect(scroller, "dblclick", operation(onDoubleClick));
-    connect(lineSpace, "selectstart", e_preventDefault);
-    // Gecko browsers fire contextmenu *after* opening the menu, at
-    // which point we can't mess with it anymore. Context menu is
-    // handled in onMouseDown for Gecko.
-    if (!gecko) connect(scroller, "contextmenu", onContextMenu);
-    connect(scroller, "scroll", onScrollMain);
-    connect(scrollbar, "scroll", onScrollBar);
-    connect(scrollbar, "mousedown", function() {if (focused) setTimeout(focusInput, 0);});
-    var resizeHandler = connect(window, "resize", function() {
-      if (wrapper.parentNode) updateDisplay(true);
-      else resizeHandler();
-    }, true);
-    connect(input, "keyup", operation(onKeyUp));
-    connect(input, "input", fastPoll);
-    connect(input, "keydown", operation(onKeyDown));
-    connect(input, "keypress", operation(onKeyPress));
-    connect(input, "focus", onFocus);
-    connect(input, "blur", onBlur);
+    // Listen to wheel events in order to try and update the viewport on time.
+    on(d.scroller, "mousewheel", function(e){onScrollWheel(cm, e);});
+    on(d.scroller, "DOMMouseScroll", function(e){onScrollWheel(cm, e);});
+
+    // Prevent clicks in the scrollbars from killing focus
+    function reFocus() { if (cm.state.focused) setTimeout(bind(focusInput, cm), 0); }
+    on(d.scrollbarH, "mousedown", reFocus);
+    on(d.scrollbarV, "mousedown", reFocus);
+    // Prevent wrapper from ever scrolling
+    on(d.wrapper, "scroll", function() { d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+    on(d.input, "keyup", function(e) { onKeyUp.call(cm, e); });
+    on(d.input, "input", function() {
+      if (ie && ie_version >= 9 && cm.display.inputHasSelection) cm.display.inputHasSelection = null;
+      fastPoll(cm);
+    });
+    on(d.input, "keydown", operation(cm, onKeyDown));
+    on(d.input, "keypress", operation(cm, onKeyPress));
+    on(d.input, "focus", bind(onFocus, cm));
+    on(d.input, "blur", bind(onBlur, cm));
 
     function drag_(e) {
-      if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
-      e_stop(e);
+      if (!signalDOMEvent(cm, e)) e_stop(e);
     }
-    if (options.dragDrop) {
-      connect(scroller, "dragstart", onDragStart);
-      connect(scroller, "dragenter", drag_);
-      connect(scroller, "dragover", drag_);
-      connect(scroller, "drop", operation(onDrop));
+    if (cm.options.dragDrop) {
+      on(d.scroller, "dragstart", function(e){onDragStart(cm, e);});
+      on(d.scroller, "dragenter", drag_);
+      on(d.scroller, "dragover", drag_);
+      on(d.scroller, "drop", operation(cm, onDrop));
     }
-    connect(scroller, "paste", function(){focusInput(); fastPoll();});
-    connect(input, "paste", fastPoll);
-    connect(input, "cut", operation(function(){
-      if (!options.readOnly) replaceSelection("");
-    }));
-
-    // Needed to handle Tab key in KHTML
-    if (khtml) connect(sizer, "mouseup", function() {
-        if (document.activeElement == input) input.blur();
-        focusInput();
+    on(d.scroller, "paste", function(e) {
+      if (eventInWidget(d, e)) return;
+      cm.state.pasteIncoming = true;
+      focusInput(cm);
+      fastPoll(cm);
+    });
+    on(d.input, "paste", function() {
+      // Workaround for webkit bug https://bugs.webkit.org/show_bug.cgi?id=90206
+      // Add a char to the end of textarea before paste occur so that
+      // selection doesn't span to the end of textarea.
+      if (webkit && !cm.state.fakedLastChar && !(new Date - cm.state.lastMiddleDown < 200)) {
+        var start = d.input.selectionStart, end = d.input.selectionEnd;
+        d.input.value += "$";
+        // The selection end needs to be set before the start, otherwise there
+        // can be an intermediate non-empty selection between the two, which
+        // can override the middle-click paste buffer on linux and cause the
+        // wrong thing to get pasted.
+        d.input.selectionEnd = end;
+        d.input.selectionStart = start;
+        cm.state.fakedLastChar = true;
+      }
+      cm.state.pasteIncoming = true;
+      fastPoll(cm);
     });
 
-    // IE throws unspecified error in certain cases, when
-    // trying to access activeElement before onload
-    var hasFocus; try { hasFocus = (document.activeElement == input); } catch(e) { }
-    if (hasFocus || options.autofocus) setTimeout(onFocus, 20);
-    else onBlur();
-
-    function isLine(l) {return l >= 0 && l < doc.size;}
-    // The instance object that we'll return. Mostly calls out to
-    // local functions in the CodeMirror function. Some do some extra
-    // range checking and/or clipping. operation is used to wrap the
-    // call so that changes it makes are tracked, and the display is
-    // updated afterwards.
-    var instance = wrapper.CodeMirror = {
-      getValue: getValue,
-      setValue: operation(setValue),
-      getSelection: getSelection,
-      replaceSelection: operation(replaceSelection),
-      focus: function(){window.focus(); focusInput(); onFocus(); fastPoll();},
-      setOption: function(option, value) {
-        var oldVal = options[option];
-        options[option] = value;
-        if (option == "mode" || option == "indentUnit") loadMode();
-        else if (option == "readOnly" && value == "nocursor") {onBlur(); input.blur();}
-        else if (option == "readOnly" && !value) {resetInput(true);}
-        else if (option == "theme") themeChanged();
-        else if (option == "lineWrapping" && oldVal != value) operation(wrappingChanged)();
-        else if (option == "tabSize") updateDisplay(true);
-        else if (option == "keyMap") keyMapChanged();
-        if (option == "lineNumbers" || option == "gutter" || option == "firstLineNumber" ||
-            option == "theme" || option == "lineNumberFormatter") {
-          gutterChanged();
-          updateDisplay(true);
-        }
-      },
-      getOption: function(option) {return options[option];},
-      getMode: function() {return mode;},
-      undo: operation(undo),
-      redo: operation(redo),
-      indentLine: operation(function(n, dir) {
-        if (typeof dir != "string") {
-          if (dir == null) dir = options.smartIndent ? "smart" : "prev";
-          else dir = dir ? "add" : "subtract";
-        }
-        if (isLine(n)) indentLine(n, dir);
-      }),
-      indentSelection: operation(indentSelected),
-      historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
-      clearHistory: function() {history = new History();},
-      setHistory: function(histData) {
-        history = new History();
-        history.done = histData.done;
-        history.undone = histData.undone;
-      },
-      getHistory: function() {
-        function cp(arr) {
-          for (var i = 0, nw = [], nwelt; i < arr.length; ++i) {
-            nw.push(nwelt = []);
-            for (var j = 0, elt = arr[i]; j < elt.length; ++j) {
-              var old = [], cur = elt[j];
-              nwelt.push({start: cur.start, added: cur.added, old: old});
-              for (var k = 0; k < cur.old.length; ++k) old.push(hlText(cur.old[k]));
-            }
-          }
-          return nw;
-        }
-        return {done: cp(history.done), undone: cp(history.undone)};
-      },
-      matchBrackets: operation(function(){matchBrackets(true);}),
-      getTokenAt: operation(function(pos) {
-        pos = clipPos(pos);
-        return getLine(pos.line).getTokenAt(mode, getStateBefore(pos.line), options.tabSize, pos.ch);
-      }),
-      getStateAfter: function(line) {
-        line = clipLine(line == null ? doc.size - 1: line);
-        return getStateBefore(line + 1);
-      },
-      cursorCoords: function(start, mode) {
-        if (start == null) start = sel.inverted;
-        return this.charCoords(start ? sel.from : sel.to, mode);
-      },
-      charCoords: function(pos, mode) {
-        pos = clipPos(pos);
-        if (mode == "local") return localCoords(pos, false);
-        if (mode == "div") return localCoords(pos, true);
-        return pageCoords(pos);
-      },
-      coordsChar: function(coords) {
-        var off = eltOffset(lineSpace);
-        return coordsChar(coords.x - off.left, coords.y - off.top);
-      },
-      markText: operation(markText),
-      setBookmark: setBookmark,
-      findMarksAt: findMarksAt,
-      setMarker: operation(addGutterMarker),
-      clearMarker: operation(removeGutterMarker),
-      setLineClass: operation(setLineClass),
-      hideLine: operation(function(h) {return setLineHidden(h, true);}),
-      showLine: operation(function(h) {return setLineHidden(h, false);}),
-      onDeleteLine: function(line, f) {
-        if (typeof line == "number") {
-          if (!isLine(line)) return null;
-          line = getLine(line);
-        }
-        (line.handlers || (line.handlers = [])).push(f);
-        return line;
-      },
-      lineInfo: lineInfo,
-      getViewport: function() { return {from: showingFrom, to: showingTo};},
-      addWidget: function(pos, node, scroll, vert, horiz) {
-        pos = localCoords(clipPos(pos));
-        var top = pos.yBot, left = pos.x;
-        node.style.position = "absolute";
-        sizer.appendChild(node);
-        if (vert == "over") top = pos.y;
-        else if (vert == "near") {
-          var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
-              hspace = Math.max(sizer.clientWidth, lineSpace.clientWidth) - paddingLeft();
-          if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
-            top = pos.y - node.offsetHeight;
-          if (left + node.offsetWidth > hspace)
-            left = hspace - node.offsetWidth;
+    function prepareCopyCut(e) {
+      if (cm.somethingSelected()) {
+        lastCopied = cm.getSelections();
+        if (d.inaccurateSelection) {
+          d.prevInput = "";
+          d.inaccurateSelection = false;
+          d.input.value = lastCopied.join("\n");
+          selectInput(d.input);
         }
-        node.style.top = (top + paddingTop()) + "px";
-        node.style.left = node.style.right = "";
-        if (horiz == "right") {
-          left = sizer.clientWidth - node.offsetWidth;
-          node.style.right = "0px";
-        } else {
-          if (horiz == "left") left = 0;
-          else if (horiz == "middle") left = (sizer.clientWidth - node.offsetWidth) / 2;
-          node.style.left = (left + paddingLeft()) + "px";
+      } else {
+        var text = [], ranges = [];
+        for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
+          var line = cm.doc.sel.ranges[i].head.line;
+          var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
+          ranges.push(lineRange);
+          text.push(cm.getRange(lineRange.anchor, lineRange.head));
         }
-        if (scroll)
-          scrollIntoView(left, top, left + node.offsetWidth, top + node.offsetHeight);
-      },
-
-      lineCount: function() {return doc.size;},
-      clipPos: clipPos,
-      getCursor: function(start) {
-        if (start == null) start = sel.inverted;
-        return copyPos(start ? sel.from : sel.to);
-      },
-      somethingSelected: function() {return !posEq(sel.from, sel.to);},
-      setCursor: operation(function(line, ch, user) {
-        if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch, user);
-        else setCursor(line, ch, user);
-      }),
-      setSelection: operation(function(from, to, user) {
-        (user ? setSelectionUser : setSelection)(clipPos(from), clipPos(to || from));
-      }),
-      getLine: function(line) {if (isLine(line)) return getLine(line).text;},
-      getLineHandle: function(line) {if (isLine(line)) return getLine(line);},
-      setLine: operation(function(line, text) {
-        if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: getLine(line).text.length});
-      }),
-      removeLine: operation(function(line) {
-        if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
-      }),
-      replaceRange: operation(replaceRange),
-      getRange: function(from, to, lineSep) {return getRange(clipPos(from), clipPos(to), lineSep);},
-
-      triggerOnKeyDown: operation(onKeyDown),
-      execCommand: function(cmd) {return commands[cmd](instance);},
-      // Stuff used by commands, probably not much use to outside code.
-      moveH: operation(moveH),
-      deleteH: operation(deleteH),
-      moveV: operation(moveV),
-      toggleOverwrite: function() {
-        if(overwrite){
-          overwrite = false;
-          cursor.className = cursor.className.replace(" CodeMirror-overwrite", "");
+        if (e.type == "cut") {
+          cm.setSelections(ranges, null, sel_dontScroll);
         } else {
-          overwrite = true;
-          cursor.className += " CodeMirror-overwrite";
-        }
-      },
-
-      posFromIndex: function(off) {
-        var lineNo = 0, ch;
-        doc.iter(0, doc.size, function(line) {
-          var sz = line.text.length + 1;
-          if (sz > off) { ch = off; return true; }
-          off -= sz;
-          ++lineNo;
-        });
-        return clipPos({line: lineNo, ch: ch});
-      },
-      indexFromPos: function (coords) {
-        if (coords.line < 0 || coords.ch < 0) return 0;
-        var index = coords.ch;
-        doc.iter(0, coords.line, function (line) {
-          index += line.text.length + 1;
-        });
-        return index;
-      },
-      scrollTo: function(x, y) {
-        if (x != null) scroller.scrollLeft = x;
-        if (y != null) scrollbar.scrollTop = scroller.scrollTop = y;
-        updateDisplay([]);
-      },
-      getScrollInfo: function() {
-        return {x: scroller.scrollLeft, y: scrollbar.scrollTop,
-                height: scrollbar.scrollHeight, width: scroller.scrollWidth};
-      },
-      setSize: function(width, height) {
-        function interpret(val) {
-          val = String(val);
-          return /^\d+$/.test(val) ? val + "px" : val;
+          d.prevInput = "";
+          d.input.value = text.join("\n");
+          selectInput(d.input);
         }
-        if (width != null) wrapper.style.width = interpret(width);
-        if (height != null) scroller.style.height = interpret(height);
-        instance.refresh();
-      },
-
-      operation: function(f){return operation(f)();},
-      compoundChange: function(f){return compoundChange(f);},
-      refresh: function(){
-        updateDisplay(true, null, lastScrollTop);
-        if (scrollbar.scrollHeight > lastScrollTop)
-          scrollbar.scrollTop = lastScrollTop;
-      },
-      getInputField: function(){return input;},
-      getWrapperElement: function(){return wrapper;},
-      getScrollerElement: function(){return scroller;},
-      getGutterElement: function(){return gutter;}
-    };
-
-    function getLine(n) { return getLineAt(doc, n); }
-    function updateLineHeight(line, height) {
-      gutterDirty = true;
-      var diff = height - line.height;
-      for (var n = line; n; n = n.parent) n.height += diff;
+        lastCopied = text;
+      }
+      if (e.type == "cut") cm.state.cutIncoming = true;
     }
+    on(d.input, "cut", prepareCopyCut);
+    on(d.input, "copy", prepareCopyCut);
 
-    function lineContent(line, wrapAt) {
-      if (!line.styles)
-        line.highlight(mode, line.stateAfter = getStateBefore(lineNo(line)), options.tabSize);
-      return line.getContent(options.tabSize, wrapAt, options.lineWrapping);
+    // Needed to handle Tab key in KHTML
+    if (khtml) on(d.sizer, "mouseup", function() {
+      if (activeElt() == d.input) d.input.blur();
+      focusInput(cm);
+    });
+  }
+
+  // Called when the window resizes
+  function onResize(cm) {
+    // Might be a text scaling operation, clear size caches.
+    var d = cm.display;
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+    cm.setSize();
+  }
+
+  // MOUSE EVENTS
+
+  // Return true when the given mouse event happened in a widget
+  function eventInWidget(display, e) {
+    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+      if (!n || n.ignoreEvents || n.parentNode == display.sizer && n != display.mover) return true;
     }
+  }
 
-    function setValue(code) {
-      var top = {line: 0, ch: 0};
-      updateLines(top, {line: doc.size - 1, ch: getLine(doc.size-1).text.length},
-                  splitLines(code), top, top);
-      updateInput = true;
+  // Given a mouse event, find the corresponding position. If liberal
+  // is false, it checks whether a gutter or scrollbar was clicked,
+  // and returns null if it was. forRect is used by rectangular
+  // selections, and tries to estimate a character position even for
+  // coordinates beyond the right of the text.
+  function posFromMouse(cm, e, liberal, forRect) {
+    var display = cm.display;
+    if (!liberal) {
+      var target = e_target(e);
+      if (target == display.scrollbarH || target == display.scrollbarV ||
+          target == display.scrollbarFiller || target == display.gutterFiller) return null;
     }
-    function getValue(lineSep) {
-      var text = [];
-      doc.iter(0, doc.size, function(line) { text.push(line.text); });
-      return text.join(lineSep || "\n");
+    var x, y, space = display.lineSpace.getBoundingClientRect();
+    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+    try { x = e.clientX - space.left; y = e.clientY - space.top; }
+    catch (e) { return null; }
+    var coords = coordsChar(cm, x, y), line;
+    if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
+      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
+      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
     }
+    return coords;
+  }
 
-    function onScrollBar(e) {
-      if (scrollbar.scrollTop != lastScrollTop) {
-        lastScrollTop = scroller.scrollTop = scrollbar.scrollTop;
-        updateDisplay([]);
+  // A mouse down can be a single click, double click, triple click,
+  // start of selection drag, start of text drag, new cursor
+  // (ctrl-click), rectangle drag (alt-drag), or xwin
+  // middle-click-paste. Or it might be a click on something we should
+  // not interfere with, such as a scrollbar or widget.
+  function onMouseDown(e) {
+    if (signalDOMEvent(this, e)) return;
+    var cm = this, display = cm.display;
+    display.shift = e.shiftKey;
+
+    if (eventInWidget(display, e)) {
+      if (!webkit) {
+        // Briefly turn off draggability, to allow widgets to do
+        // normal dragging things.
+        display.scroller.draggable = false;
+        setTimeout(function(){display.scroller.draggable = true;}, 100);
       }
+      return;
+    }
+    if (clickInGutter(cm, e)) return;
+    var start = posFromMouse(cm, e);
+    window.focus();
+
+    switch (e_button(e)) {
+    case 1:
+      if (start)
+        leftButtonDown(cm, e, start);
+      else if (e_target(e) == display.scroller)
+        e_preventDefault(e);
+      break;
+    case 2:
+      if (webkit) cm.state.lastMiddleDown = +new Date;
+      if (start) extendSelection(cm.doc, start);
+      setTimeout(bind(focusInput, cm), 20);
+      e_preventDefault(e);
+      break;
+    case 3:
+      if (captureRightClick) onContextMenu(cm, e);
+      break;
+    }
+  }
+
+  var lastClick, lastDoubleClick;
+  function leftButtonDown(cm, e, start) {
+    setTimeout(bind(ensureFocus, cm), 0);
+
+    var now = +new Date, type;
+    if (lastDoubleClick && lastDoubleClick.time > now - 400 && cmp(lastDoubleClick.pos, start) == 0) {
+      type = "triple";
+    } else if (lastClick && lastClick.time > now - 400 && cmp(lastClick.pos, start) == 0) {
+      type = "double";
+      lastDoubleClick = {time: now, pos: start};
+    } else {
+      type = "single";
+      lastClick = {time: now, pos: start};
     }
 
-    function onScrollMain(e) {
-      if (options.fixedGutter && gutter.style.left != scroller.scrollLeft + "px")
-        gutter.style.left = scroller.scrollLeft + "px";
-      if (scroller.scrollTop != lastScrollTop) {
-        lastScrollTop = scroller.scrollTop;
-        if (scrollbar.scrollTop != lastScrollTop)
-          scrollbar.scrollTop = lastScrollTop;
-        updateDisplay([]);
+    var sel = cm.doc.sel, modifier = mac ? e.metaKey : e.ctrlKey;
+    if (cm.options.dragDrop && dragAndDrop && !isReadOnly(cm) &&
+        type == "single" && sel.contains(start) > -1 && sel.somethingSelected())
+      leftButtonStartDrag(cm, e, start, modifier);
+    else
+      leftButtonSelect(cm, e, start, type, modifier);
+  }
+
+  // Start a text drag. When it ends, see if any dragging actually
+  // happen, and treat as a click if it didn't.
+  function leftButtonStartDrag(cm, e, start, modifier) {
+    var display = cm.display;
+    var dragEnd = operation(cm, function(e2) {
+      if (webkit) display.scroller.draggable = false;
+      cm.state.draggingText = false;
+      off(document, "mouseup", dragEnd);
+      off(display.scroller, "drop", dragEnd);
+      if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
+        e_preventDefault(e2);
+        if (!modifier)
+          extendSelection(cm.doc, start);
+        focusInput(cm);
+        // Work around unexplainable focus problem in IE9 (#2127)
+        if (ie && ie_version == 9)
+          setTimeout(function() {document.body.focus(); focusInput(cm);}, 20);
       }
-      if (options.onScroll) options.onScroll(instance);
+    });
+    // Let the drag handler handle this.
+    if (webkit) display.scroller.draggable = true;
+    cm.state.draggingText = dragEnd;
+    // IE's approach to draggable
+    if (display.scroller.dragDrop) display.scroller.dragDrop();
+    on(document, "mouseup", dragEnd);
+    on(display.scroller, "drop", dragEnd);
+  }
+
+  // Normal selection, as opposed to text dragging.
+  function leftButtonSelect(cm, e, start, type, addNew) {
+    var display = cm.display, doc = cm.doc;
+    e_preventDefault(e);
+
+    var ourRange, ourIndex, startSel = doc.sel;
+    if (addNew && !e.shiftKey) {
+      ourIndex = doc.sel.contains(start);
+      if (ourIndex > -1)
+        ourRange = doc.sel.ranges[ourIndex];
+      else
+        ourRange = new Range(start, start);
+    } else {
+      ourRange = doc.sel.primary();
+    }
+
+    if (e.altKey) {
+      type = "rect";
+      if (!addNew) ourRange = new Range(start, start);
+      start = posFromMouse(cm, e, true, true);
+      ourIndex = -1;
+    } else if (type == "double") {
+      var word = cm.findWordAt(start);
+      if (cm.display.shift || doc.extend)
+        ourRange = extendRange(doc, ourRange, word.anchor, word.head);
+      else
+        ourRange = word;
+    } else if (type == "triple") {
+      var line = new Range(Pos(start.line, 0), clipPos(doc, Pos(start.line + 1, 0)));
+      if (cm.display.shift || doc.extend)
+        ourRange = extendRange(doc, ourRange, line.anchor, line.head);
+      else
+        ourRange = line;
+    } else {
+      ourRange = extendRange(doc, ourRange, start);
     }
 
-    function onMouseDown(e) {
-      setShift(e_prop(e, "shiftKey"));
-      // Check whether this is a click in a widget
-      for (var n = e_target(e); n != wrapper; n = n.parentNode)
-        if (n.parentNode == sizer && n != mover) return;
+    if (!addNew) {
+      ourIndex = 0;
+      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
+      startSel = doc.sel;
+    } else if (ourIndex > -1) {
+      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
+    } else {
+      ourIndex = doc.sel.ranges.length;
+      setSelection(doc, normalizeSelection(doc.sel.ranges.concat([ourRange]), ourIndex),
+                   {scroll: false, origin: "*mouse"});
+    }
 
-      // See if this is a click in the gutter
-      for (var n = e_target(e); n != wrapper; n = n.parentNode)
-        if (n.parentNode == gutterText) {
-          if (options.onGutterClick)
-            options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom, e);
-          return e_preventDefault(e);
+    var lastPos = start;
+    function extendTo(pos) {
+      if (cmp(lastPos, pos) == 0) return;
+      lastPos = pos;
+
+      if (type == "rect") {
+        var ranges = [], tabSize = cm.options.tabSize;
+        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
+        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
+        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
+        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
+             line <= end; line++) {
+          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
+          if (left == right)
+            ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos)));
+          else if (text.length > leftPos)
+            ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize))));
         }
+        if (!ranges.length) ranges.push(new Range(start, start));
+        setSelection(doc, normalizeSelection(startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
+                     {origin: "*mouse", scroll: false});
+        cm.scrollIntoView(pos);
+      } else {
+        var oldRange = ourRange;
+        var anchor = oldRange.anchor, head = pos;
+        if (type != "single") {
+          if (type == "double")
+            var range = cm.findWordAt(pos);
+          else
+            var range = new Range(Pos(pos.line, 0), clipPos(doc, Pos(pos.line + 1, 0)));
+          if (cmp(range.anchor, anchor) > 0) {
+            head = range.head;
+            anchor = minPos(oldRange.from(), range.anchor);
+          } else {
+            head = range.anchor;
+            anchor = maxPos(oldRange.to(), range.head);
+          }
+        }
+        var ranges = startSel.ranges.slice(0);
+        ranges[ourIndex] = new Range(clipPos(doc, anchor), head);
+        setSelection(doc, normalizeSelection(ranges, ourIndex), sel_mouse);
+      }
+    }
 
-      var start = posFromMouse(e);
-
-      switch (e_button(e)) {
-      case 3:
-        if (gecko) onContextMenu(e);
-        return;
-      case 2:
-        if (start) setCursor(start.line, start.ch, true);
-        setTimeout(focusInput, 20);
-        e_preventDefault(e);
-        return;
+    var editorSize = display.wrapper.getBoundingClientRect();
+    // Used to ensure timeout re-tries don't fire when another extend
+    // happened in the meantime (clearTimeout isn't reliable -- at
+    // least on Chrome, the timeouts still happen even when cleared,
+    // if the clear happens after their scheduled firing time).
+    var counter = 0;
+
+    function extend(e) {
+      var curCount = ++counter;
+      var cur = posFromMouse(cm, e, true, type == "rect");
+      if (!cur) return;
+      if (cmp(cur, lastPos) != 0) {
+        ensureFocus(cm);
+        extendTo(cur);
+        var visible = visibleLines(display, doc);
+        if (cur.line >= visible.to || cur.line < visible.from)
+          setTimeout(operation(cm, function(){if (counter == curCount) extend(e);}), 150);
+      } else {
+        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+        if (outside) setTimeout(operation(cm, function() {
+          if (counter != curCount) return;
+          display.scroller.scrollTop += outside;
+          extend(e);
+        }), 50);
       }
-      // For button 1, if it was clicked inside the editor
-      // (posFromMouse returning non-null), we have to adjust the
-      // selection.
-      if (!start) {if (e_target(e) == scroller) e_preventDefault(e); return;}
+    }
 
-      if (!focused) onFocus();
+    function done(e) {
+      counter = Infinity;
+      e_preventDefault(e);
+      focusInput(cm);
+      off(document, "mousemove", move);
+      off(document, "mouseup", up);
+      doc.history.lastSelOrigin = null;
+    }
 
-      var now = +new Date, type = "single";
-      if (lastDoubleClick && lastDoubleClick.time > now - 400 && posEq(lastDoubleClick.pos, start)) {
-        type = "triple";
-        e_preventDefault(e);
-        setTimeout(focusInput, 20);
-        selectLine(start.line);
-      } else if (lastClick && lastClick.time > now - 400 && posEq(lastClick.pos, start)) {
-        type = "double";
-        lastDoubleClick = {time: now, pos: start};
-        e_preventDefault(e);
-        var word = findWordAt(start);
-        setSelectionUser(word.from, word.to);
-      } else { lastClick = {time: now, pos: start}; }
-
-      function dragEnd(e2) {
-        if (webkit) scroller.draggable = false;
-        draggingText = false;
-        up(); drop();
-        if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
-          e_preventDefault(e2);
-          setCursor(start.line, start.ch, true);
-          focusInput();
-        }
+    var move = operation(cm, function(e) {
+      if (!e_button(e)) done(e);
+      else extend(e);
+    });
+    var up = operation(cm, done);
+    on(document, "mousemove", move);
+    on(document, "mouseup", up);
+  }
+
+  // Determines whether an event happened in the gutter, and fires the
+  // handlers for the corresponding event.
+  function gutterEvent(cm, e, type, prevent, signalfn) {
+    try { var mX = e.clientX, mY = e.clientY; }
+    catch(e) { return false; }
+    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) return false;
+    if (prevent) e_preventDefault(e);
+
+    var display = cm.display;
+    var lineBox = display.lineDiv.getBoundingClientRect();
+
+    if (mY > lineBox.bottom || !hasHandler(cm, type)) return e_defaultPrevented(e);
+    mY -= lineBox.top - display.viewOffset;
+
+    for (var i = 0; i < cm.options.gutters.length; ++i) {
+      var g = display.gutters.childNodes[i];
+      if (g && g.getBoundingClientRect().right >= mX) {
+        var line = lineAtHeight(cm.doc, mY);
+        var gutter = cm.options.gutters[i];
+        signalfn(cm, type, cm, line, gutter, e);
+        return e_defaultPrevented(e);
       }
-      var last = start, going;
-      if (options.dragDrop && dragAndDrop && !options.readOnly && !posEq(sel.from, sel.to) &&
-          !posLess(start, sel.from) && !posLess(sel.to, start) && type == "single") {
-        // Let the drag handler handle this.
-        if (webkit) scroller.draggable = true;
-        var up = connect(document, "mouseup", operation(dragEnd), true);
-        var drop = connect(scroller, "drop", operation(dragEnd), true);
-        draggingText = true;
-        // IE's approach to draggable
-        if (scroller.dragDrop) scroller.dragDrop();
+    }
+  }
+
+  function clickInGutter(cm, e) {
+    return gutterEvent(cm, e, "gutterClick", true, signalLater);
+  }
+
+  // Kludge to work around strange IE behavior where it'll sometimes
+  // re-fire a series of drag-related events right after the drop (#1551)
+  var lastDrop = 0;
+
+  function onDrop(e) {
+    var cm = this;
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
+      return;
+    e_preventDefault(e);
+    if (ie) lastDrop = +new Date;
+    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+    if (!pos || isReadOnly(cm)) return;
+    // Might be a file drop, in which case we simply extract the text
+    // and insert it.
+    if (files && files.length && window.FileReader && window.File) {
+      var n = files.length, text = Array(n), read = 0;
+      var loadFile = function(file, i) {
+        var reader = new FileReader;
+        reader.onload = operation(cm, function() {
+          text[i] = reader.result;
+          if (++read == n) {
+            pos = clipPos(cm.doc, pos);
+            var change = {from: pos, to: pos, text: splitLines(text.join("\n")), origin: "paste"};
+            makeChange(cm.doc, change);
+            setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change)));
+          }
+        });
+        reader.readAsText(file);
+      };
+      for (var i = 0; i < n; ++i) loadFile(files[i], i);
+    } else { // Normal drop
+      // Don't do a replace if the drop happened inside of the selected text.
+      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
+        cm.state.draggingText(e);
+        // Ensure the editor is re-focused
+        setTimeout(bind(focusInput, cm), 20);
         return;
       }
-      e_preventDefault(e);
-      if (type == "single") setCursor(start.line, start.ch, true);
-
-      var startstart = sel.from, startend = sel.to;
-
-      function doSelect(cur) {
-        if (type == "single") {
-          setSelectionUser(start, cur);
-        } else if (type == "double") {
-          var word = findWordAt(cur);
-          if (posLess(cur, startstart)) setSelectionUser(word.from, startend);
-          else setSelectionUser(startstart, word.to);
-        } else if (type == "triple") {
-          if (posLess(cur, startstart)) setSelectionUser(startend, clipPos({line: cur.line, ch: 0}));
-          else setSelectionUser(startstart, clipPos({line: cur.line + 1, ch: 0}));
+      try {
+        var text = e.dataTransfer.getData("Text");
+        if (text) {
+          if (cm.state.draggingText && !(mac ? e.metaKey : e.ctrlKey))
+            var selected = cm.listSelections();
+          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
+          if (selected) for (var i = 0; i < selected.length; ++i)
+            replaceRange(cm.doc, "", selected[i].anchor, selected[i].head, "drag");
+          cm.replaceSelection(text, "around", "paste");
+          focusInput(cm);
         }
       }
+      catch(e){}
+    }
+  }
 
-      function extend(e) {
-        var cur = posFromMouse(e, true);
-        if (cur && !posEq(cur, last)) {
-          if (!focused) onFocus();
-          last = cur;
-          doSelect(cur);
-          updateInput = false;
-          var visible = visibleLines();
-          if (cur.line >= visible.to || cur.line < visible.from)
-            going = setTimeout(operation(function(){extend(e);}), 150);
-        }
+  function onDragStart(cm, e) {
+    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return; }
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) return;
+
+    e.dataTransfer.setData("Text", cm.getSelection());
+
+    // Use dummy image instead of default browsers image.
+    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+    if (e.dataTransfer.setDragImage && !safari) {
+      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+      if (presto) {
+        img.width = img.height = 1;
+        cm.display.wrapper.appendChild(img);
+        // Force a relayout, or Opera won't use our image for some obscure reason
+        img._top = img.offsetTop;
       }
+      e.dataTransfer.setDragImage(img, 0, 0);
+      if (presto) img.parentNode.removeChild(img);
+    }
+  }
 
-      function done(e) {
-        clearTimeout(going);
-        var cur = posFromMouse(e);
-        if (cur) doSelect(cur);
-        e_preventDefault(e);
-        focusInput();
-        updateInput = true;
-        move(); up();
+  // SCROLL EVENTS
+
+  // Sync the scrollable area and scrollbars, ensure the viewport
+  // covers the visible area.
+  function setScrollTop(cm, val) {
+    if (Math.abs(cm.doc.scrollTop - val) < 2) return;
+    cm.doc.scrollTop = val;
+    if (!gecko) updateDisplaySimple(cm, {top: val});
+    if (cm.display.scroller.scrollTop != val) cm.display.scroller.scrollTop = val;
+    if (cm.display.scrollbarV.scrollTop != val) cm.display.scrollbarV.scrollTop = val;
+    if (gecko) updateDisplaySimple(cm);
+    startWorker(cm, 100);
+  }
+  // Sync scroller and scrollbar, ensure the gutter elements are
+  // aligned.
+  function setScrollLeft(cm, val, isScroller) {
+    if (isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) return;
+    val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth);
+    cm.doc.scrollLeft = val;
+    alignHorizontally(cm);
+    if (cm.display.scroller.scrollLeft != val) cm.display.scroller.scrollLeft = val;
+    if (cm.display.scrollbarH.scrollLeft != val) cm.display.scrollbarH.scrollLeft = val;
+  }
+
+  // Since the delta values reported on mouse wheel events are
+  // unstandardized between browsers and even browser versions, and
+  // generally horribly unpredictable, this code starts by measuring
+  // the scroll effect that the first few mouse wheel events have,
+  // and, from that, detects the way it can convert deltas to pixel
+  // offsets afterwards.
+  //
+  // The reason we want to know the amount a wheel event will scroll
+  // is that it gives us a chance to update the display before the
+  // actual scrolling happens, reducing flickering.
+
+  var wheelSamples = 0, wheelPixelsPerUnit = null;
+  // Fill in a browser-detected starting value on browsers where we
+  // know one. These don't have to be accurate -- the result of them
+  // being wrong would just be a slight flicker on the first wheel
+  // scroll (if it is large enough).
+  if (ie) wheelPixelsPerUnit = -.53;
+  else if (gecko) wheelPixelsPerUnit = 15;
+  else if (chrome) wheelPixelsPerUnit = -.7;
+  else if (safari) wheelPixelsPerUnit = -1/3;
+
+  function onScrollWheel(cm, e) {
+    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) dx = e.detail;
+    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) dy = e.detail;
+    else if (dy == null) dy = e.wheelDelta;
+
+    var display = cm.display, scroll = display.scroller;
+    // Quit if there's nothing to scroll here
+    if (!(dx && scroll.scrollWidth > scroll.clientWidth ||
+          dy && scroll.scrollHeight > scroll.clientHeight)) return;
+
+    // Webkit browsers on OS X abort momentum scrolls when the target
+    // of the scroll event is removed from the scrollable element.
+    // This hack (see related code in patchDisplay) makes sure the
+    // element is kept around.
+    if (dy && mac && webkit) {
+      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
+        for (var i = 0; i < view.length; i++) {
+          if (view[i].node == cur) {
+            cm.display.currentWheelTarget = cur;
+            break outer;
+          }
+        }
       }
-      var move = connect(document, "mousemove", operation(function(e) {
-        clearTimeout(going);
-        e_preventDefault(e);
-        if (!ie && !e_button(e)) done(e);
-        else extend(e);
-      }), true);
-      var up = connect(document, "mouseup", operation(done), true);
-    }
-    function onDoubleClick(e) {
-      for (var n = e_target(e); n != wrapper; n = n.parentNode)
-        if (n.parentNode == gutterText) return e_preventDefault(e);
-      e_preventDefault(e);
     }
-    function onDrop(e) {
-      if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return;
+
+    // On some browsers, horizontal scrolling will cause redraws to
+    // happen before the gutter has been realigned, causing it to
+    // wriggle around in a most unseemly way. When we have an
+    // estimated pixels/delta value, we just handle horizontal
+    // scrolling entirely here. It'll be slightly off from native, but
+    // better than glitching out.
+    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
+      if (dy)
+        setScrollTop(cm, Math.max(0, Math.min(scroll.scrollTop + dy * wheelPixelsPerUnit, scroll.scrollHeight - scroll.clientHeight)));
+      setScrollLeft(cm, Math.max(0, Math.min(scroll.scrollLeft + dx * wheelPixelsPerUnit, scroll.scrollWidth - scroll.clientWidth)));
       e_preventDefault(e);
-      var pos = posFromMouse(e, true), files = e.dataTransfer.files;
-      if (!pos || options.readOnly) return;
-      if (files && files.length && window.FileReader && window.File) {
-        var n = files.length, text = Array(n), read = 0;
-        var loadFile = function(file, i) {
-          var reader = new FileReader;
-          reader.onload = function() {
-            text[i] = reader.result;
-            if (++read == n) {
-              pos = clipPos(pos);
-              operation(function() {
-                var end = replaceRange(text.join(""), pos, pos);
-                setSelectionUser(pos, end);
-              })();
-            }
-          };
-          reader.readAsText(file);
-        };
-        for (var i = 0; i < n; ++i) loadFile(files[i], i);
+      display.wheelStartX = null; // Abort measurement, if in progress
+      return;
+    }
+
+    // 'Project' the visible viewport to cover the area that is being
+    // scrolled into view (if we know enough to estimate it).
+    if (dy && wheelPixelsPerUnit != null) {
+      var pixels = dy * wheelPixelsPerUnit;
+      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+      if (pixels < 0) top = Math.max(0, top + pixels - 50);
+      else bot = Math.min(cm.doc.height, bot + pixels + 50);
+      updateDisplaySimple(cm, {top: top, bottom: bot});
+    }
+
+    if (wheelSamples < 20) {
+      if (display.wheelStartX == null) {
+        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+        display.wheelDX = dx; display.wheelDY = dy;
+        setTimeout(function() {
+          if (display.wheelStartX == null) return;
+          var movedX = scroll.scrollLeft - display.wheelStartX;
+          var movedY = scroll.scrollTop - display.wheelStartY;
+          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+            (movedX && display.wheelDX && movedX / display.wheelDX);
+          display.wheelStartX = display.wheelStartY = null;
+          if (!sample) return;
+          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+          ++wheelSamples;
+        }, 200);
       } else {
-        // Don't do a replace if the drop happened inside of the selected text.
-        if (draggingText && !(posLess(pos, sel.from) || posLess(sel.to, pos))) return;
-        try {
-          var text = e.dataTransfer.getData("Text");
-          if (text) {
-            compoundChange(function() {
-              var curFrom = sel.from, curTo = sel.to;
-              setSelectionUser(pos, pos);
-              if (draggingText) replaceRange("", curFrom, curTo);
-              replaceSelection(text);
-              focusInput();
-            });
-          }
-        }
-        catch(e){}
+        display.wheelDX += dx; display.wheelDY += dy;
       }
     }
-    function onDragStart(e) {
-      var txt = getSelection();
-      e.dataTransfer.setData("Text", txt);
+  }
 
-      // Use dummy image instead of default browsers image.
-      if (e.dataTransfer.setDragImage)
-        e.dataTransfer.setDragImage(elt('img'), 0, 0);
+  // KEY EVENTS
+
+  // Run a handler that was bound to a key.
+  function doHandleBinding(cm, bound, dropShift) {
+    if (typeof bound == "string") {
+      bound = commands[bound];
+      if (!bound) return false;
+    }
+    // Ensure previous input has been read, so that the handler sees a
+    // consistent view of the document
+    if (cm.display.pollingFast && readInput(cm)) cm.display.pollingFast = false;
+    var prevShift = cm.display.shift, done = false;
+    try {
+      if (isReadOnly(cm)) cm.state.suppressEdits = true;
+      if (dropShift) cm.display.shift = false;
+      done = bound(cm) != Pass;
+    } finally {
+      cm.display.shift = prevShift;
+      cm.state.suppressEdits = false;
     }
+    return done;
+  }
+
+  // Collect the currently active keymaps.
+  function allKeyMaps(cm) {
+    var maps = cm.state.keyMaps.slice(0);
+    if (cm.options.extraKeys) maps.push(cm.options.extraKeys);
+    maps.push(cm.options.keyMap);
+    return maps;
+  }
 
-    function doHandleBinding(bound, dropShift) {
-      if (typeof bound == "string") {
-        bound = commands[bound];
-        if (!bound) return false;
+  var maybeTransition;
+  // Handle a key from the keydown event.
+  function handleKeyBinding(cm, e) {
+    // Handle automatic keymap transitions
+    var startMap = getKeyMap(cm.options.keyMap), next = startMap.auto;
+    clearTimeout(maybeTransition);
+    if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
+      if (getKeyMap(cm.options.keyMap) == startMap) {
+        cm.options.keyMap = (next.call ? next.call(null, cm) : next);
+        keyMapChanged(cm);
       }
-      var prevShift = shiftSelecting;
-      try {
-        if (options.readOnly) suppressEdits = true;
-        if (dropShift) shiftSelecting = null;
-        bound(instance);
-      } catch(e) {
-        if (e != Pass) throw e;
-        return false;
-      } finally {
-        shiftSelecting = prevShift;
-        suppressEdits = false;
+    }, 50);
+
+    var name = keyName(e, true), handled = false;
+    if (!name) return false;
+    var keymaps = allKeyMaps(cm);
+
+    if (e.shiftKey) {
+      // First try to resolve full name (including 'Shift-'). Failing
+      // that, see if there is a cursor-motion command (starting with
+      // 'go') bound to the keyname without 'Shift-'.
+      handled = lookupKey("Shift-" + name, keymaps, function(b) {return doHandleBinding(cm, b, true);})
+             || lookupKey(name, keymaps, function(b) {
+                  if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+                    return doHandleBinding(cm, b);
+                });
+    } else {
+      handled = lookupKey(name, keymaps, function(b) { return doHandleBinding(cm, b); });
+    }
+
+    if (handled) {
+      e_preventDefault(e);
+      restartBlink(cm);
+      signalLater(cm, "keyHandled", cm, name, e);
+    }
+    return handled;
+  }
+
+  // Handle a key from the keypress event
+  function handleCharBinding(cm, e, ch) {
+    var handled = lookupKey("'" + ch + "'", allKeyMaps(cm),
+                            function(b) { return doHandleBinding(cm, b, true); });
+    if (handled) {
+      e_preventDefault(e);
+      restartBlink(cm);
+      signalLater(cm, "keyHandled", cm, "'" + ch + "'", e);
+    }
+    return handled;
+  }
+
+  var lastStoppedKey = null;
+  function onKeyDown(e) {
+    var cm = this;
+    ensureFocus(cm);
+    if (signalDOMEvent(cm, e)) return;
+    // IE does strange things with escape.
+    if (ie && ie_version < 11 && e.keyCode == 27) e.returnValue = false;
+    var code = e.keyCode;
+    cm.display.shift = code == 16 || e.shiftKey;
+    var handled = handleKeyBinding(cm, e);
+    if (presto) {
+      lastStoppedKey = handled ? code : null;
+      // Opera has no cut event... we try to at least catch the key combo
+      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
+        cm.replaceSelection("", null, "cut");
+    }
+
+    // Turn mouse into crosshair when Alt is held on Mac.
+    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
+      showCrossHair(cm);
+  }
+
+  function showCrossHair(cm) {
+    var lineDiv = cm.display.lineDiv;
+    addClass(lineDiv, "CodeMirror-crosshair");
+
+    function up(e) {
+      if (e.keyCode == 18 || !e.altKey) {
+        rmClass(lineDiv, "CodeMirror-crosshair");
+        off(document, "keyup", up);
+        off(document, "mouseover", up);
       }
-      return true;
     }
-    var maybeTransition;
-    function handleKeyBinding(e) {
-      // Handle auto keymap transitions
-      var startMap = getKeyMap(options.keyMap), next = startMap.auto;
-      clearTimeout(maybeTransition);
-      if (next && !isModifierKey(e)) maybeTransition = setTimeout(function() {
-        if (getKeyMap(options.keyMap) == startMap) {
-          options.keyMap = (next.call ? next.call(null, instance) : next);
-        }
-      }, 50);
-
-      var name = keyNames[e_prop(e, "keyCode")], handled = false;
-      var flipCtrlCmd = opera && mac;
-      if (name == null || e.altGraphKey) return false;
-      if (e_prop(e, "altKey")) name = "Alt-" + name;
-      if (e_prop(e, flipCtrlCmd ? "metaKey" : "ctrlKey")) name = "Ctrl-" + name;
-      if (e_prop(e, flipCtrlCmd ? "ctrlKey" : "metaKey")) name = "Cmd-" + name;
-
-      var stopped = false;
-      function stop() { stopped = true; }
-
-      if (e_prop(e, "shiftKey")) {
-        handled = lookupKey("Shift-" + name, options.extraKeys, options.keyMap,
-                            function(b) {return doHandleBinding(b, true);}, stop)
-               || lookupKey(name, options.extraKeys, options.keyMap, function(b) {
-                 if (typeof b == "string" && /^go[A-Z]/.test(b)) return doHandleBinding(b);
-               }, stop);
-      } else {
-        handled = lookupKey(name, options.extraKeys, options.keyMap, doHandleBinding, stop);
+    on(document, "keyup", up);
+    on(document, "mouseover", up);
+  }
+
+  function onKeyUp(e) {
+    if (e.keyCode == 16) this.doc.sel.shift = false;
+    signalDOMEvent(this, e);
+  }
+
+  function onKeyPress(e) {
+    var cm = this;
+    if (signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) return;
+    var keyCode = e.keyCode, charCode = e.charCode;
+    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
+    if (((presto && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(cm, e)) return;
+    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+    if (handleCharBinding(cm, e, ch)) return;
+    if (ie && ie_version >= 9) cm.display.inputHasSelection = null;
+    fastPoll(cm);
+  }
+
+  // FOCUS/BLUR EVENTS
+
+  function onFocus(cm) {
+    if (cm.options.readOnly == "nocursor") return;
+    if (!cm.state.focused) {
+      signal(cm, "focus", cm);
+      cm.state.focused = true;
+      addClass(cm.display.wrapper, "CodeMirror-focused");
+      // The prevInput test prevents this from firing when a context
+      // menu is closed (since the resetInput would kill the
+      // select-all detection hack)
+      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
+        resetInput(cm);
+        if (webkit) setTimeout(bind(resetInput, cm, true), 0); // Issue #1730
       }
-      if (stopped) handled = false;
-      if (handled) {
-        e_preventDefault(e);
-        restartBlink();
-        if (ie) { e.oldKeyCode = e.keyCode; e.keyCode = 0; }
+    }
+    slowPoll(cm);
+    restartBlink(cm);
+  }
+  function onBlur(cm) {
+    if (cm.state.focused) {
+      signal(cm, "blur", cm);
+      cm.state.focused = false;
+      rmClass(cm.display.wrapper, "CodeMirror-focused");
+    }
+    clearInterval(cm.display.blinker);
+    setTimeout(function() {if (!cm.state.focused) cm.display.shift = false;}, 150);
+  }
+
+  // CONTEXT MENU HANDLING
+
+  // To make the context menu work, we need to briefly unhide the
+  // textarea (making it as unobtrusive as possible) to let the
+  // right-click take effect on it.
+  function onContextMenu(cm, e) {
+    if (signalDOMEvent(cm, e, "contextmenu")) return;
+    var display = cm.display;
+    if (eventInWidget(display, e) || contextMenuInGutter(cm, e)) return;
+
+    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
+    if (!pos || presto) return; // Opera is difficult.
+
+    // Reset the current text selection only if the click is done outside of the selection
+    // and 'resetSelectionOnContextMenu' option is true.
+    var reset = cm.options.resetSelectionOnContextMenu;
+    if (reset && cm.doc.sel.contains(pos) == -1)
+      operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll);
+
+    var oldCSS = display.input.style.cssText;
+    display.inputDiv.style.position = "absolute";
+    display.input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
+      "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: " +
+      (ie ? "rgba(255, 255, 255, .05)" : "transparent") +
+      "; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+    if (webkit) var oldScrollY = window.scrollY; // Work around Chrome issue (#2712)
+    focusInput(cm);
+    if (webkit) window.scrollTo(null, oldScrollY);
+    resetInput(cm);
+    // Adds "Select all" to context menu in FF
+    if (!cm.somethingSelected()) display.input.value = display.prevInput = " ";
+    display.selForContextMenu = cm.doc.sel;
+    clearTimeout(display.detectingSelectAll);
+
+    // Select-all will be greyed out if there's nothing to select, so
+    // this adds a zero-width space so that we can later check whether
+    // it got selected.
+    function prepareSelectAllHack() {
+      if (display.input.selectionStart != null) {
+        var selected = cm.somethingSelected();
+        var extval = display.input.value = "\u200b" + (selected ? display.input.value : "");
+        display.prevInput = selected ? "" : "\u200b";
+        display.input.selectionStart = 1; display.input.selectionEnd = extval.length;
+        // Re-set this, in case some other handler touched the
+        // selection in the meantime.
+        display.selForContextMenu = cm.doc.sel;
       }
-      return handled;
     }
-    function handleCharBinding(e, ch) {
-      var handled = lookupKey("'" + ch + "'", options.extraKeys,
-                              options.keyMap, function(b) { return doHandleBinding(b, true); });
-      if (handled) {
-        e_preventDefault(e);
-        restartBlink();
-      }
-      return handled;
-    }
-
-    var lastStoppedKey = null;
-    function onKeyDown(e) {
-      if (!focused) onFocus();
-      if (ie && e.keyCode == 27) { e.returnValue = false; }
-      if (pollingFast) { if (readInput()) pollingFast = false; }
-      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
-      var code = e_prop(e, "keyCode");
-      // IE does strange things with escape.
-      setShift(code == 16 || e_prop(e, "shiftKey"));
-      // First give onKeyEvent option a chance to handle this.
-      var handled = handleKeyBinding(e);
-      if (opera) {
-        lastStoppedKey = handled ? code : null;
-        // Opera has no cut event... we try to at least catch the key combo
-        if (!handled && code == 88 && e_prop(e, mac ? "metaKey" : "ctrlKey"))
-          replaceSelection("");
-      }
-    }
-    function onKeyPress(e) {
-      if (pollingFast) readInput();
-      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
-      var keyCode = e_prop(e, "keyCode"), charCode = e_prop(e, "charCode");
-      if (opera && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return;}
-      if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(e)) return;
-      var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
-      if (options.electricChars && mode.electricChars && options.smartIndent && !options.readOnly) {
-        if (mode.electricChars.indexOf(ch) > -1)
-          setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 75);
-      }
-      if (handleCharBinding(e, ch)) return;
-      fastPoll();
-    }
-    function onKeyUp(e) {
-      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return;
-      if (e_prop(e, "keyCode") == 16) shiftSelecting = null;
-    }
-
-    function onFocus() {
-      if (options.readOnly == "nocursor") return;
-      if (!focused) {
-        if (options.onFocus) options.onFocus(instance);
-        focused = true;
-        if (scroller.className.search(/\bCodeMirror-focused\b/) == -1)
-          scroller.className += " CodeMirror-focused";
-      }
-      slowPoll();
-      restartBlink();
-    }
-    function onBlur() {
-      if (focused) {
-        if (options.onBlur) options.onBlur(instance);
-        focused = false;
-        if (bracketHighlighted)
-          operation(function(){
-            if (bracketHighlighted) { bracketHighlighted(); bracketHighlighted = null; }
-          })();
-        scroller.className = scroller.className.replace(" CodeMirror-focused", "");
-      }
-      clearInterval(blinker);
-      setTimeout(function() {if (!focused) shiftSelecting = null;}, 150);
-    }
-
-    // Replace the range from from to to by the strings in newText.
-    // Afterwards, set the selection to selFrom, selTo.
-    function updateLines(from, to, newText, selFrom, selTo) {
-      if (suppressEdits) return;
-      var old = [];
-      doc.iter(from.line, to.line + 1, function(line) {
-        old.push(newHL(line.text, line.markedSpans));
-      });
-      if (history) {
-        history.addChange(from.line, newText.length, old);
-        while (history.done.length > options.undoDepth) history.done.shift();
-      }
-      var lines = updateMarkedSpans(hlSpans(old[0]), hlSpans(lst(old)), from.ch, to.ch, newText);
-      updateLinesNoUndo(from, to, lines, selFrom, selTo);
-    }
-    function unredoHelper(from, to) {
-      if (!from.length) return;
-      var set = from.pop(), out = [];
-      for (var i = set.length - 1; i >= 0; i -= 1) {
-        var change = set[i];
-        var replaced = [], end = change.start + change.added;
-        doc.iter(change.start, end, function(line) { replaced.push(newHL(line.text, line.markedSpans)); });
-        out.push({start: change.start, added: change.old.length, old: replaced});
-        var pos = {line: change.start + change.old.length - 1,
-                   ch: editEnd(hlText(lst(replaced)), hlText(lst(change.old)))};
-        updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: getLine(end-1).text.length},
-                          change.old, pos, pos);
-      }
-      updateInput = true;
-      to.push(out);
-    }
-    function undo() {unredoHelper(history.done, history.undone);}
-    function redo() {unredoHelper(history.undone, history.done);}
-
-    function updateLinesNoUndo(from, to, lines, selFrom, selTo) {
-      if (suppressEdits) return;
-      var recomputeMaxLength = false, maxLineLength = maxLine.text.length;
-      if (!options.lineWrapping)
-        doc.iter(from.line, to.line + 1, function(line) {
-          if (!line.hidden && line.text.length == maxLineLength) {recomputeMaxLength = true; return true;}
-        });
-      if (from.line != to.line || lines.length > 1) gutterDirty = true;
-
-      var nlines = to.line - from.line, firstLine = getLine(from.line), lastLine = getLine(to.line);
-      var lastHL = lst(lines);
-
-      // First adjust the line structure
-      if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == "") {
-        // This is a whole-line replace. Treated specially to make
-        // sure line objects move the way they are supposed to.
-        var added = [], prevLine = null;
-        for (var i = 0, e = lines.length - 1; i < e; ++i)
-          added.push(new Line(hlText(lines[i]), hlSpans(lines[i])));
-        lastLine.update(lastLine.text, hlSpans(lastHL));
-        if (nlines) doc.remove(from.line, nlines, callbacks);
-        if (added.length) doc.insert(from.line, added);
-      } else if (firstLine == lastLine) {
-        if (lines.length == 1) {
-          firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + firstLine.text.slice(to.ch), hlSpans(lines[0]));
-        } else {
-          for (var added = [], i = 1, e = lines.length - 1; i < e; ++i)
-            added.push(new Line(hlText(lines[i]), hlSpans(lines[i])));
-          added.push(new Line(hlText(lastHL) + firstLine.text.slice(to.ch), hlSpans(lastHL)));
-          firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0]));
-          doc.insert(from.line + 1, added);
-        }
-      } else if (lines.length == 1) {
-        firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]) + lastLine.text.slice(to.ch), hlSpans(lines[0]));
-        doc.remove(from.line + 1, nlines, callbacks);
-      } else {
-        var added = [];
-        firstLine.update(firstLine.text.slice(0, from.ch) + hlText(lines[0]), hlSpans(lines[0]));
-        lastLine.update(hlText(lastHL) + lastLine.text.slice(to.ch), hlSpans(lastHL));
-        for (var i = 1, e = lines.length - 1; i < e; ++i)
-          added.push(new Line(hlText(lines[i]), hlSpans(lines[i])));
-        if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks);
-        doc.insert(from.line + 1, added);
+    function rehide() {
+      display.inputDiv.style.position = "relative";
+      display.input.style.cssText = oldCSS;
+      if (ie && ie_version < 9) display.scrollbarV.scrollTop = display.scroller.scrollTop = scrollPos;
+      slowPoll(cm);
+
+      // Try to detect the user choosing select-all
+      if (display.input.selectionStart != null) {
+        if (!ie || (ie && ie_version < 9)) prepareSelectAllHack();
+        var i = 0, poll = function() {
+          if (display.selForContextMenu == cm.doc.sel && display.input.selectionStart == 0)
+            operation(cm, commands.selectAll)(cm);
+          else if (i++ < 10) display.detectingSelectAll = setTimeout(poll, 500);
+          else resetInput(cm);
+        };
+        display.detectingSelectAll = setTimeout(poll, 200);
       }
-      if (options.lineWrapping) {
-        var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3);
-        doc.iter(from.line, from.line + lines.length, function(line) {
-          if (line.hidden) return;
-          var guess = Math.ceil(line.text.length / perLine) || 1;
-          if (guess != line.height) updateLineHeight(line, guess);
-        });
-      } else {
-        doc.iter(from.line, from.line + lines.length, function(line) {
-          var l = line.text;
-          if (!line.hidden && l.length > maxLineLength) {
-            maxLine = line; maxLineLength = l.length; maxLineChanged = true;
-            recomputeMaxLength = false;
-          }
-        });
-        if (recomputeMaxLength) updateMaxLine = true;
-      }
-
-      // Adjust frontier, schedule worker
-      frontier = Math.min(frontier, from.line);
-      startWorker(400);
-
-      var lendiff = lines.length - nlines - 1;
-      // Remember that these lines changed, for updating the display
-      changes.push({from: from.line, to: to.line + 1, diff: lendiff});
-      if (options.onChange) {
-        // Normalize lines to contain only strings, since that's what
-        // the change event handler expects
-        for (var i = 0; i < lines.length; ++i)
-          if (typeof lines[i] != "string") lines[i] = lines[i].text;
-        var changeObj = {from: from, to: to, text: lines};
-        if (textChanged) {
-          for (var cur = textChanged; cur.next; cur = cur.next) {}
-          cur.next = changeObj;
-        } else textChanged = changeObj;
-      }
-
-      // Update the selection
-      function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
-      setSelection(clipPos(selFrom), clipPos(selTo),
-                   updateLine(sel.from.line), updateLine(sel.to.line));
-    }
-
-    function needsScrollbar() {
-      var realHeight = doc.height * textHeight() + 2 * paddingTop();
-      return realHeight * .99 > scroller.offsetHeight ? realHeight : false;
-    }
-
-    function updateVerticalScroll(scrollTop) {
-      var scrollHeight = needsScrollbar();
-      scrollbar.style.display = scrollHeight ? "block" : "none";
-      if (scrollHeight) {
-        scrollbarInner.style.height = sizer.style.minHeight = scrollHeight + "px";
-        scrollbar.style.height = scroller.clientHeight + "px";
-        if (scrollTop != null) {
-          scrollbar.scrollTop = scroller.scrollTop = scrollTop;
-          // 'Nudge' the scrollbar to work around a Webkit bug where,
-          // in some situations, we'd end up with a scrollbar that
-          // reported its scrollTop (and looked) as expected, but
-          // *behaved* as if it was still in a previous state (i.e.
-          // couldn't scroll up, even though it appeared to be at the
-          // bottom).
-          if (webkit) setTimeout(function() {
-            if (scrollbar.scrollTop != scrollTop) return;
-            scrollbar.scrollTop = scrollTop + (scrollTop ? -1 : 1);
-            scrollbar.scrollTop = scrollTop;
-          }, 0);
-        }
+    }
+
+    if (ie && ie_version >= 9) prepareSelectAllHack();
+    if (captureRightClick) {
+      e_stop(e);
+      var mouseup = function() {
+        off(window, "mouseup", mouseup);
+        setTimeout(rehide, 20);
+      };
+      on(window, "mouseup", mouseup);
+    } else {
+      setTimeout(rehide, 50);
+    }
+  }
+
+  function contextMenuInGutter(cm, e) {
+    if (!hasHandler(cm, "gutterContextMenu")) return false;
+    return gutterEvent(cm, e, "gutterContextMenu", false, signal);
+  }
+
+  // UPDATING
+
+  // Compute the position of the end of a change (its 'to' property
+  // refers to the pre-change end).
+  var changeEnd = CodeMirror.changeEnd = function(change) {
+    if (!change.text) return change.to;
+    return Pos(change.from.line + change.text.length - 1,
+               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0));
+  };
+
+  // Adjust a position to refer to the post-change position of the
+  // same text, or the end of the change if the change covers it.
+  function adjustForChange(pos, change) {
+    if (cmp(pos, change.from) < 0) return pos;
+    if (cmp(pos, change.to) <= 0) return changeEnd(change);
+
+    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
+    if (pos.line == change.to.line) ch += changeEnd(change).ch - change.to.ch;
+    return Pos(line, ch);
+  }
+
+  function computeSelAfterChange(doc, change) {
+    var out = [];
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      var range = doc.sel.ranges[i];
+      out.push(new Range(adjustForChange(range.anchor, change),
+                         adjustForChange(range.head, change)));
+    }
+    return normalizeSelection(out, doc.sel.primIndex);
+  }
+
+  function offsetPos(pos, old, nw) {
+    if (pos.line == old.line)
+      return Pos(nw.line, pos.ch - old.ch + nw.ch);
+    else
+      return Pos(nw.line + (pos.line - old.line), pos.ch);
+  }
+
+  // Used by replaceSelections to allow moving the selection to the
+  // start or around the replaced test. Hint may be "start" or "around".
+  function computeReplacedSel(doc, changes, hint) {
+    var out = [];
+    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
+    for (var i = 0; i < changes.length; i++) {
+      var change = changes[i];
+      var from = offsetPos(change.from, oldPrev, newPrev);
+      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
+      oldPrev = change.to;
+      newPrev = to;
+      if (hint == "around") {
+        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
+        out[i] = new Range(inv ? to : from, inv ? from : to);
       } else {
-        sizer.style.minHeight = "";
+        out[i] = new Range(from, from);
       }
-      // Position the mover div to align with the current virtual scroll position
-      mover.style.top = displayOffset * textHeight() + "px";
     }
+    return new Selection(out, doc.sel.primIndex);
+  }
+
+  // Allow "beforeChange" event handlers to influence a change
+  function filterChange(doc, change, update) {
+    var obj = {
+      canceled: false,
+      from: change.from,
+      to: change.to,
+      text: change.text,
+      origin: change.origin,
+      cancel: function() { this.canceled = true; }
+    };
+    if (update) obj.update = function(from, to, text, origin) {
+      if (from) this.from = clipPos(doc, from);
+      if (to) this.to = clipPos(doc, to);
+      if (text) this.text = text;
+      if (origin !== undefined) this.origin = origin;
+    };
+    signal(doc, "beforeChange", doc, obj);
+    if (doc.cm) signal(doc.cm, "beforeChange", doc.cm, obj);
+
+    if (obj.canceled) return null;
+    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin};
+  }
+
+  // Apply a change to a document, and add it to the document's
+  // history, and propagating it to all linked documents.
+  function makeChange(doc, change, ignoreReadOnly) {
+    if (doc.cm) {
+      if (!doc.cm.curOp) return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly);
+      if (doc.cm.state.suppressEdits) return;
+    }
+
+    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
+      change = filterChange(doc, change, true);
+      if (!change) return;
+    }
+
+    // Possibly split or suppress the update based on the presence
+    // of read-only spans in its range.
+    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
+    if (split) {
+      for (var i = split.length - 1; i >= 0; --i)
+        makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text});
+    } else {
+      makeChangeInner(doc, change);
+    }
+  }
+
+  function makeChangeInner(doc, change) {
+    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) return;
+    var selAfter = computeSelAfterChange(doc, change);
+    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
+
+    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
+    var rebased = [];
+
+    linkedDocs(doc, function(doc, sharedHist) {
+      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+        rebaseHist(doc.history, change);
+        rebased.push(doc.history);
+      }
+      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
+    });
+  }
+
+  // Revert a change stored in a document's history.
+  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
+    if (doc.cm && doc.cm.state.suppressEdits) return;
 
-    function computeMaxLength() {
-      maxLine = getLine(0); maxLineChanged = true;
-      var maxLineLength = maxLine.text.length;
-      doc.iter(1, doc.size, function(line) {
-        var l = line.text;
-        if (!line.hidden && l.length > maxLineLength) {
-          maxLineLength = l.length; maxLine = line;
+    var hist = doc.history, event, selAfter = doc.sel;
+    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
+
+    // Verify that there is a useable event (so that ctrl-z won't
+    // needlessly clear selection events)
+    for (var i = 0; i < source.length; i++) {
+      event = source[i];
+      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
+        break;
+    }
+    if (i == source.length) return;
+    hist.lastOrigin = hist.lastSelOrigin = null;
+
+    for (;;) {
+      event = source.pop();
+      if (event.ranges) {
+        pushSelectionToHistory(event, dest);
+        if (allowSelectionOnly && !event.equals(doc.sel)) {
+          setSelection(doc, event, {clearRedo: false});
+          return;
         }
-      });
-      updateMaxLine = false;
-    }
-
-    function replaceRange(code, from, to) {
-      from = clipPos(from);
-      if (!to) to = from; else to = clipPos(to);
-      code = splitLines(code);
-      function adjustPos(pos) {
-        if (posLess(pos, from)) return pos;
-        if (!posLess(to, pos)) return end;
-        var line = pos.line + code.length - (to.line - from.line) - 1;
-        var ch = pos.ch;
-        if (pos.line == to.line)
-          ch += lst(code).length - (to.ch - (to.line == from.line ? from.ch : 0));
-        return {line: line, ch: ch};
-      }
-      var end;
-      replaceRange1(code, from, to, function(end1) {
-        end = end1;
-        return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
-      });
-      return end;
+        selAfter = event;
+      }
+      else break;
     }
-    function replaceSelection(code, collapse) {
-      replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
-        if (collapse == "end") return {from: end, to: end};
-        else if (collapse == "start") return {from: sel.from, to: sel.from};
-        else return {from: sel.from, to: end};
+
+    // Build up a reverse change object to add to the opposite history
+    // stack (redo when undoing, and vice versa).
+    var antiChanges = [];
+    pushSelectionToHistory(selAfter, dest);
+    dest.push({changes: antiChanges, generation: hist.generation});
+    hist.generation = event.generation || ++hist.maxGeneration;
+
+    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
+
+    for (var i = event.changes.length - 1; i >= 0; --i) {
+      var change = event.changes[i];
+      change.origin = type;
+      if (filter && !filterChange(doc, change, false)) {
+        source.length = 0;
+        return;
+      }
+
+      antiChanges.push(historyChangeFromChange(doc, change));
+
+      var after = i ? computeSelAfterChange(doc, change) : lst(source);
+      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
+      if (!i && doc.cm) doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)});
+      var rebased = [];
+
+      // Propagate to the linked documents
+      linkedDocs(doc, function(doc, sharedHist) {
+        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+          rebaseHist(doc.history, change);
+          rebased.push(doc.history);
+        }
+        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
       });
     }
-    function replaceRange1(code, from, to, computeSel) {
-      var endch = code.length == 1 ? code[0].length + from.ch : lst(code).length;
-      var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
-      updateLines(from, to, code, newSel.from, newSel.to);
+  }
+
+  // Sub-views need their line numbers shifted when text is added
+  // above or below them in the parent document.
+  function shiftDoc(doc, distance) {
+    if (distance == 0) return;
+    doc.first += distance;
+    doc.sel = new Selection(map(doc.sel.ranges, function(range) {
+      return new Range(Pos(range.anchor.line + distance, range.anchor.ch),
+                       Pos(range.head.line + distance, range.head.ch));
+    }), doc.sel.primIndex);
+    if (doc.cm) {
+      regChange(doc.cm, doc.first, doc.first - distance, distance);
+      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
+        regLineChange(doc.cm, l, "gutter");
     }
+  }
+
+  // More lower-level change function, handling only a single document
+  // (not linked ones).
+  function makeChangeSingleDoc(doc, change, selAfter, spans) {
+    if (doc.cm && !doc.cm.curOp)
+      return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans);
 
-    function getRange(from, to, lineSep) {
-      var l1 = from.line, l2 = to.line;
-      if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch);
-      var code = [getLine(l1).text.slice(from.ch)];
-      doc.iter(l1 + 1, l2, function(line) { code.push(line.text); });
-      code.push(getLine(l2).text.slice(0, to.ch));
-      return code.join(lineSep || "\n");
+    if (change.to.line < doc.first) {
+      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
+      return;
+    }
+    if (change.from.line > doc.lastLine()) return;
+
+    // Clip the change to the size of this doc
+    if (change.from.line < doc.first) {
+      var shift = change.text.length - 1 - (doc.first - change.from.line);
+      shiftDoc(doc, shift);
+      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
+                text: [lst(change.text)], origin: change.origin};
+    }
+    var last = doc.lastLine();
+    if (change.to.line > last) {
+      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
+                text: [change.text[0]], origin: change.origin};
     }
-    function getSelection(lineSep) {
-      return getRange(sel.from, sel.to, lineSep);
+
+    change.removed = getBetween(doc, change.from, change.to);
+
+    if (!selAfter) selAfter = computeSelAfterChange(doc, change);
+    if (doc.cm) makeChangeSingleDocInEditor(doc.cm, change, spans);
+    else updateDoc(doc, change, spans);
+    setSelectionNoUndo(doc, selAfter, sel_dontScroll);
+  }
+
+  // Handle the interaction of a change to a document with the editor
+  // that this document is part of.
+  function makeChangeSingleDocInEditor(cm, change, spans) {
+    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
+
+    var recomputeMaxLength = false, checkWidthStart = from.line;
+    if (!cm.options.lineWrapping) {
+      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
+      doc.iter(checkWidthStart, to.line + 1, function(line) {
+        if (line == display.maxLine) {
+          recomputeMaxLength = true;
+          return true;
+        }
+      });
     }
 
-    function slowPoll() {
-      if (pollingFast) return;
-      poll.set(options.pollInterval, function() {
-        readInput();
-        if (focused) slowPoll();
+    if (doc.sel.contains(change.from, change.to) > -1)
+      signalCursorActivity(cm);
+
+    updateDoc(doc, change, spans, estimateHeight(cm));
+
+    if (!cm.options.lineWrapping) {
+      doc.iter(checkWidthStart, from.line + change.text.length, function(line) {
+        var len = lineLength(line);
+        if (len > display.maxLineLength) {
+          display.maxLine = line;
+          display.maxLineLength = len;
+          display.maxLineChanged = true;
+          recomputeMaxLength = false;
+        }
       });
+      if (recomputeMaxLength) cm.curOp.updateMaxLine = true;
     }
-    function fastPoll() {
-      var missed = false;
-      pollingFast = true;
-      function p() {
-        var changed = readInput();
-        if (!changed && !missed) {missed = true; poll.set(60, p);}
-        else {pollingFast = false; slowPoll();}
-      }
-      poll.set(20, p);
-    }
-
-    // Previnput is a hack to work with IME. If we reset the textarea
-    // on every change, that breaks IME. So we look for changes
-    // compared to the previous content instead. (Modern browsers have
-    // events that indicate IME taking place, but these are not widely
-    // supported or compatible enough yet to rely on.)
-    var prevInput = "";
-    function readInput() {
-      if (!focused || hasSelection(input) || options.readOnly) return false;
-      var text = input.value;
-      if (text == prevInput) return false;
-      if (!nestedOperation) startOperation();
-      shiftSelecting = null;
-      var same = 0, l = Math.min(prevInput.length, text.length);
-      while (same < l && prevInput[same] == text[same]) ++same;
-      if (same < prevInput.length)
-        sel.from = {line: sel.from.line, ch: sel.from.ch - (prevInput.length - same)};
-      else if (overwrite && posEq(sel.from, sel.to))
-        sel.to = {line: sel.to.line, ch: Math.min(getLine(sel.to.line).text.length, sel.to.ch + (text.length - same))};
-      replaceSelection(text.slice(same), "end");
-      if (text.length > 1000) { input.value = prevInput = ""; }
-      else prevInput = text;
-      if (!nestedOperation) endOperation();
-      return true;
+
+    // Adjust frontier, schedule worker
+    doc.frontier = Math.min(doc.frontier, from.line);
+    startWorker(cm, 400);
+
+    var lendiff = change.text.length - (to.line - from.line) - 1;
+    // Remember that these lines changed, for updating the display
+    if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
+      regLineChange(cm, from.line, "text");
+    else
+      regChange(cm, from.line, to.line + 1, lendiff);
+
+    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+    if (changeHandler || changesHandler) {
+      var obj = {
+        from: from, to: to,
+        text: change.text,
+        removed: change.removed,
+        origin: change.origin
+      };
+      if (changeHandler) signalLater(cm, "change", cm, obj);
+      if (changesHandler) (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj);
     }
-    function resetInput(user) {
-      if (!posEq(sel.from, sel.to)) {
-        prevInput = "";
-        input.value = getSelection();
-        if (focused) selectInput(input);
-      } else if (user) prevInput = input.value = "";
-    }
-
-    function focusInput() {
-      if (options.readOnly != "nocursor") input.focus();
-    }
-
-    function scrollCursorIntoView() {
-      var coords = calculateCursorCoords();
-      scrollIntoView(coords.x, coords.y, coords.x, coords.yBot);
-      if (!focused) return;
-      var box = sizer.getBoundingClientRect(), doScroll = null;
-      if (coords.y + box.top < 0) doScroll = true;
-      else if (coords.y + box.top + textHeight() > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
-      if (doScroll != null) {
-        var hidden = cursor.style.display == "none";
-        if (hidden) {
-          cursor.style.display = "";
-          cursor.style.left = coords.x + "px";
-          cursor.style.top = (coords.y - displayOffset) + "px";
-        }
-        cursor.scrollIntoView(doScroll);
-        if (hidden) cursor.style.display = "none";
-      }
-    }
-    function calculateCursorCoords() {
-      var cursor = localCoords(sel.inverted ? sel.from : sel.to);
-      var x = options.lineWrapping ? Math.min(cursor.x, lineSpace.offsetWidth) : cursor.x;
-      return {x: x, y: cursor.y, yBot: cursor.yBot};
-    }
-    function scrollIntoView(x1, y1, x2, y2) {
-      var scrollPos = calculateScrollPos(x1, y1, x2, y2);
-      if (scrollPos.scrollLeft != null) {scroller.scrollLeft = scrollPos.scrollLeft;}
-      if (scrollPos.scrollTop != null) {scrollbar.scrollTop = scroller.scrollTop = scrollPos.scrollTop;}
-    }
-    function calculateScrollPos(x1, y1, x2, y2) {
-      var pl = paddingLeft(), pt = paddingTop();
-      y1 += pt; y2 += pt; x1 += pl; x2 += pl;
-      var screen = scroller.clientHeight, screentop = scrollbar.scrollTop, result = {};
-      var docBottom = needsScrollbar() || Infinity;
-      var atTop = y1 < pt + 10, atBottom = y2 + pt > docBottom - 10;
-      if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1);
-      else if (y2 > screentop + screen) result.scrollTop = (atBottom ? docBottom : y2) - screen;
-
-      var screenw = scroller.clientWidth, screenleft = scroller.scrollLeft;
-      var gutterw = options.fixedGutter ? gutter.clientWidth : 0;
-      var atLeft = x1 < gutterw + pl + 10;
-      if (x1 < screenleft + gutterw || atLeft) {
-        if (atLeft) x1 = 0;
-        result.scrollLeft = Math.max(0, x1 - 10 - gutterw);
-      } else if (x2 > screenw + screenleft - 3) {
-        result.scrollLeft = x2 + 10 - screenw;
-      }
-      return result;
-    }
-
-    function visibleLines(scrollTop) {
-      var lh = textHeight(), top = (scrollTop != null ? scrollTop : scrollbar.scrollTop) - paddingTop();
-      var fromHeight = Math.max(0, Math.floor(top / lh));
-      var toHeight = Math.ceil((top + scroller.clientHeight) / lh);
-      return {from: lineAtHeight(doc, fromHeight),
-              to: lineAtHeight(doc, toHeight)};
-    }
-    // Uses a set of changes plus the current scroll position to
-    // determine which DOM updates have to be made, and makes the
-    // updates.
-    function updateDisplay(changes, suppressCallback, scrollTop) {
-      if (!scroller.clientWidth) {
-        showingFrom = showingTo = displayOffset = 0;
-        return;
-      }
-      // Compute the new visible window
-      // If scrollTop is specified, use that to determine which lines
-      // to render instead of the current scrollbar position.
-      var visible = visibleLines(scrollTop);
-      // Bail out if the visible area is already rendered and nothing changed.
-      if (changes !== true && changes.length == 0 && visible.from > showingFrom && visible.to < showingTo) {
-        updateVerticalScroll(scrollTop);
-        return;
+    cm.display.selForContextMenu = null;
+  }
+
+  function replaceRange(doc, code, from, to, origin) {
+    if (!to) to = from;
+    if (cmp(to, from) < 0) { var tmp = to; to = from; from = tmp; }
+    if (typeof code == "string") code = splitLines(code);
+    makeChange(doc, {from: from, to: to, text: code, origin: origin});
+  }
+
+  // SCROLLING THINGS INTO VIEW
+
+  // If an editor sits on the top or bottom of the window, partially
+  // scrolled out of view, this ensures that the cursor is visible.
+  function maybeScrollWindow(cm, coords) {
+    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
+    if (coords.top + box.top < 0) doScroll = true;
+    else if (coords.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) doScroll = false;
+    if (doScroll != null && !phantom) {
+      var scrollNode = elt("div", "\u200b", null, "position: absolute; top: " +
+                           (coords.top - display.viewOffset - paddingTop(cm.display)) + "px; height: " +
+                           (coords.bottom - coords.top + scrollerCutOff) + "px; left: " +
+                           coords.left + "px; width: 2px;");
+      cm.display.lineSpace.appendChild(scrollNode);
+      scrollNode.scrollIntoView(doScroll);
+      cm.display.lineSpace.removeChild(scrollNode);
+    }
+  }
+
+  // Scroll a given position into view (immediately), verifying that
+  // it actually became visible (as line heights are accurately
+  // measured, the position of something may 'drift' during drawing).
+  function scrollPosIntoView(cm, pos, end, margin) {
+    if (margin == null) margin = 0;
+    for (;;) {
+      var changed = false, coords = cursorCoords(cm, pos);
+      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
+      var scrollPos = calculateScrollPos(cm, Math.min(coords.left, endCoords.left),
+                                         Math.min(coords.top, endCoords.top) - margin,
+                                         Math.max(coords.left, endCoords.left),
+                                         Math.max(coords.bottom, endCoords.bottom) + margin);
+      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
+      if (scrollPos.scrollTop != null) {
+        setScrollTop(cm, scrollPos.scrollTop);
+        if (Math.abs(cm.doc.scrollTop - startTop) > 1) changed = true;
       }
-      var from = Math.max(visible.from - 100, 0), to = Math.min(doc.size, visible.to + 100);
-      if (showingFrom < from && from - showingFrom < 20) from = showingFrom;
-      if (showingTo > to && showingTo - to < 20) to = Math.min(doc.size, showingTo);
-
-      // Create a range of theoretically intact lines, and punch holes
-      // in that using the change info.
-      var intact = changes === true ? [] :
-        computeIntact([{from: showingFrom, to: showingTo, domStart: 0}], changes);
-      // Clip off the parts that won't be visible
-      var intactLines = 0;
-      for (var i = 0; i < intact.length; ++i) {
-        var range = intact[i];
-        if (range.from < from) {range.domStart += (from - range.from); range.from = from;}
-        if (range.to > to) range.to = to;
-        if (range.from >= range.to) intact.splice(i--, 1);
-        else intactLines += range.to - range.from;
-      }
-      if (intactLines == to - from && from == showingFrom && to == showingTo) {
-        updateVerticalScroll(scrollTop);
-        return;
+      if (scrollPos.scrollLeft != null) {
+        setScrollLeft(cm, scrollPos.scrollLeft);
+        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) changed = true;
       }
-      intact.sort(function(a, b) {return a.domStart - b.domStart;});
+      if (!changed) return coords;
+    }
+  }
+
+  // Scroll a given set of coordinates into view (immediately).
+  function scrollIntoView(cm, x1, y1, x2, y2) {
+    var scrollPos = calculateScrollPos(cm, x1, y1, x2, y2);
+    if (scrollPos.scrollTop != null) setScrollTop(cm, scrollPos.scrollTop);
+    if (scrollPos.scrollLeft != null) setScrollLeft(cm, scrollPos.scrollLeft);
+  }
+
+  // Calculate a new scroll position needed to scroll the given
+  // rectangle into view. Returns an object with scrollTop and
+  // scrollLeft properties. When these are undefined, the
+  // vertical/horizontal position does not need to be adjusted.
+  function calculateScrollPos(cm, x1, y1, x2, y2) {
+    var display = cm.display, snapMargin = textHeight(cm.display);
+    if (y1 < 0) y1 = 0;
+    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
+    var screen = display.scroller.clientHeight - scrollerCutOff, result = {};
+    if (y2 - y1 > screen) y2 = y1 + screen;
+    var docBottom = cm.doc.height + paddingVert(display);
+    var atTop = y1 < snapMargin, atBottom = y2 > docBottom - snapMargin;
+    if (y1 < screentop) {
+      result.scrollTop = atTop ? 0 : y1;
+    } else if (y2 > screentop + screen) {
+      var newTop = Math.min(y1, (atBottom ? docBottom : y2) - screen);
+      if (newTop != screentop) result.scrollTop = newTop;
+    }
+
+    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft;
+    var screenw = display.scroller.clientWidth - scrollerCutOff - display.gutters.offsetWidth;
+    var tooWide = x2 - x1 > screenw;
+    if (tooWide) x2 = y1 + screen;
+    if (x1 < 10)
+      result.scrollLeft = 0;
+    else if (x1 < screenleft)
+      result.scrollLeft = Math.max(0, x1 - (tooWide ? 0 : 10));
+    else if (x2 > screenw + screenleft - 3)
+      result.scrollLeft = x2 + (tooWide ? 0 : 10) - screenw;
+
+    return result;
+  }
 
-      var th = textHeight(), gutterDisplay = gutter.style.display;
-      lineDiv.style.display = "none";
-      patchDisplay(from, to, intact);
-      lineDiv.style.display = gutter.style.display = "";
+  // Store a relative adjustment to the scroll position in the current
+  // operation (to be applied when the operation finishes).
+  function addToScrollPos(cm, left, top) {
+    if (left != null || top != null) resolveScrollToPos(cm);
+    if (left != null)
+      cm.curOp.scrollLeft = (cm.curOp.scrollLeft == null ? cm.doc.scrollLeft : cm.curOp.scrollLeft) + left;
+    if (top != null)
+      cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
+  }
 
-      var different = from != showingFrom || to != showingTo || lastSizeC != scroller.clientHeight + th;
-      // This is just a bogus formula that detects when the editor is
-      // resized or the font size changes.
-      if (different) lastSizeC = scroller.clientHeight + th;
-      if (from != showingFrom || to != showingTo && options.onViewportChange)
-        setTimeout(function(){
-          if (options.onViewportChange) options.onViewportChange(instance, from, to);
-        });
-      showingFrom = from; showingTo = to;
-      displayOffset = heightAtLine(doc, from);
-      startWorker(100);
-
-      // Since this is all rather error prone, it is honoured with the
-      // only assertion in the whole file.
-      if (lineDiv.childNodes.length != showingTo - showingFrom)
-        throw new Error("BAD PATCH! " + JSON.stringify(intact) + " size=" + (showingTo - showingFrom) +
-                        " nodes=" + lineDiv.childNodes.length);
-
-      function checkHeights() {
-        var curNode = lineDiv.firstChild, heightChanged = false;
-        doc.iter(showingFrom, showingTo, function(line) {
-          // Work around bizarro IE7 bug where, sometimes, our curNode
-          // is magically replaced with a new node in the DOM, leaving
-          // us with a reference to an orphan (nextSibling-less) node.
-          if (!curNode) return;
-          if (!line.hidden) {
-            var height = Math.round(curNode.offsetHeight / th) || 1;
-            if (line.height != height) {
-              updateLineHeight(line, height);
-              gutterDirty = heightChanged = true;
-            }
-          }
-          curNode = curNode.nextSibling;
-        });
-        return heightChanged;
-      }
+  // Make sure that at the end of the operation the current cursor is
+  // shown.
+  function ensureCursorVisible(cm) {
+    resolveScrollToPos(cm);
+    var cur = cm.getCursor(), from = cur, to = cur;
+    if (!cm.options.lineWrapping) {
+      from = cur.ch ? Pos(cur.line, cur.ch - 1) : cur;
+      to = Pos(cur.line, cur.ch + 1);
+    }
+    cm.curOp.scrollToPos = {from: from, to: to, margin: cm.options.cursorScrollMargin, isCursor: true};
+  }
 
-      if (options.lineWrapping) checkHeights();
+  // When an operation has its scrollToPos property set, and another
+  // scroll action is applied before the end of the operation, this
+  // 'simulates' scrolling that position into view in a cheap way, so
+  // that the effect of intermediate scroll commands is not ignored.
+  function resolveScrollToPos(cm) {
+    var range = cm.curOp.scrollToPos;
+    if (range) {
+      cm.curOp.scrollToPos = null;
+      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
+      var sPos = calculateScrollPos(cm, Math.min(from.left, to.left),
+                                    Math.min(from.top, to.top) - range.margin,
+                                    Math.max(from.right, to.right),
+                                    Math.max(from.bottom, to.bottom) + range.margin);
+      cm.scrollTo(sPos.scrollLeft, sPos.scrollTop);
+    }
+  }
 
-      gutter.style.display = gutterDisplay;
-      if (different || gutterDirty) {
-        // If the gutter grew in size, re-check heights. If those changed, re-draw gutter.
-        updateGutter() && options.lineWrapping && checkHeights() && updateGutter();
-      }
-      updateVerticalScroll(scrollTop);
-      updateSelection();
-      if (!suppressCallback && options.onUpdate) options.onUpdate(instance);
-      return true;
+  // API UTILITIES
+
+  // Indent the given line. The how parameter can be "smart",
+  // "add"/null, "subtract", or "prev". When aggressive is false
+  // (typically set to true for forced single-line indents), empty
+  // lines are not indented, and places where the mode returns Pass
+  // are left alone.
+  function indentLine(cm, n, how, aggressive) {
+    var doc = cm.doc, state;
+    if (how == null) how = "add";
+    if (how == "smart") {
+      // Fall back to "prev" when the mode doesn't have an indentation
+      // method.
+      if (!doc.mode.indent) how = "prev";
+      else state = getStateBefore(cm, n);
     }
 
-    function computeIntact(intact, changes) {
-      for (var i = 0, l = changes.length || 0; i < l; ++i) {
-        var change = changes[i], intact2 = [], diff = change.diff || 0;
-        for (var j = 0, l2 = intact.length; j < l2; ++j) {
-          var range = intact[j];
-          if (change.to <= range.from && change.diff)
-            intact2.push({from: range.from + diff, to: range.to + diff,
-                          domStart: range.domStart});
-          else if (change.to <= range.from || change.from >= range.to)
-            intact2.push(range);
-          else {
-            if (change.from > range.from)
-              intact2.push({from: range.from, to: change.from, domStart: range.domStart});
-            if (change.to < range.to)
-              intact2.push({from: change.to + diff, to: range.to + diff,
-                            domStart: range.domStart + (change.to - range.from)});
-          }
-        }
-        intact = intact2;
+    var tabSize = cm.options.tabSize;
+    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
+    if (line.stateAfter) line.stateAfter = null;
+    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
+    if (!aggressive && !/\S/.test(line.text)) {
+      indentation = 0;
+      how = "not";
+    } else if (how == "smart") {
+      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+      if (indentation == Pass || indentation > 150) {
+        if (!aggressive) return;
+        how = "prev";
       }
-      return intact;
     }
-
-    function patchDisplay(from, to, intact) {
-      function killNode(node) {
-        var tmp = node.nextSibling;
-        node.parentNode.removeChild(node);
-        return tmp;
-      }
-      // The first pass removes the DOM nodes that aren't intact.
-      if (!intact.length) removeChildren(lineDiv);
-      else {
-        var domPos = 0, curNode = lineDiv.firstChild, n;
-        for (var i = 0; i < intact.length; ++i) {
-          var cur = intact[i];
-          while (cur.domStart > domPos) {curNode = killNode(curNode); domPos++;}
-          for (var j = 0, e = cur.to - cur.from; j < e; ++j) {curNode = curNode.nextSibling; domPos++;}
-        }
-        while (curNode) curNode = killNode(curNode);
-      }
-      // This pass fills in the lines that actually changed.
-      var nextIntact = intact.shift(), curNode = lineDiv.firstChild, j = from;
-      doc.iter(from, to, function(line) {
-        if (nextIntact && nextIntact.to == j) nextIntact = intact.shift();
-        if (!nextIntact || nextIntact.from > j) {
-          if (line.hidden) var lineElement = elt("pre");
-          else {
-            var lineElement = lineContent(line);
-            if (line.className) lineElement.className = line.className;
-            // Kludge to make sure the styled element lies behind the selection (by z-index)
-            if (line.bgClassName) {
-              var pre = elt("pre", "\u00a0", line.bgClassName, "position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2");
-              lineElement = elt("div", [pre, lineElement], null, "position: relative");
-            }
-          }
-          lineDiv.insertBefore(lineElement, curNode);
-        } else {
-          curNode = curNode.nextSibling;
-        }
-        ++j;
-      });
+    if (how == "prev") {
+      if (n > doc.first) indentation = countColumn(getLine(doc, n-1).text, null, tabSize);
+      else indentation = 0;
+    } else if (how == "add") {
+      indentation = curSpace + cm.options.indentUnit;
+    } else if (how == "subtract") {
+      indentation = curSpace - cm.options.indentUnit;
+    } else if (typeof how == "number") {
+      indentation = curSpace + how;
     }
+    indentation = Math.max(0, indentation);
 
-    function updateGutter() {
-      if (!options.gutter && !options.lineNumbers) return;
-      var hText = mover.offsetHeight, hEditor = scroller.clientHeight;
-      gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
-      var fragment = document.createDocumentFragment(), i = showingFrom, normalNode;
-      doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
-        if (line.hidden) {
-          fragment.appendChild(elt("pre"));
-        } else {
-          var marker = line.gutterMarker;
-          var text = options.lineNumbers ? options.lineNumberFormatter(i + options.firstLineNumber) : null;
-          if (marker && marker.text)
-            text = marker.text.replace("%N%", text != null ? text : "");
-          else if (text == null)
-            text = "\u00a0";
-          var markerElement = fragment.appendChild(elt("pre", null, marker && marker.style));
-          markerElement.innerHTML = text;
-          for (var j = 1; j < line.height; ++j) {
-            markerElement.appendChild(elt("br"));
-            markerElement.appendChild(document.createTextNode("\u00a0"));
-          }
-          if (!marker) normalNode = i;
-        }
-        ++i;
-      });
-      gutter.style.display = "none";
-      removeChildrenAndAdd(gutterText, fragment);
-      // Make sure scrolling doesn't cause number gutter size to pop
-      if (normalNode != null && options.lineNumbers) {
-        var node = gutterText.childNodes[normalNode - showingFrom];
-        var minwidth = String(doc.size).length, val = eltText(node.firstChild), pad = "";
-        while (val.length + pad.length < minwidth) pad += "\u00a0";
-        if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild);
-      }
-      gutter.style.display = "";
-      var resized = Math.abs((parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth) > 2;
-      lineSpace.style.marginLeft = gutter.offsetWidth + "px";
-      gutterDirty = false;
-      return resized;
-    }
-    function updateSelection() {
-      var collapsed = posEq(sel.from, sel.to);
-      var fromPos = localCoords(sel.from, true);
-      var toPos = collapsed ? fromPos : localCoords(sel.to, true);
-      var headPos = sel.inverted ? fromPos : toPos, th = textHeight();
-      var wrapOff = eltOffset(wrapper), lineOff = eltOffset(lineDiv);
-      inputDiv.style.top = Math.max(0, Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)) + "px";
-      inputDiv.style.left = Math.max(0, Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)) + "px";
-      if (collapsed) {
-        cursor.style.top = headPos.y + "px";
-        cursor.style.left = (options.lineWrapping ? Math.min(headPos.x, lineSpace.offsetWidth) : headPos.x) + "px";
-        cursor.style.display = "";
-        selectionDiv.style.display = "none";
-      } else {
-        var sameLine = fromPos.y == toPos.y, fragment = document.createDocumentFragment();
-        var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth;
-        var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight;
-        var add = function(left, top, right, height) {
-          var rstyle = quirksMode ? "width: " + (!right ? clientWidth : clientWidth - right - left) + "px"
-                                  : "right: " + right + "px";
-          fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left +
-                                   "px; top: " + top + "px; " + rstyle + "; height: " + height + "px"));
-        };
-        if (sel.from.ch && fromPos.y >= 0) {
-          var right = sameLine ? clientWidth - toPos.x : 0;
-          add(fromPos.x, fromPos.y, right, th);
-        }
-        var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0));
-        var middleHeight = Math.min(toPos.y, clientHeight) - middleStart;
-        if (middleHeight > 0.2 * th)
-          add(0, middleStart, 0, middleHeight);
-        if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - .5 * th)
-          add(0, toPos.y, clientWidth - toPos.x, th);
-        removeChildrenAndAdd(selectionDiv, fragment);
-        cursor.style.display = "none";
-        selectionDiv.style.display = "";
-      }
-    }
-
-    function setShift(val) {
-      if (val) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
-      else shiftSelecting = null;
-    }
-    function setSelectionUser(from, to) {
-      var sh = shiftSelecting && clipPos(shiftSelecting);
-      if (sh) {
-        if (posLess(sh, from)) from = sh;
-        else if (posLess(to, sh)) to = sh;
-      }
-      setSelection(from, to);
-      userSelChange = true;
-    }
-    // Update the selection. Last two args are only used by
-    // updateLines, since they have to be expressed in the line
-    // numbers before the update.
-    function setSelection(from, to, oldFrom, oldTo) {
-      goalColumn = null;
-      if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
-      if (posEq(sel.from, from) && posEq(sel.to, to)) return;
-      if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
-
-      // Skip over hidden lines.
-      if (from.line != oldFrom) {
-        var from1 = skipHidden(from, oldFrom, sel.from.ch);
-        // If there is no non-hidden line left, force visibility on current line
-        if (!from1) setLineHidden(from.line, false);
-        else from = from1;
-      }
-      if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch);
-
-      if (posEq(from, to)) sel.inverted = false;
-      else if (posEq(from, sel.to)) sel.inverted = false;
-      else if (posEq(to, sel.from)) sel.inverted = true;
-
-      if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) {
-        var head = sel.inverted ? from : to;
-        if (head.line != sel.from.line && sel.from.line < doc.size) {
-          var oldLine = getLine(sel.from.line);
-          if (/^\s+$/.test(oldLine.text))
-            setTimeout(operation(function() {
-              if (oldLine.parent && /^\s+$/.test(oldLine.text)) {
-                var no = lineNo(oldLine);
-                replaceRange("", {line: no, ch: 0}, {line: no, ch: oldLine.text.length});
-              }
-            }, 10));
-        }
-      }
+    var indentString = "", pos = 0;
+    if (cm.options.indentWithTabs)
+      for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
+    if (pos < indentation) indentString += spaceStr(indentation - pos);
 
-      sel.from = from; sel.to = to;
-      selectionChanged = true;
-    }
-    function skipHidden(pos, oldLine, oldCh) {
-      function getNonHidden(dir) {
-        var lNo = pos.line + dir, end = dir == 1 ? doc.size : -1;
-        while (lNo != end) {
-          var line = getLine(lNo);
-          if (!line.hidden) {
-            var ch = pos.ch;
-            if (toEnd || ch > oldCh || ch > line.text.length) ch = line.text.length;
-            return {line: lNo, ch: ch};
-          }
-          lNo += dir;
-        }
-      }
-      var line = getLine(pos.line);
-      var toEnd = pos.ch == line.text.length && pos.ch != oldCh;
-      if (!line.hidden) return pos;
-      if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1);
-      else return getNonHidden(-1) || getNonHidden(1);
-    }
-    function setCursor(line, ch, user) {
-      var pos = clipPos({line: line, ch: ch || 0});
-      (user ? setSelectionUser : setSelection)(pos, pos);
-    }
-
-    function clipLine(n) {return Math.max(0, Math.min(n, doc.size-1));}
-    function clipPos(pos) {
-      if (pos.line < 0) return {line: 0, ch: 0};
-      if (pos.line >= doc.size) return {line: doc.size-1, ch: getLine(doc.size-1).text.length};
-      var ch = pos.ch, linelen = getLine(pos.line).text.length;
-      if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
-      else if (ch < 0) return {line: pos.line, ch: 0};
-      else return pos;
-    }
-
-    function findPosH(dir, unit) {
-      var end = sel.inverted ? sel.from : sel.to, line = end.line, ch = end.ch;
-      var lineObj = getLine(line);
-      function findNextLine() {
-        for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
-          var lo = getLine(l);
-          if (!lo.hidden) { line = l; lineObj = lo; return true; }
+    if (indentString != curSpaceString) {
+      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
+    } else {
+      // Ensure that, if the cursor was in the whitespace at the start
+      // of the line, it is moved to the end of that space.
+      for (var i = 0; i < doc.sel.ranges.length; i++) {
+        var range = doc.sel.ranges[i];
+        if (range.head.line == n && range.head.ch < curSpaceString.length) {
+          var pos = Pos(n, curSpaceString.length);
+          replaceOneSelection(doc, i, new Range(pos, pos));
+          break;
         }
       }
-      function moveOnce(boundToLine) {
-        if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
-          if (!boundToLine && findNextLine()) ch = dir < 0 ? lineObj.text.length : 0;
-          else return false;
-        } else ch += dir;
-        return true;
-      }
-      if (unit == "char") moveOnce();
-      else if (unit == "column") moveOnce(true);
-      else if (unit == "word") {
-        var sawWord = false;
-        for (;;) {
-          if (dir < 0) if (!moveOnce()) break;
-          if (isWordChar(lineObj.text.charAt(ch))) sawWord = true;
-          else if (sawWord) {if (dir < 0) {dir = 1; moveOnce();} break;}
-          if (dir > 0) if (!moveOnce()) break;
+    }
+    line.stateAfter = null;
+  }
+
+  // Utility for applying a change to a line by handle or number,
+  // returning the number and optionally registering the line as
+  // changed.
+  function changeLine(doc, handle, changeType, op) {
+    var no = handle, line = handle;
+    if (typeof handle == "number") line = getLine(doc, clipLine(doc, handle));
+    else no = lineNo(handle);
+    if (no == null) return null;
+    if (op(line, no) && doc.cm) regLineChange(doc.cm, no, changeType);
+    return line;
+  }
+
+  // Helper for deleting text near the selection(s), used to implement
+  // backspace, delete, and similar functionality.
+  function deleteNearSelection(cm, compute) {
+    var ranges = cm.doc.sel.ranges, kill = [];
+    // Build up a set of ranges to kill first, merging overlapping
+    // ranges.
+    for (var i = 0; i < ranges.length; i++) {
+      var toKill = compute(ranges[i]);
+      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+        var replaced = kill.pop();
+        if (cmp(replaced.from, toKill.from) < 0) {
+          toKill.from = replaced.from;
+          break;
         }
       }
-      return {line: line, ch: ch};
-    }
-    function moveH(dir, unit) {
-      var pos = dir < 0 ? sel.from : sel.to;
-      if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit);
-      setCursor(pos.line, pos.ch, true);
+      kill.push(toKill);
     }
-    function deleteH(dir, unit) {
-      if (!posEq(sel.from, sel.to)) replaceRange("", sel.from, sel.to);
-      else if (dir < 0) replaceRange("", findPosH(dir, unit), sel.to);
-      else replaceRange("", sel.from, findPosH(dir, unit));
-      userSelChange = true;
+    // Next, remove those actual ranges.
+    runInOp(cm, function() {
+      for (var i = kill.length - 1; i >= 0; i--)
+        replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete");
+      ensureCursorVisible(cm);
+    });
+  }
+
+  // Used for horizontal relative motion. Dir is -1 or 1 (left or
+  // right), unit can be "char", "column" (like char, but doesn't
+  // cross line boundaries), "word" (across next word), or "group" (to
+  // the start of next group of word or non-word-non-whitespace
+  // chars). The visually param controls whether, in right-to-left
+  // text, direction 1 means to move towards the next index in the
+  // string, or towards the character to the right of the current
+  // position. The resulting position will have a hitSide=true
+  // property if it reached the end of the document.
+  function findPosH(doc, pos, dir, unit, visually) {
+    var line = pos.line, ch = pos.ch, origDir = dir;
+    var lineObj = getLine(doc, line);
+    var possible = true;
+    function findNextLine() {
+      var l = line + dir;
+      if (l < doc.first || l >= doc.first + doc.size) return (possible = false);
+      line = l;
+      return lineObj = getLine(doc, l);
     }
-    function moveV(dir, unit) {
-      var dist = 0, pos = localCoords(sel.inverted ? sel.from : sel.to, true);
-      if (goalColumn != null) pos.x = goalColumn;
-      if (unit == "page") {
-        var screen = Math.min(scroller.clientHeight, window.innerHeight || document.documentElement.clientHeight);
-        var target = coordsChar(pos.x, pos.y + screen * dir);
-      } else if (unit == "line") {
-        var th = textHeight();
-        var target = coordsChar(pos.x, pos.y + .5 * th + dir * th);
-      }
-      if (unit == "page") scrollbar.scrollTop += localCoords(target, true).y - pos.y;
-      setCursor(target.line, target.ch, true);
-      goalColumn = pos.x;
+    function moveOnce(boundToLine) {
+      var next = (visually ? moveVisually : moveLogically)(lineObj, ch, dir, true);
+      if (next == null) {
+        if (!boundToLine && findNextLine()) {
+          if (visually) ch = (dir < 0 ? lineRight : lineLeft)(lineObj);
+          else ch = dir < 0 ? lineObj.text.length : 0;
+        } else return (possible = false);
+      } else ch = next;
+      return true;
     }
 
-    function findWordAt(pos) {
-      var line = getLine(pos.line).text;
-      var start = pos.ch, end = pos.ch;
-      if (line) {
-        if (pos.after === false || end == line.length) --start; else ++end;
-        var startChar = line.charAt(start);
-        var check = isWordChar(startChar) ? isWordChar :
-                    /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);} :
-                    function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
-        while (start > 0 && check(line.charAt(start - 1))) --start;
-        while (end < line.length && check(line.charAt(end))) ++end;
+    if (unit == "char") moveOnce();
+    else if (unit == "column") moveOnce(true);
+    else if (unit == "word" || unit == "group") {
+      var sawType = null, group = unit == "group";
+      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
+      for (var first = true;; first = false) {
+        if (dir < 0 && !moveOnce(!first)) break;
+        var cur = lineObj.text.charAt(ch) || "\n";
+        var type = isWordChar(cur, helper) ? "w"
+          : group && cur == "\n" ? "n"
+          : !group || /\s/.test(cur) ? null
+          : "p";
+        if (group && !first && !type) type = "s";
+        if (sawType && sawType != type) {
+          if (dir < 0) {dir = 1; moveOnce();}
+          break;
+        }
+
+        if (type) sawType = type;
+        if (dir > 0 && !moveOnce(!first)) break;
       }
-      return {from: {line: pos.line, ch: start}, to: {line: pos.line, ch: end}};
     }
-    function selectLine(line) {
-      setSelectionUser({line: line, ch: 0}, clipPos({line: line + 1, ch: 0}));
+    var result = skipAtomic(doc, Pos(line, ch), origDir, true);
+    if (!possible) result.hitSide = true;
+    return result;
+  }
+
+  // For relative vertical movement. Dir may be -1 or 1. Unit can be
+  // "page" or "line". The resulting position will have a hitSide=true
+  // property if it reached the end of the document.
+  function findPosV(cm, pos, dir, unit) {
+    var doc = cm.doc, x = pos.left, y;
+    if (unit == "page") {
+      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+      y = pos.top + dir * (pageSize - (dir < 0 ? 1.5 : .5) * textHeight(cm.display));
+    } else if (unit == "line") {
+      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
     }
-    function indentSelected(mode) {
-      if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode);
-      var e = sel.to.line - (sel.to.ch ? 0 : 1);
-      for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode);
+    for (;;) {
+      var target = coordsChar(cm, x, y);
+      if (!target.outside) break;
+      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break; }
+      y += dir * 5;
     }
+    return target;
+  }
+
+  // EDITOR METHODS
+
+  // The publicly visible API. Note that methodOp(f) means
+  // 'wrap f in an operation, performed on its `this` parameter'.
+
+  // This is not the complete set of editor methods. Most of the
+  // methods defined on the Doc type are also injected into
+  // CodeMirror.prototype, for backwards compatibility and
+  // convenience.
+
+  CodeMirror.prototype = {
+    constructor: CodeMirror,
+    focus: function(){window.focus(); focusInput(this); fastPoll(this);},
+
+    setOption: function(option, value) {
+      var options = this.options, old = options[option];
+      if (options[option] == value && option != "mode") return;
+      options[option] = value;
+      if (optionHandlers.hasOwnProperty(option))
+        operation(this, optionHandlers[option])(this, value, old);
+    },
+
+    getOption: function(option) {return this.options[option];},
+    getDoc: function() {return this.doc;},
 
-    function indentLine(n, how) {
-      if (!how) how = "add";
-      if (how == "smart") {
-        if (!mode.indent) how = "prev";
-        else var state = getStateBefore(n);
+    addKeyMap: function(map, bottom) {
+      this.state.keyMaps[bottom ? "push" : "unshift"](map);
+    },
+    removeKeyMap: function(map) {
+      var maps = this.state.keyMaps;
+      for (var i = 0; i < maps.length; ++i)
+        if (maps[i] == map || (typeof maps[i] != "string" && maps[i].name == map)) {
+          maps.splice(i, 1);
+          return true;
+        }
+    },
+
+    addOverlay: methodOp(function(spec, options) {
+      var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
+      if (mode.startState) throw new Error("Overlays may not be stateful.");
+      this.state.overlays.push({mode: mode, modeSpec: spec, opaque: options && options.opaque});
+      this.state.modeGen++;
+      regChange(this);
+    }),
+    removeOverlay: methodOp(function(spec) {
+      var overlays = this.state.overlays;
+      for (var i = 0; i < overlays.length; ++i) {
+        var cur = overlays[i].modeSpec;
+        if (cur == spec || typeof spec == "string" && cur.name == spec) {
+          overlays.splice(i, 1);
+          this.state.modeGen++;
+          regChange(this);
+          return;
+        }
       }
+    }),
 
-      var line = getLine(n), curSpace = line.indentation(options.tabSize),
-          curSpaceString = line.text.match(/^\s*/)[0], indentation;
-      if (how == "smart") {
-        indentation = mode.indent(state, line.text.slice(curSpaceString.length), line.text);
-        if (indentation == Pass) how = "prev";
+    indentLine: methodOp(function(n, dir, aggressive) {
+      if (typeof dir != "string" && typeof dir != "number") {
+        if (dir == null) dir = this.options.smartIndent ? "smart" : "prev";
+        else dir = dir ? "add" : "subtract";
       }
-      if (how == "prev") {
-        if (n) indentation = getLine(n-1).indentation(options.tabSize);
-        else indentation = 0;
+      if (isLine(this.doc, n)) indentLine(this, n, dir, aggressive);
+    }),
+    indentSelection: methodOp(function(how) {
+      var ranges = this.doc.sel.ranges, end = -1;
+      for (var i = 0; i < ranges.length; i++) {
+        var range = ranges[i];
+        if (!range.empty()) {
+          var from = range.from(), to = range.to();
+          var start = Math.max(end, from.line);
+          end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
+          for (var j = start; j < end; ++j)
+            indentLine(this, j, how);
+          var newRanges = this.doc.sel.ranges;
+          if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
+            replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll);
+        } else if (range.head.line > end) {
+          indentLine(this, range.head.line, how, true);
+          end = range.head.line;
+          if (i == this.doc.sel.primIndex) ensureCursorVisible(this);
+        }
       }
-      else if (how == "add") indentation = curSpace + options.indentUnit;
-      else if (how == "subtract") indentation = curSpace - options.indentUnit;
-      indentation = Math.max(0, indentation);
-      var diff = indentation - curSpace;
-
-      var indentString = "", pos = 0;
-      if (options.indentWithTabs)
-        for (var i = Math.floor(indentation / options.tabSize); i; --i) {pos += options.tabSize; indentString += "\t";}
-      if (pos < indentation) indentString += spaceStr(indentation - pos);
+    }),
 
-      if (indentString != curSpaceString)
-        replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
-    }
+    // Fetch the parser token for a given character. Useful for hacks
+    // that want to inspect the mode state (say, for completion).
+    getTokenAt: function(pos, precise) {
+      var doc = this.doc;
+      pos = clipPos(doc, pos);
+      var state = getStateBefore(this, pos.line, precise), mode = this.doc.mode;
+      var line = getLine(doc, pos.line);
+      var stream = new StringStream(line.text, this.options.tabSize);
+      while (stream.pos < pos.ch && !stream.eol()) {
+        stream.start = stream.pos;
+        var style = readToken(mode, stream, state);
+      }
+      return {start: stream.start,
+              end: stream.pos,
+              string: stream.current(),
+              type: style || null,
+              state: state};
+    },
 
-    function loadMode() {
-      mode = CodeMirror.getMode(options, options.mode);
-      doc.iter(0, doc.size, function(line) { line.stateAfter = null; });
-      frontier = 0;
-      startWorker(100);
-    }
-    function gutterChanged() {
-      var visible = options.gutter || options.lineNumbers;
-      gutter.style.display = visible ? "" : "none";
-      if (visible) gutterDirty = true;
-      else lineDiv.parentNode.style.marginLeft = 0;
-    }
-    function wrappingChanged(from, to) {
-      if (options.lineWrapping) {
-        wrapper.className += " CodeMirror-wrap";
-        var perLine = scroller.clientWidth / charWidth() - 3;
-        doc.iter(0, doc.size, function(line) {
-          if (line.hidden) return;
-          var guess = Math.ceil(line.text.length / perLine) || 1;
-          if (guess != 1) updateLineHeight(line, guess);
-        });
-        lineSpace.style.minWidth = widthForcer.style.left = "";
-      } else {
-        wrapper.className = wrapper.className.replace(" CodeMirror-wrap", "");
-        computeMaxLength();
-        doc.iter(0, doc.size, function(line) {
-          if (line.height != 1 && !line.hidden) updateLineHeight(line, 1);
-        });
+    getTokenTypeAt: function(pos) {
+      pos = clipPos(this.doc, pos);
+      var styles = getLineStyles(this, getLine(this.doc, pos.line));
+      var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
+      var type;
+      if (ch == 0) type = styles[2];
+      else for (;;) {
+        var mid = (before + after) >> 1;
+        if ((mid ? styles[mid * 2 - 1] : 0) >= ch) after = mid;
+        else if (styles[mid * 2 + 1] < ch) before = mid + 1;
+        else { type = styles[mid * 2 + 2]; break; }
       }
-      changes.push({from: 0, to: doc.size});
-    }
-    function themeChanged() {
-      scroller.className = scroller.className.replace(/\s*cm-s-\S+/g, "") +
-        options.theme.replace(/(^|\s)\s*/g, " cm-s-");
-    }
-    function keyMapChanged() {
-      var style = keyMap[options.keyMap].style;
-      wrapper.className = wrapper.className.replace(/\s*cm-keymap-\S+/g, "") +
-        (style ? " cm-keymap-" + style : "");
-    }
+      var cut = type ? type.indexOf("cm-overlay ") : -1;
+      return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1);
+    },
 
-    function TextMarker(type, style) { this.lines = []; this.type = type; if (style) this.style = style; }
-    TextMarker.prototype.clear = operation(function() {
-      var min = Infinity, max = -Infinity;
-      for (var i = 0; i < this.lines.length; ++i) {
-        var line = this.lines[i];
-        var span = getMarkedSpanFor(line.markedSpans, this, true);
-        if (span.from != null || span.to != null) {
-          var lineN = lineNo(line);
-          min = Math.min(min, lineN); max = Math.max(max, lineN);
+    getModeAt: function(pos) {
+      var mode = this.doc.mode;
+      if (!mode.innerMode) return mode;
+      return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode;
+    },
+
+    getHelper: function(pos, type) {
+      return this.getHelpers(pos, type)[0];
+    },
+
+    getHelpers: function(pos, type) {
+      var found = [];
+      if (!helpers.hasOwnProperty(type)) return helpers;
+      var help = helpers[type], mode = this.getModeAt(pos);
+      if (typeof mode[type] == "string") {
+        if (help[mode[type]]) found.push(help[mode[type]]);
+      } else if (mode[type]) {
+        for (var i = 0; i < mode[type].length; i++) {
+          var val = help[mode[type][i]];
+          if (val) found.push(val);
         }
+      } else if (mode.helperType && help[mode.helperType]) {
+        found.push(help[mode.helperType]);
+      } else if (help[mode.name]) {
+        found.push(help[mode.name]);
       }
-      if (min != Infinity)
-        changes.push({from: min, to: max + 1});
-      this.lines.length = 0;
-    });
-    TextMarker.prototype.find = function() {
-      var from, to;
-      for (var i = 0; i < this.lines.length; ++i) {
-        var line = this.lines[i];
-        var span = getMarkedSpanFor(line.markedSpans, this);
-        if (span.from != null || span.to != null) {
-          var found = lineNo(line);
-          if (span.from != null) from = {line: found, ch: span.from};
-          if (span.to != null) to = {line: found, ch: span.to};
-        }
+      for (var i = 0; i < help._global.length; i++) {
+        var cur = help._global[i];
+        if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
+          found.push(cur.val);
       }
-      if (this.type == "bookmark") return from;
-      return from && {from: from, to: to};
-    };
+      return found;
+    },
 
-    function markText(from, to, className, options) {
-      from = clipPos(from); to = clipPos(to);
-      var marker = new TextMarker("range", className);
-      if (options) for (var opt in options) if (options.hasOwnProperty(opt))
-        marker[opt] = options[opt];
-      var curLine = from.line;
-      doc.iter(curLine, to.line + 1, function(line) {
-        var span = {from: curLine == from.line ? from.ch : null,
-                    to: curLine == to.line ? to.ch : null,
-                    marker: marker};
-        (line.markedSpans || (line.markedSpans = [])).push(span);
-        marker.lines.push(line);
-        ++curLine;
-      });
-      changes.push({from: from.line, to: to.line + 1});
-      return marker;
-    }
+    getStateAfter: function(line, precise) {
+      var doc = this.doc;
+      line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
+      return getStateBefore(this, line + 1, precise);
+    },
 
-    function setBookmark(pos) {
-      pos = clipPos(pos);
-      var marker = new TextMarker("bookmark"), line = getLine(pos.line);
-      var span = {from: pos.ch, to: pos.ch, marker: marker};
-      (line.markedSpans || (line.markedSpans = [])).push(span);
-      marker.lines.push(line);
-      return marker;
-    }
+    cursorCoords: function(start, mode) {
+      var pos, range = this.doc.sel.primary();
+      if (start == null) pos = range.head;
+      else if (typeof start == "object") pos = clipPos(this.doc, start);
+      else pos = start ? range.from() : range.to();
+      return cursorCoords(this, pos, mode || "page");
+    },
 
-    function findMarksAt(pos) {
-      pos = clipPos(pos);
-      var markers = [], spans = getLine(pos.line).markedSpans;
-      if (spans) for (var i = 0; i < spans.length; ++i) {
-        var span = spans[i];
-        if ((span.from == null || span.from <= pos.ch) &&
-            (span.to == null || span.to >= pos.ch))
-          markers.push(span.marker);
-      }
-      return markers;
-    }
+    charCoords: function(pos, mode) {
+      return charCoords(this, clipPos(this.doc, pos), mode || "page");
+    },
 
-    function addGutterMarker(line, text, className) {
-      if (typeof line == "number") line = getLine(clipLine(line));
-      line.gutterMarker = {text: text, style: className};
-      gutterDirty = true;
-      return line;
-    }
-    function removeGutterMarker(line) {
-      if (typeof line == "number") line = getLine(clipLine(line));
-      line.gutterMarker = null;
-      gutterDirty = true;
-    }
-
-    function changeLine(handle, op) {
-      var no = handle, line = handle;
-      if (typeof handle == "number") line = getLine(clipLine(handle));
-      else no = lineNo(handle);
-      if (no == null) return null;
-      if (op(line, no)) changes.push({from: no, to: no + 1});
-      else return null;
-      return line;
-    }
-    function setLineClass(handle, className, bgClassName) {
-      return changeLine(handle, function(line) {
-        if (line.className != className || line.bgClassName != bgClassName) {
-          line.className = className;
-          line.bgClassName = bgClassName;
-          return true;
-        }
+    coordsChar: function(coords, mode) {
+      coords = fromCoordSystem(this, coords, mode || "page");
+      return coordsChar(this, coords.left, coords.top);
+    },
+
+    lineAtHeight: function(height, mode) {
+      height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
+      return lineAtHeight(this.doc, height + this.display.viewOffset);
+    },
+    heightAtLine: function(line, mode) {
+      var end = false, last = this.doc.first + this.doc.size - 1;
+      if (line < this.doc.first) line = this.doc.first;
+      else if (line > last) { line = last; end = true; }
+      var lineObj = getLine(this.doc, line);
+      return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page").top +
+        (end ? this.doc.height - heightAtLine(lineObj) : 0);
+    },
+
+    defaultTextHeight: function() { return textHeight(this.display); },
+    defaultCharWidth: function() { return charWidth(this.display); },
+
+    setGutterMarker: methodOp(function(line, gutterID, value) {
+      return changeLine(this.doc, line, "gutter", function(line) {
+        var markers = line.gutterMarkers || (line.gutterMarkers = {});
+        markers[gutterID] = value;
+        if (!value && isEmpty(markers)) line.gutterMarkers = null;
+        return true;
       });
-    }
-    function setLineHidden(handle, hidden) {
-      return changeLine(handle, function(line, no) {
-        if (line.hidden != hidden) {
-          line.hidden = hidden;
-          if (!options.lineWrapping) {
-            if (hidden && line.text.length == maxLine.text.length) {
-              updateMaxLine = true;
-            } else if (!hidden && line.text.length > maxLine.text.length) {
-              maxLine = line; updateMaxLine = false;
-            }
-          }
-          updateLineHeight(line, hidden ? 0 : 1);
-          var fline = sel.from.line, tline = sel.to.line;
-          if (hidden && (fline == no || tline == no)) {
-            var from = fline == no ? skipHidden({line: fline, ch: 0}, fline, 0) : sel.from;
-            var to = tline == no ? skipHidden({line: tline, ch: 0}, tline, 0) : sel.to;
-            // Can't hide the last visible line, we'd have no place to put the cursor
-            if (!to) return;
-            setSelection(from, to);
-          }
-          return (gutterDirty = true);
+    }),
+
+    clearGutter: methodOp(function(gutterID) {
+      var cm = this, doc = cm.doc, i = doc.first;
+      doc.iter(function(line) {
+        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
+          line.gutterMarkers[gutterID] = null;
+          regLineChange(cm, i, "gutter");
+          if (isEmpty(line.gutterMarkers)) line.gutterMarkers = null;
         }
+        ++i;
       });
-    }
+    }),
+
+    addLineWidget: methodOp(function(handle, node, options) {
+      return addLineWidget(this, handle, node, options);
+    }),
 
-    function lineInfo(line) {
+    removeLineWidget: function(widget) { widget.clear(); },
+
+    lineInfo: function(line) {
       if (typeof line == "number") {
-        if (!isLine(line)) return null;
+        if (!isLine(this.doc, line)) return null;
         var n = line;
-        line = getLine(line);
+        line = getLine(this.doc, line);
         if (!line) return null;
       } else {
         var n = lineNo(line);
         if (n == null) return null;
       }
-      var marker = line.gutterMarker;
-      return {line: n, handle: line, text: line.text, markerText: marker && marker.text,
-              markerClass: marker && marker.style, lineClass: line.className, bgClass: line.bgClassName};
-    }
-
-    function measureLine(line, ch) {
-      if (ch == 0) return {top: 0, left: 0};
-      var wbr = options.lineWrapping && ch < line.text.length &&
-                spanAffectsWrapping.test(line.text.slice(ch - 1, ch + 1));
-      var pre = lineContent(line, ch);
-      removeChildrenAndAdd(measure, pre);
-      var anchor = pre.anchor;
-      var top = anchor.offsetTop, left = anchor.offsetLeft;
-      // Older IEs report zero offsets for spans directly after a wrap
-      if (ie && top == 0 && left == 0) {
-        var backup = elt("span", "x");
-        anchor.parentNode.insertBefore(backup, anchor.nextSibling);
-        top = backup.offsetTop;
-      }
-      return {top: top, left: left};
-    }
-    function localCoords(pos, inLineWrap) {
-      var x, lh = textHeight(), y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0));
-      if (pos.ch == 0) x = 0;
-      else {
-        var sp = measureLine(getLine(pos.line), pos.ch);
-        x = sp.left;
-        if (options.lineWrapping) y += Math.max(0, sp.top);
-      }
-      return {x: x, y: y, yBot: y + lh};
-    }
-    // Coords must be lineSpace-local
-    function coordsChar(x, y) {
-      var th = textHeight(), cw = charWidth(), heightPos = displayOffset + Math.floor(y / th);
-      if (heightPos < 0) return {line: 0, ch: 0};
-      var lineNo = lineAtHeight(doc, heightPos);
-      if (lineNo >= doc.size) return {line: doc.size - 1, ch: getLine(doc.size - 1).text.length};
-      var lineObj = getLine(lineNo), text = lineObj.text;
-      var tw = options.lineWrapping, innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0;
-      if (x <= 0 && innerOff == 0) return {line: lineNo, ch: 0};
-      var wrongLine = false;
-      function getX(len) {
-        var sp = measureLine(lineObj, len);
-        if (tw) {
-          var off = Math.round(sp.top / th);
-          wrongLine = off != innerOff;
-          return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth);
-        }
-        return sp.left;
+      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
+              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
+              widgets: line.widgets};
+    },
+
+    getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo};},
+
+    addWidget: function(pos, node, scroll, vert, horiz) {
+      var display = this.display;
+      pos = cursorCoords(this, clipPos(this.doc, pos));
+      var top = pos.bottom, left = pos.left;
+      node.style.position = "absolute";
+      display.sizer.appendChild(node);
+      if (vert == "over") {
+        top = pos.top;
+      } else if (vert == "above" || vert == "near") {
+        var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
+        hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
+        // Default to positioning above (if specified and possible); otherwise default to positioning below
+        if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
+          top = pos.top - node.offsetHeight;
+        else if (pos.bottom + node.offsetHeight <= vspace)
+          top = pos.bottom;
+        if (left + node.offsetWidth > hspace)
+          left = hspace - node.offsetWidth;
       }
-      var from = 0, fromX = 0, to = text.length, toX;
-      // Guess a suitable upper bound for our search.
-      var estimated = Math.min(to, Math.ceil((x + innerOff * scroller.clientWidth * .9) / cw));
-      for (;;) {
-        var estX = getX(estimated);
-        if (estX <= x && estimated < to) estimated = Math.min(to, Math.ceil(estimated * 1.2));
-        else {toX = estX; to = estimated; break;}
-      }
-      if (x > toX) return {line: lineNo, ch: to};
-      // Try to guess a suitable lower bound as well.
-      estimated = Math.floor(to * 0.8); estX = getX(estimated);
-      if (estX < x) {from = estimated; fromX = estX;}
-      // Do a binary search between these bounds.
-      for (;;) {
-        if (to - from <= 1) {
-          var after = x - fromX < toX - x;
-          return {line: lineNo, ch: after ? from : to, after: after};
-        }
-        var middle = Math.ceil((from + to) / 2), middleX = getX(middle);
-        if (middleX > x) {to = middle; toX = middleX; if (wrongLine) toX += 1000; }
-        else {from = middle; fromX = middleX;}
+      node.style.top = top + "px";
+      node.style.left = node.style.right = "";
+      if (horiz == "right") {
+        left = display.sizer.clientWidth - node.offsetWidth;
+        node.style.right = "0px";
+      } else {
+        if (horiz == "left") left = 0;
+        else if (horiz == "middle") left = (display.sizer.clientWidth - node.offsetWidth) / 2;
+        node.style.left = left + "px";
       }
-    }
-    function pageCoords(pos) {
-      var local = localCoords(pos, true), off = eltOffset(lineSpace);
-      return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
-    }
+      if (scroll)
+        scrollIntoView(this, left, top, left + node.offsetWidth, top + node.offsetHeight);
+    },
 
-    var cachedHeight, cachedHeightFor, measurePre;
-    function textHeight() {
-      if (measurePre == null) {
-        measurePre = elt("pre");
-        for (var i = 0; i < 49; ++i) {
-          measurePre.appendChild(document.createTextNode("x"));
-          measurePre.appendChild(elt("br"));
-        }
-        measurePre.appendChild(document.createTextNode("x"));
-      }
-      var offsetHeight = lineDiv.clientHeight;
-      if (offsetHeight == cachedHeightFor) return cachedHeight;
-      cachedHeightFor = offsetHeight;
-      removeChildrenAndAdd(measure, measurePre.cloneNode(true));
-      cachedHeight = measure.firstChild.offsetHeight / 50 || 1;
-      removeChildren(measure);
-      return cachedHeight;
-    }
-    var cachedWidth, cachedWidthFor = 0;
-    function charWidth() {
-      if (scroller.clientWidth == cachedWidthFor) return cachedWidth;
-      cachedWidthFor = scroller.clientWidth;
-      var anchor = elt("span", "x");
-      var pre = elt("pre", [anchor]);
-      removeChildrenAndAdd(measure, pre);
-      return (cachedWidth = anchor.offsetWidth || 10);
-    }
-    function paddingTop() {return lineSpace.offsetTop;}
-    function paddingLeft() {return lineSpace.offsetLeft;}
-
-    function posFromMouse(e, liberal) {
-      var offW = eltOffset(scroller, true), x, y;
-      // Fails unpredictably on IE[67] when mouse is dragged around quickly.
-      try { x = e.clientX; y = e.clientY; } catch (e) { return null; }
-      // This is a mess of a heuristic to try and determine whether a
-      // scroll-bar was clicked or not, and to return null if one was
-      // (and !liberal).
-      if (!liberal && (x - offW.left > scroller.clientWidth || y - offW.top > scroller.clientHeight))
-        return null;
-      var offL = eltOffset(lineSpace, true);
-      return coordsChar(x - offL.left, y - offL.top);
-    }
-    var detectingSelectAll;
-    function onContextMenu(e) {
-      var pos = posFromMouse(e), scrollPos = scrollbar.scrollTop;
-      if (!pos || opera) return; // Opera is difficult.
-      if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
-        operation(setCursor)(pos.line, pos.ch);
-
-      var oldCSS = input.style.cssText;
-      inputDiv.style.position = "absolute";
-      input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.clientY - 5) +
-        "px; left: " + (e.clientX - 5) + "px; z-index: 1000; background: white; " +
-        "border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
-      focusInput();
-      resetInput(true);
-      // Adds "Select all" to context menu in FF
-      if (posEq(sel.from, sel.to)) input.value = prevInput = " ";
-
-      function rehide() {
-        inputDiv.style.position = "relative";
-        input.style.cssText = oldCSS;
-        if (ie_lt9) scrollbar.scrollTop = scrollPos;
-        slowPoll();
-
-        // Try to detect the user choosing select-all 
-        if (input.selectionStart != null) {
-          clearTimeout(detectingSelectAll);
-          var extval = input.value = " " + (posEq(sel.from, sel.to) ? "" : input.value), i = 0;
-          prevInput = " ";
-          input.selectionStart = 1; input.selectionEnd = extval.length;
-          detectingSelectAll = setTimeout(function poll(){
-            if (prevInput == " " && input.selectionStart == 0)
-              operation(commands.selectAll)(instance);
-            else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500);
-            else resetInput();
-          }, 200);
-        }
+    triggerOnKeyDown: methodOp(onKeyDown),
+    triggerOnKeyPress: methodOp(onKeyPress),
+    triggerOnKeyUp: onKeyUp,
+
+    execCommand: function(cmd) {
+      if (commands.hasOwnProperty(cmd))
+        return commands[cmd](this);
+    },
+
+    findPosH: function(from, amount, unit, visually) {
+      var dir = 1;
+      if (amount < 0) { dir = -1; amount = -amount; }
+      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
+        cur = findPosH(this.doc, cur, dir, unit, visually);
+        if (cur.hitSide) break;
+      }
+      return cur;
+    },
+
+    moveH: methodOp(function(dir, unit) {
+      var cm = this;
+      cm.extendSelectionsBy(function(range) {
+        if (cm.display.shift || cm.doc.extend || range.empty())
+          return findPosH(cm.doc, range.head, dir, unit, cm.options.rtlMoveVisually);
+        else
+          return dir < 0 ? range.from() : range.to();
+      }, sel_move);
+    }),
+
+    deleteH: methodOp(function(dir, unit) {
+      var sel = this.doc.sel, doc = this.doc;
+      if (sel.somethingSelected())
+        doc.replaceSelection("", null, "+delete");
+      else
+        deleteNearSelection(this, function(range) {
+          var other = findPosH(doc, range.head, dir, unit, false);
+          return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other};
+        });
+    }),
+
+    findPosV: function(from, amount, unit, goalColumn) {
+      var dir = 1, x = goalColumn;
+      if (amount < 0) { dir = -1; amount = -amount; }
+      for (var i = 0, cur = clipPos(this.doc, from); i < amount; ++i) {
+        var coords = cursorCoords(this, cur, "div");
+        if (x == null) x = coords.left;
+        else coords.left = x;
+        cur = findPosV(this, coords, dir, unit);
+        if (cur.hitSide) break;
       }
+      return cur;
+    },
+
+    moveV: methodOp(function(dir, unit) {
+      var cm = this, doc = this.doc, goals = [];
+      var collapse = !cm.display.shift && !doc.extend && doc.sel.somethingSelected();
+      doc.extendSelectionsBy(function(range) {
+        if (collapse)
+          return dir < 0 ? range.from() : range.to();
+        var headPos = cursorCoords(cm, range.head, "div");
+        if (range.goalColumn != null) headPos.left = range.goalColumn;
+        goals.push(headPos.left);
+        var pos = findPosV(cm, headPos, dir, unit);
+        if (unit == "page" && range == doc.sel.primary())
+          addToScrollPos(cm, null, charCoords(cm, pos, "div").top - headPos.top);
+        return pos;
+      }, sel_move);
+      if (goals.length) for (var i = 0; i < doc.sel.ranges.length; i++)
+        doc.sel.ranges[i].goalColumn = goals[i];
+    }),
+
+    // Find the word at the given position (as returned by coordsChar).
+    findWordAt: function(pos) {
+      var doc = this.doc, line = getLine(doc, pos.line).text;
+      var start = pos.ch, end = pos.ch;
+      if (line) {
+        var helper = this.getHelper(pos, "wordChars");
+        if ((pos.xRel < 0 || end == line.length) && start) --start; else ++end;
+        var startChar = line.charAt(start);
+        var check = isWordChar(startChar, helper)
+          ? function(ch) { return isWordChar(ch, helper); }
+          : /\s/.test(startChar) ? function(ch) {return /\s/.test(ch);}
+          : function(ch) {return !/\s/.test(ch) && !isWordChar(ch);};
+        while (start > 0 && check(line.charAt(start - 1))) --start;
+        while (end < line.length && check(line.charAt(end))) ++end;
+      }
+      return new Range(Pos(pos.line, start), Pos(pos.line, end));
+    },
+
+    toggleOverwrite: function(value) {
+      if (value != null && value == this.state.overwrite) return;
+      if (this.state.overwrite = !this.state.overwrite)
+        addClass(this.display.cursorDiv, "CodeMirror-overwrite");
+      else
+        rmClass(this.display.cursorDiv, "CodeMirror-overwrite");
+
+      signal(this, "overwriteToggle", this, this.state.overwrite);
+    },
+    hasFocus: function() { return activeElt() == this.display.input; },
+
+    scrollTo: methodOp(function(x, y) {
+      if (x != null || y != null) resolveScrollToPos(this);
+      if (x != null) this.curOp.scrollLeft = x;
+      if (y != null) this.curOp.scrollTop = y;
+    }),
+    getScrollInfo: function() {
+      var scroller = this.display.scroller, co = scrollerCutOff;
+      return {left: scroller.scrollLeft, top: scroller.scrollTop,
+              height: scroller.scrollHeight - co, width: scroller.scrollWidth - co,
+              clientHeight: scroller.clientHeight - co, clientWidth: scroller.clientWidth - co};
+    },
+
+    scrollIntoView: methodOp(function(range, margin) {
+      if (range == null) {
+        range = {from: this.doc.sel.primary().head, to: null};
+        if (margin == null) margin = this.options.cursorScrollMargin;
+      } else if (typeof range == "number") {
+        range = {from: Pos(range, 0), to: null};
+      } else if (range.from == null) {
+        range = {from: range, to: null};
+      }
+      if (!range.to) range.to = range.from;
+      range.margin = margin || 0;
 
-      if (gecko) {
-        e_stop(e);
-        var mouseup = connect(window, "mouseup", function() {
-          mouseup();
-          setTimeout(rehide, 20);
-        }, true);
+      if (range.from.line != null) {
+        resolveScrollToPos(this);
+        this.curOp.scrollToPos = range;
       } else {
-        setTimeout(rehide, 50);
-      }
-    }
-
-    // Cursor-blinking
-    function restartBlink() {
-      clearInterval(blinker);
-      var on = true;
-      cursor.style.visibility = "";
-      blinker = setInterval(function() {
-        cursor.style.visibility = (on = !on) ? "" : "hidden";
-      }, options.cursorBlinkRate);
-    }
-
-    var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
-    function matchBrackets(autoclear) {
-      var head = sel.inverted ? sel.from : sel.to, line = getLine(head.line), pos = head.ch - 1;
-      var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
-      if (!match) return;
-      var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
-      for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
-        if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
-
-      var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
-      function scan(line, from, to) {
-        if (!line.text) return;
-        var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
-        for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
-          var text = st[i];
-          if (st[i+1] != style) {pos += d * text.length; continue;}
-          for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
-            if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
-              var match = matching[cur];
-              if (match.charAt(1) == ">" == forward) stack.push(cur);
-              else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
-              else if (!stack.length) return {pos: pos, match: true};
-            }
-          }
-        }
+        var sPos = calculateScrollPos(this, Math.min(range.from.left, range.to.left),
+                                      Math.min(range.from.top, range.to.top) - range.margin,
+                                      Math.max(range.from.right, range.to.right),
+                                      Math.max(range.from.bottom, range.to.bottom) + range.margin);
+        this.scrollTo(sPos.scrollLeft, sPos.scrollTop);
       }
-      for (var i = head.line, e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100); i != e; i+=d) {
-        var line = getLine(i), first = i == head.line;
-        var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
-        if (found) break;
-      }
-      if (!found) found = {pos: null, match: false};
-      var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
-      var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
-          two = found.pos != null && markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
-      var clear = operation(function(){one.clear(); two && two.clear();});
-      if (autoclear) setTimeout(clear, 800);
-      else bracketHighlighted = clear;
-    }
-
-    // Finds the line to start with when starting a parse. Tries to
-    // find a line with a stateAfter, so that it can start with a
-    // valid state. If that fails, it returns the line with the
-    // smallest indentation, which tends to need the least context to
-    // parse correctly.
-    function findStartLine(n) {
-      var minindent, minline;
-      for (var search = n, lim = n - 40; search > lim; --search) {
-        if (search == 0) return 0;
-        var line = getLine(search-1);
-        if (line.stateAfter) return search;
-        var indented = line.indentation(options.tabSize);
-        if (minline == null || minindent > indented) {
-          minline = search - 1;
-          minindent = indented;
-        }
+    }),
+
+    setSize: methodOp(function(width, height) {
+      var cm = this;
+      function interpret(val) {
+        return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val;
       }
-      return minline;
-    }
-    function getStateBefore(n) {
-      var pos = findStartLine(n), state = pos && getLine(pos-1).stateAfter;
-      if (!state) state = startState(mode);
-      else state = copyState(mode, state);
-      doc.iter(pos, n, function(line) {
-        line.process(mode, state, options.tabSize);
-        line.stateAfter = (pos == n - 1 || pos % 5 == 0) ? copyState(mode, state) : null;
-      });
-      return state;
-    }
-    function highlightWorker() {
-      if (frontier >= showingTo) return;
-      var end = +new Date + options.workTime, state = copyState(mode, getStateBefore(frontier));
-      var startFrontier = frontier;
-      doc.iter(frontier, showingTo, function(line) {
-        if (frontier >= showingFrom) { // Visible
-          line.highlight(mode, state, options.tabSize);
-          line.stateAfter = copyState(mode, state);
-        } else {
-          line.process(mode, state, options.tabSize);
-          line.stateAfter = frontier % 5 == 0 ? copyState(mode, state) : null;
-        }
-        ++frontier;
-        if (+new Date > end) {
-          startWorker(options.workDelay);
-          return true;
-        }
+      if (width != null) cm.display.wrapper.style.width = interpret(width);
+      if (height != null) cm.display.wrapper.style.height = interpret(height);
+      if (cm.options.lineWrapping) clearLineMeasurementCache(this);
+      var lineNo = cm.display.viewFrom;
+      cm.doc.iter(lineNo, cm.display.viewTo, function(line) {
+        if (line.widgets) for (var i = 0; i < line.widgets.length; i++)
+          if (line.widgets[i].noHScroll) { regLineChange(cm, lineNo, "widget"); break; }
+        ++lineNo;
       });
-      if (showingTo > startFrontier && frontier >= showingFrom)
-        operation(function() {changes.push({from: startFrontier, to: frontier});})();
-    }
-    function startWorker(time) {
-      if (frontier < showingTo)
-        highlight.set(time, highlightWorker);
-    }
-
-    // Operations are used to wrap changes in such a way that each
-    // change won't have to update the cursor and display (which would
-    // be awkward, slow, and error-prone), but instead updates are
-    // batched and then all combined and executed at once.
-    function startOperation() {
-      updateInput = userSelChange = textChanged = null;
-      changes = []; selectionChanged = false; callbacks = [];
-    }
-    function endOperation() {
-      if (updateMaxLine) computeMaxLength();
-      if (maxLineChanged && !options.lineWrapping) {
-        var cursorWidth = widthForcer.offsetWidth, left = measureLine(maxLine, maxLine.text.length).left;
-        if (!ie_lt8) {
-          widthForcer.style.left = left + "px";
-          lineSpace.style.minWidth = (left + cursorWidth) + "px";
-        }
-        maxLineChanged = false;
-      }
-      var newScrollPos, updated;
-      if (selectionChanged) {
-        var coords = calculateCursorCoords();
-        newScrollPos = calculateScrollPos(coords.x, coords.y, coords.x, coords.yBot);
-      }
-      if (changes.length || newScrollPos && newScrollPos.scrollTop != null)
-        updated = updateDisplay(changes, true, newScrollPos && newScrollPos.scrollTop);
-      if (!updated) {
-        if (selectionChanged) updateSelection();
-        if (gutterDirty) updateGutter();
-      }
-      if (newScrollPos) scrollCursorIntoView();
-      if (selectionChanged) restartBlink();
-
-      if (focused && (updateInput === true || (updateInput !== false && selectionChanged)))
-        resetInput(userSelChange);
-
-      if (selectionChanged && options.matchBrackets)
-        setTimeout(operation(function() {
-          if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
-          if (posEq(sel.from, sel.to)) matchBrackets(false);
-        }), 20);
-      var sc = selectionChanged, cbs = callbacks; // these can be reset by callbacks
-      if (textChanged && options.onChange && instance)
-        options.onChange(instance, textChanged);
-      if (sc && options.onCursorActivity)
-        options.onCursorActivity(instance);
-      for (var i = 0; i < cbs.length; ++i) cbs[i](instance);
-      if (updated && options.onUpdate) options.onUpdate(instance);
-    }
-    var nestedOperation = 0;
-    function operation(f) {
-      return function() {
-        if (!nestedOperation++) startOperation();
-        try {var result = f.apply(this, arguments);}
-        finally {if (!--nestedOperation) endOperation();}
-        return result;
-      };
-    }
-
-    function compoundChange(f) {
-      history.startCompound();
-      try { return f(); } finally { history.endCompound(); }
-    }
+      cm.curOp.forceUpdate = true;
+      signal(cm, "refresh", this);
+    }),
+
+    operation: function(f){return runInOp(this, f);},
+
+    refresh: methodOp(function() {
+      var oldHeight = this.display.cachedTextHeight;
+      regChange(this);
+      this.curOp.forceUpdate = true;
+      clearCaches(this);
+      this.scrollTo(this.doc.scrollLeft, this.doc.scrollTop);
+      updateGutterSpace(this);
+      if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5)
+        estimateLineHeights(this);
+      signal(this, "refresh", this);
+    }),
+
+    swapDoc: methodOp(function(doc) {
+      var old = this.doc;
+      old.cm = null;
+      attachDoc(this, doc);
+      clearCaches(this);
+      resetInput(this);
+      this.scrollTo(doc.scrollLeft, doc.scrollTop);
+      this.curOp.forceScroll = true;
+      signalLater(this, "swapDoc", this, old);
+      return old;
+    }),
+
+    getInputField: function(){return this.display.input;},
+    getWrapperElement: function(){return this.display.wrapper;},
+    getScrollerElement: function(){return this.display.scroller;},
+    getGutterElement: function(){return this.display.gutters;}
+  };
+  eventMixin(CodeMirror);
 
-    for (var ext in extensions)
-      if (extensions.propertyIsEnumerable(ext) &&
-          !instance.propertyIsEnumerable(ext))
-        instance[ext] = extensions[ext];
-    return instance;
-  } // (end of function CodeMirror)
+  // OPTION DEFAULTS
 
   // The default configuration options.
-  CodeMirror.defaults = {
-    value: "",
-    mode: null,
-    theme: "default",
-    indentUnit: 2,
-    indentWithTabs: false,
-    smartIndent: true,
-    tabSize: 4,
-    keyMap: "default",
-    extraKeys: null,
-    electricChars: true,
-    autoClearEmptyLines: false,
-    onKeyEvent: null,
-    onDragEvent: null,
-    lineWrapping: false,
-    lineNumbers: false,
-    gutter: false,
-    fixedGutter: false,
-    firstLineNumber: 1,
-    readOnly: false,
-    dragDrop: true,
-    onChange: null,
-    onCursorActivity: null,
-    onViewportChange: null,
-    onGutterClick: null,
-    onUpdate: null,
-    onFocus: null, onBlur: null, onScroll: null,
-    matchBrackets: false,
-    cursorBlinkRate: 530,
-    workTime: 100,
-    workDelay: 200,
-    pollInterval: 100,
-    undoDepth: 40,
-    tabindex: null,
-    autofocus: null,
-    lineNumberFormatter: function(integer) { return integer; }
-  };
+  var defaults = CodeMirror.defaults = {};
+  // Functions to run when options are changed.
+  var optionHandlers = CodeMirror.optionHandlers = {};
+
+  function option(name, deflt, handle, notOnInit) {
+    CodeMirror.defaults[name] = deflt;
+    if (handle) optionHandlers[name] =
+      notOnInit ? function(cm, val, old) {if (old != Init) handle(cm, val, old);} : handle;
+  }
 
-  var ios = /AppleWebKit/.test(navigator.userAgent) && /Mobile\/\w+/.test(navigator.userAgent);
-  var mac = ios || /Mac/.test(navigator.platform);
-  var win = /Win/.test(navigator.platform);
+  // Passed to option handlers when there is no old value.
+  var Init = CodeMirror.Init = {toString: function(){return "CodeMirror.Init";}};
+
+  // These two are, on init, called from the constructor because they
+  // have to be initialized before the editor can start at all.
+  option("value", "", function(cm, val) {
+    cm.setValue(val);
+  }, true);
+  option("mode", null, function(cm, val) {
+    cm.doc.modeOption = val;
+    loadMode(cm);
+  }, true);
+
+  option("indentUnit", 2, loadMode, true);
+  option("indentWithTabs", false);
+  option("smartIndent", true);
+  option("tabSize", 4, function(cm) {
+    resetModeState(cm);
+    clearCaches(cm);
+    regChange(cm);
+  }, true);
+  option("specialChars", /[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g, function(cm, val) {
+    cm.options.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
+    cm.refresh();
+  }, true);
+  option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function(cm) {cm.refresh();}, true);
+  option("electricChars", true);
+  option("rtlMoveVisually", !windows);
+  option("wholeLineUpdateBefore", true);
+
+  option("theme", "default", function(cm) {
+    themeChanged(cm);
+    guttersChanged(cm);
+  }, true);
+  option("keyMap", "default", keyMapChanged);
+  option("extraKeys", null);
+
+  option("lineWrapping", false, wrappingChanged, true);
+  option("gutters", [], function(cm) {
+    setGuttersForLineNumbers(cm.options);
+    guttersChanged(cm);
+  }, true);
+  option("fixedGutter", true, function(cm, val) {
+    cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
+    cm.refresh();
+  }, true);
+  option("coverGutterNextToScrollbar", false, updateScrollbars, true);
+  option("lineNumbers", false, function(cm) {
+    setGuttersForLineNumbers(cm.options);
+    guttersChanged(cm);
+  }, true);
+  option("firstLineNumber", 1, guttersChanged, true);
+  option("lineNumberFormatter", function(integer) {return integer;}, guttersChanged, true);
+  option("showCursorWhenSelecting", false, updateSelection, true);
+
+  option("resetSelectionOnContextMenu", true);
+
+  option("readOnly", false, function(cm, val) {
+    if (val == "nocursor") {
+      onBlur(cm);
+      cm.display.input.blur();
+      cm.display.disabled = true;
+    } else {
+      cm.display.disabled = false;
+      if (!val) resetInput(cm);
+    }
+  });
+  option("disableInput", false, function(cm, val) {if (!val) resetInput(cm);}, true);
+  option("dragDrop", true);
+
+  option("cursorBlinkRate", 530);
+  option("cursorScrollMargin", 0);
+  option("cursorHeight", 1, updateSelection, true);
+  option("singleCursorHeightPerLine", true, updateSelection, true);
+  option("workTime", 100);
+  option("workDelay", 100);
+  option("flattenSpans", true, resetModeState, true);
+  option("addModeClass", false, resetModeState, true);
+  option("pollInterval", 100);
+  option("undoDepth", 200, function(cm, val){cm.doc.history.undoDepth = val;});
+  option("historyEventDelay", 1250);
+  option("viewportMargin", 10, function(cm){cm.refresh();}, true);
+  option("maxHighlightLength", 10000, resetModeState, true);
+  option("moveInputWithCursor", true, function(cm, val) {
+    if (!val) cm.display.inputDiv.style.top = cm.display.inputDiv.style.left = 0;
+  });
+
+  option("tabindex", null, function(cm, val) {
+    cm.display.input.tabIndex = val || "";
+  });
+  option("autofocus", null);
+
+  // MODE DEFINITION AND QUERYING
 
   // Known modes, by name and by MIME
   var modes = CodeMirror.modes = {}, mimeModes = CodeMirror.mimeModes = {};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
   CodeMirror.defineMode = function(name, mode) {
     if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
     if (arguments.length > 2) {
@@ -2036,17 +4576,30 @@ window.CodeMirror = (function() {
     }
     modes[name] = mode;
   };
+
   CodeMirror.defineMIME = function(mime, spec) {
     mimeModes[mime] = spec;
   };
+
+  // Given a MIME type, a {name, ...options} config object, or a name
+  // string, return a mode config object.
   CodeMirror.resolveMode = function(spec) {
-    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
       spec = mimeModes[spec];
-    else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec))
+    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+      var found = mimeModes[spec.name];
+      if (typeof found == "string") found = {name: found};
+      spec = createObj(found, spec);
+      spec.name = found.name;
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
       return CodeMirror.resolveMode("application/xml");
+    }
     if (typeof spec == "string") return {name: spec};
     else return spec || {name: "null"};
   };
+
+  // Given a mode spec (anything that resolveMode accepts), find and
+  // initialize an actual mode object.
   CodeMirror.getMode = function(options, spec) {
     var spec = CodeMirror.resolveMode(spec);
     var mfactory = modes[spec.name];
@@ -2054,55 +4607,176 @@ window.CodeMirror = (function() {
     var modeObj = mfactory(options, spec);
     if (modeExtensions.hasOwnProperty(spec.name)) {
       var exts = modeExtensions[spec.name];
-      for (var prop in exts) if (exts.hasOwnProperty(prop)) modeObj[prop] = exts[prop];
+      for (var prop in exts) {
+        if (!exts.hasOwnProperty(prop)) continue;
+        if (modeObj.hasOwnProperty(prop)) modeObj["_" + prop] = modeObj[prop];
+        modeObj[prop] = exts[prop];
+      }
     }
     modeObj.name = spec.name;
+    if (spec.helperType) modeObj.helperType = spec.helperType;
+    if (spec.modeProps) for (var prop in spec.modeProps)
+      modeObj[prop] = spec.modeProps[prop];
+
     return modeObj;
   };
-  CodeMirror.listModes = function() {
-    var list = [];
-    for (var m in modes)
-      if (modes.propertyIsEnumerable(m)) list.push(m);
-    return list;
-  };
-  CodeMirror.listMIMEs = function() {
-    var list = [];
-    for (var m in mimeModes)
-      if (mimeModes.propertyIsEnumerable(m)) list.push({mime: m, mode: mimeModes[m]});
-    return list;
-  };
 
-  var extensions = CodeMirror.extensions = {};
-  CodeMirror.defineExtension = function(name, func) {
-    extensions[name] = func;
-  };
+  // Minimal default mode.
+  CodeMirror.defineMode("null", function() {
+    return {token: function(stream) {stream.skipToEnd();}};
+  });
+  CodeMirror.defineMIME("text/plain", "null");
 
+  // This can be used to attach properties to mode objects from
+  // outside the actual mode definition.
   var modeExtensions = CodeMirror.modeExtensions = {};
   CodeMirror.extendMode = function(mode, properties) {
     var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
-    for (var prop in properties) if (properties.hasOwnProperty(prop))
-      exts[prop] = properties[prop];
+    copyObj(properties, exts);
+  };
+
+  // EXTENSIONS
+
+  CodeMirror.defineExtension = function(name, func) {
+    CodeMirror.prototype[name] = func;
+  };
+  CodeMirror.defineDocExtension = function(name, func) {
+    Doc.prototype[name] = func;
+  };
+  CodeMirror.defineOption = option;
+
+  var initHooks = [];
+  CodeMirror.defineInitHook = function(f) {initHooks.push(f);};
+
+  var helpers = CodeMirror.helpers = {};
+  CodeMirror.registerHelper = function(type, name, value) {
+    if (!helpers.hasOwnProperty(type)) helpers[type] = CodeMirror[type] = {_global: []};
+    helpers[type][name] = value;
+  };
+  CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
+    CodeMirror.registerHelper(type, name, value);
+    helpers[type]._global.push({pred: predicate, val: value});
+  };
+
+  // MODE STATE HANDLING
+
+  // Utility functions for working with state. Exported because nested
+  // modes need to do this for their inner modes.
+
+  var copyState = CodeMirror.copyState = function(mode, state) {
+    if (state === true) return state;
+    if (mode.copyState) return mode.copyState(state);
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) val = val.concat([]);
+      nstate[n] = val;
+    }
+    return nstate;
   };
 
+  var startState = CodeMirror.startState = function(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true;
+  };
+
+  // Given a mode and a state (for that mode), find the inner mode and
+  // state at the position that the state refers to.
+  CodeMirror.innerMode = function(mode, state) {
+    while (mode.innerMode) {
+      var info = mode.innerMode(state);
+      if (!info || info.mode == mode) break;
+      state = info.state;
+      mode = info.mode;
+    }
+    return info || {mode: mode, state: state};
+  };
+
+  // STANDARD COMMANDS
+
+  // Commands are parameter-less actions that can be performed on an
+  // editor, mostly used for keybindings.
   var commands = CodeMirror.commands = {
-    selectAll: function(cm) {cm.setSelection({line: 0, ch: 0}, {line: cm.lineCount() - 1});},
+    selectAll: function(cm) {cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);},
+    singleSelection: function(cm) {
+      cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll);
+    },
     killLine: function(cm) {
-      var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
-      if (!sel && cm.getLine(from.line).length == from.ch) cm.replaceRange("", from, {line: from.line + 1, ch: 0});
-      else cm.replaceRange("", from, sel ? to : {line: from.line});
+      deleteNearSelection(cm, function(range) {
+        if (range.empty()) {
+          var len = getLine(cm.doc, range.head.line).text.length;
+          if (range.head.ch == len && range.head.line < cm.lastLine())
+            return {from: range.head, to: Pos(range.head.line + 1, 0)};
+          else
+            return {from: range.head, to: Pos(range.head.line, len)};
+        } else {
+          return {from: range.from(), to: range.to()};
+        }
+      });
+    },
+    deleteLine: function(cm) {
+      deleteNearSelection(cm, function(range) {
+        return {from: Pos(range.from().line, 0),
+                to: clipPos(cm.doc, Pos(range.to().line + 1, 0))};
+      });
+    },
+    delLineLeft: function(cm) {
+      deleteNearSelection(cm, function(range) {
+        return {from: Pos(range.from().line, 0), to: range.from()};
+      });
+    },
+    delWrappedLineLeft: function(cm) {
+      deleteNearSelection(cm, function(range) {
+        var top = cm.charCoords(range.head, "div").top + 5;
+        var leftPos = cm.coordsChar({left: 0, top: top}, "div");
+        return {from: leftPos, to: range.from()};
+      });
+    },
+    delWrappedLineRight: function(cm) {
+      deleteNearSelection(cm, function(range) {
+        var top = cm.charCoords(range.head, "div").top + 5;
+        var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+        return {from: range.from(), to: rightPos };
+      });
     },
-    deleteLine: function(cm) {var l = cm.getCursor().line; cm.replaceRange("", {line: l, ch: 0}, {line: l});},
     undo: function(cm) {cm.undo();},
     redo: function(cm) {cm.redo();},
-    goDocStart: function(cm) {cm.setCursor(0, 0, true);},
-    goDocEnd: function(cm) {cm.setSelection({line: cm.lineCount() - 1}, null, true);},
-    goLineStart: function(cm) {cm.setCursor(cm.getCursor().line, 0, true);},
+    undoSelection: function(cm) {cm.undoSelection();},
+    redoSelection: function(cm) {cm.redoSelection();},
+    goDocStart: function(cm) {cm.extendSelection(Pos(cm.firstLine(), 0));},
+    goDocEnd: function(cm) {cm.extendSelection(Pos(cm.lastLine()));},
+    goLineStart: function(cm) {
+      cm.extendSelectionsBy(function(range) { return lineStart(cm, range.head.line); },
+                            {origin: "+move", bias: 1});
+    },
     goLineStartSmart: function(cm) {
-      var cur = cm.getCursor();
-      var text = cm.getLine(cur.line), firstNonWS = Math.max(0, text.search(/\S/));
-      cm.setCursor(cur.line, cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS, true);
+      cm.extendSelectionsBy(function(range) {
+        return lineStartSmart(cm, range.head);
+      }, {origin: "+move", bias: 1});
+    },
+    goLineEnd: function(cm) {
+      cm.extendSelectionsBy(function(range) { return lineEnd(cm, range.head.line); },
+                            {origin: "+move", bias: -1});
+    },
+    goLineRight: function(cm) {
+      cm.extendSelectionsBy(function(range) {
+        var top = cm.charCoords(range.head, "div").top + 5;
+        return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+      }, sel_move);
+    },
+    goLineLeft: function(cm) {
+      cm.extendSelectionsBy(function(range) {
+        var top = cm.charCoords(range.head, "div").top + 5;
+        return cm.coordsChar({left: 0, top: top}, "div");
+      }, sel_move);
+    },
+    goLineLeftSmart: function(cm) {
+      cm.extendSelectionsBy(function(range) {
+        var top = cm.charCoords(range.head, "div").top + 5;
+        var pos = cm.coordsChar({left: 0, top: top}, "div");
+        if (pos.ch < cm.getLine(pos.line).search(/\S/)) return lineStartSmart(cm, range.head);
+        return pos;
+      }, sel_move);
     },
-    goLineEnd: function(cm) {cm.setSelection({line: cm.getCursor().line}, null, true);},
     goLineUp: function(cm) {cm.moveV(-1, "line");},
     goLineDown: function(cm) {cm.moveV(1, "line");},
     goPageUp: function(cm) {cm.moveV(-1, "page");},
@@ -2112,198 +4786,236 @@ window.CodeMirror = (function() {
     goColumnLeft: function(cm) {cm.moveH(-1, "column");},
     goColumnRight: function(cm) {cm.moveH(1, "column");},
     goWordLeft: function(cm) {cm.moveH(-1, "word");},
+    goGroupRight: function(cm) {cm.moveH(1, "group");},
+    goGroupLeft: function(cm) {cm.moveH(-1, "group");},
     goWordRight: function(cm) {cm.moveH(1, "word");},
-    delCharLeft: function(cm) {cm.deleteH(-1, "char");},
-    delCharRight: function(cm) {cm.deleteH(1, "char");},
-    delWordLeft: function(cm) {cm.deleteH(-1, "word");},
-    delWordRight: function(cm) {cm.deleteH(1, "word");},
+    delCharBefore: function(cm) {cm.deleteH(-1, "char");},
+    delCharAfter: function(cm) {cm.deleteH(1, "char");},
+    delWordBefore: function(cm) {cm.deleteH(-1, "word");},
+    delWordAfter: function(cm) {cm.deleteH(1, "word");},
+    delGroupBefore: function(cm) {cm.deleteH(-1, "group");},
+    delGroupAfter: function(cm) {cm.deleteH(1, "group");},
     indentAuto: function(cm) {cm.indentSelection("smart");},
     indentMore: function(cm) {cm.indentSelection("add");},
     indentLess: function(cm) {cm.indentSelection("subtract");},
-    insertTab: function(cm) {cm.replaceSelection("\t", "end");},
+    insertTab: function(cm) {cm.replaceSelection("\t");},
+    insertSoftTab: function(cm) {
+      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
+      for (var i = 0; i < ranges.length; i++) {
+        var pos = ranges[i].from();
+        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
+        spaces.push(new Array(tabSize - col % tabSize + 1).join(" "));
+      }
+      cm.replaceSelections(spaces);
+    },
     defaultTab: function(cm) {
       if (cm.somethingSelected()) cm.indentSelection("add");
-      else cm.replaceSelection("\t", "end");
+      else cm.execCommand("insertTab");
     },
     transposeChars: function(cm) {
-      var cur = cm.getCursor(), line = cm.getLine(cur.line);
-      if (cur.ch > 0 && cur.ch < line.length - 1)
-        cm.replaceRange(line.charAt(cur.ch) + line.charAt(cur.ch - 1),
-                        {line: cur.line, ch: cur.ch - 1}, {line: cur.line, ch: cur.ch + 1});
+      runInOp(cm, function() {
+        var ranges = cm.listSelections(), newSel = [];
+        for (var i = 0; i < ranges.length; i++) {
+          var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
+          if (line) {
+            if (cur.ch == line.length) cur = new Pos(cur.line, cur.ch - 1);
+            if (cur.ch > 0) {
+              cur = new Pos(cur.line, cur.ch + 1);
+              cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
+                              Pos(cur.line, cur.ch - 2), cur, "+transpose");
+            } else if (cur.line > cm.doc.first) {
+              var prev = getLine(cm.doc, cur.line - 1).text;
+              if (prev)
+                cm.replaceRange(line.charAt(0) + "\n" + prev.charAt(prev.length - 1),
+                                Pos(cur.line - 1, prev.length - 1), Pos(cur.line, 1), "+transpose");
+            }
+          }
+          newSel.push(new Range(cur, cur));
+        }
+        cm.setSelections(newSel);
+      });
     },
     newlineAndIndent: function(cm) {
-      cm.replaceSelection("\n", "end");
-      cm.indentLine(cm.getCursor().line);
+      runInOp(cm, function() {
+        var len = cm.listSelections().length;
+        for (var i = 0; i < len; i++) {
+          var range = cm.listSelections()[i];
+          cm.replaceRange("\n", range.anchor, range.head, "+input");
+          cm.indentLine(range.from().line + 1, null, true);
+          ensureCursorVisible(cm);
+        }
+      });
     },
     toggleOverwrite: function(cm) {cm.toggleOverwrite();}
   };
 
+  // STANDARD KEYMAPS
+
   var keyMap = CodeMirror.keyMap = {};
   keyMap.basic = {
     "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
     "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
-    "Delete": "delCharRight", "Backspace": "delCharLeft", "Tab": "defaultTab", "Shift-Tab": "indentAuto",
-    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite"
+    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
+    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
+    "Esc": "singleSelection"
   };
   // Note that the save and find-related commands aren't defined by
-  // default. Unknown commands are simply ignored.
+  // default. User code or addons can define them. Unknown commands
+  // are simply ignored.
   keyMap.pcDefault = {
     "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
-    "Ctrl-Home": "goDocStart", "Alt-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
-    "Ctrl-Left": "goWordLeft", "Ctrl-Right": "goWordRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
-    "Ctrl-Backspace": "delWordLeft", "Ctrl-Delete": "delWordRight", "Ctrl-S": "save", "Ctrl-F": "find",
+    "Ctrl-Home": "goDocStart", "Ctrl-Up": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Down": "goDocEnd",
+    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
     "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
     "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
     fallthrough: "basic"
   };
   keyMap.macDefault = {
     "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
-    "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goWordLeft",
-    "Alt-Right": "goWordRight", "Cmd-Left": "goLineStart", "Cmd-Right": "goLineEnd", "Alt-Backspace": "delWordLeft",
-    "Ctrl-Alt-Backspace": "delWordRight", "Alt-Delete": "delWordRight", "Cmd-S": "save", "Cmd-F": "find",
+    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
+    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
+    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
     "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
-    "Cmd-[": "indentLess", "Cmd-]": "indentMore",
+    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
+    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection",
     fallthrough: ["basic", "emacsy"]
   };
-  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+  // Very basic readline/emacs-style bindings, which are standard on Mac.
   keyMap.emacsy = {
     "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
     "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd",
-    "Ctrl-V": "goPageUp", "Shift-Ctrl-V": "goPageDown", "Ctrl-D": "delCharRight", "Ctrl-H": "delCharLeft",
-    "Alt-D": "delWordRight", "Alt-Backspace": "delWordLeft", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
+    "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore",
+    "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars"
   };
+  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+
+  // KEYMAP DISPATCH
 
   function getKeyMap(val) {
     if (typeof val == "string") return keyMap[val];
     else return val;
   }
-  function lookupKey(name, extraMap, map, handle, stop) {
+
+  // Given an array of keymaps and a key name, call handle on any
+  // bindings found, until that returns a truthy value, at which point
+  // we consider the key handled. Implements things like binding a key
+  // to false stopping further handling and keymap fallthrough.
+  var lookupKey = CodeMirror.lookupKey = function(name, maps, handle) {
     function lookup(map) {
       map = getKeyMap(map);
       var found = map[name];
-      if (found === false) {
-        if (stop) stop();
-        return true;
-      }
+      if (found === false) return "stop";
       if (found != null && handle(found)) return true;
-      if (map.nofallthrough) {
-        if (stop) stop();
-        return true;
-      }
+      if (map.nofallthrough) return "stop";
+
       var fallthrough = map.fallthrough;
       if (fallthrough == null) return false;
       if (Object.prototype.toString.call(fallthrough) != "[object Array]")
         return lookup(fallthrough);
-      for (var i = 0, e = fallthrough.length; i < e; ++i) {
-        if (lookup(fallthrough[i])) return true;
+      for (var i = 0; i < fallthrough.length; ++i) {
+        var done = lookup(fallthrough[i]);
+        if (done) return done;
       }
       return false;
     }
-    if (extraMap && lookup(extraMap)) return true;
-    return lookup(map);
-  }
-  function isModifierKey(event) {
-    var name = keyNames[e_prop(event, "keyCode")];
+
+    for (var i = 0; i < maps.length; ++i) {
+      var done = lookup(maps[i]);
+      if (done) return done != "stop";
+    }
+  };
+
+  // Modifier key presses don't count as 'real' key presses for the
+  // purpose of keymap fallthrough.
+  var isModifierKey = CodeMirror.isModifierKey = function(event) {
+    var name = keyNames[event.keyCode];
     return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod";
-  }
+  };
+
+  // Look up the name of a key as indicated by an event object.
+  var keyName = CodeMirror.keyName = function(event, noShift) {
+    if (presto && event.keyCode == 34 && event["char"]) return false;
+    var name = keyNames[event.keyCode];
+    if (name == null || event.altGraphKey) return false;
+    if (event.altKey) name = "Alt-" + name;
+    if (flipCtrlCmd ? event.metaKey : event.ctrlKey) name = "Ctrl-" + name;
+    if (flipCtrlCmd ? event.ctrlKey : event.metaKey) name = "Cmd-" + name;
+    if (!noShift && event.shiftKey) name = "Shift-" + name;
+    return name;
+  };
+
+  // FROMTEXTAREA
 
   CodeMirror.fromTextArea = function(textarea, options) {
     if (!options) options = {};
     options.value = textarea.value;
     if (!options.tabindex && textarea.tabindex)
       options.tabindex = textarea.tabindex;
+    if (!options.placeholder && textarea.placeholder)
+      options.placeholder = textarea.placeholder;
     // Set autofocus to true if this textarea is focused, or if it has
     // autofocus and no other element is focused.
     if (options.autofocus == null) {
-      var hasFocus = document.body;
-      // doc.activeElement occasionally throws on IE
-      try { hasFocus = document.activeElement; } catch(e) {}
+      var hasFocus = activeElt();
       options.autofocus = hasFocus == textarea ||
         textarea.getAttribute("autofocus") != null && hasFocus == document.body;
     }
 
-    function save() {textarea.value = instance.getValue();}
+    function save() {textarea.value = cm.getValue();}
     if (textarea.form) {
+      on(textarea.form, "submit", save);
       // Deplorable hack to make the submit method do the right thing.
-      var rmSubmit = connect(textarea.form, "submit", save, true);
-      if (typeof textarea.form.submit == "function") {
-        var realSubmit = textarea.form.submit;
-        textarea.form.submit = function wrappedSubmit() {
-          save();
-          textarea.form.submit = realSubmit;
-          textarea.form.submit();
-          textarea.form.submit = wrappedSubmit;
-        };
+      if (!options.leaveSubmitMethodAlone) {
+        var form = textarea.form, realSubmit = form.submit;
+        try {
+          var wrappedSubmit = form.submit = function() {
+            save();
+            form.submit = realSubmit;
+            form.submit();
+            form.submit = wrappedSubmit;
+          };
+        } catch(e) {}
       }
     }
 
     textarea.style.display = "none";
-    var instance = CodeMirror(function(node) {
+    var cm = CodeMirror(function(node) {
       textarea.parentNode.insertBefore(node, textarea.nextSibling);
     }, options);
-    instance.save = save;
-    instance.getTextArea = function() { return textarea; };
-    instance.toTextArea = function() {
+    cm.save = save;
+    cm.getTextArea = function() { return textarea; };
+    cm.toTextArea = function() {
       save();
-      textarea.parentNode.removeChild(instance.getWrapperElement());
+      textarea.parentNode.removeChild(cm.getWrapperElement());
       textarea.style.display = "";
       if (textarea.form) {
-        rmSubmit();
+        off(textarea.form, "submit", save);
         if (typeof textarea.form.submit == "function")
           textarea.form.submit = realSubmit;
       }
     };
-    return instance;
+    return cm;
   };
 
-  var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
-  var ie = /MSIE \d/.test(navigator.userAgent);
-  var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent);
-  var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent);
-  var quirksMode = ie && document.documentMode == 5;
-  var webkit = /WebKit\//.test(navigator.userAgent);
-  var chrome = /Chrome\//.test(navigator.userAgent);
-  var opera = /Opera\//.test(navigator.userAgent);
-  var safari = /Apple Computer/.test(navigator.vendor);
-  var khtml = /KHTML\//.test(navigator.userAgent);
-  var mac_geLion = /Mac OS X 10\D([7-9]|\d\d)\D/.test(navigator.userAgent);
+  // STRING STREAM
 
-  // Utility functions for working with state. Exported because modes
-  // sometimes need to do this.
-  function copyState(mode, state) {
-    if (state === true) return state;
-    if (mode.copyState) return mode.copyState(state);
-    var nstate = {};
-    for (var n in state) {
-      var val = state[n];
-      if (val instanceof Array) val = val.concat([]);
-      nstate[n] = val;
-    }
-    return nstate;
-  }
-  CodeMirror.copyState = copyState;
-  function startState(mode, a1, a2) {
-    return mode.startState ? mode.startState(a1, a2) : true;
-  }
-  CodeMirror.startState = startState;
-  CodeMirror.innerMode = function(mode, state) {
-    while (mode.innerMode) {
-      var info = mode.innerMode(state);
-      state = info.state;
-      mode = info.mode;
-    }
-    return info || {mode: mode, state: state};
-  };
+  // Fed to the mode parsers, provides helper functions to make
+  // parsers more succinct.
 
-  // The character stream used by a mode's parser.
-  function StringStream(string, tabSize) {
+  var StringStream = CodeMirror.StringStream = function(string, tabSize) {
     this.pos = this.start = 0;
     this.string = string;
     this.tabSize = tabSize || 8;
-  }
+    this.lastColumnPos = this.lastColumnValue = 0;
+    this.lineStart = 0;
+  };
+
   StringStream.prototype = {
     eol: function() {return this.pos >= this.string.length;},
-    sol: function() {return this.pos == 0;},
+    sol: function() {return this.pos == this.lineStart;},
     peek: function() {return this.string.charAt(this.pos) || undefined;},
     next: function() {
       if (this.pos < this.string.length)
@@ -2331,12 +5043,22 @@ window.CodeMirror = (function() {
       if (found > -1) {this.pos = found; return true;}
     },
     backUp: function(n) {this.pos -= n;},
-    column: function() {return countColumn(this.string, this.start, this.tabSize);},
-    indentation: function() {return countColumn(this.string, null, this.tabSize);},
+    column: function() {
+      if (this.lastColumnPos < this.start) {
+        this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+        this.lastColumnPos = this.start;
+      }
+      return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
+    },
+    indentation: function() {
+      return countColumn(this.string, null, this.tabSize) -
+        (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0);
+    },
     match: function(pattern, consume, caseInsensitive) {
       if (typeof pattern == "string") {
         var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};
-        if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+        var substr = this.string.substr(this.pos, pattern.length);
+        if (cased(substr) == cased(pattern)) {
           if (consume !== false) this.pos += pattern.length;
           return true;
         }
@@ -2347,370 +5069,1178 @@ window.CodeMirror = (function() {
         return match;
       }
     },
-    current: function(){return this.string.slice(this.start, this.pos);}
+    current: function(){return this.string.slice(this.start, this.pos);},
+    hideFirstChars: function(n, inner) {
+      this.lineStart += n;
+      try { return inner(); }
+      finally { this.lineStart -= n; }
+    }
+  };
+
+  // TEXTMARKERS
+
+  // Created with markText and setBookmark methods. A TextMarker is a
+  // handle that can be used to clear or find a marked position in the
+  // document. Line objects hold arrays (markedSpans) containing
+  // {from, to, marker} object pointing to such marker objects, and
+  // indicating that such a marker is present on that line. Multiple
+  // lines may point to the same marker when it spans across lines.
+  // The spans will have null for their from/to properties when the
+  // marker continues beyond the start/end of the line. Markers have
+  // links back to the lines they currently touch.
+
+  var TextMarker = CodeMirror.TextMarker = function(doc, type) {
+    this.lines = [];
+    this.type = type;
+    this.doc = doc;
+  };
+  eventMixin(TextMarker);
+
+  // Clear the marker.
+  TextMarker.prototype.clear = function() {
+    if (this.explicitlyCleared) return;
+    var cm = this.doc.cm, withOp = cm && !cm.curOp;
+    if (withOp) startOperation(cm);
+    if (hasHandler(this, "clear")) {
+      var found = this.find();
+      if (found) signalLater(this, "clear", found.from, found.to);
+    }
+    var min = null, max = null;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (cm && !this.collapsed) regLineChange(cm, lineNo(line), "text");
+      else if (cm) {
+        if (span.to != null) max = lineNo(line);
+        if (span.from != null) min = lineNo(line);
+      }
+      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
+      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
+        updateLineHeight(line, textHeight(cm.display));
+    }
+    if (cm && this.collapsed && !cm.options.lineWrapping) for (var i = 0; i < this.lines.length; ++i) {
+      var visual = visualLine(this.lines[i]), len = lineLength(visual);
+      if (len > cm.display.maxLineLength) {
+        cm.display.maxLine = visual;
+        cm.display.maxLineLength = len;
+        cm.display.maxLineChanged = true;
+      }
+    }
+
+    if (min != null && cm && this.collapsed) regChange(cm, min, max + 1);
+    this.lines.length = 0;
+    this.explicitlyCleared = true;
+    if (this.atomic && this.doc.cantEdit) {
+      this.doc.cantEdit = false;
+      if (cm) reCheckSelection(cm.doc);
+    }
+    if (cm) signalLater(cm, "markerCleared", cm, this);
+    if (withOp) endOperation(cm);
+    if (this.parent) this.parent.clear();
+  };
+
+  // Find the position of the marker in the document. Returns a {from,
+  // to} object by default. Side can be passed to get a specific side
+  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
+  // Pos objects returned contain a line object, rather than a line
+  // number (used to prevent looking up the same line twice).
+  TextMarker.prototype.find = function(side, lineObj) {
+    if (side == null && this.type == "bookmark") side = 1;
+    var from, to;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (span.from != null) {
+        from = Pos(lineObj ? line : lineNo(line), span.from);
+        if (side == -1) return from;
+      }
+      if (span.to != null) {
+        to = Pos(lineObj ? line : lineNo(line), span.to);
+        if (side == 1) return to;
+      }
+    }
+    return from && {from: from, to: to};
+  };
+
+  // Signals that the marker's widget changed, and surrounding layout
+  // should be recomputed.
+  TextMarker.prototype.changed = function() {
+    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
+    if (!pos || !cm) return;
+    runInOp(cm, function() {
+      var line = pos.line, lineN = lineNo(pos.line);
+      var view = findViewForLine(cm, lineN);
+      if (view) {
+        clearLineMeasurementCacheFor(view);
+        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
+      }
+      cm.curOp.updateMaxLine = true;
+      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
+        var oldHeight = widget.height;
+        widget.height = null;
+        var dHeight = widgetHeight(widget) - oldHeight;
+        if (dHeight)
+          updateLineHeight(line, line.height + dHeight);
+      }
+    });
+  };
+
+  TextMarker.prototype.attachLine = function(line) {
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp;
+      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
+        (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this);
+    }
+    this.lines.push(line);
+  };
+  TextMarker.prototype.detachLine = function(line) {
+    this.lines.splice(indexOf(this.lines, line), 1);
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp;
+      (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
+    }
+  };
+
+  // Collapsed markers have unique ids, in order to be able to order
+  // them, which is needed for uniquely determining an outer marker
+  // when they overlap (they may nest, but not partially overlap).
+  var nextMarkerId = 0;
+
+  // Create a marker, wire it up to the right lines, and
+  function markText(doc, from, to, options, type) {
+    // Shared markers (across linked documents) are handled separately
+    // (markTextShared will call out to this again, once per
+    // document).
+    if (options && options.shared) return markTextShared(doc, from, to, options, type);
+    // Ensure we are in an operation.
+    if (doc.cm && !doc.cm.curOp) return operation(doc.cm, markText)(doc, from, to, options, type);
+
+    var marker = new TextMarker(doc, type), diff = cmp(from, to);
+    if (options) copyObj(options, marker, false);
+    // Don't connect empty markers unless clearWhenEmpty is false
+    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
+      return marker;
+    if (marker.replacedWith) {
+      // Showing up as a widget implies collapsed (widget replaces text)
+      marker.collapsed = true;
+      marker.widgetNode = elt("span", [marker.replacedWith], "CodeMirror-widget");
+      if (!options.handleMouseEvents) marker.widgetNode.ignoreEvents = true;
+      if (options.insertLeft) marker.widgetNode.insertLeft = true;
+    }
+    if (marker.collapsed) {
+      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
+          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
+        throw new Error("Inserting collapsed marker partially overlapping an existing one");
+      sawCollapsedSpans = true;
+    }
+
+    if (marker.addToHistory)
+      addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN);
+
+    var curLine = from.line, cm = doc.cm, updateMaxLine;
+    doc.iter(curLine, to.line + 1, function(line) {
+      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
+        updateMaxLine = true;
+      if (marker.collapsed && curLine != from.line) updateLineHeight(line, 0);
+      addMarkedSpan(line, new MarkedSpan(marker,
+                                         curLine == from.line ? from.ch : null,
+                                         curLine == to.line ? to.ch : null));
+      ++curLine;
+    });
+    // lineIsHidden depends on the presence of the spans, so needs a second pass
+    if (marker.collapsed) doc.iter(from.line, to.line + 1, function(line) {
+      if (lineIsHidden(doc, line)) updateLineHeight(line, 0);
+    });
+
+    if (marker.clearOnEnter) on(marker, "beforeCursorEnter", function() { marker.clear(); });
+
+    if (marker.readOnly) {
+      sawReadOnlySpans = true;
+      if (doc.history.done.length || doc.history.undone.length)
+        doc.clearHistory();
+    }
+    if (marker.collapsed) {
+      marker.id = ++nextMarkerId;
+      marker.atomic = true;
+    }
+    if (cm) {
+      // Sync editor state
+      if (updateMaxLine) cm.curOp.updateMaxLine = true;
+      if (marker.collapsed)
+        regChange(cm, from.line, to.line + 1);
+      else if (marker.className || marker.title || marker.startStyle || marker.endStyle)
+        for (var i = from.line; i <= to.line; i++) regLineChange(cm, i, "text");
+      if (marker.atomic) reCheckSelection(cm.doc);
+      signalLater(cm, "markerAdded", cm, marker);
+    }
+    return marker;
+  }
+
+  // SHARED TEXTMARKERS
+
+  // A shared marker spans multiple linked documents. It is
+  // implemented as a meta-marker-object controlling multiple normal
+  // markers.
+  var SharedTextMarker = CodeMirror.SharedTextMarker = function(markers, primary) {
+    this.markers = markers;
+    this.primary = primary;
+    for (var i = 0; i < markers.length; ++i)
+      markers[i].parent = this;
+  };
+  eventMixin(SharedTextMarker);
+
+  SharedTextMarker.prototype.clear = function() {
+    if (this.explicitlyCleared) return;
+    this.explicitlyCleared = true;
+    for (var i = 0; i < this.markers.length; ++i)
+      this.markers[i].clear();
+    signalLater(this, "clear");
+  };
+  SharedTextMarker.prototype.find = function(side, lineObj) {
+    return this.primary.find(side, lineObj);
+  };
+
+  function markTextShared(doc, from, to, options, type) {
+    options = copyObj(options);
+    options.shared = false;
+    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
+    var widget = options.widgetNode;
+    linkedDocs(doc, function(doc) {
+      if (widget) options.widgetNode = widget.cloneNode(true);
+      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
+      for (var i = 0; i < doc.linked.length; ++i)
+        if (doc.linked[i].isParent) return;
+      primary = lst(markers);
+    });
+    return new SharedTextMarker(markers, primary);
+  }
+
+  function findSharedMarkers(doc) {
+    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())),
+                         function(m) { return m.parent; });
+  }
+
+  function copySharedMarkers(doc, markers) {
+    for (var i = 0; i < markers.length; i++) {
+      var marker = markers[i], pos = marker.find();
+      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
+      if (cmp(mFrom, mTo)) {
+        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
+        marker.markers.push(subMark);
+        subMark.parent = marker;
+      }
+    }
+  }
+
+  function detachSharedMarkers(markers) {
+    for (var i = 0; i < markers.length; i++) {
+      var marker = markers[i], linked = [marker.primary.doc];;
+      linkedDocs(marker.primary.doc, function(d) { linked.push(d); });
+      for (var j = 0; j < marker.markers.length; j++) {
+        var subMarker = marker.markers[j];
+        if (indexOf(linked, subMarker.doc) == -1) {
+          subMarker.parent = null;
+          marker.markers.splice(j--, 1);
+        }
+      }
+    }
+  }
+
+  // TEXTMARKER SPANS
+
+  function MarkedSpan(marker, from, to) {
+    this.marker = marker;
+    this.from = from; this.to = to;
+  }
+
+  // Search an array of spans for a span matching the given marker.
+  function getMarkedSpanFor(spans, marker) {
+    if (spans) for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.marker == marker) return span;
+    }
+  }
+  // Remove a span from an array, returning undefined if no spans are
+  // left (we don't store arrays for lines without spans).
+  function removeMarkedSpan(spans, span) {
+    for (var r, i = 0; i < spans.length; ++i)
+      if (spans[i] != span) (r || (r = [])).push(spans[i]);
+    return r;
+  }
+  // Add a span to a line.
+  function addMarkedSpan(line, span) {
+    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+    span.marker.attachLine(line);
+  }
+
+  // Used for the algorithm that adjusts markers for a change in the
+  // document. These functions cut an array of spans at a given
+  // character position, returning an array of remaining chunks (or
+  // undefined if nothing remains).
+  function markedSpansBefore(old, startCh, isInsert) {
+    if (old) for (var i = 0, nw; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
+        (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+      }
+    }
+    return nw;
+  }
+  function markedSpansAfter(old, endCh, isInsert) {
+    if (old) for (var i = 0, nw; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
+        (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+                                              span.to == null ? null : span.to - endCh));
+      }
+    }
+    return nw;
+  }
+
+  // Given a change object, compute the new set of marker spans that
+  // cover the line in which the change took place. Removes spans
+  // entirely within the change, reconnects spans belonging to the
+  // same marker that appear on both sides of the change, and cuts off
+  // spans partially within the change. Returns an array of span
+  // arrays with one element for each line in (after) the change.
+  function stretchSpansOverChange(doc, change) {
+    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+    if (!oldFirst && !oldLast) return null;
+
+    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+    // Get the spans that 'stick out' on both sides
+    var first = markedSpansBefore(oldFirst, startCh, isInsert);
+    var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+    // Next, merge those two ends
+    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+    if (first) {
+      // Fix up .to properties of first
+      for (var i = 0; i < first.length; ++i) {
+        var span = first[i];
+        if (span.to == null) {
+          var found = getMarkedSpanFor(last, span.marker);
+          if (!found) span.to = startCh;
+          else if (sameLine) span.to = found.to == null ? null : found.to + offset;
+        }
+      }
+    }
+    if (last) {
+      // Fix up .from in last (or move them into first in case of sameLine)
+      for (var i = 0; i < last.length; ++i) {
+        var span = last[i];
+        if (span.to != null) span.to += offset;
+        if (span.from == null) {
+          var found = getMarkedSpanFor(first, span.marker);
+          if (!found) {
+            span.from = offset;
+            if (sameLine) (first || (first = [])).push(span);
+          }
+        } else {
+          span.from += offset;
+          if (sameLine) (first || (first = [])).push(span);
+        }
+      }
+    }
+    // Make sure we didn't create any zero-length spans
+    if (first) first = clearEmptySpans(first);
+    if (last && last != first) last = clearEmptySpans(last);
+
+    var newMarkers = [first];
+    if (!sameLine) {
+      // Fill gap with whole-line-spans
+      var gap = change.text.length - 2, gapMarkers;
+      if (gap > 0 && first)
+        for (var i = 0; i < first.length; ++i)
+          if (first[i].to == null)
+            (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i].marker, null, null));
+      for (var i = 0; i < gap; ++i)
+        newMarkers.push(gapMarkers);
+      newMarkers.push(last);
+    }
+    return newMarkers;
+  }
+
+  // Remove spans that are empty and don't have a clearWhenEmpty
+  // option of false.
+  function clearEmptySpans(spans) {
+    for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+        spans.splice(i--, 1);
+    }
+    if (!spans.length) return null;
+    return spans;
+  }
+
+  // Used for un/re-doing changes from the history. Combines the
+  // result of computing the existing spans with the set of spans that
+  // existed in the history (so that deleting around a span and then
+  // undoing brings back the span).
+  function mergeOldSpans(doc, change) {
+    var old = getOldSpans(doc, change);
+    var stretched = stretchSpansOverChange(doc, change);
+    if (!old) return stretched;
+    if (!stretched) return old;
+
+    for (var i = 0; i < old.length; ++i) {
+      var oldCur = old[i], stretchCur = stretched[i];
+      if (oldCur && stretchCur) {
+        spans: for (var j = 0; j < stretchCur.length; ++j) {
+          var span = stretchCur[j];
+          for (var k = 0; k < oldCur.length; ++k)
+            if (oldCur[k].marker == span.marker) continue spans;
+          oldCur.push(span);
+        }
+      } else if (stretchCur) {
+        old[i] = stretchCur;
+      }
+    }
+    return old;
+  }
+
+  // Used to 'clip' out readOnly ranges when making a change.
+  function removeReadOnlyRanges(doc, from, to) {
+    var markers = null;
+    doc.iter(from.line, to.line + 1, function(line) {
+      if (line.markedSpans) for (var i = 0; i < line.markedSpans.length; ++i) {
+        var mark = line.markedSpans[i].marker;
+        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+          (markers || (markers = [])).push(mark);
+      }
+    });
+    if (!markers) return null;
+    var parts = [{from: from, to: to}];
+    for (var i = 0; i < markers.length; ++i) {
+      var mk = markers[i], m = mk.find(0);
+      for (var j = 0; j < parts.length; ++j) {
+        var p = parts[j];
+        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) continue;
+        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+          newParts.push({from: p.from, to: m.from});
+        if (dto > 0 || !mk.inclusiveRight && !dto)
+          newParts.push({from: m.to, to: p.to});
+        parts.splice.apply(parts, newParts);
+        j += newParts.length - 1;
+      }
+    }
+    return parts;
+  }
+
+  // Connect or disconnect spans from a line.
+  function detachMarkedSpans(line) {
+    var spans = line.markedSpans;
+    if (!spans) return;
+    for (var i = 0; i < spans.length; ++i)
+      spans[i].marker.detachLine(line);
+    line.markedSpans = null;
+  }
+  function attachMarkedSpans(line, spans) {
+    if (!spans) return;
+    for (var i = 0; i < spans.length; ++i)
+      spans[i].marker.attachLine(line);
+    line.markedSpans = spans;
+  }
+
+  // Helpers used when computing which overlapping collapsed span
+  // counts as the larger one.
+  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
+  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
+
+  // Returns a number indicating which of two overlapping collapsed
+  // spans is larger (and thus includes the other). Falls back to
+  // comparing ids when the spans cover exactly the same range.
+  function compareCollapsedMarkers(a, b) {
+    var lenDiff = a.lines.length - b.lines.length;
+    if (lenDiff != 0) return lenDiff;
+    var aPos = a.find(), bPos = b.find();
+    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+    if (fromCmp) return -fromCmp;
+    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+    if (toCmp) return toCmp;
+    return b.id - a.id;
+  }
+
+  // Find out whether a line ends or starts in a collapsed span. If
+  // so, return the marker for that span.
+  function collapsedSpanAtSide(line, start) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+        found = sp.marker;
+    }
+    return found;
+  }
+  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true); }
+  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false); }
+
+  // Test whether there exists a collapsed span that partially
+  // overlaps (covers the start or end, but not both) of a new span.
+  // Such overlap is not allowed.
+  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+    var line = getLine(doc, lineNo);
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (!sp.marker.collapsed) continue;
+      var found = sp.marker.find(0);
+      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) continue;
+      if (fromCmp <= 0 && (cmp(found.to, from) > 0 || (sp.marker.inclusiveRight && marker.inclusiveLeft)) ||
+          fromCmp >= 0 && (cmp(found.from, to) < 0 || (sp.marker.inclusiveLeft && marker.inclusiveRight)))
+        return true;
+    }
+  }
+
+  // A visual line is a line as drawn on the screen. Folding, for
+  // example, can cause multiple logical lines to appear on the same
+  // visual line. This finds the start of the visual line that the
+  // given line is part of (usually that is the line itself).
+  function visualLine(line) {
+    var merged;
+    while (merged = collapsedSpanAtStart(line))
+      line = merged.find(-1, true).line;
+    return line;
+  }
+
+  // Returns an array of logical lines that continue the visual line
+  // started by the argument, or undefined if there are no such lines.
+  function visualLineContinued(line) {
+    var merged, lines;
+    while (merged = collapsedSpanAtEnd(line)) {
+      line = merged.find(1, true).line;
+      (lines || (lines = [])).push(line);
+    }
+    return lines;
+  }
+
+  // Get the line number of the start of the visual line that the
+  // given line number is part of.
+  function visualLineNo(doc, lineN) {
+    var line = getLine(doc, lineN), vis = visualLine(line);
+    if (line == vis) return lineN;
+    return lineNo(vis);
+  }
+  // Get the line number of the start of the next visual line after
+  // the given line.
+  function visualLineEndNo(doc, lineN) {
+    if (lineN > doc.lastLine()) return lineN;
+    var line = getLine(doc, lineN), merged;
+    if (!lineIsHidden(doc, line)) return lineN;
+    while (merged = collapsedSpanAtEnd(line))
+      line = merged.find(1, true).line;
+    return lineNo(line) + 1;
+  }
+
+  // Compute whether a line is hidden. Lines count as hidden when they
+  // are part of a visual line that starts with another line, or when
+  // they are entirely covered by collapsed, non-widget span.
+  function lineIsHidden(doc, line) {
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) for (var sp, i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (!sp.marker.collapsed) continue;
+      if (sp.from == null) return true;
+      if (sp.marker.widgetNode) continue;
+      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+        return true;
+    }
+  }
+  function lineIsHiddenInner(doc, line, span) {
+    if (span.to == null) {
+      var end = span.marker.find(1, true);
+      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker));
+    }
+    if (span.marker.inclusiveRight && span.to == line.text.length)
+      return true;
+    for (var sp, i = 0; i < line.markedSpans.length; ++i) {
+      sp = line.markedSpans[i];
+      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+          (sp.to == null || sp.to != span.from) &&
+          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+          lineIsHiddenInner(doc, line, sp)) return true;
+    }
+  }
+
+  // LINE WIDGETS
+
+  // Line widgets are block elements displayed above or below a line.
+
+  var LineWidget = CodeMirror.LineWidget = function(cm, node, options) {
+    if (options) for (var opt in options) if (options.hasOwnProperty(opt))
+      this[opt] = options[opt];
+    this.cm = cm;
+    this.node = node;
   };
-  CodeMirror.StringStream = StringStream;
+  eventMixin(LineWidget);
 
-  function MarkedSpan(from, to, marker) {
-    this.from = from; this.to = to; this.marker = marker;
+  function adjustScrollWhenAboveVisible(cm, line, diff) {
+    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
+      addToScrollPos(cm, null, diff);
   }
 
-  function getMarkedSpanFor(spans, marker, del) {
-    if (spans) for (var i = 0; i < spans.length; ++i) {
-      var span = spans[i];
-      if (span.marker == marker) {
-        if (del) spans.splice(i, 1);
-        return span;
-      }
+  LineWidget.prototype.clear = function() {
+    var cm = this.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
+    if (no == null || !ws) return;
+    for (var i = 0; i < ws.length; ++i) if (ws[i] == this) ws.splice(i--, 1);
+    if (!ws.length) line.widgets = null;
+    var height = widgetHeight(this);
+    runInOp(cm, function() {
+      adjustScrollWhenAboveVisible(cm, line, -height);
+      regLineChange(cm, no, "widget");
+      updateLineHeight(line, Math.max(0, line.height - height));
+    });
+  };
+  LineWidget.prototype.changed = function() {
+    var oldH = this.height, cm = this.cm, line = this.line;
+    this.height = null;
+    var diff = widgetHeight(this) - oldH;
+    if (!diff) return;
+    runInOp(cm, function() {
+      cm.curOp.forceUpdate = true;
+      adjustScrollWhenAboveVisible(cm, line, diff);
+      updateLineHeight(line, line.height + diff);
+    });
+  };
+
+  function widgetHeight(widget) {
+    if (widget.height != null) return widget.height;
+    if (!contains(document.body, widget.node)) {
+      var parentStyle = "position: relative;";
+      if (widget.coverGutter)
+        parentStyle += "margin-left: -" + widget.cm.getGutterElement().offsetWidth + "px;";
+      removeChildrenAndAdd(widget.cm.display.measure, elt("div", [widget.node], null, parentStyle));
     }
+    return widget.height = widget.node.offsetHeight;
   }
 
-  function markedSpansBefore(old, startCh, endCh) {
-    if (old) for (var i = 0, nw; i < old.length; ++i) {
-      var span = old[i], marker = span.marker;
-      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
-      if (startsBefore || marker.type == "bookmark" && span.from == startCh && span.from != endCh) {
-        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh);
-        (nw || (nw = [])).push({from: span.from,
-                                to: endsAfter ? null : span.to,
-                                marker: marker});
+  function addLineWidget(cm, handle, node, options) {
+    var widget = new LineWidget(cm, node, options);
+    if (widget.noHScroll) cm.display.alignWidgets = true;
+    changeLine(cm.doc, handle, "widget", function(line) {
+      var widgets = line.widgets || (line.widgets = []);
+      if (widget.insertAt == null) widgets.push(widget);
+      else widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget);
+      widget.line = line;
+      if (!lineIsHidden(cm.doc, line)) {
+        var aboveVisible = heightAtLine(line) < cm.doc.scrollTop;
+        updateLineHeight(line, line.height + widgetHeight(widget));
+        if (aboveVisible) addToScrollPos(cm, null, widget.height);
+        cm.curOp.forceUpdate = true;
       }
-    }
-    return nw;
+      return true;
+    });
+    return widget;
   }
 
-  function markedSpansAfter(old, endCh) {
-    if (old) for (var i = 0, nw; i < old.length; ++i) {
-      var span = old[i], marker = span.marker;
-      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
-      if (endsAfter || marker.type == "bookmark" && span.from == endCh) {
-        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh);
-        (nw || (nw = [])).push({from: startsBefore ? null : span.from - endCh,
-                                to: span.to == null ? null : span.to - endCh,
-                                marker: marker});
-      }
+  // LINE DATA STRUCTURE
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  var Line = CodeMirror.Line = function(text, markedSpans, estimateHeight) {
+    this.text = text;
+    attachMarkedSpans(this, markedSpans);
+    this.height = estimateHeight ? estimateHeight(this) : 1;
+  };
+  eventMixin(Line);
+  Line.prototype.lineNo = function() { return lineNo(this); };
+
+  // Change the content (text, markers) of a line. Automatically
+  // invalidates cached information and tries to re-estimate the
+  // line's height.
+  function updateLine(line, text, markedSpans, estimateHeight) {
+    line.text = text;
+    if (line.stateAfter) line.stateAfter = null;
+    if (line.styles) line.styles = null;
+    if (line.order != null) line.order = null;
+    detachMarkedSpans(line);
+    attachMarkedSpans(line, markedSpans);
+    var estHeight = estimateHeight ? estimateHeight(line) : 1;
+    if (estHeight != line.height) updateLineHeight(line, estHeight);
+  }
+
+  // Detach a line from the document tree and its markers.
+  function cleanUpLine(line) {
+    line.parent = null;
+    detachMarkedSpans(line);
+  }
+
+  function extractLineClasses(type, output) {
+    if (type) for (;;) {
+      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+      if (!lineClass) break;
+      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+      var prop = lineClass[1] ? "bgClass" : "textClass";
+      if (output[prop] == null)
+        output[prop] = lineClass[2];
+      else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop]))
+        output[prop] += " " + lineClass[2];
     }
-    return nw;
+    return type;
   }
 
-  function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) {
-    if (!oldFirst && !oldLast) return newText;
-    // Get the spans that 'stick out' on both sides
-    var first = markedSpansBefore(oldFirst, startCh);
-    var last = markedSpansAfter(oldLast, endCh);
+  function callBlankLine(mode, state) {
+    if (mode.blankLine) return mode.blankLine(state);
+    if (!mode.innerMode) return;
+    var inner = CodeMirror.innerMode(mode, state);
+    if (inner.mode.blankLine) return inner.mode.blankLine(inner.state);
+  }
 
-    // Next, merge those two ends
-    var sameLine = newText.length == 1, offset = lst(newText).length + (sameLine ? startCh : 0);
-    if (first) {
-      // Fix up .to properties of first
-      for (var i = 0; i < first.length; ++i) {
-        var span = first[i];
-        if (span.to == null) {
-          var found = getMarkedSpanFor(last, span.marker);
-          if (!found) span.to = startCh;
-          else if (sameLine) span.to = found.to == null ? null : found.to + offset;
-        }
+  function readToken(mode, stream, state) {
+    for (var i = 0; i < 10; i++) {
+      var style = mode.token(stream, state);
+      if (stream.pos > stream.start) return style;
+    }
+    throw new Error("Mode " + mode.name + " failed to advance stream.");
+  }
+
+  // Run the given mode's parser over a line, calling f for each token.
+  function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
+    var flattenSpans = mode.flattenSpans;
+    if (flattenSpans == null) flattenSpans = cm.options.flattenSpans;
+    var curStart = 0, curStyle = null;
+    var stream = new StringStream(text, cm.options.tabSize), style;
+    if (text == "") extractLineClasses(callBlankLine(mode, state), lineClasses);
+    while (!stream.eol()) {
+      if (stream.pos > cm.options.maxHighlightLength) {
+        flattenSpans = false;
+        if (forceToEnd) processLine(cm, text, state, stream.pos);
+        stream.pos = text.length;
+        style = null;
+      } else {
+        style = extractLineClasses(readToken(mode, stream, state), lineClasses);
+      }
+      if (cm.options.addModeClass) {
+        var mName = CodeMirror.innerMode(mode, state).mode.name;
+        if (mName) style = "m-" + (style ? mName + " " + style : mName);
       }
+      if (!flattenSpans || curStyle != style) {
+        if (curStart < stream.start) f(stream.start, curStyle);
+        curStart = stream.start; curStyle = style;
+      }
+      stream.start = stream.pos;
     }
-    if (last) {
-      // Fix up .from in last (or move them into first in case of sameLine)
-      for (var i = 0; i < last.length; ++i) {
-        var span = last[i];
-        if (span.to != null) span.to += offset;
-        if (span.from == null) {
-          var found = getMarkedSpanFor(first, span.marker);
-          if (!found) {
-            span.from = offset;
-            if (sameLine) (first || (first = [])).push(span);
-          }
+    while (curStart < stream.pos) {
+      // Webkit seems to refuse to render text nodes longer than 57444 characters
+      var pos = Math.min(stream.pos, curStart + 50000);
+      f(pos, curStyle);
+      curStart = pos;
+    }
+  }
+
+  // Compute a style array (an array starting with a mode generation
+  // -- for invalidation -- followed by pairs of end positions and
+  // style strings), which is used to highlight the tokens on the
+  // line.
+  function highlightLine(cm, line, state, forceToEnd) {
+    // A styles array always starts with a number identifying the
+    // mode/overlays that it is based on (for easy invalidation).
+    var st = [cm.state.modeGen], lineClasses = {};
+    // Compute the base array of styles
+    runMode(cm, line.text, cm.doc.mode, state, function(end, style) {
+      st.push(end, style);
+    }, lineClasses, forceToEnd);
+
+    // Run overlays, adjust style array.
+    for (var o = 0; o < cm.state.overlays.length; ++o) {
+      var overlay = cm.state.overlays[o], i = 1, at = 0;
+      runMode(cm, line.text, overlay.mode, true, function(end, style) {
+        var start = i;
+        // Ensure there's a token end at the current position, and that i points at it
+        while (at < end) {
+          var i_end = st[i];
+          if (i_end > end)
+            st.splice(i, 1, end, st[i+1], i_end);
+          i += 2;
+          at = Math.min(end, i_end);
+        }
+        if (!style) return;
+        if (overlay.opaque) {
+          st.splice(start, i - start, end, "cm-overlay " + style);
+          i = start + 2;
         } else {
-          span.from += offset;
-          if (sameLine) (first || (first = [])).push(span);
+          for (; start < i; start += 2) {
+            var cur = st[start+1];
+            st[start+1] = (cur ? cur + " " : "") + "cm-overlay " + style;
+          }
         }
-      }
+      }, lineClasses);
     }
 
-    var newMarkers = [newHL(newText[0], first)];
-    if (!sameLine) {
-      // Fill gap with whole-line-spans
-      var gap = newText.length - 2, gapMarkers;
-      if (gap > 0 && first)
-        for (var i = 0; i < first.length; ++i)
-          if (first[i].to == null)
-            (gapMarkers || (gapMarkers = [])).push({from: null, to: null, marker: first[i].marker});
-      for (var i = 0; i < gap; ++i)
-        newMarkers.push(newHL(newText[i+1], gapMarkers));
-      newMarkers.push(newHL(lst(newText), last));
-    }
-    return newMarkers;
+    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null};
   }
 
-  // hl stands for history-line, a data structure that can be either a
-  // string (line without markers) or a {text, markedSpans} object.
-  function hlText(val) { return typeof val == "string" ? val : val.text; }
-  function hlSpans(val) { return typeof val == "string" ? null : val.markedSpans; }
-  function newHL(text, spans) { return spans ? {text: text, markedSpans: spans} : text; }
+  function getLineStyles(cm, line) {
+    if (!line.styles || line.styles[0] != cm.state.modeGen) {
+      var result = highlightLine(cm, line, line.stateAfter = getStateBefore(cm, lineNo(line)));
+      line.styles = result.styles;
+      if (result.classes) line.styleClasses = result.classes;
+      else if (line.styleClasses) line.styleClasses = null;
+    }
+    return line.styles;
+  }
 
-  function detachMarkedSpans(line) {
-    var spans = line.markedSpans;
-    if (!spans) return;
-    for (var i = 0; i < spans.length; ++i) {
-      var lines = spans[i].marker.lines;
-      var ix = indexOf(lines, line);
-      lines.splice(ix, 1);
+  // Lightweight form of highlight -- proceed over this line and
+  // update state, but don't save a style array. Used for lines that
+  // aren't currently visible.
+  function processLine(cm, text, state, startAt) {
+    var mode = cm.doc.mode;
+    var stream = new StringStream(text, cm.options.tabSize);
+    stream.start = stream.pos = startAt || 0;
+    if (text == "") callBlankLine(mode, state);
+    while (!stream.eol() && stream.pos <= cm.options.maxHighlightLength) {
+      readToken(mode, stream, state);
+      stream.start = stream.pos;
     }
-    line.markedSpans = null;
   }
 
-  function attachMarkedSpans(line, spans) {
-    if (!spans) return;
-    for (var i = 0; i < spans.length; ++i)
-      var marker = spans[i].marker.lines.push(line);
-    line.markedSpans = spans;
+  // Convert a style as returned by a mode (either null, or a string
+  // containing one or more styles) to a CSS style. This is cached,
+  // and also looks for line-wide styles.
+  var styleToClassCache = {}, styleToClassCacheWithMode = {};
+  function interpretTokenStyle(style, options) {
+    if (!style || /^\s*$/.test(style)) return null;
+    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+    return cache[style] ||
+      (cache[style] = style.replace(/\S+/g, "cm-$&"));
   }
 
-  // When measuring the position of the end of a line, different
-  // browsers require different approaches. If an empty span is added,
-  // many browsers report bogus offsets. Of those, some (Webkit,
-  // recent IE) will accept a space without moving the whole span to
-  // the next line when wrapping it, others work with a zero-width
-  // space.
-  var eolSpanContent = " ";
-  if (gecko || (ie && !ie_lt8)) eolSpanContent = "\u200b";
-  else if (opera) eolSpanContent = "";
+  // Render the DOM representation of the text of a line. Also builds
+  // up a 'line map', which points at the DOM nodes that represent
+  // specific stretches of text, and is used by the measuring code.
+  // The returned object contains the DOM node, this map, and
+  // information about line-wide styles that were set by the mode.
+  function buildLineContent(cm, lineView) {
+    // The padding-right forces the element to have a 'border', which
+    // is needed on Webkit to be able to get line-level bounding
+    // rectangles for it (in measureChar).
+    var content = elt("span", null, null, webkit ? "padding-right: .1px" : null);
+    var builder = {pre: elt("pre", [content]), content: content, col: 0, pos: 0, cm: cm};
+    lineView.measure = {};
+
+    // Iterate over the logical lines that make up this visual line.
+    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+      var line = i ? lineView.rest[i - 1] : lineView.line, order;
+      builder.pos = 0;
+      builder.addToken = buildToken;
+      // Optionally wire in some hacks into the token-rendering
+      // algorithm, to deal with browser quirks.
+      if ((ie || webkit) && cm.getOption("lineWrapping"))
+        builder.addToken = buildTokenSplitSpaces(builder.addToken);
+      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line)))
+        builder.addToken = buildTokenBadBidi(builder.addToken, order);
+      builder.map = [];
+      insertLineContent(line, builder, getLineStyles(cm, line));
+      if (line.styleClasses) {
+        if (line.styleClasses.bgClass)
+          builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || "");
+        if (line.styleClasses.textClass)
+          builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || "");
+      }
 
-  // Line objects. These hold state related to a line, including
-  // highlighting info (the styles array).
-  function Line(text, markedSpans) {
-    this.text = text;
-    this.height = 1;
-    attachMarkedSpans(this, markedSpans);
+      // Ensure at least a single node is present, for measuring.
+      if (builder.map.length == 0)
+        builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure)));
+
+      // Store the map and a cache object for the current logical line
+      if (i == 0) {
+        lineView.measure.map = builder.map;
+        lineView.measure.cache = {};
+      } else {
+        (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map);
+        (lineView.measure.caches || (lineView.measure.caches = [])).push({});
+      }
+    }
+
+    signal(cm, "renderLine", cm, lineView.line, builder.pre);
+    if (builder.pre.className)
+      builder.textClass = joinClasses(builder.pre.className, builder.textClass || "");
+    return builder;
   }
-  Line.prototype = {
-    update: function(text, markedSpans) {
-      this.text = text;
-      this.stateAfter = this.styles = null;
-      detachMarkedSpans(this);
-      attachMarkedSpans(this, markedSpans);
-    },
-    // Run the given mode's parser over a line, update the styles
-    // array, which contains alternating fragments of text and CSS
-    // classes.
-    highlight: function(mode, state, tabSize) {
-      var stream = new StringStream(this.text, tabSize), st = this.styles || (this.styles = []);
-      var pos = st.length = 0;
-      if (this.text == "" && mode.blankLine) mode.blankLine(state);
-      while (!stream.eol()) {
-        var style = mode.token(stream, state), substr = stream.current();
-        stream.start = stream.pos;
-        if (pos && st[pos-1] == style) {
-          st[pos-2] += substr;
-        } else if (substr) {
-          st[pos++] = substr; st[pos++] = style;
+
+  function defaultSpecialCharPlaceholder(ch) {
+    var token = elt("span", "\u2022", "cm-invalidchar");
+    token.title = "\\u" + ch.charCodeAt(0).toString(16);
+    return token;
+  }
+
+  // Build up the DOM representation for a single token, and add it to
+  // the line map. Takes care to render special characters separately.
+  function buildToken(builder, text, style, startStyle, endStyle, title) {
+    if (!text) return;
+    var special = builder.cm.options.specialChars, mustWrap = false;
+    if (!special.test(text)) {
+      builder.col += text.length;
+      var content = document.createTextNode(text);
+      builder.map.push(builder.pos, builder.pos + text.length, content);
+      if (ie && ie_version < 9) mustWrap = true;
+      builder.pos += text.length;
+    } else {
+      var content = document.createDocumentFragment(), pos = 0;
+      while (true) {
+        special.lastIndex = pos;
+        var m = special.exec(text);
+        var skipped = m ? m.index - pos : text.length - pos;
+        if (skipped) {
+          var txt = document.createTextNode(text.slice(pos, pos + skipped));
+          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
+          else content.appendChild(txt);
+          builder.map.push(builder.pos, builder.pos + skipped, txt);
+          builder.col += skipped;
+          builder.pos += skipped;
         }
-        // Give up when line is ridiculously long
-        if (stream.pos > 5000) {
-          st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
-          break;
+        if (!m) break;
+        pos += skipped + 1;
+        if (m[0] == "\t") {
+          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+          var txt = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+          builder.col += tabWidth;
+        } else {
+          var txt = builder.cm.options.specialCharPlaceholder(m[0]);
+          if (ie && ie_version < 9) content.appendChild(elt("span", [txt]));
+          else content.appendChild(txt);
+          builder.col += 1;
         }
+        builder.map.push(builder.pos, builder.pos + 1, txt);
+        builder.pos++;
       }
-    },
-    process: function(mode, state, tabSize) {
-      var stream = new StringStream(this.text, tabSize);
-      if (this.text == "" && mode.blankLine) mode.blankLine(state);
-      while (!stream.eol() && stream.pos <= 5000) {
-        mode.token(stream, state);
-        stream.start = stream.pos;
-      }
-    },
-    // Fetch the parser token for a given character. Useful for hacks
-    // that want to inspect the mode state (say, for completion).
-    getTokenAt: function(mode, state, tabSize, ch) {
-      var txt = this.text, stream = new StringStream(txt, tabSize);
-      while (stream.pos < ch && !stream.eol()) {
-        stream.start = stream.pos;
-        var style = mode.token(stream, state);
+    }
+    if (style || startStyle || endStyle || mustWrap) {
+      var fullStyle = style || "";
+      if (startStyle) fullStyle += startStyle;
+      if (endStyle) fullStyle += endStyle;
+      var token = elt("span", [content], fullStyle);
+      if (title) token.title = title;
+      return builder.content.appendChild(token);
+    }
+    builder.content.appendChild(content);
+  }
+
+  function buildTokenSplitSpaces(inner) {
+    function split(old) {
+      var out = " ";
+      for (var i = 0; i < old.length - 2; ++i) out += i % 2 ? " " : "\u00a0";
+      out += " ";
+      return out;
+    }
+    return function(builder, text, style, startStyle, endStyle, title) {
+      inner(builder, text.replace(/ {3,}/g, split), style, startStyle, endStyle, title);
+    };
+  }
+
+  // Work around nonsense dimensions being reported for stretches of
+  // right-to-left text.
+  function buildTokenBadBidi(inner, order) {
+    return function(builder, text, style, startStyle, endStyle, title) {
+      style = style ? style + " cm-force-border" : "cm-force-border";
+      var start = builder.pos, end = start + text.length;
+      for (;;) {
+        // Find the part that overlaps with the start of this text
+        for (var i = 0; i < order.length; i++) {
+          var part = order[i];
+          if (part.to > start && part.from <= start) break;
+        }
+        if (part.to >= end) return inner(builder, text, style, startStyle, endStyle, title);
+        inner(builder, text.slice(0, part.to - start), style, startStyle, null, title);
+        startStyle = null;
+        text = text.slice(part.to - start);
+        start = part.to;
       }
-      return {start: stream.start,
-              end: stream.pos,
-              string: stream.current(),
-              className: style || null,
-              state: state};
-    },
-    indentation: function(tabSize) {return countColumn(this.text, null, tabSize);},
-    // Produces an HTML fragment for the line, taking selection,
-    // marking, and highlighting into account.
-    getContent: function(tabSize, wrapAt, compensateForWrapping) {
-      var first = true, col = 0, specials = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g;
-      var pre = elt("pre");
-      function span_(html, text, style) {
-        if (!text) return;
-        // Work around a bug where, in some compat modes, IE ignores leading spaces
-        if (first && ie && text.charAt(0) == " ") text = "\u00a0" + text.slice(1);
-        first = false;
-        if (!specials.test(text)) {
-          col += text.length;
-          var content = document.createTextNode(text);
-        } else {
-          var content = document.createDocumentFragment(), pos = 0;
-          while (true) {
-            specials.lastIndex = pos;
-            var m = specials.exec(text);
-            var skipped = m ? m.index - pos : text.length - pos;
-            if (skipped) {
-              content.appendChild(document.createTextNode(text.slice(pos, pos + skipped)));
-              col += skipped;
-            }
-            if (!m) break;
-            pos += skipped + 1;
-            if (m[0] == "\t") {
-              var tabWidth = tabSize - col % tabSize;
-              content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
-              col += tabWidth;
-            } else {
-              var token = elt("span", "\u2022", "cm-invalidchar");
-              token.title = "\\u" + m[0].charCodeAt(0).toString(16);
-              content.appendChild(token);
-              col += 1;
-            }
+    };
+  }
+
+  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+    var widget = !ignoreWidget && marker.widgetNode;
+    if (widget) {
+      builder.map.push(builder.pos, builder.pos + size, widget);
+      builder.content.appendChild(widget);
+    }
+    builder.pos += size;
+  }
+
+  // Outputs a number of spans to make up a line, taking highlighting
+  // and marked text into account.
+  function insertLineContent(line, builder, styles) {
+    var spans = line.markedSpans, allText = line.text, at = 0;
+    if (!spans) {
+      for (var i = 1; i < styles.length; i+=2)
+        builder.addToken(builder, allText.slice(at, at = styles[i]), interpretTokenStyle(styles[i+1], builder.cm.options));
+      return;
+    }
+
+    var len = allText.length, pos = 0, i = 1, text = "", style;
+    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, title, collapsed;
+    for (;;) {
+      if (nextChange == pos) { // Update current marker set
+        spanStyle = spanEndStyle = spanStartStyle = title = "";
+        collapsed = null; nextChange = Infinity;
+        var foundBookmarks = [];
+        for (var j = 0; j < spans.length; ++j) {
+          var sp = spans[j], m = sp.marker;
+          if (sp.from <= pos && (sp.to == null || sp.to > pos)) {
+            if (sp.to != null && nextChange > sp.to) { nextChange = sp.to; spanEndStyle = ""; }
+            if (m.className) spanStyle += " " + m.className;
+            if (m.startStyle && sp.from == pos) spanStartStyle += " " + m.startStyle;
+            if (m.endStyle && sp.to == nextChange) spanEndStyle += " " + m.endStyle;
+            if (m.title && !title) title = m.title;
+            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+              collapsed = sp;
+          } else if (sp.from > pos && nextChange > sp.from) {
+            nextChange = sp.from;
           }
+          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) foundBookmarks.push(m);
         }
-        if (style) html.appendChild(elt("span", [content], style));
-        else html.appendChild(content);
-      }
-      var span = span_;
-      if (wrapAt != null) {
-        var outPos = 0, anchor = pre.anchor = elt("span");
-        span = function(html, text, style) {
-          var l = text.length;
-          if (wrapAt >= outPos && wrapAt < outPos + l) {
-            if (wrapAt > outPos) {
-              span_(html, text.slice(0, wrapAt - outPos), style);
-              // See comment at the definition of spanAffectsWrapping
-              if (compensateForWrapping) html.appendChild(elt("wbr"));
-            }
-            html.appendChild(anchor);
-            var cut = wrapAt - outPos;
-            span_(anchor, opera ? text.slice(cut, cut + 1) : text.slice(cut), style);
-            if (opera) span_(html, text.slice(cut + 1), style);
-            wrapAt--;
-            outPos += l;
-          } else {
-            outPos += l;
-            span_(html, text, style);
-            if (outPos == wrapAt && outPos == len) {
-              setTextContent(anchor, eolSpanContent);
-              html.appendChild(anchor);
-            }
-            // Stop outputting HTML when gone sufficiently far beyond measure
-            else if (outPos > wrapAt + 10 && /\s/.test(text)) span = function(){};
+        if (collapsed && (collapsed.from || 0) == pos) {
+          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+                             collapsed.marker, collapsed.from == null);
+          if (collapsed.to == null) return;
+        }
+        if (!collapsed && foundBookmarks.length) for (var j = 0; j < foundBookmarks.length; ++j)
+          buildCollapsedSpan(builder, 0, foundBookmarks[j]);
+      }
+      if (pos >= len) break;
+
+      var upto = Math.min(len, nextChange);
+      while (true) {
+        if (text) {
+          var end = pos + text.length;
+          if (!collapsed) {
+            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", title);
           }
-        };
+          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+          pos = end;
+          spanStartStyle = "";
+        }
+        text = allText.slice(at, at = styles[i++]);
+        style = interpretTokenStyle(styles[i++], builder.cm.options);
       }
+    }
+  }
 
-      var st = this.styles, allText = this.text, marked = this.markedSpans;
-      var len = allText.length;
-      function styleToClass(style) {
-        if (!style) return null;
-        return "cm-" + style.replace(/ +/g, " cm-");
-      }
-      if (!allText && wrapAt == null) {
-        span(pre, " ");
-      } else if (!marked || !marked.length) {
-        for (var i = 0, ch = 0; ch < len; i+=2) {
-          var str = st[i], style = st[i+1], l = str.length;
-          if (ch + l > len) str = str.slice(0, len - ch);
-          ch += l;
-          span(pre, str, styleToClass(style));
-        }
+  // DOCUMENT DATA STRUCTURE
+
+  // By default, updates that start and end at the beginning of a line
+  // are treated specially, in order to make the association of line
+  // widgets and marker elements with the text behave more intuitive.
+  function isWholeLineUpdate(doc, change) {
+    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
+      (!doc.cm || doc.cm.options.wholeLineUpdateBefore);
+  }
+
+  // Perform a change on the document data structure.
+  function updateDoc(doc, change, markedSpans, estimateHeight) {
+    function spansFor(n) {return markedSpans ? markedSpans[n] : null;}
+    function update(line, text, spans) {
+      updateLine(line, text, spans, estimateHeight);
+      signalLater(line, "change", line, change);
+    }
+
+    var from = change.from, to = change.to, text = change.text;
+    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
+    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
+
+    // Adjust the line structure
+    if (isWholeLineUpdate(doc, change)) {
+      // This is a whole-line replace. Treated specially to make
+      // sure line objects move the way they are supposed to.
+      for (var i = 0, added = []; i < text.length - 1; ++i)
+        added.push(new Line(text[i], spansFor(i), estimateHeight));
+      update(lastLine, lastLine.text, lastSpans);
+      if (nlines) doc.remove(from.line, nlines);
+      if (added.length) doc.insert(from.line, added);
+    } else if (firstLine == lastLine) {
+      if (text.length == 1) {
+        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
       } else {
-        marked.sort(function(a, b) { return a.from - b.from; });
-        var pos = 0, i = 0, text = "", style, sg = 0;
-        var nextChange = marked[0].from || 0, marks = [], markpos = 0;
-        var advanceMarks = function() {
-          var m;
-          while (markpos < marked.length &&
-                 ((m = marked[markpos]).from == pos || m.from == null)) {
-            if (m.marker.type == "range") marks.push(m);
-            ++markpos;
-          }
-          nextChange = markpos < marked.length ? marked[markpos].from : Infinity;
-          for (var i = 0; i < marks.length; ++i) {
-            var to = marks[i].to;
-            if (to == null) to = Infinity;
-            if (to == pos) marks.splice(i--, 1);
-            else nextChange = Math.min(to, nextChange);
-          }
-        };
-        var m = 0;
-        while (pos < len) {
-          if (nextChange == pos) advanceMarks();
-          var upto = Math.min(len, nextChange);
-          while (true) {
-            if (text) {
-              var end = pos + text.length;
-              var appliedStyle = style;
-              for (var j = 0; j < marks.length; ++j) {
-                var mark = marks[j];
-                appliedStyle = (appliedStyle ? appliedStyle + " " : "") + mark.marker.style;
-                if (mark.marker.endStyle && mark.to === Math.min(end, upto)) appliedStyle += " " + mark.marker.endStyle;
-                if (mark.marker.startStyle && mark.from === pos) appliedStyle += " " + mark.marker.startStyle;
-              }
-              span(pre, end > upto ? text.slice(0, upto - pos) : text, appliedStyle);
-              if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
-              pos = end;
-            }
-            text = st[i++]; style = styleToClass(st[i++]);
-          }
-        }
+        for (var added = [], i = 1; i < text.length - 1; ++i)
+          added.push(new Line(text[i], spansFor(i), estimateHeight));
+        added.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
+        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+        doc.insert(from.line + 1, added);
       }
-      return pre;
-    },
-    cleanUp: function() {
-      this.parent = null;
-      detachMarkedSpans(this);
+    } else if (text.length == 1) {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
+      doc.remove(from.line + 1, nlines);
+    } else {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
+      for (var i = 1, added = []; i < text.length - 1; ++i)
+        added.push(new Line(text[i], spansFor(i), estimateHeight));
+      if (nlines > 1) doc.remove(from.line + 1, nlines - 1);
+      doc.insert(from.line + 1, added);
     }
-  };
 
-  // Data structure that holds the sequence of lines.
+    signalLater(doc, "change", doc, change);
+  }
+
+  // The document is represented as a BTree consisting of leaves, with
+  // chunk of lines in them, and branches, with up to ten leaves or
+  // other branch nodes below them. The top node is always a branch
+  // node, and is the document object itself (meaning it has
+  // additional methods and properties).
+  //
+  // All nodes have parent links. The tree is used both to go from
+  // line numbers to line objects, and to go from objects to numbers.
+  // It also indexes by height, and is used to convert between height
+  // and line object, and to find the total height of the document.
+  //
+  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
+
   function LeafChunk(lines) {
     this.lines = lines;
     this.parent = null;
-    for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
+    for (var i = 0, height = 0; i < lines.length; ++i) {
       lines[i].parent = this;
       height += lines[i].height;
     }
     this.height = height;
   }
+
   LeafChunk.prototype = {
     chunkSize: function() { return this.lines.length; },
-    remove: function(at, n, callbacks) {
+    // Remove the n lines at offset 'at'.
+    removeInner: function(at, n) {
       for (var i = at, e = at + n; i < e; ++i) {
         var line = this.lines[i];
         this.height -= line.height;
-        line.cleanUp();
-        if (line.handlers)
-          for (var j = 0; j < line.handlers.length; ++j) callbacks.push(line.handlers[j]);
+        cleanUpLine(line);
+        signalLater(line, "delete");
       }
       this.lines.splice(at, n);
     },
+    // Helper used to collapse a small branch into a single leaf.
     collapse: function(lines) {
-      lines.splice.apply(lines, [lines.length, 0].concat(this.lines));
+      lines.push.apply(lines, this.lines);
     },
-    insertHeight: function(at, lines, height) {
+    // Insert the given array of lines at offset 'at', count them as
+    // having the given height.
+    insertInner: function(at, lines, height) {
       this.height += height;
       this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
-      for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this;
+      for (var i = 0; i < lines.length; ++i) lines[i].parent = this;
     },
+    // Used to iterate over a part of the tree.
     iterN: function(at, n, op) {
       for (var e = at + n; at < e; ++at)
         if (op(this.lines[at])) return true;
     }
   };
+
   function BranchChunk(children) {
     this.children = children;
     var size = 0, height = 0;
-    for (var i = 0, e = children.length; i < e; ++i) {
+    for (var i = 0; i < children.length; ++i) {
       var ch = children[i];
       size += ch.chunkSize(); height += ch.height;
       ch.parent = this;
@@ -2719,22 +6249,26 @@ window.CodeMirror = (function() {
     this.height = height;
     this.parent = null;
   }
+
   BranchChunk.prototype = {
     chunkSize: function() { return this.size; },
-    remove: function(at, n, callbacks) {
+    removeInner: function(at, n) {
       this.size -= n;
       for (var i = 0; i < this.children.length; ++i) {
         var child = this.children[i], sz = child.chunkSize();
         if (at < sz) {
           var rm = Math.min(n, sz - at), oldHeight = child.height;
-          child.remove(at, rm, callbacks);
+          child.removeInner(at, rm);
           this.height -= oldHeight - child.height;
           if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
           if ((n -= rm) == 0) break;
           at = 0;
         } else at -= sz;
       }
-      if (this.size - n < 25) {
+      // If the result is smaller than 25 lines, ensure that it is a
+      // single leaf node.
+      if (this.size - n < 25 &&
+          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
         var lines = [];
         this.collapse(lines);
         this.children = [new LeafChunk(lines)];
@@ -2742,20 +6276,15 @@ window.CodeMirror = (function() {
       }
     },
     collapse: function(lines) {
-      for (var i = 0, e = this.children.length; i < e; ++i) this.children[i].collapse(lines);
-    },
-    insert: function(at, lines) {
-      var height = 0;
-      for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height;
-      this.insertHeight(at, lines, height);
+      for (var i = 0; i < this.children.length; ++i) this.children[i].collapse(lines);
     },
-    insertHeight: function(at, lines, height) {
+    insertInner: function(at, lines, height) {
       this.size += lines.length;
       this.height += height;
-      for (var i = 0, e = this.children.length; i < e; ++i) {
+      for (var i = 0; i < this.children.length; ++i) {
         var child = this.children[i], sz = child.chunkSize();
         if (at <= sz) {
-          child.insertHeight(at, lines, height);
+          child.insertInner(at, lines, height);
           if (child.lines && child.lines.length > 50) {
             while (child.lines.length > 50) {
               var spilled = child.lines.splice(child.lines.length - 25, 25);
@@ -2771,6 +6300,7 @@ window.CodeMirror = (function() {
         at -= sz;
       }
     },
+    // When a node has grown, check whether it should be split.
     maybeSpill: function() {
       if (this.children.length <= 10) return;
       var me = this;
@@ -2792,22 +6322,403 @@ window.CodeMirror = (function() {
       } while (me.children.length > 10);
       me.parent.maybeSpill();
     },
-    iter: function(from, to, op) { this.iterN(from, to - from, op); },
-    iterN: function(at, n, op) {
-      for (var i = 0, e = this.children.length; i < e; ++i) {
-        var child = this.children[i], sz = child.chunkSize();
-        if (at < sz) {
-          var used = Math.min(n, sz - at);
-          if (child.iterN(at, used, op)) return true;
-          if ((n -= used) == 0) break;
-          at = 0;
-        } else at -= sz;
+    iterN: function(at, n, op) {
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var used = Math.min(n, sz - at);
+          if (child.iterN(at, used, op)) return true;
+          if ((n -= used) == 0) break;
+          at = 0;
+        } else at -= sz;
+      }
+    }
+  };
+
+  var nextDocId = 0;
+  var Doc = CodeMirror.Doc = function(text, mode, firstLine) {
+    if (!(this instanceof Doc)) return new Doc(text, mode, firstLine);
+    if (firstLine == null) firstLine = 0;
+
+    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
+    this.first = firstLine;
+    this.scrollTop = this.scrollLeft = 0;
+    this.cantEdit = false;
+    this.cleanGeneration = 1;
+    this.frontier = firstLine;
+    var start = Pos(firstLine, 0);
+    this.sel = simpleSelection(start);
+    this.history = new History(null);
+    this.id = ++nextDocId;
+    this.modeOption = mode;
+
+    if (typeof text == "string") text = splitLines(text);
+    updateDoc(this, {from: start, to: start, text: text});
+    setSelection(this, simpleSelection(start), sel_dontScroll);
+  };
+
+  Doc.prototype = createObj(BranchChunk.prototype, {
+    constructor: Doc,
+    // Iterate over the document. Supports two forms -- with only one
+    // argument, it calls that for each line in the document. With
+    // three, it iterates over the range given by the first two (with
+    // the second being non-inclusive).
+    iter: function(from, to, op) {
+      if (op) this.iterN(from - this.first, to - from, op);
+      else this.iterN(this.first, this.first + this.size, from);
+    },
+
+    // Non-public interface for adding and removing lines.
+    insert: function(at, lines) {
+      var height = 0;
+      for (var i = 0; i < lines.length; ++i) height += lines[i].height;
+      this.insertInner(at - this.first, lines, height);
+    },
+    remove: function(at, n) { this.removeInner(at - this.first, n); },
+
+    // From here, the methods are part of the public interface. Most
+    // are also available from CodeMirror (editor) instances.
+
+    getValue: function(lineSep) {
+      var lines = getLines(this, this.first, this.first + this.size);
+      if (lineSep === false) return lines;
+      return lines.join(lineSep || "\n");
+    },
+    setValue: docMethodOp(function(code) {
+      var top = Pos(this.first, 0), last = this.first + this.size - 1;
+      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
+                        text: splitLines(code), origin: "setValue"}, true);
+      setSelection(this, simpleSelection(top));
+    }),
+    replaceRange: function(code, from, to, origin) {
+      from = clipPos(this, from);
+      to = to ? clipPos(this, to) : from;
+      replaceRange(this, code, from, to, origin);
+    },
+    getRange: function(from, to, lineSep) {
+      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
+      if (lineSep === false) return lines;
+      return lines.join(lineSep || "\n");
+    },
+
+    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text;},
+
+    getLineHandle: function(line) {if (isLine(this, line)) return getLine(this, line);},
+    getLineNumber: function(line) {return lineNo(line);},
+
+    getLineHandleVisualStart: function(line) {
+      if (typeof line == "number") line = getLine(this, line);
+      return visualLine(line);
+    },
+
+    lineCount: function() {return this.size;},
+    firstLine: function() {return this.first;},
+    lastLine: function() {return this.first + this.size - 1;},
+
+    clipPos: function(pos) {return clipPos(this, pos);},
+
+    getCursor: function(start) {
+      var range = this.sel.primary(), pos;
+      if (start == null || start == "head") pos = range.head;
+      else if (start == "anchor") pos = range.anchor;
+      else if (start == "end" || start == "to" || start === false) pos = range.to();
+      else pos = range.from();
+      return pos;
+    },
+    listSelections: function() { return this.sel.ranges; },
+    somethingSelected: function() {return this.sel.somethingSelected();},
+
+    setCursor: docMethodOp(function(line, ch, options) {
+      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
+    }),
+    setSelection: docMethodOp(function(anchor, head, options) {
+      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
+    }),
+    extendSelection: docMethodOp(function(head, other, options) {
+      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
+    }),
+    extendSelections: docMethodOp(function(heads, options) {
+      extendSelections(this, clipPosArray(this, heads, options));
+    }),
+    extendSelectionsBy: docMethodOp(function(f, options) {
+      extendSelections(this, map(this.sel.ranges, f), options);
+    }),
+    setSelections: docMethodOp(function(ranges, primary, options) {
+      if (!ranges.length) return;
+      for (var i = 0, out = []; i < ranges.length; i++)
+        out[i] = new Range(clipPos(this, ranges[i].anchor),
+                           clipPos(this, ranges[i].head));
+      if (primary == null) primary = Math.min(ranges.length - 1, this.sel.primIndex);
+      setSelection(this, normalizeSelection(out, primary), options);
+    }),
+    addSelection: docMethodOp(function(anchor, head, options) {
+      var ranges = this.sel.ranges.slice(0);
+      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
+      setSelection(this, normalizeSelection(ranges, ranges.length - 1), options);
+    }),
+
+    getSelection: function(lineSep) {
+      var ranges = this.sel.ranges, lines;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        lines = lines ? lines.concat(sel) : sel;
+      }
+      if (lineSep === false) return lines;
+      else return lines.join(lineSep || "\n");
+    },
+    getSelections: function(lineSep) {
+      var parts = [], ranges = this.sel.ranges;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        if (lineSep !== false) sel = sel.join(lineSep || "\n");
+        parts[i] = sel;
+      }
+      return parts;
+    },
+    replaceSelection: function(code, collapse, origin) {
+      var dup = [];
+      for (var i = 0; i < this.sel.ranges.length; i++)
+        dup[i] = code;
+      this.replaceSelections(dup, collapse, origin || "+input");
+    },
+    replaceSelections: docMethodOp(function(code, collapse, origin) {
+      var changes = [], sel = this.sel;
+      for (var i = 0; i < sel.ranges.length; i++) {
+        var range = sel.ranges[i];
+        changes[i] = {from: range.from(), to: range.to(), text: splitLines(code[i]), origin: origin};
+      }
+      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
+      for (var i = changes.length - 1; i >= 0; i--)
+        makeChange(this, changes[i]);
+      if (newSel) setSelectionReplaceHistory(this, newSel);
+      else if (this.cm) ensureCursorVisible(this.cm);
+    }),
+    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
+    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
+    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
+    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
+
+    setExtending: function(val) {this.extend = val;},
+    getExtending: function() {return this.extend;},
+
+    historySize: function() {
+      var hist = this.history, done = 0, undone = 0;
+      for (var i = 0; i < hist.done.length; i++) if (!hist.done[i].ranges) ++done;
+      for (var i = 0; i < hist.undone.length; i++) if (!hist.undone[i].ranges) ++undone;
+      return {undo: done, redo: undone};
+    },
+    clearHistory: function() {this.history = new History(this.history.maxGeneration);},
+
+    markClean: function() {
+      this.cleanGeneration = this.changeGeneration(true);
+    },
+    changeGeneration: function(forceSplit) {
+      if (forceSplit)
+        this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null;
+      return this.history.generation;
+    },
+    isClean: function (gen) {
+      return this.history.generation == (gen || this.cleanGeneration);
+    },
+
+    getHistory: function() {
+      return {done: copyHistoryArray(this.history.done),
+              undone: copyHistoryArray(this.history.undone)};
+    },
+    setHistory: function(histData) {
+      var hist = this.history = new History(this.history.maxGeneration);
+      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
+      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
+    },
+
+    addLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, "class", function(line) {
+        var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
+        if (!line[prop]) line[prop] = cls;
+        else if (new RegExp("(?:^|\\s)" + cls + "(?:$|\\s)").test(line[prop])) return false;
+        else line[prop] += " " + cls;
+        return true;
+      });
+    }),
+    removeLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, "class", function(line) {
+        var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : "wrapClass";
+        var cur = line[prop];
+        if (!cur) return false;
+        else if (cls == null) line[prop] = null;
+        else {
+          var found = cur.match(new RegExp("(?:^|\\s+)" + cls + "(?:$|\\s+)"));
+          if (!found) return false;
+          var end = found.index + found[0].length;
+          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
+        }
+        return true;
+      });
+    }),
+
+    markText: function(from, to, options) {
+      return markText(this, clipPos(this, from), clipPos(this, to), options, "range");
+    },
+    setBookmark: function(pos, options) {
+      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
+                      insertLeft: options && options.insertLeft,
+                      clearWhenEmpty: false, shared: options && options.shared};
+      pos = clipPos(this, pos);
+      return markText(this, pos, pos, realOpts, "bookmark");
+    },
+    findMarksAt: function(pos) {
+      pos = clipPos(this, pos);
+      var markers = [], spans = getLine(this, pos.line).markedSpans;
+      if (spans) for (var i = 0; i < spans.length; ++i) {
+        var span = spans[i];
+        if ((span.from == null || span.from <= pos.ch) &&
+            (span.to == null || span.to >= pos.ch))
+          markers.push(span.marker.parent || span.marker);
+      }
+      return markers;
+    },
+    findMarks: function(from, to, filter) {
+      from = clipPos(this, from); to = clipPos(this, to);
+      var found = [], lineNo = from.line;
+      this.iter(from.line, to.line + 1, function(line) {
+        var spans = line.markedSpans;
+        if (spans) for (var i = 0; i < spans.length; i++) {
+          var span = spans[i];
+          if (!(lineNo == from.line && from.ch > span.to ||
+                span.from == null && lineNo != from.line||
+                lineNo == to.line && span.from > to.ch) &&
+              (!filter || filter(span.marker)))
+            found.push(span.marker.parent || span.marker);
+        }
+        ++lineNo;
+      });
+      return found;
+    },
+    getAllMarks: function() {
+      var markers = [];
+      this.iter(function(line) {
+        var sps = line.markedSpans;
+        if (sps) for (var i = 0; i < sps.length; ++i)
+          if (sps[i].from != null) markers.push(sps[i].marker);
+      });
+      return markers;
+    },
+
+    posFromIndex: function(off) {
+      var ch, lineNo = this.first;
+      this.iter(function(line) {
+        var sz = line.text.length + 1;
+        if (sz > off) { ch = off; return true; }
+        off -= sz;
+        ++lineNo;
+      });
+      return clipPos(this, Pos(lineNo, ch));
+    },
+    indexFromPos: function (coords) {
+      coords = clipPos(this, coords);
+      var index = coords.ch;
+      if (coords.line < this.first || coords.ch < 0) return 0;
+      this.iter(this.first, coords.line, function (line) {
+        index += line.text.length + 1;
+      });
+      return index;
+    },
+
+    copy: function(copyHistory) {
+      var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first);
+      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
+      doc.sel = this.sel;
+      doc.extend = false;
+      if (copyHistory) {
+        doc.history.undoDepth = this.history.undoDepth;
+        doc.setHistory(this.getHistory());
+      }
+      return doc;
+    },
+
+    linkedDoc: function(options) {
+      if (!options) options = {};
+      var from = this.first, to = this.first + this.size;
+      if (options.from != null && options.from > from) from = options.from;
+      if (options.to != null && options.to < to) to = options.to;
+      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from);
+      if (options.sharedHist) copy.history = this.history;
+      (this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
+      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
+      copySharedMarkers(copy, findSharedMarkers(this));
+      return copy;
+    },
+    unlinkDoc: function(other) {
+      if (other instanceof CodeMirror) other = other.doc;
+      if (this.linked) for (var i = 0; i < this.linked.length; ++i) {
+        var link = this.linked[i];
+        if (link.doc != other) continue;
+        this.linked.splice(i, 1);
+        other.unlinkDoc(this);
+        detachSharedMarkers(findSharedMarkers(this));
+        break;
+      }
+      // If the histories were shared, split them again
+      if (other.history == this.history) {
+        var splitIds = [other.id];
+        linkedDocs(other, function(doc) {splitIds.push(doc.id);}, true);
+        other.history = new History(null);
+        other.history.done = copyHistoryArray(this.history.done, splitIds);
+        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
+      }
+    },
+    iterLinkedDocs: function(f) {linkedDocs(this, f);},
+
+    getMode: function() {return this.mode;},
+    getEditor: function() {return this.cm;}
+  });
+
+  // Public alias.
+  Doc.prototype.eachLine = Doc.prototype.iter;
+
+  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
+  var dontDelegate = "iter insert remove copy getEditor".split(" ");
+  for (var prop in Doc.prototype) if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
+    CodeMirror.prototype[prop] = (function(method) {
+      return function() {return method.apply(this.doc, arguments);};
+    })(Doc.prototype[prop]);
+
+  eventMixin(Doc);
+
+  // Call f for all linked documents.
+  function linkedDocs(doc, f, sharedHistOnly) {
+    function propagate(doc, skip, sharedHist) {
+      if (doc.linked) for (var i = 0; i < doc.linked.length; ++i) {
+        var rel = doc.linked[i];
+        if (rel.doc == skip) continue;
+        var shared = sharedHist && rel.sharedHist;
+        if (sharedHistOnly && !shared) continue;
+        f(rel.doc, shared);
+        propagate(rel.doc, doc, shared);
       }
     }
-  };
+    propagate(doc, null, true);
+  }
 
-  function getLineAt(chunk, n) {
-    while (!chunk.lines) {
+  // Attach a document to an editor.
+  function attachDoc(cm, doc) {
+    if (doc.cm) throw new Error("This document is already in use.");
+    cm.doc = doc;
+    doc.cm = cm;
+    estimateLineHeights(cm);
+    loadMode(cm);
+    if (!cm.options.lineWrapping) findMaxLine(cm);
+    cm.options.mode = doc.modeOption;
+    regChange(cm);
+  }
+
+  // LINE UTILITIES
+
+  // Find the line object corresponding to the given line number.
+  function getLine(doc, n) {
+    n -= doc.first;
+    if (n < 0 || n >= doc.size) throw new Error("There is no line " + (n + doc.first) + " in the document.");
+    for (var chunk = doc; !chunk.lines;) {
       for (var i = 0;; ++i) {
         var child = chunk.children[i], sz = child.chunkSize();
         if (n < sz) { chunk = child; break; }
@@ -2816,21 +6727,54 @@ window.CodeMirror = (function() {
     }
     return chunk.lines[n];
   }
+
+  // Get the part of a document between two positions, as an array of
+  // strings.
+  function getBetween(doc, start, end) {
+    var out = [], n = start.line;
+    doc.iter(start.line, end.line + 1, function(line) {
+      var text = line.text;
+      if (n == end.line) text = text.slice(0, end.ch);
+      if (n == start.line) text = text.slice(start.ch);
+      out.push(text);
+      ++n;
+    });
+    return out;
+  }
+  // Get the lines between from and to, as array of strings.
+  function getLines(doc, from, to) {
+    var out = [];
+    doc.iter(from, to, function(line) { out.push(line.text); });
+    return out;
+  }
+
+  // Update the height of a line, propagating the height change
+  // upwards to parent nodes.
+  function updateLineHeight(line, height) {
+    var diff = height - line.height;
+    if (diff) for (var n = line; n; n = n.parent) n.height += diff;
+  }
+
+  // Given a line object, find its line number by walking up through
+  // its parent links.
   function lineNo(line) {
     if (line.parent == null) return null;
     var cur = line.parent, no = indexOf(cur.lines, line);
     for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
-      for (var i = 0, e = chunk.children.length; ; ++i) {
+      for (var i = 0;; ++i) {
         if (chunk.children[i] == cur) break;
         no += chunk.children[i].chunkSize();
       }
     }
-    return no;
+    return no + cur.first;
   }
+
+  // Find the line at the given vertical position, using the height
+  // information in the document tree.
   function lineAtHeight(chunk, h) {
-    var n = 0;
+    var n = chunk.first;
     outer: do {
-      for (var i = 0, e = chunk.children.length; i < e; ++i) {
+      for (var i = 0; i < chunk.children.length; ++i) {
         var child = chunk.children[i], ch = child.height;
         if (h < ch) { chunk = child; continue outer; }
         h -= ch;
@@ -2838,85 +6782,304 @@ window.CodeMirror = (function() {
       }
       return n;
     } while (!chunk.lines);
-    for (var i = 0, e = chunk.lines.length; i < e; ++i) {
+    for (var i = 0; i < chunk.lines.length; ++i) {
       var line = chunk.lines[i], lh = line.height;
       if (h < lh) break;
       h -= lh;
     }
     return n + i;
   }
-  function heightAtLine(chunk, n) {
-    var h = 0;
-    outer: do {
-      for (var i = 0, e = chunk.children.length; i < e; ++i) {
-        var child = chunk.children[i], sz = child.chunkSize();
-        if (n < sz) { chunk = child; continue outer; }
-        n -= sz;
-        h += child.height;
+
+
+  // Find the height above the given line.
+  function heightAtLine(lineObj) {
+    lineObj = visualLine(lineObj);
+
+    var h = 0, chunk = lineObj.parent;
+    for (var i = 0; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i];
+      if (line == lineObj) break;
+      else h += line.height;
+    }
+    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+      for (var i = 0; i < p.children.length; ++i) {
+        var cur = p.children[i];
+        if (cur == chunk) break;
+        else h += cur.height;
       }
-      return h;
-    } while (!chunk.lines);
-    for (var i = 0; i < n; ++i) h += chunk.lines[i].height;
+    }
     return h;
   }
 
-  // The history object 'chunks' changes that are made close together
-  // and at almost the same time into bigger undoable units.
-  function History() {
-    this.time = 0;
+  // Get the bidi ordering for the given line (and cache it). Returns
+  // false for lines that are fully left-to-right, and an array of
+  // BidiSpan objects otherwise.
+  function getOrder(line) {
+    var order = line.order;
+    if (order == null) order = line.order = bidiOrdering(line.text);
+    return order;
+  }
+
+  // HISTORY
+
+  function History(startGen) {
+    // Arrays of change events and selections. Doing something adds an
+    // event to done and clears undo. Undoing moves events from done
+    // to undone, redoing moves them in the other direction.
     this.done = []; this.undone = [];
-    this.compound = 0;
-    this.closed = false;
-  }
-  History.prototype = {
-    addChange: function(start, added, old) {
-      this.undone.length = 0;
-      var time = +new Date, cur = lst(this.done), last = cur && lst(cur);
-      var dtime = time - this.time;
-
-      if (this.compound && cur && !this.closed) {
-        cur.push({start: start, added: added, old: old});
-      } else if (dtime > 400 || !last || this.closed ||
-                 last.start > start + old.length || last.start + last.added < start) {
-        this.done.push([{start: start, added: added, old: old}]);
-        this.closed = false;
+    this.undoDepth = Infinity;
+    // Used to track when changes can be merged into a single undo
+    // event
+    this.lastModTime = this.lastSelTime = 0;
+    this.lastOp = this.lastSelOp = null;
+    this.lastOrigin = this.lastSelOrigin = null;
+    // Used by the isClean() method
+    this.generation = this.maxGeneration = startGen || 1;
+  }
+
+  // Create a history change event from an updateDoc-style change
+  // object.
+  function historyChangeFromChange(doc, change) {
+    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
+    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
+    linkedDocs(doc, function(doc) {attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);}, true);
+    return histChange;
+  }
+
+  // Pop all selection events off the end of a history array. Stop at
+  // a change event.
+  function clearSelectionEvents(array) {
+    while (array.length) {
+      var last = lst(array);
+      if (last.ranges) array.pop();
+      else break;
+    }
+  }
+
+  // Find the top change event in the history. Pop off selection
+  // events that are in the way.
+  function lastChangeEvent(hist, force) {
+    if (force) {
+      clearSelectionEvents(hist.done);
+      return lst(hist.done);
+    } else if (hist.done.length && !lst(hist.done).ranges) {
+      return lst(hist.done);
+    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
+      hist.done.pop();
+      return lst(hist.done);
+    }
+  }
+
+  // Register a change in the history. Merges changes that are within
+  // a single operation, ore are close together with an origin that
+  // allows merging (starting with "+") into a single event.
+  function addChangeToHistory(doc, change, selAfter, opId) {
+    var hist = doc.history;
+    hist.undone.length = 0;
+    var time = +new Date, cur;
+
+    if ((hist.lastOp == opId ||
+         hist.lastOrigin == change.origin && change.origin &&
+         ((change.origin.charAt(0) == "+" && doc.cm && hist.lastModTime > time - doc.cm.options.historyEventDelay) ||
+          change.origin.charAt(0) == "*")) &&
+        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
+      // Merge this change into the last event
+      var last = lst(cur.changes);
+      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
+        // Optimized case for simple insertion -- don't want to add
+        // new changesets for every character typed
+        last.to = changeEnd(change);
       } else {
-        var startBefore = Math.max(0, last.start - start),
-            endAfter = Math.max(0, (start + old.length) - (last.start + last.added));
-        for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1]);
-        for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i]);
-        if (startBefore) last.start = start;
-        last.added += added - (old.length - startBefore - endAfter);
+        // Add new sub-event
+        cur.changes.push(historyChangeFromChange(doc, change));
+      }
+    } else {
+      // Can not be merged, start a new event.
+      var before = lst(hist.done);
+      if (!before || !before.ranges)
+        pushSelectionToHistory(doc.sel, hist.done);
+      cur = {changes: [historyChangeFromChange(doc, change)],
+             generation: hist.generation};
+      hist.done.push(cur);
+      while (hist.done.length > hist.undoDepth) {
+        hist.done.shift();
+        if (!hist.done[0].ranges) hist.done.shift();
       }
-      this.time = time;
-    },
-    startCompound: function() {
-      if (!this.compound++) this.closed = true;
-    },
-    endCompound: function() {
-      if (!--this.compound) this.closed = true;
     }
-  };
+    hist.done.push(selAfter);
+    hist.generation = ++hist.maxGeneration;
+    hist.lastModTime = hist.lastSelTime = time;
+    hist.lastOp = hist.lastSelOp = opId;
+    hist.lastOrigin = hist.lastSelOrigin = change.origin;
+
+    if (!last) signal(doc, "historyAdded");
+  }
+
+  function selectionEventCanBeMerged(doc, origin, prev, sel) {
+    var ch = origin.charAt(0);
+    return ch == "*" ||
+      ch == "+" &&
+      prev.ranges.length == sel.ranges.length &&
+      prev.somethingSelected() == sel.somethingSelected() &&
+      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500);
+  }
+
+  // Called whenever the selection changes, sets the new selection as
+  // the pending selection in the history, and pushes the old pending
+  // selection into the 'done' array when it was significantly
+  // different (in number of selected ranges, emptiness, or time).
+  function addSelectionToHistory(doc, sel, opId, options) {
+    var hist = doc.history, origin = options && options.origin;
+
+    // A new event is started when the previous origin does not match
+    // the current, or the origins don't allow matching. Origins
+    // starting with * are always merged, those starting with + are
+    // merged when similar and close together in time.
+    if (opId == hist.lastSelOp ||
+        (origin && hist.lastSelOrigin == origin &&
+         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
+          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
+      hist.done[hist.done.length - 1] = sel;
+    else
+      pushSelectionToHistory(sel, hist.done);
+
+    hist.lastSelTime = +new Date;
+    hist.lastSelOrigin = origin;
+    hist.lastSelOp = opId;
+    if (options && options.clearRedo !== false)
+      clearSelectionEvents(hist.undone);
+  }
+
+  function pushSelectionToHistory(sel, dest) {
+    var top = lst(dest);
+    if (!(top && top.ranges && top.equals(sel)))
+      dest.push(sel);
+  }
+
+  // Used to store marked span information in the history.
+  function attachLocalSpans(doc, change, from, to) {
+    var existing = change["spans_" + doc.id], n = 0;
+    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function(line) {
+      if (line.markedSpans)
+        (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans;
+      ++n;
+    });
+  }
+
+  // When un/re-doing restores text containing marked spans, those
+  // that have been explicitly cleared should not be restored.
+  function removeClearedSpans(spans) {
+    if (!spans) return null;
+    for (var i = 0, out; i < spans.length; ++i) {
+      if (spans[i].marker.explicitlyCleared) { if (!out) out = spans.slice(0, i); }
+      else if (out) out.push(spans[i]);
+    }
+    return !out ? spans : out.length ? out : null;
+  }
+
+  // Retrieve and filter the old marked spans stored in a change event.
+  function getOldSpans(doc, change) {
+    var found = change["spans_" + doc.id];
+    if (!found) return null;
+    for (var i = 0, nw = []; i < change.text.length; ++i)
+      nw.push(removeClearedSpans(found[i]));
+    return nw;
+  }
+
+  // Used both to provide a JSON-safe object in .getHistory, and, when
+  // detaching a document, to split the history in two
+  function copyHistoryArray(events, newGroup, instantiateSel) {
+    for (var i = 0, copy = []; i < events.length; ++i) {
+      var event = events[i];
+      if (event.ranges) {
+        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
+        continue;
+      }
+      var changes = event.changes, newChanges = [];
+      copy.push({changes: newChanges});
+      for (var j = 0; j < changes.length; ++j) {
+        var change = changes[j], m;
+        newChanges.push({from: change.from, to: change.to, text: change.text});
+        if (newGroup) for (var prop in change) if (m = prop.match(/^spans_(\d+)$/)) {
+          if (indexOf(newGroup, Number(m[1])) > -1) {
+            lst(newChanges)[prop] = change[prop];
+            delete change[prop];
+          }
+        }
+      }
+    }
+    return copy;
+  }
+
+  // Rebasing/resetting history to deal with externally-sourced changes
 
-  function stopMethod() {e_stop(this);}
-  // Ensure an event has a stop method.
-  function addStop(event) {
-    if (!event.stop) event.stop = stopMethod;
-    return event;
+  function rebaseHistSelSingle(pos, from, to, diff) {
+    if (to < pos.line) {
+      pos.line += diff;
+    } else if (from < pos.line) {
+      pos.line = from;
+      pos.ch = 0;
+    }
+  }
+
+  // Tries to rebase an array of history events given a change in the
+  // document. If the change touches the same lines as the event, the
+  // event, and everything 'behind' it, is discarded. If the change is
+  // before the event, the event's positions are updated. Uses a
+  // copy-on-write scheme for the positions, to avoid having to
+  // reallocate them all on every rebase, but also avoid problems with
+  // shared position objects being unsafely updated.
+  function rebaseHistArray(array, from, to, diff) {
+    for (var i = 0; i < array.length; ++i) {
+      var sub = array[i], ok = true;
+      if (sub.ranges) {
+        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
+        for (var j = 0; j < sub.ranges.length; j++) {
+          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
+          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
+        }
+        continue;
+      }
+      for (var j = 0; j < sub.changes.length; ++j) {
+        var cur = sub.changes[j];
+        if (to < cur.from.line) {
+          cur.from = Pos(cur.from.line + diff, cur.from.ch);
+          cur.to = Pos(cur.to.line + diff, cur.to.ch);
+        } else if (from <= cur.to.line) {
+          ok = false;
+          break;
+        }
+      }
+      if (!ok) {
+        array.splice(0, i + 1);
+        i = 0;
+      }
+    }
+  }
+
+  function rebaseHist(hist, change) {
+    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
+    rebaseHistArray(hist.done, from, to, diff);
+    rebaseHistArray(hist.undone, from, to, diff);
   }
 
-  function e_preventDefault(e) {
+  // EVENT UTILITIES
+
+  // Due to the fact that we still support jurassic IE versions, some
+  // compatibility wrappers are needed.
+
+  var e_preventDefault = CodeMirror.e_preventDefault = function(e) {
     if (e.preventDefault) e.preventDefault();
     else e.returnValue = false;
-  }
-  function e_stopPropagation(e) {
+  };
+  var e_stopPropagation = CodeMirror.e_stopPropagation = function(e) {
     if (e.stopPropagation) e.stopPropagation();
     else e.cancelBubble = true;
+  };
+  function e_defaultPrevented(e) {
+    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false;
   }
-  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
-  CodeMirror.e_stop = e_stop;
-  CodeMirror.e_preventDefault = e_preventDefault;
-  CodeMirror.e_stopPropagation = e_stopPropagation;
+  var e_stop = CodeMirror.e_stop = function(e) {e_preventDefault(e); e_stopPropagation(e);};
 
   function e_target(e) {return e.target || e.srcElement;}
   function e_button(e) {
@@ -2930,95 +7093,152 @@ window.CodeMirror = (function() {
     return b;
   }
 
-  // Allow 3rd-party code to override event properties by adding an override
-  // object to an event object.
-  function e_prop(e, prop) {
-    var overridden = e.override && e.override.hasOwnProperty(prop);
-    return overridden ? e.override[prop] : e[prop];
-  }
+  // EVENT HANDLING
+
+  // Lightweight event framework. on/off also work on DOM nodes,
+  // registering native DOM handlers.
+
+  var on = CodeMirror.on = function(emitter, type, f) {
+    if (emitter.addEventListener)
+      emitter.addEventListener(type, f, false);
+    else if (emitter.attachEvent)
+      emitter.attachEvent("on" + type, f);
+    else {
+      var map = emitter._handlers || (emitter._handlers = {});
+      var arr = map[type] || (map[type] = []);
+      arr.push(f);
+    }
+  };
+
+  var off = CodeMirror.off = function(emitter, type, f) {
+    if (emitter.removeEventListener)
+      emitter.removeEventListener(type, f, false);
+    else if (emitter.detachEvent)
+      emitter.detachEvent("on" + type, f);
+    else {
+      var arr = emitter._handlers && emitter._handlers[type];
+      if (!arr) return;
+      for (var i = 0; i < arr.length; ++i)
+        if (arr[i] == f) { arr.splice(i, 1); break; }
+    }
+  };
+
+  var signal = CodeMirror.signal = function(emitter, type /*, values...*/) {
+    var arr = emitter._handlers && emitter._handlers[type];
+    if (!arr) return;
+    var args = Array.prototype.slice.call(arguments, 2);
+    for (var i = 0; i < arr.length; ++i) arr[i].apply(null, args);
+  };
 
-  // Event handler registration. If disconnect is true, it'll return a
-  // function that unregisters the handler.
-  function connect(node, type, handler, disconnect) {
-    if (typeof node.addEventListener == "function") {
-      node.addEventListener(type, handler, false);
-      if (disconnect) return function() {node.removeEventListener(type, handler, false);};
+  var orphanDelayedCallbacks = null;
+
+  // Often, we want to signal events at a point where we are in the
+  // middle of some work, but don't want the handler to start calling
+  // other methods on the editor, which might be in an inconsistent
+  // state or simply not expect any other events to happen.
+  // signalLater looks whether there are any handlers, and schedules
+  // them to be executed when the last operation ends, or, if no
+  // operation is active, when a timeout fires.
+  function signalLater(emitter, type /*, values...*/) {
+    var arr = emitter._handlers && emitter._handlers[type];
+    if (!arr) return;
+    var args = Array.prototype.slice.call(arguments, 2), list;
+    if (operationGroup) {
+      list = operationGroup.delayedCallbacks;
+    } else if (orphanDelayedCallbacks) {
+      list = orphanDelayedCallbacks;
     } else {
-      var wrapHandler = function(event) {handler(event || window.event);};
-      node.attachEvent("on" + type, wrapHandler);
-      if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
+      list = orphanDelayedCallbacks = [];
+      setTimeout(fireOrphanDelayed, 0);
     }
+    function bnd(f) {return function(){f.apply(null, args);};};
+    for (var i = 0; i < arr.length; ++i)
+      list.push(bnd(arr[i]));
   }
-  CodeMirror.connect = connect;
 
-  function Delayed() {this.id = null;}
-  Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
+  function fireOrphanDelayed() {
+    var delayed = orphanDelayedCallbacks;
+    orphanDelayedCallbacks = null;
+    for (var i = 0; i < delayed.length; ++i) delayed[i]();
+  }
 
-  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
+  // The DOM events that CodeMirror handles can be overridden by
+  // registering a (non-DOM) handler on the editor for the event name,
+  // and preventDefault-ing the event in that handler.
+  function signalDOMEvent(cm, e, override) {
+    signal(cm, override || e.type, cm, e);
+    return e_defaultPrevented(e) || e.codemirrorIgnore;
+  }
 
-  // Detect drag-and-drop
-  var dragAndDrop = function() {
-    // There is *some* kind of drag-and-drop support in IE6-8, but I
-    // couldn't get it to work yet.
-    if (ie_lt9) return false;
-    var div = elt('div');
-    return "draggable" in div || "dragDrop" in div;
-  }();
+  function signalCursorActivity(cm) {
+    var arr = cm._handlers && cm._handlers.cursorActivity;
+    if (!arr) return;
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i < arr.length; ++i) if (indexOf(set, arr[i]) == -1)
+      set.push(arr[i]);
+  }
 
-  // Feature-detect whether newlines in textareas are converted to \r\n
-  var lineSep = function () {
-    var te = elt("textarea");
-    te.value = "foo\nbar";
-    if (te.value.indexOf("\r") > -1) return "\r\n";
-    return "\n";
-  }();
+  function hasHandler(emitter, type) {
+    var arr = emitter._handlers && emitter._handlers[type];
+    return arr && arr.length > 0;
+  }
+
+  // Add on and off methods to a constructor's prototype, to make
+  // registering events on such objects more convenient.
+  function eventMixin(ctor) {
+    ctor.prototype.on = function(type, f) {on(this, type, f);};
+    ctor.prototype.off = function(type, f) {off(this, type, f);};
+  }
+
+  // MISC UTILITIES
+
+  // Number of pixels added to scroller and sizer to hide scrollbar
+  var scrollerCutOff = 30;
+
+  // Returned or thrown by various protocols to signal 'I'm not
+  // handling this'.
+  var Pass = CodeMirror.Pass = {toString: function(){return "CodeMirror.Pass";}};
+
+  // Reused option objects for setSelection & friends
+  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
 
-  // For a reason I have yet to figure out, some browsers disallow
-  // word wrapping between certain characters *only* if a new inline
-  // element is started between them. This makes it hard to reliably
-  // measure the position of things, since that requires inserting an
-  // extra span. This terribly fragile set of regexps matches the
-  // character combinations that suffer from this phenomenon on the
-  // various browsers.
-  var spanAffectsWrapping = /^$/; // Won't match any two-character string
-  if (gecko) spanAffectsWrapping = /$'/;
-  else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/;
-  else if (chrome) spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/;
+  function Delayed() {this.id = null;}
+  Delayed.prototype.set = function(ms, f) {
+    clearTimeout(this.id);
+    this.id = setTimeout(f, ms);
+  };
 
   // Counts the column offset in a string, taking tabs into account.
   // Used mostly to find indentation.
-  function countColumn(string, end, tabSize) {
+  var countColumn = CodeMirror.countColumn = function(string, end, tabSize, startIndex, startValue) {
     if (end == null) {
       end = string.search(/[^\s\u00a0]/);
       if (end == -1) end = string.length;
     }
-    for (var i = 0, n = 0; i < end; ++i) {
-      if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
-      else ++n;
+    for (var i = startIndex || 0, n = startValue || 0;;) {
+      var nextTab = string.indexOf("\t", i);
+      if (nextTab < 0 || nextTab >= end)
+        return n + (end - i);
+      n += nextTab - i;
+      n += tabSize - (n % tabSize);
+      i = nextTab + 1;
     }
-    return n;
-  }
+  };
 
-  function eltOffset(node, screen) {
-    // Take the parts of bounding client rect that we are interested in so we are able to edit if need be,
-    // since the returned value cannot be changed externally (they are kept in sync as the element moves within the page)
-    try { var box = node.getBoundingClientRect(); box = { top: box.top, left: box.left }; }
-    catch(e) { box = {top: 0, left: 0}; }
-    if (!screen) {
-      // Get the toplevel scroll, working around browser differences.
-      if (window.pageYOffset == null) {
-        var t = document.documentElement || document.body.parentNode;
-        if (t.scrollTop == null) t = document.body;
-        box.top += t.scrollTop; box.left += t.scrollLeft;
-      } else {
-        box.top += window.pageYOffset; box.left += window.pageXOffset;
-      }
+  // The inverse of countColumn -- find the offset that corresponds to
+  // a particular column.
+  function findColumn(string, goal, tabSize) {
+    for (var pos = 0, col = 0;;) {
+      var nextTab = string.indexOf("\t", pos);
+      if (nextTab == -1) nextTab = string.length;
+      var skipped = nextTab - pos;
+      if (nextTab == string.length || col + skipped >= goal)
+        return pos + Math.min(skipped, goal - col);
+      col += nextTab - pos;
+      col += tabSize - (col % tabSize);
+      pos = nextTab + 1;
+      if (col >= goal) return pos;
     }
-    return box;
-  }
-
-  function eltText(node) {
-    return node.textContent || node.innerText || node.nodeValue || "";
   }
 
   var spaceStrs = [""];
@@ -3030,63 +7250,226 @@ window.CodeMirror = (function() {
 
   function lst(arr) { return arr[arr.length-1]; }
 
-  function selectInput(node) {
-    if (ios) { // Mobile Safari apparently has a bug where select() is broken.
-      node.selectionStart = 0;
-      node.selectionEnd = node.value.length;
-    } else node.select();
+  var selectInput = function(node) { node.select(); };
+  if (ios) // Mobile Safari apparently has a bug where select() is broken.
+    selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; };
+  else if (ie) // Suppress mysterious IE10 errors
+    selectInput = function(node) { try { node.select(); } catch(_e) {} };
+
+  function indexOf(array, elt) {
+    for (var i = 0; i < array.length; ++i)
+      if (array[i] == elt) return i;
+    return -1;
+  }
+  if ([].indexOf) indexOf = function(array, elt) { return array.indexOf(elt); };
+  function map(array, f) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) out[i] = f(array[i], i);
+    return out;
+  }
+  if ([].map) map = function(array, f) { return array.map(f); };
+
+  function createObj(base, props) {
+    var inst;
+    if (Object.create) {
+      inst = Object.create(base);
+    } else {
+      var ctor = function() {};
+      ctor.prototype = base;
+      inst = new ctor();
+    }
+    if (props) copyObj(props, inst);
+    return inst;
+  };
+
+  function copyObj(obj, target, overwrite) {
+    if (!target) target = {};
+    for (var prop in obj)
+      if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+        target[prop] = obj[prop];
+    return target;
+  }
+
+  function bind(f) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function(){return f.apply(null, args);};
+  }
+
+  var nonASCIISingleCaseWordChar = /[\u00df\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+  var isWordCharBasic = CodeMirror.isWordChar = function(ch) {
+    return /\w/.test(ch) || ch > "\x80" &&
+      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch));
+  };
+  function isWordChar(ch, helper) {
+    if (!helper) return isWordCharBasic(ch);
+    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) return true;
+    return helper.test(ch);
+  }
+
+  function isEmpty(obj) {
+    for (var n in obj) if (obj.hasOwnProperty(n) && obj[n]) return false;
+    return true;
   }
 
-  // Operations on {line, ch} objects.
-  function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
-  function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
-  function copyPos(x) {return {line: x.line, ch: x.ch};}
+  // Extending unicode characters. A series of a non-extending char +
+  // any number of extending chars is treated as a single unit as far
+  // as editing and measuring is concerned. This is not fully correct,
+  // since some scripts/fonts/browsers also treat other configurations
+  // of code points as a group.
+  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); }
+
+  // DOM UTILITIES
 
   function elt(tag, content, className, style) {
     var e = document.createElement(tag);
     if (className) e.className = className;
     if (style) e.style.cssText = style;
-    if (typeof content == "string") setTextContent(e, content);
+    if (typeof content == "string") e.appendChild(document.createTextNode(content));
     else if (content) for (var i = 0; i < content.length; ++i) e.appendChild(content[i]);
     return e;
   }
+
+  var range;
+  if (document.createRange) range = function(node, start, end) {
+    var r = document.createRange();
+    r.setEnd(node, end);
+    r.setStart(node, start);
+    return r;
+  };
+  else range = function(node, start, end) {
+    var r = document.body.createTextRange();
+    r.moveToElementText(node.parentNode);
+    r.collapse(true);
+    r.moveEnd("character", end);
+    r.moveStart("character", start);
+    return r;
+  };
+
   function removeChildren(e) {
-    e.innerHTML = "";
+    for (var count = e.childNodes.length; count > 0; --count)
+      e.removeChild(e.firstChild);
     return e;
   }
+
   function removeChildrenAndAdd(parent, e) {
-    removeChildren(parent).appendChild(e);
+    return removeChildren(parent).appendChild(e);
+  }
+
+  function contains(parent, child) {
+    if (parent.contains)
+      return parent.contains(child);
+    while (child = child.parentNode)
+      if (child == parent) return true;
   }
-  function setTextContent(e, str) {
-    if (ie_lt9) {
-      e.innerHTML = "";
-      e.appendChild(document.createTextNode(str));
-    } else e.textContent = str;
+
+  function activeElt() { return document.activeElement; }
+  // Older versions of IE throws unspecified error when touching
+  // document.activeElement in some cases (during loading, in iframe)
+  if (ie && ie_version < 11) activeElt = function() {
+    try { return document.activeElement; }
+    catch(e) { return document.body; }
+  };
+
+  function classTest(cls) { return new RegExp("\\b" + cls + "\\b\\s*"); }
+  function rmClass(node, cls) {
+    var test = classTest(cls);
+    if (test.test(node.className)) node.className = node.className.replace(test, "");
+  }
+  function addClass(node, cls) {
+    if (!classTest(cls).test(node.className)) node.className += " " + cls;
+  }
+  function joinClasses(a, b) {
+    var as = a.split(" ");
+    for (var i = 0; i < as.length; i++)
+      if (as[i] && !classTest(as[i]).test(b)) b += " " + as[i];
+    return b;
+  }
+
+  // WINDOW-WIDE EVENTS
+
+  // These must be handled carefully, because naively registering a
+  // handler for each editor will cause the editors to never be
+  // garbage collected.
+
+  function forEachCodeMirror(f) {
+    if (!document.body.getElementsByClassName) return;
+    var byClass = document.body.getElementsByClassName("CodeMirror");
+    for (var i = 0; i < byClass.length; i++) {
+      var cm = byClass[i].CodeMirror;
+      if (cm) f(cm);
+    }
   }
 
-  // Used to position the cursor after an undo/redo by finding the
-  // last edited character.
-  function editEnd(from, to) {
-    if (!to) return 0;
-    if (!from) return to.length;
-    for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
-      if (from.charAt(i) != to.charAt(j)) break;
-    return j + 1;
+  var globalsRegistered = false;
+  function ensureGlobalHandlers() {
+    if (globalsRegistered) return;
+    registerGlobalHandlers();
+    globalsRegistered = true;
+  }
+  function registerGlobalHandlers() {
+    // When the window resizes, we need to refresh active editors.
+    var resizeTimer;
+    on(window, "resize", function() {
+      if (resizeTimer == null) resizeTimer = setTimeout(function() {
+        resizeTimer = null;
+        knownScrollbarWidth = null;
+        forEachCodeMirror(onResize);
+      }, 100);
+    });
+    // When the window loses focus, we want to show the editor as blurred
+    on(window, "blur", function() {
+      forEachCodeMirror(onBlur);
+    });
   }
 
-  function indexOf(collection, elt) {
-    if (collection.indexOf) return collection.indexOf(elt);
-    for (var i = 0, e = collection.length; i < e; ++i)
-      if (collection[i] == elt) return i;
-    return -1;
+  // FEATURE DETECTION
+
+  // Detect drag-and-drop
+  var dragAndDrop = function() {
+    // There is *some* kind of drag-and-drop support in IE6-8, but I
+    // couldn't get it to work yet.
+    if (ie && ie_version < 9) return false;
+    var div = elt('div');
+    return "draggable" in div || "dragDrop" in div;
+  }();
+
+  var knownScrollbarWidth;
+  function scrollbarWidth(measure) {
+    if (knownScrollbarWidth != null) return knownScrollbarWidth;
+    var test = elt("div", null, null, "width: 50px; height: 50px; overflow-x: scroll");
+    removeChildrenAndAdd(measure, test);
+    if (test.offsetWidth)
+      knownScrollbarWidth = test.offsetHeight - test.clientHeight;
+    return knownScrollbarWidth || 0;
   }
-  function isWordChar(ch) {
-    return /\w/.test(ch) || ch.toUpperCase() != ch.toLowerCase();
+
+  var zwspSupported;
+  function zeroWidthElement(measure) {
+    if (zwspSupported == null) {
+      var test = elt("span", "\u200b");
+      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+      if (measure.firstChild.offsetHeight != 0)
+        zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8);
+    }
+    if (zwspSupported) return elt("span", "\u200b");
+    else return elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+  }
+
+  // Feature-detect IE's crummy client rect reporting for bidi text
+  var badBidiRects;
+  function hasBadBidiRects(measure) {
+    if (badBidiRects != null) return badBidiRects;
+    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+    var r0 = range(txt, 0, 1).getBoundingClientRect();
+    if (!r0 || r0.left == r0.right) return false; // Safari returns null in some cases (#2780)
+    var r1 = range(txt, 1, 2).getBoundingClientRect();
+    return badBidiRects = (r1.right - r0.right < 3);
   }
 
   // See if "".split is the broken IE version, if so, provide an
   // alternative way to split lines.
-  var splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
+  var splitLines = CodeMirror.splitLines = "\n\nb".split(/\n/).length != 3 ? function(string) {
     var pos = 0, result = [], l = string.length;
     while (pos <= l) {
       var nl = string.indexOf("\n", pos);
@@ -3103,7 +7486,6 @@ window.CodeMirror = (function() {
     }
     return result;
   } : function(string){return string.split(/\r\n?|\n/);};
-  CodeMirror.splitLines = splitLines;
 
   var hasSelection = window.getSelection ? function(te) {
     try { return te.selectionStart != te.selectionEnd; }
@@ -3115,29 +7497,335 @@ window.CodeMirror = (function() {
     return range.compareEndPoints("StartToEnd", range) != 0;
   };
 
-  CodeMirror.defineMode("null", function() {
-    return {token: function(stream) {stream.skipToEnd();}};
-  });
-  CodeMirror.defineMIME("text/plain", "null");
+  var hasCopyEvent = (function() {
+    var e = elt("div");
+    if ("oncopy" in e) return true;
+    e.setAttribute("oncopy", "return;");
+    return typeof e.oncopy == "function";
+  })();
+
+  var badZoomedRects = null;
+  function hasBadZoomedRects(measure) {
+    if (badZoomedRects != null) return badZoomedRects;
+    var node = removeChildrenAndAdd(measure, elt("span", "x"));
+    var normal = node.getBoundingClientRect();
+    var fromRange = range(node, 0, 1).getBoundingClientRect();
+    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1;
+  }
+
+  // KEY NAMES
 
   var keyNames = {3: "Enter", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
                   19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
                   36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
-                  46: "Delete", 59: ";", 91: "Mod", 92: "Mod", 93: "Mod", 109: "-", 107: "=", 127: "Delete",
-                  186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
-                  221: "]", 222: "'", 63276: "PageUp", 63277: "PageDown", 63275: "End", 63273: "Home",
-                  63234: "Left", 63232: "Up", 63235: "Right", 63233: "Down", 63302: "Insert", 63272: "Delete"};
+                  46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", 107: "=", 109: "-", 127: "Delete",
+                  173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
+                  221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
+                  63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"};
   CodeMirror.keyNames = keyNames;
   (function() {
     // Number keys
-    for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i);
+    for (var i = 0; i < 10; i++) keyNames[i + 48] = keyNames[i + 96] = String(i);
     // Alphabetic keys
     for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i);
     // Function keys
     for (var i = 1; i <= 12; i++) keyNames[i + 111] = keyNames[i + 63235] = "F" + i;
   })();
 
-  CodeMirror.version = "2.34";
+  // BIDI HELPERS
+
+  function iterateBidiSections(order, from, to, f) {
+    if (!order) return f(from, to, "ltr");
+    var found = false;
+    for (var i = 0; i < order.length; ++i) {
+      var part = order[i];
+      if (part.from < to && part.to > from || from == to && part.to == from) {
+        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr");
+        found = true;
+      }
+    }
+    if (!found) f(from, to, "ltr");
+  }
+
+  function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
+  function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
+
+  function lineLeft(line) { var order = getOrder(line); return order ? bidiLeft(order[0]) : 0; }
+  function lineRight(line) {
+    var order = getOrder(line);
+    if (!order) return line.text.length;
+    return bidiRight(lst(order));
+  }
+
+  function lineStart(cm, lineN) {
+    var line = getLine(cm.doc, lineN);
+    var visual = visualLine(line);
+    if (visual != line) lineN = lineNo(visual);
+    var order = getOrder(visual);
+    var ch = !order ? 0 : order[0].level % 2 ? lineRight(visual) : lineLeft(visual);
+    return Pos(lineN, ch);
+  }
+  function lineEnd(cm, lineN) {
+    var merged, line = getLine(cm.doc, lineN);
+    while (merged = collapsedSpanAtEnd(line)) {
+      line = merged.find(1, true).line;
+      lineN = null;
+    }
+    var order = getOrder(line);
+    var ch = !order ? line.text.length : order[0].level % 2 ? lineLeft(line) : lineRight(line);
+    return Pos(lineN == null ? lineNo(line) : lineN, ch);
+  }
+  function lineStartSmart(cm, pos) {
+    var start = lineStart(cm, pos.line);
+    var line = getLine(cm.doc, start.line);
+    var order = getOrder(line);
+    if (!order || order[0].level == 0) {
+      var firstNonWS = Math.max(0, line.text.search(/\S/));
+      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
+      return Pos(start.line, inWS ? 0 : firstNonWS);
+    }
+    return start;
+  }
+
+  function compareBidiLevel(order, a, b) {
+    var linedir = order[0].level;
+    if (a == linedir) return true;
+    if (b == linedir) return false;
+    return a < b;
+  }
+  var bidiOther;
+  function getBidiPartAt(order, pos) {
+    bidiOther = null;
+    for (var i = 0, found; i < order.length; ++i) {
+      var cur = order[i];
+      if (cur.from < pos && cur.to > pos) return i;
+      if ((cur.from == pos || cur.to == pos)) {
+        if (found == null) {
+          found = i;
+        } else if (compareBidiLevel(order, cur.level, order[found].level)) {
+          if (cur.from != cur.to) bidiOther = found;
+          return i;
+        } else {
+          if (cur.from != cur.to) bidiOther = i;
+          return found;
+        }
+      }
+    }
+    return found;
+  }
+
+  function moveInLine(line, pos, dir, byUnit) {
+    if (!byUnit) return pos + dir;
+    do pos += dir;
+    while (pos > 0 && isExtendingChar(line.text.charAt(pos)));
+    return pos;
+  }
+
+  // This is needed in order to move 'visually' through bi-directional
+  // text -- i.e., pressing left should make the cursor go left, even
+  // when in RTL text. The tricky part is the 'jumps', where RTL and
+  // LTR text touch each other. This often requires the cursor offset
+  // to move more than one unit, in order to visually move one unit.
+  function moveVisually(line, start, dir, byUnit) {
+    var bidi = getOrder(line);
+    if (!bidi) return moveLogically(line, start, dir, byUnit);
+    var pos = getBidiPartAt(bidi, start), part = bidi[pos];
+    var target = moveInLine(line, start, part.level % 2 ? -dir : dir, byUnit);
+
+    for (;;) {
+      if (target > part.from && target < part.to) return target;
+      if (target == part.from || target == part.to) {
+        if (getBidiPartAt(bidi, target) == pos) return target;
+        part = bidi[pos += dir];
+        return (dir > 0) == part.level % 2 ? part.to : part.from;
+      } else {
+        part = bidi[pos += dir];
+        if (!part) return null;
+        if ((dir > 0) == part.level % 2)
+          target = moveInLine(line, part.to, -1, byUnit);
+        else
+          target = moveInLine(line, part.from, 1, byUnit);
+      }
+    }
+  }
+
+  function moveLogically(line, start, dir, byUnit) {
+    var target = start + dir;
+    if (byUnit) while (target > 0 && isExtendingChar(line.text.charAt(target))) target += dir;
+    return target < 0 || target > line.text.length ? null : target;
+  }
+
+  // Bidirectional ordering algorithm
+  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+  // that this (partially) implements.
+
+  // One-char codes used for character types:
+  // L (L):   Left-to-Right
+  // R (R):   Right-to-Left
+  // r (AL):  Right-to-Left Arabic
+  // 1 (EN):  European Number
+  // + (ES):  European Number Separator
+  // % (ET):  European Number Terminator
+  // n (AN):  Arabic Number
+  // , (CS):  Common Number Separator
+  // m (NSM): Non-Spacing Mark
+  // b (BN):  Boundary Neutral
+  // s (B):   Paragraph Separator
+  // t (S):   Segment Separator
+  // w (WS):  Whitespace
+  // N (ON):  Other Neutrals
+
+  // Returns null if characters are ordered as they appear
+  // (left-to-right), or an array of sections ({from, to, level}
+  // objects) in the order in which they occur visually.
+  var bidiOrdering = (function() {
+    // Character types for codepoints 0 to 0xff
+    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+    // Character types for codepoints 0x600 to 0x6ff
+    var arabicTypes = "rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm";
+    function charType(code) {
+      if (code <= 0xf7) return lowTypes.charAt(code);
+      else if (0x590 <= code && code <= 0x5f4) return "R";
+      else if (0x600 <= code && code <= 0x6ed) return arabicTypes.charAt(code - 0x600);
+      else if (0x6ee <= code && code <= 0x8ac) return "r";
+      else if (0x2000 <= code && code <= 0x200b) return "w";
+      else if (code == 0x200c) return "b";
+      else return "L";
+    }
+
+    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+    // Browsers seem to always treat the boundaries of block elements as being L.
+    var outerType = "L";
+
+    function BidiSpan(level, from, to) {
+      this.level = level;
+      this.from = from; this.to = to;
+    }
+
+    return function(str) {
+      if (!bidiRE.test(str)) return false;
+      var len = str.length, types = [];
+      for (var i = 0, type; i < len; ++i)
+        types.push(type = charType(str.charCodeAt(i)));
+
+      // W1. Examine each non-spacing mark (NSM) in the level run, and
+      // change the type of the NSM to the type of the previous
+      // character. If the NSM is at the start of the level run, it will
+      // get the type of sor.
+      for (var i = 0, prev = outerType; i < len; ++i) {
+        var type = types[i];
+        if (type == "m") types[i] = prev;
+        else prev = type;
+      }
+
+      // W2. Search backwards from each instance of a European number
+      // until the first strong type (R, L, AL, or sor) is found. If an
+      // AL is found, change the type of the European number to Arabic
+      // number.
+      // W3. Change all ALs to R.
+      for (var i = 0, cur = outerType; i < len; ++i) {
+        var type = types[i];
+        if (type == "1" && cur == "r") types[i] = "n";
+        else if (isStrong.test(type)) { cur = type; if (type == "r") types[i] = "R"; }
+      }
+
+      // W4. A single European separator between two European numbers
+      // changes to a European number. A single common separator between
+      // two numbers of the same type changes to that type.
+      for (var i = 1, prev = types[0]; i < len - 1; ++i) {
+        var type = types[i];
+        if (type == "+" && prev == "1" && types[i+1] == "1") types[i] = "1";
+        else if (type == "," && prev == types[i+1] &&
+                 (prev == "1" || prev == "n")) types[i] = prev;
+        prev = type;
+      }
+
+      // W5. A sequence of European terminators adjacent to European
+      // numbers changes to all European numbers.
+      // W6. Otherwise, separators and terminators change to Other
+      // Neutral.
+      for (var i = 0; i < len; ++i) {
+        var type = types[i];
+        if (type == ",") types[i] = "N";
+        else if (type == "%") {
+          for (var end = i + 1; end < len && types[end] == "%"; ++end) {}
+          var replace = (i && types[i-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+          for (var j = i; j < end; ++j) types[j] = replace;
+          i = end - 1;
+        }
+      }
+
+      // W7. Search backwards from each instance of a European number
+      // until the first strong type (R, L, or sor) is found. If an L is
+      // found, then change the type of the European number to L.
+      for (var i = 0, cur = outerType; i < len; ++i) {
+        var type = types[i];
+        if (cur == "L" && type == "1") types[i] = "L";
+        else if (isStrong.test(type)) cur = type;
+      }
+
+      // N1. A sequence of neutrals takes the direction of the
+      // surrounding strong text if the text on both sides has the same
+      // direction. European and Arabic numbers act as if they were R in
+      // terms of their influence on neutrals. Start-of-level-run (sor)
+      // and end-of-level-run (eor) are used at level run boundaries.
+      // N2. Any remaining neutrals take the embedding direction.
+      for (var i = 0; i < len; ++i) {
+        if (isNeutral.test(types[i])) {
+          for (var end = i + 1; end < len && isNeutral.test(types[end]); ++end) {}
+          var before = (i ? types[i-1] : outerType) == "L";
+          var after = (end < len ? types[end] : outerType) == "L";
+          var replace = before || after ? "L" : "R";
+          for (var j = i; j < end; ++j) types[j] = replace;
+          i = end - 1;
+        }
+      }
+
+      // Here we depart from the documented algorithm, in order to avoid
+      // building up an actual levels array. Since there are only three
+      // levels (0, 1, 2) in an implementation that doesn't take
+      // explicit embedding into account, we can build up the order on
+      // the fly, without following the level-based algorithm.
+      var order = [], m;
+      for (var i = 0; i < len;) {
+        if (countsAsLeft.test(types[i])) {
+          var start = i;
+          for (++i; i < len && countsAsLeft.test(types[i]); ++i) {}
+          order.push(new BidiSpan(0, start, i));
+        } else {
+          var pos = i, at = order.length;
+          for (++i; i < len && types[i] != "L"; ++i) {}
+          for (var j = pos; j < i;) {
+            if (countsAsNum.test(types[j])) {
+              if (pos < j) order.splice(at, 0, new BidiSpan(1, pos, j));
+              var nstart = j;
+              for (++j; j < i && countsAsNum.test(types[j]); ++j) {}
+              order.splice(at, 0, new BidiSpan(2, nstart, j));
+              pos = j;
+            } else ++j;
+          }
+          if (pos < i) order.splice(at, 0, new BidiSpan(1, pos, i));
+        }
+      }
+      if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+        order[0].from = m[0].length;
+        order.unshift(new BidiSpan(0, 0, m[0].length));
+      }
+      if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+        lst(order).to -= m[0].length;
+        order.push(new BidiSpan(0, len - m[0].length, len));
+      }
+      if (order[0].level != lst(order).level)
+        order.push(new BidiSpan(order[0].level, len, len));
+
+      return order;
+    };
+  })();
+
+  // THE END
+
+  CodeMirror.version = "4.6.0";
 
   return CodeMirror;
-})();
+});
diff --git a/amber/src/js/lib/CodeMirror/css.js b/amber/src/js/lib/CodeMirror/css.js
new file mode 100644
index 0000000000000000000000000000000000000000..2695d0815058b7ba168942c101e5d7253e9504e2
--- /dev/null
+++ b/amber/src/js/lib/CodeMirror/css.js
@@ -0,0 +1,717 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("css", function(config, parserConfig) {
+  if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css");
+
+  var indentUnit = config.indentUnit,
+      tokenHooks = parserConfig.tokenHooks,
+      mediaTypes = parserConfig.mediaTypes || {},
+      mediaFeatures = parserConfig.mediaFeatures || {},
+      propertyKeywords = parserConfig.propertyKeywords || {},
+      nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},
+      colorKeywords = parserConfig.colorKeywords || {},
+      valueKeywords = parserConfig.valueKeywords || {},
+      fontProperties = parserConfig.fontProperties || {},
+      allowNested = parserConfig.allowNested;
+
+  var type, override;
+  function ret(style, tp) { type = tp; return style; }
+
+  // Tokenizers
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (tokenHooks[ch]) {
+      var result = tokenHooks[ch](stream, state);
+      if (result !== false) return result;
+    }
+    if (ch == "@") {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("def", stream.current());
+    } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) {
+      return ret(null, "compare");
+    } else if (ch == "\"" || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    } else if (ch == "#") {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("atom", "hash");
+    } else if (ch == "!") {
+      stream.match(/^\s*\w*/);
+      return ret("keyword", "important");
+    } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) {
+      stream.eatWhile(/[\w.%]/);
+      return ret("number", "unit");
+    } else if (ch === "-") {
+      if (/[\d.]/.test(stream.peek())) {
+        stream.eatWhile(/[\w.%]/);
+        return ret("number", "unit");
+      } else if (stream.match(/^\w+-/)) {
+        return ret("meta", "meta");
+      }
+    } else if (/[,+>*\/]/.test(ch)) {
+      return ret(null, "select-op");
+    } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
+      return ret("qualifier", "qualifier");
+    } else if (/[:;{}\[\]\(\)]/.test(ch)) {
+      return ret(null, ch);
+    } else if (ch == "u" && stream.match("rl(")) {
+      stream.backUp(1);
+      state.tokenize = tokenParenthesized;
+      return ret("property", "word");
+    } else if (/[\w\\\-]/.test(ch)) {
+      stream.eatWhile(/[\w\\\-]/);
+      return ret("property", "word");
+    } else {
+      return ret(null, null);
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, ch;
+      while ((ch = stream.next()) != null) {
+        if (ch == quote && !escaped) {
+          if (quote == ")") stream.backUp(1);
+          break;
+        }
+        escaped = !escaped && ch == "\\";
+      }
+      if (ch == quote || !escaped && quote != ")") state.tokenize = null;
+      return ret("string", "string");
+    };
+  }
+
+  function tokenParenthesized(stream, state) {
+    stream.next(); // Must be '('
+    if (!stream.match(/\s*[\"\')]/, false))
+      state.tokenize = tokenString(")");
+    else
+      state.tokenize = null;
+    return ret(null, "(");
+  }
+
+  // Context management
+
+  function Context(type, indent, prev) {
+    this.type = type;
+    this.indent = indent;
+    this.prev = prev;
+  }
+
+  function pushContext(state, stream, type) {
+    state.context = new Context(type, stream.indentation() + indentUnit, state.context);
+    return type;
+  }
+
+  function popContext(state) {
+    state.context = state.context.prev;
+    return state.context.type;
+  }
+
+  function pass(type, stream, state) {
+    return states[state.context.type](type, stream, state);
+  }
+  function popAndPass(type, stream, state, n) {
+    for (var i = n || 1; i > 0; i--)
+      state.context = state.context.prev;
+    return pass(type, stream, state);
+  }
+
+  // Parser
+
+  function wordAsValue(stream) {
+    var word = stream.current().toLowerCase();
+    if (valueKeywords.hasOwnProperty(word))
+      override = "atom";
+    else if (colorKeywords.hasOwnProperty(word))
+      override = "keyword";
+    else
+      override = "variable";
+  }
+
+  var states = {};
+
+  states.top = function(type, stream, state) {
+    if (type == "{") {
+      return pushContext(state, stream, "block");
+    } else if (type == "}" && state.context.prev) {
+      return popContext(state);
+    } else if (type == "@media") {
+      return pushContext(state, stream, "media");
+    } else if (type == "@font-face") {
+      return "font_face_before";
+    } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {
+      return "keyframes";
+    } else if (type && type.charAt(0) == "@") {
+      return pushContext(state, stream, "at");
+    } else if (type == "hash") {
+      override = "builtin";
+    } else if (type == "word") {
+      override = "tag";
+    } else if (type == "variable-definition") {
+      return "maybeprop";
+    } else if (type == "interpolation") {
+      return pushContext(state, stream, "interpolation");
+    } else if (type == ":") {
+      return "pseudo";
+    } else if (allowNested && type == "(") {
+      return pushContext(state, stream, "parens");
+    }
+    return state.context.type;
+  };
+
+  states.block = function(type, stream, state) {
+    if (type == "word") {
+      var word = stream.current().toLowerCase();
+      if (propertyKeywords.hasOwnProperty(word)) {
+        override = "property";
+        return "maybeprop";
+      } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {
+        override = "string-2";
+        return "maybeprop";
+      } else if (allowNested) {
+        override = stream.match(/^\s*:/, false) ? "property" : "tag";
+        return "block";
+      } else {
+        override += " error";
+        return "maybeprop";
+      }
+    } else if (type == "meta") {
+      return "block";
+    } else if (!allowNested && (type == "hash" || type == "qualifier")) {
+      override = "error";
+      return "block";
+    } else {
+      return states.top(type, stream, state);
+    }
+  };
+
+  states.maybeprop = function(type, stream, state) {
+    if (type == ":") return pushContext(state, stream, "prop");
+    return pass(type, stream, state);
+  };
+
+  states.prop = function(type, stream, state) {
+    if (type == ";") return popContext(state);
+    if (type == "{" && allowNested) return pushContext(state, stream, "propBlock");
+    if (type == "}" || type == "{") return popAndPass(type, stream, state);
+    if (type == "(") return pushContext(state, stream, "parens");
+
+    if (type == "hash" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {
+      override += " error";
+    } else if (type == "word") {
+      wordAsValue(stream);
+    } else if (type == "interpolation") {
+      return pushContext(state, stream, "interpolation");
+    }
+    return "prop";
+  };
+
+  states.propBlock = function(type, _stream, state) {
+    if (type == "}") return popContext(state);
+    if (type == "word") { override = "property"; return "maybeprop"; }
+    return state.context.type;
+  };
+
+  states.parens = function(type, stream, state) {
+    if (type == "{" || type == "}") return popAndPass(type, stream, state);
+    if (type == ")") return popContext(state);
+    if (type == "(") return pushContext(state, stream, "parens");
+    if (type == "word") wordAsValue(stream);
+    return "parens";
+  };
+
+  states.pseudo = function(type, stream, state) {
+    if (type == "word") {
+      override = "variable-3";
+      return state.context.type;
+    }
+    return pass(type, stream, state);
+  };
+
+  states.media = function(type, stream, state) {
+    if (type == "(") return pushContext(state, stream, "media_parens");
+    if (type == "}") return popAndPass(type, stream, state);
+    if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top");
+
+    if (type == "word") {
+      var word = stream.current().toLowerCase();
+      if (word == "only" || word == "not" || word == "and")
+        override = "keyword";
+      else if (mediaTypes.hasOwnProperty(word))
+        override = "attribute";
+      else if (mediaFeatures.hasOwnProperty(word))
+        override = "property";
+      else
+        override = "error";
+    }
+    return state.context.type;
+  };
+
+  states.media_parens = function(type, stream, state) {
+    if (type == ")") return popContext(state);
+    if (type == "{" || type == "}") return popAndPass(type, stream, state, 2);
+    return states.media(type, stream, state);
+  };
+
+  states.font_face_before = function(type, stream, state) {
+    if (type == "{")
+      return pushContext(state, stream, "font_face");
+    return pass(type, stream, state);
+  };
+
+  states.font_face = function(type, stream, state) {
+    if (type == "}") return popContext(state);
+    if (type == "word") {
+      if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))
+        override = "error";
+      else
+        override = "property";
+      return "maybeprop";
+    }
+    return "font_face";
+  };
+
+  states.keyframes = function(type, stream, state) {
+    if (type == "word") { override = "variable"; return "keyframes"; }
+    if (type == "{") return pushContext(state, stream, "top");
+    return pass(type, stream, state);
+  };
+
+  states.at = function(type, stream, state) {
+    if (type == ";") return popContext(state);
+    if (type == "{" || type == "}") return popAndPass(type, stream, state);
+    if (type == "word") override = "tag";
+    else if (type == "hash") override = "builtin";
+    return "at";
+  };
+
+  states.interpolation = function(type, stream, state) {
+    if (type == "}") return popContext(state);
+    if (type == "{" || type == ";") return popAndPass(type, stream, state);
+    if (type != "variable") override = "error";
+    return "interpolation";
+  };
+
+  return {
+    startState: function(base) {
+      return {tokenize: null,
+              state: "top",
+              context: new Context("top", base || 0, null)};
+    },
+
+    token: function(stream, state) {
+      if (!state.tokenize && stream.eatSpace()) return null;
+      var style = (state.tokenize || tokenBase)(stream, state);
+      if (style && typeof style == "object") {
+        type = style[1];
+        style = style[0];
+      }
+      override = style;
+      state.state = states[state.state](type, stream, state);
+      return override;
+    },
+
+    indent: function(state, textAfter) {
+      var cx = state.context, ch = textAfter && textAfter.charAt(0);
+      var indent = cx.indent;
+      if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev;
+      if (cx.prev &&
+          (ch == "}" && (cx.type == "block" || cx.type == "top" || cx.type == "interpolation" || cx.type == "font_face") ||
+           ch == ")" && (cx.type == "parens" || cx.type == "media_parens") ||
+           ch == "{" && (cx.type == "at" || cx.type == "media"))) {
+        indent = cx.indent - indentUnit;
+        cx = cx.prev;
+      }
+      return indent;
+    },
+
+    electricChars: "}",
+    blockCommentStart: "/*",
+    blockCommentEnd: "*/",
+    fold: "brace"
+  };
+});
+
+  function keySet(array) {
+    var keys = {};
+    for (var i = 0; i < array.length; ++i) {
+      keys[array[i]] = true;
+    }
+    return keys;
+  }
+
+  var mediaTypes_ = [
+    "all", "aural", "braille", "handheld", "print", "projection", "screen",
+    "tty", "tv", "embossed"
+  ], mediaTypes = keySet(mediaTypes_);
+
+  var mediaFeatures_ = [
+    "width", "min-width", "max-width", "height", "min-height", "max-height",
+    "device-width", "min-device-width", "max-device-width", "device-height",
+    "min-device-height", "max-device-height", "aspect-ratio",
+    "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio",
+    "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color",
+    "max-color", "color-index", "min-color-index", "max-color-index",
+    "monochrome", "min-monochrome", "max-monochrome", "resolution",
+    "min-resolution", "max-resolution", "scan", "grid"
+  ], mediaFeatures = keySet(mediaFeatures_);
+
+  var propertyKeywords_ = [
+    "align-content", "align-items", "align-self", "alignment-adjust",
+    "alignment-baseline", "anchor-point", "animation", "animation-delay",
+    "animation-direction", "animation-duration", "animation-fill-mode",
+    "animation-iteration-count", "animation-name", "animation-play-state",
+    "animation-timing-function", "appearance", "azimuth", "backface-visibility",
+    "background", "background-attachment", "background-clip", "background-color",
+    "background-image", "background-origin", "background-position",
+    "background-repeat", "background-size", "baseline-shift", "binding",
+    "bleed", "bookmark-label", "bookmark-level", "bookmark-state",
+    "bookmark-target", "border", "border-bottom", "border-bottom-color",
+    "border-bottom-left-radius", "border-bottom-right-radius",
+    "border-bottom-style", "border-bottom-width", "border-collapse",
+    "border-color", "border-image", "border-image-outset",
+    "border-image-repeat", "border-image-slice", "border-image-source",
+    "border-image-width", "border-left", "border-left-color",
+    "border-left-style", "border-left-width", "border-radius", "border-right",
+    "border-right-color", "border-right-style", "border-right-width",
+    "border-spacing", "border-style", "border-top", "border-top-color",
+    "border-top-left-radius", "border-top-right-radius", "border-top-style",
+    "border-top-width", "border-width", "bottom", "box-decoration-break",
+    "box-shadow", "box-sizing", "break-after", "break-before", "break-inside",
+    "caption-side", "clear", "clip", "color", "color-profile", "column-count",
+    "column-fill", "column-gap", "column-rule", "column-rule-color",
+    "column-rule-style", "column-rule-width", "column-span", "column-width",
+    "columns", "content", "counter-increment", "counter-reset", "crop", "cue",
+    "cue-after", "cue-before", "cursor", "direction", "display",
+    "dominant-baseline", "drop-initial-after-adjust",
+    "drop-initial-after-align", "drop-initial-before-adjust",
+    "drop-initial-before-align", "drop-initial-size", "drop-initial-value",
+    "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis",
+    "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap",
+    "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings",
+    "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust",
+    "font-stretch", "font-style", "font-synthesis", "font-variant",
+    "font-variant-alternates", "font-variant-caps", "font-variant-east-asian",
+    "font-variant-ligatures", "font-variant-numeric", "font-variant-position",
+    "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow",
+    "grid-auto-position", "grid-auto-rows", "grid-column", "grid-column-end",
+    "grid-column-start", "grid-row", "grid-row-end", "grid-row-start",
+    "grid-template", "grid-template-areas", "grid-template-columns",
+    "grid-template-rows", "hanging-punctuation", "height", "hyphens",
+    "icon", "image-orientation", "image-rendering", "image-resolution",
+    "inline-box-align", "justify-content", "left", "letter-spacing",
+    "line-break", "line-height", "line-stacking", "line-stacking-ruby",
+    "line-stacking-shift", "line-stacking-strategy", "list-style",
+    "list-style-image", "list-style-position", "list-style-type", "margin",
+    "margin-bottom", "margin-left", "margin-right", "margin-top",
+    "marker-offset", "marks", "marquee-direction", "marquee-loop",
+    "marquee-play-count", "marquee-speed", "marquee-style", "max-height",
+    "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index",
+    "nav-left", "nav-right", "nav-up", "object-fit", "object-position",
+    "opacity", "order", "orphans", "outline",
+    "outline-color", "outline-offset", "outline-style", "outline-width",
+    "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y",
+    "padding", "padding-bottom", "padding-left", "padding-right", "padding-top",
+    "page", "page-break-after", "page-break-before", "page-break-inside",
+    "page-policy", "pause", "pause-after", "pause-before", "perspective",
+    "perspective-origin", "pitch", "pitch-range", "play-during", "position",
+    "presentation-level", "punctuation-trim", "quotes", "region-break-after",
+    "region-break-before", "region-break-inside", "region-fragment",
+    "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness",
+    "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang",
+    "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin",
+    "shape-outside", "size", "speak", "speak-as", "speak-header",
+    "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set",
+    "tab-size", "table-layout", "target", "target-name", "target-new",
+    "target-position", "text-align", "text-align-last", "text-decoration",
+    "text-decoration-color", "text-decoration-line", "text-decoration-skip",
+    "text-decoration-style", "text-emphasis", "text-emphasis-color",
+    "text-emphasis-position", "text-emphasis-style", "text-height",
+    "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow",
+    "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position",
+    "text-wrap", "top", "transform", "transform-origin", "transform-style",
+    "transition", "transition-delay", "transition-duration",
+    "transition-property", "transition-timing-function", "unicode-bidi",
+    "vertical-align", "visibility", "voice-balance", "voice-duration",
+    "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress",
+    "voice-volume", "volume", "white-space", "widows", "width", "word-break",
+    "word-spacing", "word-wrap", "z-index",
+    // SVG-specific
+    "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color",
+    "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events",
+    "color-interpolation", "color-interpolation-filters",
+    "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering",
+    "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke",
+    "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin",
+    "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering",
+    "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal",
+    "glyph-orientation-vertical", "text-anchor", "writing-mode"
+  ], propertyKeywords = keySet(propertyKeywords_);
+
+  var nonStandardPropertyKeywords_ = [
+    "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color",
+    "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color",
+    "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside",
+    "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button",
+    "searchfield-results-decoration", "zoom"
+  ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);
+
+  var colorKeywords_ = [
+    "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige",
+    "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown",
+    "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue",
+    "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod",
+    "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen",
+    "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
+    "darkslateblue", "darkslategray", "darkturquoise", "darkviolet",
+    "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick",
+    "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
+    "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew",
+    "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender",
+    "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral",
+    "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink",
+    "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray",
+    "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta",
+    "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple",
+    "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise",
+    "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin",
+    "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered",
+    "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred",
+    "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue",
+    "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown",
+    "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue",
+    "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan",
+    "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white",
+    "whitesmoke", "yellow", "yellowgreen"
+  ], colorKeywords = keySet(colorKeywords_);
+
+  var valueKeywords_ = [
+    "above", "absolute", "activeborder", "activecaption", "afar",
+    "after-white-space", "ahead", "alias", "all", "all-scroll", "alternate",
+    "always", "amharic", "amharic-abegede", "antialiased", "appworkspace",
+    "arabic-indic", "armenian", "asterisks", "auto", "avoid", "avoid-column", "avoid-page",
+    "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary",
+    "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box",
+    "both", "bottom", "break", "break-all", "break-word", "button", "button-bevel",
+    "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "cambodian",
+    "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret",
+    "cell", "center", "checkbox", "circle", "cjk-earthly-branch",
+    "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote",
+    "col-resize", "collapse", "column", "compact", "condensed", "contain", "content",
+    "content-box", "context-menu", "continuous", "copy", "cover", "crop",
+    "cross", "crosshair", "currentcolor", "cursive", "dashed", "decimal",
+    "decimal-leading-zero", "default", "default-button", "destination-atop",
+    "destination-in", "destination-out", "destination-over", "devanagari",
+    "disc", "discard", "document", "dot-dash", "dot-dot-dash", "dotted",
+    "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out",
+    "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede",
+    "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er",
+    "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er",
+    "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et",
+    "ethiopic-halehame-gez", "ethiopic-halehame-om-et",
+    "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et",
+    "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et",
+    "ethiopic-halehame-tig", "ew-resize", "expanded", "extra-condensed",
+    "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "footnotes",
+    "forwards", "from", "geometricPrecision", "georgian", "graytext", "groove",
+    "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hebrew",
+    "help", "hidden", "hide", "higher", "highlight", "highlighttext",
+    "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "icon", "ignore",
+    "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite",
+    "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis",
+    "inline-block", "inline-table", "inset", "inside", "intrinsic", "invert",
+    "italic", "justify", "kannada", "katakana", "katakana-iroha", "keep-all", "khmer",
+    "landscape", "lao", "large", "larger", "left", "level", "lighter",
+    "line-through", "linear", "lines", "list-item", "listbox", "listitem",
+    "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian",
+    "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian",
+    "lower-roman", "lowercase", "ltr", "malayalam", "match",
+    "media-controls-background", "media-current-time-display",
+    "media-fullscreen-button", "media-mute-button", "media-play-button",
+    "media-return-to-realtime-button", "media-rewind-button",
+    "media-seek-back-button", "media-seek-forward-button", "media-slider",
+    "media-sliderthumb", "media-time-remaining-display", "media-volume-slider",
+    "media-volume-slider-container", "media-volume-sliderthumb", "medium",
+    "menu", "menulist", "menulist-button", "menulist-text",
+    "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic",
+    "mix", "mongolian", "monospace", "move", "multiple", "myanmar", "n-resize",
+    "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop",
+    "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap",
+    "ns-resize", "nw-resize", "nwse-resize", "oblique", "octal", "open-quote",
+    "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset",
+    "outside", "outside-shape", "overlay", "overline", "padding", "padding-box",
+    "painted", "page", "paused", "persian", "plus-darker", "plus-lighter", "pointer",
+    "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", "progress", "push-button",
+    "radio", "read-only", "read-write", "read-write-plaintext-only", "rectangle", "region",
+    "relative", "repeat", "repeat-x", "repeat-y", "reset", "reverse", "rgb", "rgba",
+    "ridge", "right", "round", "row-resize", "rtl", "run-in", "running",
+    "s-resize", "sans-serif", "scroll", "scrollbar", "se-resize", "searchfield",
+    "searchfield-cancel-button", "searchfield-decoration",
+    "searchfield-results-button", "searchfield-results-decoration",
+    "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama",
+    "single", "skip-white-space", "slide", "slider-horizontal",
+    "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow",
+    "small", "small-caps", "small-caption", "smaller", "solid", "somali",
+    "source-atop", "source-in", "source-out", "source-over", "space", "square",
+    "square-button", "start", "static", "status-bar", "stretch", "stroke",
+    "sub", "subpixel-antialiased", "super", "sw-resize", "table",
+    "table-caption", "table-cell", "table-column", "table-column-group",
+    "table-footer-group", "table-header-group", "table-row", "table-row-group",
+    "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai",
+    "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight",
+    "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er",
+    "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top",
+    "transparent", "ultra-condensed", "ultra-expanded", "underline", "up",
+    "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal",
+    "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url",
+    "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted",
+    "visibleStroke", "visual", "w-resize", "wait", "wave", "wider",
+    "window", "windowframe", "windowtext", "x-large", "x-small", "xor",
+    "xx-large", "xx-small"
+  ], valueKeywords = keySet(valueKeywords_);
+
+  var fontProperties_ = [
+    "font-family", "src", "unicode-range", "font-variant", "font-feature-settings",
+    "font-stretch", "font-weight", "font-style"
+  ], fontProperties = keySet(fontProperties_);
+
+  var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)
+    .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);
+  CodeMirror.registerHelper("hintWords", "css", allWords);
+
+  function tokenCComment(stream, state) {
+    var maybeEnd = false, ch;
+    while ((ch = stream.next()) != null) {
+      if (maybeEnd && ch == "/") {
+        state.tokenize = null;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ["comment", "comment"];
+  }
+
+  function tokenSGMLComment(stream, state) {
+    if (stream.skipTo("-->")) {
+      stream.match("-->");
+      state.tokenize = null;
+    } else {
+      stream.skipToEnd();
+    }
+    return ["comment", "comment"];
+  }
+
+  CodeMirror.defineMIME("text/css", {
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    fontProperties: fontProperties,
+    tokenHooks: {
+      "<": function(stream, state) {
+        if (!stream.match("!--")) return false;
+        state.tokenize = tokenSGMLComment;
+        return tokenSGMLComment(stream, state);
+      },
+      "/": function(stream, state) {
+        if (!stream.eat("*")) return false;
+        state.tokenize = tokenCComment;
+        return tokenCComment(stream, state);
+      }
+    },
+    name: "css"
+  });
+
+  CodeMirror.defineMIME("text/x-scss", {
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    fontProperties: fontProperties,
+    allowNested: true,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (stream.eat("/")) {
+          stream.skipToEnd();
+          return ["comment", "comment"];
+        } else if (stream.eat("*")) {
+          state.tokenize = tokenCComment;
+          return tokenCComment(stream, state);
+        } else {
+          return ["operator", "operator"];
+        }
+      },
+      ":": function(stream) {
+        if (stream.match(/\s*\{/))
+          return [null, "{"];
+        return false;
+      },
+      "$": function(stream) {
+        stream.match(/^[\w-]+/);
+        if (stream.match(/^\s*:/, false))
+          return ["variable-2", "variable-definition"];
+        return ["variable-2", "variable"];
+      },
+      "#": function(stream) {
+        if (!stream.eat("{")) return false;
+        return [null, "interpolation"];
+      }
+    },
+    name: "css",
+    helperType: "scss"
+  });
+
+  CodeMirror.defineMIME("text/x-less", {
+    mediaTypes: mediaTypes,
+    mediaFeatures: mediaFeatures,
+    propertyKeywords: propertyKeywords,
+    nonStandardPropertyKeywords: nonStandardPropertyKeywords,
+    colorKeywords: colorKeywords,
+    valueKeywords: valueKeywords,
+    fontProperties: fontProperties,
+    allowNested: true,
+    tokenHooks: {
+      "/": function(stream, state) {
+        if (stream.eat("/")) {
+          stream.skipToEnd();
+          return ["comment", "comment"];
+        } else if (stream.eat("*")) {
+          state.tokenize = tokenCComment;
+          return tokenCComment(stream, state);
+        } else {
+          return ["operator", "operator"];
+        }
+      },
+      "@": function(stream) {
+        if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/, false)) return false;
+        stream.eatWhile(/[\w\\\-]/);
+        if (stream.match(/^\s*:/, false))
+          return ["variable-2", "variable-definition"];
+        return ["variable-2", "variable"];
+      },
+      "&": function() {
+        return ["atom", "atom"];
+      }
+    },
+    name: "css",
+    helperType: "less"
+  });
+
+});
diff --git a/application/modules/admin/controllers/AccueilController.php b/application/modules/admin/controllers/AccueilController.php
index c1732eff2365aa382f35a789dcd37ebc00bd91cf..821536818e7dd41273e8ca99d171676d841817ff 100644
--- a/application/modules/admin/controllers/AccueilController.php
+++ b/application/modules/admin/controllers/AccueilController.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class Admin_AccueilController extends Zend_Controller_Action {
 	private $id_profil;										// Profil a modifier
@@ -46,10 +46,10 @@ class Admin_AccueilController extends Zend_Controller_Action {
 			$this->id_profil = $this->profil->getId();
 		}
 
-		$this->type_module = $this->_getParam('type_module');			
+		$this->type_module = $this->_getParam('type_module');
 
 		$user = Class_Users::getIdentity();
- 
+
 		if ((!$user->isAdminBib() && !$user->hasRightConfigFront())
 				|| ($user->isAdminBib() && ($user->getIdSite() !== $this->profil->getIdSite()))) {
 			 $this->_redirect('admin/index');
@@ -57,13 +57,13 @@ class Admin_AccueilController extends Zend_Controller_Action {
 		}
 
 		$this->preferences = ($this->config == 'admin') ?
-			$this->_extractProperties() : 
+			$this->_extractProperties() :
 			$this->profil->getOrCreateConfigAccueil($this->id_module, $this->type_module);
 
 		$boite = isset($this->preferences["boite"]) ? $this->preferences["boite"] : '';
 		$this->view->preferences = $this->preferences;
 		$this->view->url = $this->_request->getRequestUri();
-		
+
 		$this->view->combo_templates = ZendAfi_View_Helper_Accueil_Base::getComboTemplates($boite, $this->profil);
 		$this->view->id_profil = $this->profil->getId();
 		$this->view->id_bib = $this->profil->getIdSite();
@@ -175,7 +175,7 @@ class Admin_AccueilController extends Zend_Controller_Action {
 	public function panierAction() {
 		$this->_simpleAction('PANIER');
 	}
-	
+
 
 	public function bibliothequeNumeriqueAction() {
 		if (1 == $this->_getParam('styles_reload')) {
@@ -280,15 +280,15 @@ class Admin_AccueilController extends Zend_Controller_Action {
 		}
 	}
 
-	
+
 	protected function _setTypeDAnalyse(&$enreg) {
-		$enreg = isset($enreg['nb_notices']) ? $enreg : array_merge($enreg,['nb_notices' => 1]) ; 
+		$enreg = isset($enreg['nb_notices']) ? $enreg : array_merge($enreg,['nb_notices' => 1]) ;
 
 		$enreg['nb_notices'] = (1 < (int)$enreg['nb_notices']) ?
 			(int)$enreg["nb_notices"]
 			: 1;
-		
-		$enreg = isset($enreg['nb_analyse']) ? $enreg : array_merge($enreg,['nb_analyse' => 10]) ; 
+
+		$enreg = isset($enreg['nb_analyse']) ? $enreg : array_merge($enreg,['nb_analyse' => 10]) ;
 
 		$enreg['nb_analyse'] = (int)$enreg['nb_analyse'];
 		if ($enreg['nb_analyse'] < $enreg['nb_notices'])
@@ -319,7 +319,7 @@ class Admin_AccueilController extends Zend_Controller_Action {
 		$module_config = $this->profil
 			->getModuleAccueilConfig($this->id_module, 'KIOSQUE');
 		$selected_elementId = explode('-', $this->_request->getPost('domaine_panier'));
-		
+
 		if($selected_elementId[0] == 'p') {
 			$module_config['preferences']['id_catalogue'] = 0;
 			$module_config['preferences']['id_panier'] = $selected_elementId[1];
@@ -330,7 +330,7 @@ class Admin_AccueilController extends Zend_Controller_Action {
 			$module_config['preferences']['id_catalogue'] = 0;
 			$module_config['preferences']['id_panier'] = 0;
 		}
-		
+
 		$this->profil
 			->updateModuleConfigAccueil($this->id_module, $module_config)
 			->save();
@@ -363,7 +363,7 @@ class Admin_AccueilController extends Zend_Controller_Action {
 	private function _simpleAction($type) {
 		// pour combo des annexes
 		$this->view->ya_annexes = fetchAll("select count(*) from codif_annexe where invisible=0 order by libelle");
-		if ($this->_request->isPost()) 
+		if ($this->_request->isPost())
 			$this->_updateEtRetour($this->_request->getPost(), $type);
 	}
 
@@ -406,7 +406,6 @@ class Admin_AccueilController extends Zend_Controller_Action {
 	 */
 	protected function _updateEtRetour($data, $type) {
 		$enreg = [];
-
 		foreach ($data as $clef => $valeur)
 			$enreg[$clef] = addslashes($valeur);
 
@@ -415,7 +414,7 @@ class Admin_AccueilController extends Zend_Controller_Action {
 			$this->view->properties = $this->_compactProperties($enreg);
 		} else {
 			$module_config = $this->profil->getModuleAccueilConfig($this->id_module, $type);
-			$module_config['preferences'] = $enreg;
+			$module_config['preferences'] = array_merge($module_config['preferences'], $enreg);
 
 			$this->profil
 				->updateModuleConfigAccueil($this->id_module, $module_config)
diff --git a/application/modules/admin/controllers/CmsController.php b/application/modules/admin/controllers/CmsController.php
index 8f7a8669895b5fca2f8f84ea5046652476b090f2..87b479729933db8ad19dbb0e61b7eb6d24bda081 100644
--- a/application/modules/admin/controllers/CmsController.php
+++ b/application/modules/admin/controllers/CmsController.php
@@ -160,6 +160,12 @@ class Admin_CmsController extends ZendAfi_Controller_Action {
 
 
 	protected function _updateNewModel($article) {
+		if ('newsduplicate' == $this->_request->getActionName()
+				&& $original = Class_Article::find($this->_getParam('id', 0))) {
+			$article->updateAttributes($original->copy()->toArray());
+			return $this;
+		}
+
 		$article->setAuteur(Class_Users::getIdentity());
 
 		if (!$category = $this->getCategoryAndSetComboCat())
@@ -193,31 +199,33 @@ class Admin_CmsController extends ZendAfi_Controller_Action {
 
 
 	public function newsduplicateAction() {
-		$new_article = Class_Article::find($this->_getParam('id'))->copy();
+		if (!$model = Class_Article::find($this->_getParam('id'))) {
+			$this->_redirect('admin/cms');
+			return;
+		}
 
-		$this->view->article		=  $new_article;
-		$this->view->titre			= $this->_('Dupliquer l\'article: ').$new_article->getTitre();
-		$this->view->combo_lieu_options = $this->comboLieuOptions();
-		$this->view->combo_cat = $this->view->comboCategories($new_article->getCategorie());
-		$this->view->form_action = $this->view->url(['module' => 'admin',
-																								 'controller' => 'cms',
-																								 'action' => 'add',
-																								 'id_cat' => $new_article->getIdCat()],
-																								null,
-																								true);
+		$this->_setParam('id_cat', $model->getCategorie()->getId());
+		parent::addAction();
+		$this->view->titre = $this->_('Dupliquer l\'article: %s', $model->getTitre());
+		$this->view->form
+			->setAction($this->view->url(['module' => 'admin',
+																		'controller' => 'cms',
+																		'action' => 'add',
+																		'id_cat' => $model->getCategorie()->getId()],
+																	 null, true));
+		$this->render('add');
 	}
 
 
 	public function getCategoryAndSetComboCat() {
-		$category = Class_ArticleCategorie::getLoader()->find($this->_getParam('id_cat'));
-		if (null === $category) {
+		if (!$category = Class_ArticleCategorie::find($this->_getParam('id_cat'))) {
 			$this->_redirect('admin/cms');
 			return;
 		}
 
-		if (null === ($category->getBib())) {
+		if (null === ($category->getBib()))
 			$category->setBib($this->_bib);
-		}
+
 		$this->view->combo_cat = $this->view->comboCategories($category);
 		return $category;
 	}
@@ -531,7 +539,6 @@ class Admin_CmsController extends ZendAfi_Controller_Action {
 
 		return $this->_($template, $model->getLibelle());
 	}
-
 }
 
 ?>
\ No newline at end of file
diff --git a/application/modules/admin/controllers/IndexController.php b/application/modules/admin/controllers/IndexController.php
index d17e278df153263e24b47b829cf222b6da5ca51f..6d9e61c80b3eac3e04f5804cdb8f7334b55c6a6d 100644
--- a/application/modules/admin/controllers/IndexController.php
+++ b/application/modules/admin/controllers/IndexController.php
@@ -16,9 +16,9 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
-class Admin_IndexController extends Zend_Controller_Action {
+class Admin_IndexController extends ZendAfi_Controller_Action {
 	public function indexAction()	{
 		$this->view->titre = 'Accueil';
 
@@ -67,7 +67,7 @@ class Admin_IndexController extends Zend_Controller_Action {
 
 
 	public function shouldEncodeVar($cle) {
-		return in_array($cle->getId(), 
+		return in_array($cle->getId(),
 										['REGISTER_OK', 'RESA_CONDITION', 'TEXTE_MAIL_RESA',
 										 'USER_VALIDATED', 'USER_NON_VALIDATED']);
 	}
@@ -92,10 +92,12 @@ class Admin_IndexController extends Zend_Controller_Action {
 			}
 
 			$cle->save();
-			$this->_redirect('admin/index/adminvar');
+			$this->_helper->notify('Variable '.$id.' sauvegardée');
+			$this->_redirect('admin/index/adminvaredit/cle/'.$id);
+			return;
 		}
 
-		$this->view->var_valeur	= $this->shouldEncodeVar($cle) 
+		$this->view->var_valeur	= $this->shouldEncodeVar($cle)
 			? urldecode($cle->getValeur())
 			: $cle->getValeur();
 
diff --git a/application/modules/admin/controllers/ProfilController.php b/application/modules/admin/controllers/ProfilController.php
index 3a58354b80eef28730b7c6aecfdfa7a283033107..144534ff45fa463cc3e9cef7eeb315daab556ee6 100644
--- a/application/modules/admin/controllers/ProfilController.php
+++ b/application/modules/admin/controllers/ProfilController.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class Admin_ProfilController extends ZendAfi_Controller_Action {
 	use Trait_Translator;
@@ -128,7 +128,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		$this->getHelper('ViewRenderer')->setNoRender();
 	}
 
-	
+
 	public function menusmajAction() {
 		$id_menu=$this->_getParam('id_menu');
 		$profil = Class_Profil::getLoader()->find($this->id_profil);
@@ -236,7 +236,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		$profil = Class_Profil::getLoader()->find($this->id_profil);
 
 		// Decoupage des modules
-		$modules = explode(';',$cfg_module);
+		$modules = explode(';box',$cfg_module);
 		foreach ($modules as $module) {
 			$elem=explode('|',$module);
 			$division=substr($elem[0],-1);
@@ -322,11 +322,10 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 
 			$cfg_module = $this->_getParam('saveContent');
 			$enreg = $this->_parseSaveContentString($cfg_module);
-			
+
 			$enreg["use_parent_css"] = $this->_getParam('use_parent_css', $profil->getUseParentCss());
-			
-			$enreg["page_css"]=$this->_getParam('page_css');
 
+			$enreg["page_css"]=$this->_getParam('page_css');
 
 			foreach($enreg["modules"] as $id_module => $module_config) {
 				if ($id_module == 0) {
@@ -341,9 +340,9 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 					$enreg["modules"][$id_module]['preferences'] = $class_module->getValeursParDefaut($type_module);
 				}
 
-				/* 
+				/*
 					 Permet de ne pas perdre la configuration des modules contenus
-					 dans une boîte 2 colonnes 
+					 dans une boîte 2 colonnes
 				*/
 				if ($module_config['type_module'] == "CONTENEUR_DEUX_COLONNES") {
 					if (array_key_exists('col_gauche_module_id', $module_config['preferences']) and
@@ -364,7 +363,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 			}
 
 			$profil->setCfgAccueil($enreg)->save();
-			
+
 			$this->_redirect('admin/profil/accueil/id_profil/'.$profil->getId());
 		}
 
@@ -372,7 +371,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		else {
 			// Html des modules sélectionnés triés par divisions
 			$box = array(1 => '', 2 => '', 3 => '', 4 => '', 5 => '');
-			foreach($box as $division => $content) 
+			foreach($box as $division => $content)
 				$box[$division] = $this->_getHTMLForProfilModulesDivision($profil, $division);
 
 			// Html des objets disponibles
@@ -389,7 +388,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 				$box_dispo[$module->getGroup()].=$this->_getItemModule($type_module,$module);
 			}
 
-			foreach($groupes as $groupe => $libelle) 
+			foreach($groupes as $groupe => $libelle)
 				$box_dispo[$groupe].='</ul></div>';
 
 			// Get le nombre de divisions dans le profil
@@ -415,8 +414,8 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		$modules = $profil->getBoitesDivision($division);
 
 		foreach($modules as $id_module => $module)
-			$html .= $this->_getItemModule($module['type_module'], 
-																		 Class_Systeme_ModulesAccueil::moduleByCode($module['type_module']), 
+			$html .= $this->_getItemModule($module['type_module'],
+																		 Class_Systeme_ModulesAccueil::moduleByCode($module['type_module']),
 																		 $module['preferences'],
 																		 $id_module);
 		return $html;
@@ -519,9 +518,9 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		if (!$profil = Class_Profil::getLoader()->find($this->_getParam('profil')))
 			return;
 
-		$profil->moveModuleOldDivPosNewDivPos($this->_getParam('fromDivision'), 
-																					$this->_getParam('fromPosition'), 
-																					$this->_getParam('toDivision'), 
+		$profil->moveModuleOldDivPosNewDivPos($this->_getParam('fromDivision'),
+																					$this->_getParam('fromPosition'),
+																					$this->_getParam('toDivision'),
 																					$this->_getParam('toPosition'));
 		$profil->save();
 	}
@@ -553,7 +552,7 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 		$this->_redirect('admin/profil');
 	}
 
-	
+
 	private function _splitArg($item) {
 		$pos = strpos($item, '=');
 		if ($pos === false)
diff --git a/application/modules/admin/views/scripts/accueil/calendrier.phtml b/application/modules/admin/views/scripts/accueil/calendrier.phtml
index a19d4d0c4c16b4175542e093616dc0aab6798d9c..e3845b0b0d87c00175a82037f3b29358291d15e1 100644
--- a/application/modules/admin/views/scripts/accueil/calendrier.phtml
+++ b/application/modules/admin/views/scripts/accueil/calendrier.phtml
@@ -1,182 +1,205 @@
-<center>
-  <h1>Propriétés du calendrier</h1><br>
-  <div class="formTable">
-    <form method="post" action="<?php echo $this->url ?>">
-      
-      <fieldset>
-	      <legend>Affichage</legend>
-	      <table cellspacing="2">
-	        
-	        <tr>
-	          <td class="droite">Style de boite&nbsp;</td>
-	          <td class="gauche"><?php echo $this->combo_templates ?></td>
-	        </tr>
-
-					
-					<tr>
-	          <td class="droite">Nombre d'évènements à afficher</td>
-	          <td class="gauche">
-	            <?php echo $this->formText('nb_events', 
-	                                       $this->preferences['nb_events'], 
-	                                       array('size' => '2', 
-	                                             'maxlenghth' => '2')) ?>																					 
-	          </td>
-					</tr>
-
-				</table>
-      </fieldset>
-      <br/>
-      
-      <fieldset>
-	      <legend>Généralités</legend>
-	      <table cellspacing="2">
-	        <tr>
-	          <td class="droite">Titre&nbsp;</td>
-	          <td class="gauche"><input type="text" name="titre" size="55" value="<?php print($this->preferences["titre"]); ?>"></td>
-	        </tr>
-	        <tr>
-	          <td class="droite">Proposer un fil Rss&nbsp;</td>
-	          <td class="gauche">
-	            <?php echo $this->formCheckbox('rss_avis', 
-	                                           $this->preferences['rss_avis'], 
-	                                           null, 
-	                                           array('1', '0')) ?>
-	          </td>
-	        </tr>
-	      </table>
-      </fieldset>
-
-      <br/>
-
-      <fieldset>
-	      <legend>Affichage de la boite calendrier</legend>
-	      <table cellspacing="2">
-					
-					<tr>
-	          <td class="droite">Afficher le calendrier</td>
-	          <td class="gauche">
-	            <?php echo $this->formSelect('display_calendar', 
-	                                         $this->preferences['display_calendar'], 
-	                                         '', 
-	                                         ['0' => 'Ne pas afficher',
-																						'1' => 'Calendrier',
-																						'2' => 'Liste des mois']); ?>
-	          </td>
-	        </tr>
-
-					<tr>
-					  <td class="droite">Mode d'affichage des évènements</td>
-					  <td class="gauche">
-						  <?php 
-							echo $this->formSelect('mode-affichage',
-																		 $this->preferences['mode-affichage'],
-																		 '',
-																		 ['simple' => $this->_('mode liste simple'),
-									                    'article' => $this->_('mode résumé d\'article'),
-																			'wall' => $this->_('mode mur'),
-																			'diaporama_navigation' => $this->_('Diaporama avec navigation'),
-									                    'none' => $this->_('Ne pas afficher')]);
-							echo (new ZendAfi_View_Helper_Admin_PropertiesReader())
-												->setView($this)
-												->propertiesReader($this->preferences['mode-affichage'],
-																					 $this->preferences);
-						  ?>
-					  </td>
-					</tr>
-
-					<tr>
-	          <td class="droite"><?php echo $this->_('Filtre sur les évènements'); ?></td>
-	          <td class="gauche">
-	            <?php echo $this->formSelect('event_filter', 
-	                                         $this->preferences['event_filter'], 
-	                                         '', 
-	                                         ['none' => $this->_('aucun'),
-																						'month' => $this->_('par mois')]); ?>
-	          </td>
-	        </tr>
-
-					<tr>
-						<td class="droite">Mode d'affichage des titres</td>
-						<td class="gauche">
-						  <?php 
-							echo $this->formSelect('display_event_info', 
-																		 $this->preferences['display_event_info'],
-																		 '',
-																		 ['bib' => $this->_('Nom de la bibliothèque'),
-									                    'cat' => $this->_('Catégorie de l\'article'),
-									                    'none' => $this->_('Titre seulement')]);
-						  ?>
-					  </td>
-				  </tr>
-        </table>
-      </fieldset>
-
-      <br/>
-
-      <fieldset>
-	      <legend>Affichage en pleine page</legend>
-	      <table cellspacing="2" width="100%">
-	        <tr>
-	          <td class="droite">Afficher&nbsp;</td>
-	          <td class="gauche">
-	            <?php 
-		          echo $this->formRadioButtons("display_mode", 
-	                                         $this->preferences["display_mode"], 
-	                                         ["Title" => "Date et titre seulement",
-	                                          "Summary" =>"Date et résumé de l'article",
-	                                          "FullArticle" =>"Date et article"]);
-	            ?>
-	          </td>
-	        </tr>
-
-	        <tr>
-	          <td class="droite">Ordre&nbsp;</td>
-	          <td class="gauche">
-	            <?php 
-		          echo $this->formRadioButtons("display_order", 
-	                                         $this->preferences["display_order"], 
-	                                         ["EventDebut" => "Par date de début d'événement (plus ancien en premier)",
-	                                          "DebutPublicationDesc" => "Par date de début de publication (plus récent en premier)",
-                                            "DateCreationDesc" => "Par date de création (plus récent en premier)"]);
-	            ?>
-	          </td>
-	        </tr>
-	      </table>
-      </fieldset>
-
-      <br/>
-
-      <fieldset>
-	      <legend>Filtrage des catégories</legend>
-	      <table cellspacing="2">
-	        <tr>
-	          <td class="droite">Afficher sélection</td>
-	          <td class="gauche">
-	            <?php	$checked = $this->preferences["display_cat_select"] ? "checked='checked'" : ""; ?>
-	            <input type="checkbox" name="display_cat_select" <?php echo $checked ?> >
-	          </td>
-	        </tr>
-	      </table>
-
-	      <div id='table_selection'>
-	        <?php	
-							 echo $this->treeSelect(
-								 '',
-								 $this->preferences["id_categorie"],
-								 true,
-								 $this->url(array('module' => 'admin',
-																	'controller' => 'bib',
-																	'action' => 'articles',
-																	'id_bib' => $this->id_bib,
-																	'categories_only' => 1)),
-								 "form");
-	        ?>
-	      </div>
-
-	      </table>
-      </fieldset>
-
-      <?php echo $this->formSubmit("Valider","Valider",array("class" => "bouton")) ?>
-    </form>
-  </div>
-</center>
+<center>
+  <h1>Propriétés du calendrier</h1><br>
+  <div class="formTable">
+    <form method="post" action="<?php echo $this->url ?>">
+
+      <fieldset>
+	      <legend>Affichage</legend>
+	      <table cellspacing="2">
+
+	        <tr>
+	          <td class="droite">Style de boite&nbsp;</td>
+	          <td class="gauche"><?php echo $this->combo_templates ?></td>
+	        </tr>
+
+
+					<tr>
+	          <td class="droite">Nombre d'évènements à afficher</td>
+	          <td class="gauche">
+	            <?php echo $this->formText('nb_events',
+	                                       $this->preferences['nb_events'],
+	                                       array('size' => '2',
+	                                             'maxlenghth' => '2')) ?>
+	          </td>
+					</tr>
+
+				</table>
+      </fieldset>
+      <br/>
+
+      <fieldset>
+	      <legend>Généralités</legend>
+	      <table cellspacing="2">
+	        <tr>
+	          <td class="droite">Titre&nbsp;</td>
+	          <td class="gauche"><input type="text" name="titre" size="55" value="<?php print($this->preferences["titre"]); ?>"></td>
+	        </tr>
+	        <tr>
+	          <td class="droite">Proposer un fil Rss&nbsp;</td>
+	          <td class="gauche">
+	            <?php echo $this->formCheckbox('rss_avis',
+	                                           $this->preferences['rss_avis'],
+	                                           null,
+	                                           array('1', '0')) ?>
+	          </td>
+	        </tr>
+	      </table>
+      </fieldset>
+
+      <br/>
+
+      <fieldset>
+	      <legend>Affichage de la boite calendrier</legend>
+	      <table cellspacing="2">
+
+					<tr>
+	          <td class="droite">Afficher le calendrier</td>
+	          <td class="gauche">
+	            <?php echo $this->formSelect('display_calendar',
+	                                         $this->preferences['display_calendar'],
+	                                         '',
+	                                         ['0' => 'Ne pas afficher',
+																						'1' => 'Calendrier',
+																						'2' => 'Liste des mois']); ?>
+	          </td>
+	        </tr>
+
+					<tr>
+					  <td class="droite">Mode d'affichage des évènements</td>
+					  <td class="gauche">
+						  <?php
+							echo $this->formSelect('mode-affichage',
+																		 $this->preferences['mode-affichage'],
+																		 '',
+																		 ['simple' => $this->_('mode liste simple'),
+									                    'article' => $this->_('mode résumé d\'article'),
+																			'wall' => $this->_('mode mur'),
+																			'diaporama_navigation' => $this->_('Diaporama avec navigation'),
+									                    'none' => $this->_('Ne pas afficher')]);
+							echo (new ZendAfi_View_Helper_Admin_PropertiesReader())
+												->setView($this)
+												->propertiesReader($this->preferences['mode-affichage'],
+																					 $this->preferences);
+						  ?>
+					  </td>
+					</tr>
+
+					<tr>
+	          <td class="droite"><?php echo $this->_('Filtre sur les évènements'); ?></td>
+	          <td class="gauche">
+	            <?php echo $this->formSelect('event_filter',
+	                                         $this->preferences['event_filter'],
+	                                         '',
+	                                         ['none' => $this->_('aucun'),
+																						'month' => $this->_('par mois')]); ?>
+	          </td>
+	        </tr>
+
+					<tr>
+						<td class="droite">Mode d'affichage des titres</td>
+						<td class="gauche">
+						  <?php
+							echo $this->formSelect('display_event_info',
+																		 $this->preferences['display_event_info'],
+																		 '',
+																		 ['bib' => $this->_('Nom de la bibliothèque'),
+									                    'cat' => $this->_('Catégorie de l\'article'),
+									                    'none' => $this->_('Titre seulement')]);
+						  ?>
+					  </td>
+				  </tr>
+
+					<tr>
+						<td class="droite"><?php echo $this->_('Activer la redirection vers la liste d\'articles'); ?></td>
+						<td class="gauche">
+							<?php echo $this->formCheckbox('display_full_page',
+	                                           $this->preferences['display_full_page'],
+	                                           null,
+	                                           ['1', '0']); ?>
+						</td>
+					</tr>
+        </table>
+      </fieldset>
+
+      <br/>
+
+      <fieldset>
+	      <legend>Affichage en pleine page</legend>
+	      <table cellspacing="2" width="100%">
+	        <tr>
+	          <td class="droite">Afficher&nbsp;</td>
+	          <td class="gauche">
+	            <?php
+		          echo $this->formRadioButtons("display_mode",
+	                                         $this->preferences["display_mode"],
+	                                         ["Title" => "Date et titre seulement",
+	                                          "Summary" =>"Date et résumé de l'article",
+	                                          "FullArticle" =>"Date et article"]);
+	            ?>
+	          </td>
+	        </tr>
+
+	        <tr>
+	          <td class="droite">Ordre&nbsp;</td>
+	          <td class="gauche">
+	            <?php
+		          echo $this->formRadioButtons("display_order",
+	                                         $this->preferences["display_order"],
+	                                         ["EventDebut" => "Par date de début d'événement (plus ancien en premier)",
+	                                          "DebutPublicationDesc" => "Par date de début de publication (plus récent en premier)",
+                                            "DateCreationDesc" => "Par date de création (plus récent en premier)"]);
+	            ?>
+	          </td>
+	        </tr>
+	      </table>
+      </fieldset>
+
+      <br/>
+
+      <fieldset>
+        <legend>Affichage des filtres</legend>
+        <?php
+          echo $this->formSortableConnectLists(
+            'enabled_filters',
+            $this->preferences['enabled_filters'],
+            (new Class_Systeme_ModulesAccueil_Calendrier())->getAvailableFilters()
+          );
+        ?>
+      </fieldset>
+
+      <br>
+
+      <fieldset>
+	      <legend>Filtrage des catégories</legend>
+	      <table cellspacing="2">
+	        <tr>
+	          <td class="droite">Afficher sélection</td>
+	          <td class="gauche">
+	            <?php	$checked = $this->preferences["display_cat_select"] ? "checked='checked'" : ""; ?>
+	            <input type="checkbox" name="display_cat_select" <?php echo $checked ?> >
+	          </td>
+	        </tr>
+	      </table>
+
+	      <div id='table_selection'>
+	        <?php
+							 echo $this->treeSelect(
+								 '',
+								 $this->preferences["id_categorie"],
+								 true,
+								 $this->url(array('module' => 'admin',
+																	'controller' => 'bib',
+																	'action' => 'articles',
+																	'id_bib' => $this->id_bib,
+																	'categories_only' => 1)),
+								 "form");
+	        ?>
+	      </div>
+
+	      </table>
+      </fieldset>
+
+      <?php echo $this->formSubmit("Valider","Valider",array("class" => "bouton")) ?>
+    </form>
+  </div>
+</center>
diff --git a/application/modules/admin/views/scripts/index/adminvar.phtml b/application/modules/admin/views/scripts/index/adminvar.phtml
index 7a1721c2355b76289c0acc9af9467c2715f0f35c..e75ab0951411da0e47ecf1c9e4470142dfd1de5b 100644
--- a/application/modules/admin/views/scripts/index/adminvar.phtml
+++ b/application/modules/admin/views/scripts/index/adminvar.phtml
@@ -1,9 +1,9 @@
-<?php 
+<?php
 Class_ScriptLoader::getInstance()
 ->loadDataTables()
 ->addJQueryReady("$('#adminvars').dataTable({
-'iDisplayLength': -1, 
-'bPaginate': false, 
+'iDisplayLength': -1,
+'bPaginate': false,
 'columnDefs' : [
 	{'orderable': false, 'targets': 2}
 ]
@@ -20,6 +20,7 @@ position: { my: "left top+30", at: "left top"},
 hide: {duration: 1000}
 })');
 ?>
+
 <table id="adminvars">
 	<thead>
     <tr class="soustitre">
@@ -29,7 +30,7 @@ hide: {duration: 1000}
     </tr>
 	</thead>
 	<tbody>
-		<?php 
+		<?php
 		$ligne = 0;
 		foreach($this->vars as $var) {
 			if ($var->getId() == 'JS_STAT')
@@ -48,7 +49,7 @@ hide: {duration: 1000}
 				</td>
 				<td><?php echo wordwrap($value, 40, "<br />", 1);?></td>
 				<td style="width:2%;text-align:center">
-					<a href="<?php echo BASE_URL;?>/admin/index/adminvaredit/cle/<?php echo $var->getId();?>"><?php echo $this->boutonIco("type=edit");?></a>
+					<a data-popup="true" href="<?php echo $this->url(['action' => 'adminvaredit', 'cle' => $var->getId()])?>"><?php echo $this->boutonIco("type=edit");?></a>
 				</td>
 			</tr>
 		<?php	} ?>
diff --git a/application/modules/admin/views/scripts/index/adminvaredit.phtml b/application/modules/admin/views/scripts/index/adminvaredit.phtml
index b0ef4da974d677e5d1346e0521f2060d996629de..86ee5b79a2da8d6ceab31c4e63fd13bf035d9eaa 100644
--- a/application/modules/admin/views/scripts/index/adminvaredit.phtml
+++ b/application/modules/admin/views/scripts/index/adminvaredit.phtml
@@ -12,7 +12,7 @@
   </tr>
    <tr>
     <td class="droite">Nouvelle valeur</td>
-    <td class="gauche"><textarea rows="10" name="valeur"><?php echo $this->var_valeur; ?></textarea></td>
+    <td class="gauche"><textarea rows="10" cols="60" name="valeur"><?php echo $this->var_valeur; ?></textarea></td>
   </tr>
 </table><br />
 </div>
@@ -22,7 +22,7 @@
 <table>
 <tr>
     <td align="right" style="padding-right:5px;"><?php echo $this->bouton('type=V'); ?> </td>
-    <td align="left" style="padding-left:5px;"> <?php echo $this->bouton('id=29','picto=del.gif','texte=Annuler','url='.BASE_URL.'/admin/index/adminvar','largeur=120px'); ?></td>
+    <td align="left" style="padding-left:5px;"> <?php echo $this->bouton('id=29','picto=back.gif','texte=Retour','url='.BASE_URL.'/admin/index/adminvar','largeur=120px'); ?></td>
 </tr>
 </table>
 </form>
diff --git a/application/modules/opac/controllers/AbonneController.php b/application/modules/opac/controllers/AbonneController.php
index 8666ab51d6299bacd84e28eb22d348d438c9fc3c..c49c7095b26bb8478116dbfc7f45abf328a9f60f 100644
--- a/application/modules/opac/controllers/AbonneController.php
+++ b/application/modules/opac/controllers/AbonneController.php
@@ -388,17 +388,24 @@ class AbonneController extends ZendAfi_Controller_Action {
 
 
 	public function prolongerpretAction() {
-		$id_pret = $this->_request->getParam('id_pret');
-		$cls_comm = new Class_CommSigb();
+		$id_pret = $this->_getParam('id_pret');
 
-		$result = $cls_comm->prolongerPret($this->_user, $id_pret);
+		$result = Class_CommSigb::getInstance()->prolongerPret($this->_user, $id_pret);
 
 		$this->view->fiche = $this->_user->getFicheSigb();
-		$this->_helper->notify($result['statut'] == 1
-													 ? $this->_('Prêt prolongé')
-													 : $result['erreur']);
 
-		$this->_redirect('/opac/abonne/prets');
+		$this->view->titre = $result['statut'] == 1
+			? $this->_('Prêt prolongé')
+			: $this->_('Erreur');
+
+		$this->view->message = $result['statut'] == 1
+			? $this->_('Votre prêt a bien été prolongé.')
+			: $result['erreur'];
+
+		$this->renderPopupResult($this->view->titre,
+														 $this->view->render('abonne/prolonger-pret.phtml'),
+														 ['show_modal' => 'true',
+															'position' => json_decode('{ "my": "center center", "at": "center center"}')]);
 	}
 
 
diff --git a/application/modules/opac/controllers/AuthController.php b/application/modules/opac/controllers/AuthController.php
index 4ffceaefbfb996ce21fe865c2af097aa1f3e59c9..c358f9ed8837e7cd8165711677bf0f56c06c8556 100644
--- a/application/modules/opac/controllers/AuthController.php
+++ b/application/modules/opac/controllers/AuthController.php
@@ -30,6 +30,11 @@ class AuthController extends ZendAfi_Controller_Action {
 	}
 
 
+	public function isLectura() {
+		return $this->_getParam('lectura', false);
+	}
+
+
 	public function isCasRequest() {
 		return strlen($this->getCasServerUrl())>0;
 	}
@@ -388,6 +393,10 @@ abstract class Auth_Strategy_Abstract {
 		if ($controller->isCasRequest() && !static::isLogged())
 			return new Auth_Strategy_Cas_NotLogged($controller);
 
+		if ($controller->isLectura())
+			return new Auth_Strategy_Lectura($controller);
+
+
 		if (static::isLogged())
 			return new Auth_Strategy_Logged($controller);
 
@@ -518,4 +527,32 @@ class Auth_Strategy_Cas_NotLogged extends Auth_Strategy_Cas_Abstract{
 	}
 }
 
+
+class Auth_Strategy_Lectura extends Auth_Strategy_Abstract {
+
+
+	public function handlePost() {
+		$this->controller->getHelper('ViewRenderer')->setNoRender();
+		$response= $this->controller->getResponse();
+		$view = $this->controller->view;
+		$request = $this->controller->getRequest();
+		$response->setHeader('Content-Type', 'application/xml;charset=utf-8');
+		$login = $request->getPost('CAB');
+		$password = $request->getPost('PWD');
+		$response->setBody($this->getXmlResponse($view,
+																						 ZendAfi_Auth::getInstance()->authenticateLoginPassword($login, $password)));
+	}
+
+
+	protected function getXmlResponse($view,$is_success=true) {
+		return '<?xml version="1.0" encoding="UTF-8"?>'."\n".
+			$view->tag('libraryuserauth',
+								 $view->tag('returncode',$is_success? 'success':'error'),
+								 ['timestamp' => date('Ymd-his')]);
+
+	}
+}
+
+
+
 ?>
\ No newline at end of file
diff --git a/application/modules/opac/controllers/CmsController.php b/application/modules/opac/controllers/CmsController.php
index 7b0b8014286e4b79bde612f57217121180c1018e..28c8c460eb4996df382567a060a6dbcafa7d2c93 100644
--- a/application/modules/opac/controllers/CmsController.php
+++ b/application/modules/opac/controllers/CmsController.php
@@ -279,6 +279,9 @@ class CmsController extends Zend_Controller_Action {
 
 		// param pour l'affichage du calendar
 		$param['DATE']=$date;
+		if ($month = $this->_getParam('month')) {
+			$param['DATE'] = date('Y') . '-' . sprintf("%02d", $month);
+		}
 		$param['URL']='';
 		$param['ID_BIB']=Class_Profil::getCurrentProfil()->getIdSite();
 		$param['AFFICH_MOIS']=1;
@@ -295,6 +298,17 @@ class CmsController extends Zend_Controller_Action {
 		$param['DISPLAY_CALENDAR'] = $preferences['display_calendar'];
 		$param['EVENT_INFO'] = $preferences['display_event_info'];
 		$param['EVENT_FILTER'] = $preferences['event_filter'];
+		$param['ENABLED_FILTERS'] = $preferences['enabled_filters'];
+		$param['PLACE'] = $this->_getParam('place');
+		$param['DISPLAY_FULL_PAGE'] = $preferences['display_full_page'];
+
+		$param['CUSTOM_FIELDS'] = [];
+		foreach ($this->getRequest()->getParams() as $name => $value) {
+			if (strpos($name, 'custom_field_') === 0) {
+				$param['CUSTOM_FIELDS'][str_replace('custom_field_', '', $name)] = $value;
+			}
+		}
+
 		$this->view->param = $param;
 	}
 
diff --git a/application/modules/opac/controllers/JavaController.php b/application/modules/opac/controllers/JavaController.php
index 72247bffca61b787ed9b28f0908bcac4a2dc5057..d04f8ebcc2a0c340d899837557f07157ea3352af 100644
--- a/application/modules/opac/controllers/JavaController.php
+++ b/application/modules/opac/controllers/JavaController.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class JavaController extends Zend_Controller_Action {
@@ -43,13 +43,15 @@ class JavaController extends Zend_Controller_Action {
 			$this->view->profil->getModuleAccueilPreferences($id_module, 'KIOSQUE'));
 
 		$this->view->preferences = $preferences;
-		$this->view->base_url = $this->view->url(array_merge($this->_request->getParams(),
+		$params = $this->_request->getParams();
+		unset($params['titre']);
+		$this->view->base_url = $this->view->url(array_merge($params,
 																												 ['controller' => 'recherche',
 																													'action' => 'viewnotice',
 																													'current_module' => null]),
 																						 null,
 																						 true);
-		
+
 		// Lire les notices
 		$this->view->notices = Class_Catalogue::getLoader()->getNoticesByPreferences($preferences,"url");
 
diff --git a/application/modules/opac/controllers/PanierController.php b/application/modules/opac/controllers/PanierController.php
index e6e873a68b794bc8f21a1249c456530eb3aa58f5..c6fabc0d23a5b2e758e51aa2b34b1d28a49a9ed8 100644
--- a/application/modules/opac/controllers/PanierController.php
+++ b/application/modules/opac/controllers/PanierController.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class PanierController extends ZendAfi_Controller_Action {
@@ -44,18 +44,20 @@ class PanierController extends ZendAfi_Controller_Action {
 			return;
 		}
 
-		$paniers  = $this->_user->getPaniers();	
+		$paniers  = $this->_user->getPaniers();
 
 		$this->view->paniers = $paniers;
 		$this->view->title = $this->view->_("Vos paniers");
 		$this->view->message = false;
 		$this->view->panier_courant=$panier_courant;
 
-		if(!count($paniers)) 
-			$this->view->message = $this->view->_("Vous n'avez aucun panier.");
-		else 
-			$this->view->message = $this->view->_("Vous avez %d panier(s)", count($paniers));
-	
+		$nb_paniers = count($paniers);
+		$this->view->message = $this->view->_plural($nb_paniers,
+																								"Vous n'avez aucun panier.",
+																								"Vous avez %d panier",
+																								"Vous avez %d paniers",
+																								$nb_paniers);
+
 		// Si ajout notice : choix du panier
 		if ($id_notice = $this->_getParam("id_notice"))
 			$this->view->ajout_panier_form = ZendAfi_Form_AjoutNoticePanier::newWithOptions(
@@ -72,7 +74,7 @@ class PanierController extends ZendAfi_Controller_Action {
 			$this->view->url_retour=$_SESSION["panier"]["url_retour"];
 		else if (isset($id_notice))
 			$this->view->url_retour = $this->view->urlNotice(Class_Notice::find($id_notice));
-	
+
 		if ($panier_courant)	{
 			// comme ça quand on clique est sur une notice on peut revenir au panier
 			$_SESSION["recherche"]["retour_liste"] = $this->view->url(['controller' => 'panier',
@@ -87,13 +89,13 @@ class PanierController extends ZendAfi_Controller_Action {
 			$this->_forward('creer-panier-ajax', 'panier', 'opac', ['redirect' => $this->view->url()]);
 			return;
 		}
-		
-		if (!Class_Users::getIdentity()->canModifyPanier($panier)) 
+
+		if (!Class_Users::getIdentity()->canModifyPanier($panier))
 			$this->_redirectToUrlOrReferer('opac/panier');
-		
+
 		$this->view->panier = $panier;
 		$this->view->titre = $this->view->_('Modifier les informations du panier');
-			
+
 		if($this->_request->isPost()){
 		  $message = $this->updateTitrePanierAction($panier);
 			$message.= $this->updateDomainesPanierAction($panier);
@@ -105,15 +107,15 @@ class PanierController extends ZendAfi_Controller_Action {
 
 	public function selectPanierCourantAction() {
 		$this->view->titre = $this->view->_('Changer de panier');
-		$this->view->id_panier = ($panier = Class_PanierNotice::find($this->_getParam('id_panier'))) 
+		$this->view->id_panier = ($panier = Class_PanierNotice::find($this->_getParam('id_panier')))
 			? $panier->getId() : '';
 
 		if($this->_request->isPost()){
 			if($new_current_panier = Class_PanierNotice::find($this->_request->getPost('id_new_panier'))){
 				$this->_user
 					->setPanierCourant($new_current_panier)
-					->save();		
-			}		
+					->save();
+			}
 			$this->_redirectToReferer();
 		}
 	}
@@ -136,8 +138,8 @@ class PanierController extends ZendAfi_Controller_Action {
 			if($new_current_panier = Class_PanierNotice::find($this->_request->getPost('id_new_panier'))){
 				$this->_user
 					->setPanierCourant($new_current_panier)
-					->save();		
-			}		
+					->save();
+			}
 			$this->_redirect($this->_request->getPost('redirect'));
 			return;
 		}
@@ -212,13 +214,13 @@ class PanierController extends ZendAfi_Controller_Action {
 		$this->view->panier_courant = $this->_user->getPanierCourant();
 		$this->view->notice = $notice;
 		$this->view->titre = $this->view->_('Ajouter une notice au panier');
-		
+
 		$this->ajoutAjaxPostEvent($notice);
 	}
 
 
 	protected function ajoutAjaxPostEvent($notice) {
-		if (!$this->_request->isPost()) 
+		if (!$this->_request->isPost())
 			return;
 
 		$panier=$this->ensurePanier();
@@ -269,10 +271,10 @@ class PanierController extends ZendAfi_Controller_Action {
 		$message.= $this->updateDomainesPanierAction($panier);
 
 		$this->_helper->notify($message);
-		
+
 		$this->_redirectToUrlOrReferer('opac/panier/index/id_panier/'.$panier->getId());
 	}
-	
+
 
 	public function updateDomainesPanierAction($panier) {
 		if(null===($this->_request->getPost('domaine_ids')))
@@ -284,14 +286,14 @@ class PanierController extends ZendAfi_Controller_Action {
 		$panier
 			->setDomaineIds($list_cat)
 			->save();
-			
+
 		return $this->_plural($nb_cat,
 													'',
 													$this->_('Panier: ').$panier->getLibelle().$this->_(' ajouté au domaine sélectionné.'),
 													$this->_('Panier: ').$panier->getLibelle().$this->_(' ajouté aux domaines sélectionnés.'),
 													$nb_cat);
 	}
-	
+
 
 	public function updateTitrePanierAction($panier) {
 			if(null==($this->_request->getPost('new_libelle')))
@@ -301,8 +303,8 @@ class PanierController extends ZendAfi_Controller_Action {
 			$panier
 				->setLibelle($this->_request->getPost('new_libelle'))
 				->save();
-				
-			return $this->_('Panier "%s" renommé vers "%s". ', 
+
+			return $this->_('Panier "%s" renommé vers "%s". ',
 											$old_libelle,
 											$panier->getLibelle());
 
@@ -342,7 +344,7 @@ class PanierController extends ZendAfi_Controller_Action {
 
 
 	private function ensurePanier() {
-		if ($panier = Class_PanierNotice::find($this->_getParam('id_panier'))) 
+		if ($panier = Class_PanierNotice::find($this->_getParam('id_panier')))
 			return $panier;
 
 		return $this->_user->newPanier();
@@ -353,7 +355,7 @@ class PanierController extends ZendAfi_Controller_Action {
 		if (!$user = Class_Users::getLoader()->getIdentity()) {
 		  $this->_forward('index', 'panier', 'opac', ['redirect' => $this->view->url()]);
 		}
-		
+
 
 		$this->_user = $user;
 
@@ -387,7 +389,7 @@ class PanierController extends ZendAfi_Controller_Action {
 		$this->view->titre = $this->view->_('Nouveau panier');
 
 		if ($this->_request->isPost()) {
-			$panier = 
+			$panier =
 				$this->_user
 				->newPanier()
 				->setLibelle($this->_request->getPost('new_libelle'));
diff --git a/application/modules/opac/controllers/RssController.php b/application/modules/opac/controllers/RssController.php
index 2592be3deab2cd6f58606d1dde852db4d9603f29..77ed4f9970ae14d1333e773687c2c5ae05d40832 100644
--- a/application/modules/opac/controllers/RssController.php
+++ b/application/modules/opac/controllers/RssController.php
@@ -355,7 +355,7 @@ class RssController extends Zend_Controller_Action
 		$items = [];
 		foreach($notices as $notice) {
 			$items[] = [
-				'titre' => $notice["titre"] . ', ' . $notice["auteur"],
+				'titre' => '<![CDATA[' . str_replace(BR, ' ', $notice["titre"]) . ', ' . $notice["auteur"] . ']]>' ,
 				'lien' => $this->view->absoluteUrl([
 					'controller' => 'recherche',
 					'action' => 'viewnotice',
diff --git a/application/modules/opac/controllers/SitoController.php b/application/modules/opac/controllers/SitoController.php
index 967e0fef0a79df938380bb7ed9214edb347cc5f8..8d180a1a92c9889ae43154f7ae994d61b9bf3be1 100644
--- a/application/modules/opac/controllers/SitoController.php
+++ b/application/modules/opac/controllers/SitoController.php
@@ -74,6 +74,23 @@ class SitoController extends Zend_Controller_Action {
 		$this->view->title = $this->view->_("Sélection de sites");
 	}
 
+
+	public function webthumbnailAction() {
+		$viewRenderer = $this->getHelper('ViewRenderer');
+		$viewRenderer->setNoRender();
+		session_write_close();
+
+		$url = $this->_getParam('url');
+		$webThumbnail =  $this->view->getHelper('WebThumbnail');
+		$filename = $webThumbnail->fileNameFromUrl($url);
+		$filepath = $webThumbnail->fullPath($filename);
+
+		if (!$webThumbnail->getThumbnailer()->fetchUrlToFile($url, $filepath))
+			$this->_redirect('');
+
+		$this->_redirect($webThumbnail->fullUrl($filename));
+	}
+
 }
 
 ?>
diff --git a/application/modules/opac/views/scripts/abonne/prets.phtml b/application/modules/opac/views/scripts/abonne/prets.phtml
index a26c2e97a393975917911f4d3b5bc627e841f0a2..e5de35550f0b8f69dc09d1f965ca6e6adac3344d 100644
--- a/application/modules/opac/views/scripts/abonne/prets.phtml
+++ b/application/modules/opac/views/scripts/abonne/prets.phtml
@@ -3,58 +3,59 @@
 <?php
 // messages
 foreach (['message', 'error'] as $type)
-	if (isset($this->fiche[$type]) && $this->fiche[$type]) 
+	if (isset($this->fiche[$type]) && $this->fiche[$type])
 		echo '<p class="error">' . $this->fiche[$type] . '</p>';
 ?>
 
 <?php if (isset($this->fiche['fiche'])
-					&& ($emprunts = $this->fiche['fiche']->getEmprunts())
+	&& ($emprunts = $this->fiche['fiche']->getEmprunts())
 					&& !empty($emprunts)) {
-	echo $this->abonne_LoanExport();
-}
+				echo $this->abonne_LoanExport();
+			}
 ?>
 
 <table width="100%" class="tablesorter">
 	<thead>
-	<tr>
-		<th style="text-align:left; white-space:nowrap"><?php echo $this->_('n°'); ?></th>
-		<th style="text-align:left"><?php echo $this->_('Titre'); ?></th>
-		<th style="text-align:left"><?php echo $this->_('Auteur'); ?></th>
-		<th style="text-align:left"><?php echo $this->_('Bibliothèque'); ?></th>
-		<th style="text-align:center"><?php echo $this->_('Retour prévu'); ?></th>
-		<th style="text-align:center"><?php echo $this->_('Informations'); ?></th>
-	</tr>
+		<tr>
+			<th style="text-align:left; white-space:nowrap"><?php echo $this->_('n°'); ?></th>
+			<th style="text-align:left"><?php echo $this->_('Titre'); ?></th>
+			<th style="text-align:left"><?php echo $this->_('Auteur'); ?></th>
+			<th style="text-align:left"><?php echo $this->_('Bibliothèque'); ?></th>
+			<th style="text-align:center"><?php echo $this->_('Retour prévu'); ?></th>
+			<th style="text-align:center"><?php echo $this->_('Informations'); ?></th>
+		</tr>
 	</thead>
 	<tbody>
 		<?php
 		$num = 1;
 		if (isset($this->fiche['fiche'])) {
-				foreach ($this->fiche["fiche"]->getEmprunts() as $emprunt) {
-					$class_retard = $emprunt->enRetard() ? 'class="pret_en_retard"' : '';?>
-		<tr <?php echo $class_retard;?>>
-			<td width="15px" align="center"><b><?php echo $num++;?></b></td>
-			<td>
-				<?php
-				echo $this->tagAnchor(
-					$this->url(['controller' => 'recherche',
-											'action' => 'viewnotice',
-											'id' => $emprunt->getNoticeOPACId(),
-											'retour_abonne' => 'prets'],
-										 null, true),
-					$emprunt->getTitre());
-				?></td>
-			<td><?php echo $emprunt->getAuteur();?></td>
-			<td><?php echo $emprunt->getBibliotheque();?></td>
-			<td class="date_retour">
-				<?php echo $emprunt->getDateRetour() . ' ';?>
-				<?php
-				if ($emprunt->isRenewable())
-					echo $this->tagAnchor($this->url(['action' => 'prolongerPret',
-																						'id_pret' => $emprunt->getId()]),
-																$this->_('Prolonger'));?>
-			</td>
-			<td><?php echo $emprunt->getType();?></td>
-		</tr>
+			foreach ($this->fiche["fiche"]->getEmprunts() as $emprunt) {
+				$class_retard = $emprunt->enRetard() ? 'class="pret_en_retard"' : '';?>
+			<tr <?php echo $class_retard;?>>
+				<td width="15px" align="center"><b><?php echo $num++;?></b></td>
+				<td>
+					<?php
+					echo $this->tagAnchor(
+						$this->url(['controller' => 'recherche',
+												'action' => 'viewnotice',
+												'id' => $emprunt->getNoticeOPACId(),
+												'retour_abonne' => 'prets'],
+											 null, true),
+						$emprunt->getTitre());
+					?></td>
+				<td><?php echo $emprunt->getAuteur();?></td>
+				<td><?php echo $emprunt->getBibliotheque();?></td>
+				<td class="date_retour">
+					<?php echo $emprunt->getDateRetour() . ' ';?>
+					<?php
+					if ($emprunt->isRenewable())
+						echo $this->tagAnchor($this->url(['action' => 'prolongerPret',
+																							'id_pret' => $emprunt->getId()]),
+																	$this->_('Prolonger'),
+																	['data-popup' => 'true']);?>
+				</td>
+				<td><?php echo $emprunt->getType();?></td>
+			</tr>
 		<?php }
 		} ?>
 	</tbody>
diff --git a/application/modules/opac/views/scripts/abonne/prolonger-pret.phtml b/application/modules/opac/views/scripts/abonne/prolonger-pret.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..13c72c32dc96932fdbf9fabd58a2d6c0d777afbf
--- /dev/null
+++ b/application/modules/opac/views/scripts/abonne/prolonger-pret.phtml
@@ -0,0 +1 @@
+<?php echo $this->message;?>
diff --git a/application/modules/opac/views/scripts/recherche/resultatRecherche.phtml b/application/modules/opac/views/scripts/recherche/resultatRecherche.phtml
index c9bc97abe2cf25bd5bd06bf6289a324f9a91b1be..a111fa8f6119e0357da54faaf1c9e30e0498a606 100644
--- a/application/modules/opac/views/scripts/recherche/resultatRecherche.phtml
+++ b/application/modules/opac/views/scripts/recherche/resultatRecherche.phtml
@@ -84,11 +84,12 @@ $html_pager = $this->pager($nombre,
 													 array_merge($this->criteres_recherche->getUrlRetourListe(),
 																			 ['controller' => 'recherche',
 																				'action' => 'simple']));
+$nuage_tags_title = $preferences["tags_message"] ? $this->tag('h2', $preferences["tags_message"])	: '';
 
-$html_nuage_tags = '<div class="facette_outer" style="margin-left:10px;margin-top:17px">'.
-									 ($preferences["facettes_message"] ? ('<h2>'.$preferences["facettes_message"].'</h2>') : '').
-$this->nuageTags($tags, $preferences["tags_codes"],$this->criteres_recherche).
-'</div>';
+$html_nuage_tags = $this->tag('div',
+															$nuage_tags_title
+														 .$this->nuageTags($tags, $preferences["tags_codes"],$this->criteres_recherche)
+															, ['class' => 'facette_outer nuage_outer']);
 
 $html_facettes = '<div class="facette_outer" style="margin-left:10px;margin-top:17px">'.
 								 ($preferences["facettes_message"] ? ('<h2>'.$preferences["facettes_message"].'</h2>') : '').
diff --git a/application/modules/telephone/controllers/AuthController.php b/application/modules/telephone/controllers/AuthController.php
index 44132c8a9337361fd429a2c5ccf3009215ae5763..d7c18fe22c8bad867e46bef257ef61bf0d6922d5 100644
--- a/application/modules/telephone/controllers/AuthController.php
+++ b/application/modules/telephone/controllers/AuthController.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 require_once ROOT_PATH.'application/modules/opac/controllers/AuthController.php';
@@ -35,24 +35,39 @@ class Telephone_AuthController extends AuthController {
 
 
 	public function loginAction() {
-		$this->_loginCommon('/abonne');
+		$this->view->preferences = Class_Profil::getCurrentProfil()->getCfgModulesPreferences('auth','login');
+		$redirect = $this->_getParam('redirect', '/abonne');
+		$this->view->redirect = $redirect;
+		$service = $this->_getParam('service','');
+		$this->view->service = $service;
+		$this->view->titre = $this->view->_('Connexion');
+
+		$strategy = Auth_Strategy_Abstract::strategyForController($this);
+		$strategy->setDefaultUrl($redirect);
+		$strategy->processLogin();
+		$this->_loginCommon();
 		$this->render('login-reservation');
 	}
 
 
-	public function loginReservationAction() {
-		$this->_loginCommon('/recherche/reservation');
-		$this->view->id_notice = $this->_getParam('id');
+	public function getRedirectDefaultUrl() {
+		return $this->_request->getParam('redirect','/abonne');
 	}
 
 
-
-	protected function _loginCommon($redirectUrl) {
+	public function loginReservationAction() {
 		if (Class_Users::getLoader()->hasIdentity()) {
-			$this->_redirect($redirectUrl);
+			$this->_redirect('/recherche/reservation');
 			return;
 		}
 
+		$this->_loginCommon();
+		$this->view->id_notice = $this->_getParam('id');
+	}
+
+
+
+	protected function _loginCommon() {
 		$form = $this->_getFormLogin();
 		if ($this->_request->isPost()) {
 			if (!($error = $this->_authenticate())) {
@@ -63,14 +78,13 @@ class Telephone_AuthController extends AuthController {
 			$this->_flashMessenger->addMessage($error);
 			$this->_redirect($this->view->url(), array('prependBase' => false));
 		}
-		
+
 		$this->view->error = $this->_flashMessenger->getMessages();
 		$this->view->form = $form;
 	}
 
 
 	protected function _getFormLogin() {
-		
 		$settings = array_merge(['identifiant_exemple' => $this->view->_('N° de carte'),
 														 'mot_de_passe_exemple' => $this->view->_('Mot de passe ou date de naissance')],
 														Class_Profil::getPortail()->getModuleAccueilPreferencesByType('LOGIN'));
@@ -90,6 +104,8 @@ class Telephone_AuthController extends AuthController {
 			->setLabel($this->view->_('Se connecter'))
 			->setAttrib('data-mini', 'true');
 
+		$form->getElement('service')->setValue($this->_getParam('service',''));
+
 		return $form;
 	}
 }
diff --git a/application/modules/telephone/controllers/CasServerController.php b/application/modules/telephone/controllers/CasServerController.php
new file mode 100644
index 0000000000000000000000000000000000000000..738ec47344253032958ee5534cfb57782b88bab4
--- /dev/null
+++ b/application/modules/telephone/controllers/CasServerController.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+require_once ROOT_PATH.'application/modules/opac/controllers/CasServerController.php';
+
+class Telephone_CasServerController extends CasServerController {
+}
+
+?>
\ No newline at end of file
diff --git a/application/modules/telephone/controllers/CasServerV10Controller.php b/application/modules/telephone/controllers/CasServerV10Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..fef726de4ee2f2a5eb89202a13c80ed38ab04af7
--- /dev/null
+++ b/application/modules/telephone/controllers/CasServerV10Controller.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+require_once ROOT_PATH.'application/modules/opac/controllers/CasServerV10Controller.php';
+
+class Telephone_CasServerV10Controller extends CasServerV10Controller {
+}
+
+?>
\ No newline at end of file
diff --git a/ckeditor/ckeditor_php5.php b/ckeditor/ckeditor_php5.php
index 25563536db1163acc04b68bdbc61b3af71f328fb..9f217665f771e8eefa2c896ed7f84df143b06d30 100644
--- a/ckeditor/ckeditor_php5.php
+++ b/ckeditor/ckeditor_php5.php
@@ -131,6 +131,8 @@ class CKEditor
 	public function editor($name, $value = "", $config = array(), $events = array())
 	{
 		$attr = "";
+		$id = 'cke-' . $name;
+		$this->textareaAttributes['id'] = $id;
 		foreach ($this->textareaAttributes as $key => $val) {
 			$attr.= " " . $key . '="' . str_replace('"', '&quot;', $val) . '"';
 		}
@@ -143,9 +145,9 @@ class CKEditor
 
 		$js = $this->returnGlobalEvents();
 		if (!empty($_config))
-			$js .= "CKEDITOR.replace('".$name."', ".$this->jsEncode($_config).");";
+			$js .= "CKEDITOR.replace('".$id."', ".$this->jsEncode($_config).");";
 		else
-			$js .= "CKEDITOR.replace('".$name."');";
+			$js .= "CKEDITOR.replace('".$id."');";
 
 		$out .= $this->script($js);
 
diff --git a/cosmogramme/cosmozend/application/modules/cosmo/controllers/RunLogController.php b/cosmogramme/cosmozend/application/modules/cosmo/controllers/RunLogController.php
index e71b62ea739e77d4b9cd2b420418ac01e70dc7aa..5f46e52f954a1ffd311f609cd6684233af6cc3f0 100644
--- a/cosmogramme/cosmozend/application/modules/cosmo/controllers/RunLogController.php
+++ b/cosmogramme/cosmozend/application/modules/cosmo/controllers/RunLogController.php
@@ -59,6 +59,7 @@ class Cosmo_RunLogController extends Zend_Controller_Action {
 		header('Content-length: ' . $run->getFileSize());
 		header('Content-Type: application/octet-stream');
 		header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
+		ob_end_clean();
 		readfile($file_path);
 	}
 }
diff --git a/cosmogramme/php/_init.php b/cosmogramme/php/_init.php
index a624f340ccaff4fe5142cc50ef9e823565f0d975..4ebce3f17dc19ad12155924a2c5ea9efc11da7ba 100644
--- a/cosmogramme/php/_init.php
+++ b/cosmogramme/php/_init.php
@@ -1,8 +1,8 @@
 <?php
 // Constantes
 error_reporting(E_ERROR | E_PARSE);
-define("VERSION_COSMOGRAMME","6.56");
-define("PATCH_LEVEL","218");
+define("VERSION_COSMOGRAMME","6.57");
+define("PATCH_LEVEL","219");
 
 define("APPLI","cosmogramme");
 define("COSMOPATH", "/var/www/html/vhosts/opac2/www/htdocs");
diff --git a/cosmogramme/php/classes/classe_codif_cache.php b/cosmogramme/php/classes/classe_codif_cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..17406c58ce4f99943554f1a6ae28b7ffc81af964
--- /dev/null
+++ b/cosmogramme/php/classes/classe_codif_cache.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+
+abstract class CodifCacheAbstract {
+	static $_instance;
+
+	protected $_cache = [];
+
+	public static function getInstance() {
+		if (!isset(static::$_instance))
+			static::$_instance = new static();
+		return static::$_instance;
+	}
+
+
+	public function find($code) {
+		if (!isset($this->_cache[$code]))
+			$this->_cache[$code] = $this->load($code);
+		return $this->_cache[$code];
+	}
+
+
+	abstract public function load($code);
+}
+
+
+
+class CodifAnnexeCache extends CodifCacheAbstract {
+	public function load($code) {
+		return Class_CodifAnnexe::findFirstBy(['code' => $code]);
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/cosmogramme/php/classes/classe_notice_integration.php b/cosmogramme/php/classes/classe_notice_integration.php
index 9f5beaacf0cf5a02720631ae3da37bfb108c003e..8e20c29b1638d2e768c9996ffca2df93850d600d 100644
--- a/cosmogramme/php/classes/classe_notice_integration.php
+++ b/cosmogramme/php/classes/classe_notice_integration.php
@@ -18,18 +18,18 @@
  * along with AFI-OPAC 2.0; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
-/////////////////////////////////////////////////////////////////////////////////////
-// NOTICE D'INTEGRATION
-/////////////////////////////////////////////////////////////////////////////////////
 
 require_once("classe_isbn.php");
 require_once("classe_indexation.php");
 require_once("classe_unimarc.php");
 require_once("classe_codif_matiere.php");
 require_once("classe_codif_langue.php");
+require_once("classe_profil_donnees.php");
+
+class notice_integration {
+	const RECORD_RENEW = 5;
+	const RECORD_UPDATE = 4;
 
-class notice_integration
-{
 	private $id_profil;									// Id du profil de données initialisé
 	private $format;										// Format de fichier 0=unimarc
 	private $id_article_periodique;			// Mode d'indentification des articles de periodiques
@@ -51,27 +51,19 @@ class notice_integration
 	private $mode_doublon;							// Mode de dédoublonnage (tous identifiants ou clef alpha prioritaire)
 	private $url_site;                  // Url d'origine du site opac
 	private $flag_koha=false;						// flag pour réentrance des notices de periodiques koha
+
 	/** @category testing */
 	protected $_service_runner;
 
-// ----------------------------------------------------------------
-// Constructeur
-// ----------------------------------------------------------------
-	function __construct()
-	{
-		// Classe d'indexation
+	public function __construct() {
 		$this->indexation=new indexation();
 		$this->filtrer_fulltext=getVariable("filtrer_fulltext");
 		$this->mode_doublon=getVariable("mode_doublon");
 		$this->notice_sgbd=new notice_unimarc();
 	}
 
-// ----------------------------------------------------------------
-// Init du format
-// ----------------------------------------------------------------
-	function setParamsIntegration($id_bib,$type_operation,$id_profil,$type_doc_force="")
-	{
-		global $sql;
+
+	function setParamsIntegration($id_bib,$type_operation,$id_profil,$type_doc_force="")	{
 		/**
 		 * $this->id_bib is deprecated, use $this->id_int_bib instead.
 		 * @see http://forge.afi-sa.fr/issues/14279
@@ -80,19 +72,24 @@ class notice_integration
 		$this->type_operation=$type_operation;
 		$this->type_doc_force=$type_doc_force;
 
-		$bib=$sql->fetchEnreg("select * from int_bib where id_bib=$id_bib");
-		$this->qualite_bib=$bib["qualite"];
-		$this->sigb=$bib["sigb"];
+		if (!$bib = Class_IntBib::find($id_bib))
+			$bib = Class_IntBib::newInstance();
+
+		$this->qualite_bib = $bib->getQualite();
+		$this->sigb = $bib->getSigb();
 
 		$this->id_profil=$id_profil;
 		if($id_profil < 0)$format=1; // Paniers d'homogeneisation
 		else
 		{
-			$enreg=fetchEnreg("select * from profil_donnees where id_profil=$id_profil");
-			$this->id_article_periodique=$enreg["id_article_periodique"];
-			$format=$enreg["format"];
-			if(!$format) $format=0;
-			if($enreg["type_fichier"]>9) $format=$enreg["type_fichier"];
+			$profil = (new profil_donnees())->getProfil($id_profil);
+			$this->id_article_periodique = $profil['id_article_periodique'];
+
+			$format = $profil['format'];
+			if (!$format) $format=0;
+
+			if ($profil['type_fichier']>9)
+				$format = $profil['type_fichier'];
 		}
 		$this->format=$format;
 		unset($this->analyseur);
@@ -151,7 +148,6 @@ class notice_integration
 
 		// Chercher la notice dans la base
 		$id_notice=$this->chercheNotice();
-
 		// Traiter le type d'operation : suppressions
 		if($this->type_operation == 1)
 		{
@@ -171,6 +167,7 @@ class notice_integration
 		// suppression ou creation des articles si périodique
 		if($this->notice["type_doc"]==2)
 		{
+
 			// Periodiques Koha et orphee (1 exemplaire pour chaque numéro)
 			if(($this->id_article_periodique==3 or $this->id_article_periodique==4) and $this->flag_koha==false)
 			{
@@ -214,7 +211,6 @@ class notice_integration
 				}
 			}
 		}
-
 		// Mise a jour
 		if(!$id_notice) {
 			$this->notice["qualite"]=$this->qualite_bib;
@@ -223,61 +219,72 @@ class notice_integration
 			else $this->statut=1;
 
 		} else {
-			// Controle des identifiants pour dedoublonnage eventuel
-			if ($this->identification["statut"] == "code_barres") {
-				// Lecture identifiants de la notice de la base
-				$new_id_notice=0;
-				$enreg = $sql->fetchEnreg("Select isbn,ean,id_commerciale from notices where id_notice=$id_notice");
-
-				if ($this->notice["isbn10"]
-						and $this->notice["isbn10"] != $enreg["isbn"]
-						and $this->notice["isbn13"] != $enreg["isbn"]) {
-					$new_id_notice=$this->identification["isbn"];
-					if(!$new_id_notice) $new_id_notice="creation";
-				}
+			$this->updateNoticeWithId($id_notice);
+		}
+		$this->ecrireExemplaires($id_notice);
+    return $this->notice;
+	}
 
-				if(!$new_id_notice
-					 and $this->notice["ean"]
-					 and $this->notice["ean"] != $enreg["ean"]) {
-					$new_id_notice=$this->identification["ean"];
-					if(!$new_id_notice) $new_id_notice="creation";
-				}
 
-//				if(!$new_id_notice and !$ean and $this->notice["id_commerciale"] != $enreg["id_commerciale"])
-//				{
-//					$new_id_notice=$this->identification["id_commerciale"];
-//					if(!$new_id_notice) $new_id_notice="creation";
-//				}
-				if ($new_id_notice) {
-					if ($new_id_notice == "creation") {
-						$this->notice["qualite"]=$this->qualite_bib;
-						$new_id_notice = $this->insertNotice();
-						if (!$new_id_notice) return;
-
-					} else {
-						$this->updateNotice($new_id_notice,$this->qualite_bib);
-					}
+	protected function updateNoticeWithId($id_notice) {
+		if ($this->identification["statut"] == "code_barres")
+			return $this->updateNoticeFromCodeBarres($id_notice);
 
-					// on supprime les exemplaires de l'ancienne notice
-					for($i=0; $i<count($this->notice["exemplaires"]); $i++) {
-						$ex=$this->notice["exemplaires"][$i];
-						$sql->execute("delete from exemplaires where id_bib=$id_bib and id_notice=$id_notice and code_barres='".$ex["code_barres"]."'");
-					}
-					$id_notice=$new_id_notice;
-				}
-				else $id_notice=$this->updateNotice($id_notice,$this->qualite_bib);
+		if(($this->identification["statut"] == "clef_alpha") && $this->flag_koha)
+			return $id_notice;
+
+		return $this->updateNotice($id_notice,$this->qualite_bib);
+
+	}
+
+
+	protected function updateNoticeFromCodeBarres($id_notice) {
+		// Lecture identifiants de la notice de la base
+		$new_id_notice = 0;
+		$enreg = Class_Notice::find($id_notice)->toArray();
+
+		if ($this->notice["isbn10"]
+				and $this->notice["isbn10"] != $enreg["isbn"]
+				and $this->notice["isbn13"] != $enreg["isbn"]) {
+			$new_id_notice = $this->identification["isbn"];
+			if (!$new_id_notice)
+				$new_id_notice = 'creation';
+		}
+
+		if(!$new_id_notice
+			 and $this->notice["ean"]
+			 and $this->notice["ean"] != $enreg["ean"]) {
+			$new_id_notice = $this->identification["ean"];
+			if (!$new_id_notice)
+				$new_id_notice = 'creation';
+		}
+
+		if ($new_id_notice) {
+			if ($new_id_notice == "creation") {
+				$this->notice["qualite"]=$this->qualite_bib;
+				$new_id_notice = $this->insertNotice();
+				if (!$new_id_notice)
+					return;
+			} else {
+				$this->updateNotice($new_id_notice, $this->qualite_bib);
 			}
-			else $id_notice=$this->updateNotice($id_notice,$this->qualite_bib);
+
+			// on supprime les exemplaires de l'ancienne notice
+			for($i=0; $i<count($this->notice["exemplaires"]); $i++) {
+				$ex = $this->notice["exemplaires"][$i];
+				Class_Exemplaire::deleteBy(['id_bib' => $id_bib,
+																		'id_notice' => $id_notice,
+																		'code_barres' => $ex["code_barres"]]);
+			}
+			return $new_id_notice;
 		}
-		$this->ecrireExemplaires($id_notice);
-    return $this->notice;
+
+		return $this->updateNotice($id_notice, $this->qualite_bib);
 	}
 
-// ----------------------------------------------------------------
-// Traitement notice homogene
-// ----------------------------------------------------------------
-	public function traiteHomogene($id_notice,$isbn,$ean,$id_commerciale,$no_request)
-	{
+
+
+	public function traiteHomogene($id_notice, $isbn, $ean, $id_commerciale, $no_request) {
 		global $sql;
 		// Appel du service
 		$args["isbn"]=$isbn;
@@ -463,16 +470,11 @@ class notice_integration
 	}
 
 
-// ----------------------------------------------------------------
-// Cherche dans la base fusionnée
-// ----------------------------------------------------------------
-	private function chercheNotice()
-	{
+	private function chercheNotice() {
 		global $sql;
-
 		$id_bib = $this->id_bib;
-		if(!$this->mode_doublon)
-		{
+
+		if(!$this->mode_doublon) {
 			$isbn10=$this->notice["isbn10"];
 			$isbn13=$this->notice["isbn13"];
 			$ean=$this->notice["ean"];
@@ -573,17 +575,18 @@ class notice_integration
 
 		// Traitement des facettes
 		$this->traiteFacettes();
-		$notice = Class_Notice::newInstance($this->noticeToDBEnreg($this->notice));
+
+		$notice = Class_Notice::newInstance($this->noticeToDBEnreg());
 		$notice->save();
 		$this->statut=1;
 		return $notice->getId();
 	}
 
 
-	public function noticeToDBEnreg(&$notice) {
-		$enreg= [
+	public function noticeToDBEnreg() {
+		return [
 			"type_doc" => $this->notice["type_doc"],
-			"alpha_titre" => $this->notice["alpha_titre"],
+						"alpha_titre" => $this->notice["alpha_titre"],
 			"alpha_auteur" => $this->notice["alpha_auteur"],
 
 			"titres" => $this->indexation->getfullText(array_merge($this->notice["titres"],
@@ -610,104 +613,99 @@ class notice_integration
 			"qualite" => $this->notice["qualite"],
 			"exportable" => $this->notice["exportable"],
 			"cote" => $this->notice["cote"],
-			"unimarc" => $this->notice["unimarc"],
+						"unimarc" => $this->notice["unimarc"],
 			"date_maj" => dateDuJour(2) ];
-			return $enreg;
 	}
 
-// ----------------------------------------------------------------
-// MAJ notice (remplacement si homogeneisation)
-// ----------------------------------------------------------------
-	private function updateNotice($id_notice,$qualite)
-	{
-		global $sql;
 
-		$notice_enreg=$sql->fetchEnreg("select qualite,unimarc,facettes from notices where id_notice=$id_notice");
-		$this->notice["qualite"]=$notice_enreg['qualite'];
+	private function updateNotice($id_notice, $qualite) {
+		$notice_enreg = Class_Notice::find($id_notice)->toArray();
+		$this->notice["qualite"] = $notice_enreg['qualite'];
 		$unimarc=$notice_enreg['unimarc'];
-		$this->notice["facette"]=$notice_enreg['facettes'];
+		$this->notice["facette"] = $notice_enreg['facettes'];
+
 		// Test qualite
-		if($qualite >= $this->notice["qualite"])
-		{
-			$this->notice["qualite"]=$qualite;
-			$this->statut=5;
-		}
-		elseif($qualite < $this->notice["qualite"]) $this->statut=4;
-		else
-		{
-			$this->notice["qualite"]=$qualite;
-			$this->statut=3;
+		if ($qualite >= $this->notice["qualite"]) {
+			$this->notice["qualite"] = $qualite;
+			$this->statut = static::RECORD_RENEW;
+		} else {
+			$this->statut = static::RECORD_UPDATE;
 		}
 
 		// Si la notice n'a pas de titre on substitue par celle de la base en forcant a une qualite inferieure
-		if( !$this->notice["titre_princ"] ) $this->statut=4;
+		if (!$this->notice['titre_princ'])
+			$this->statut = static::RECORD_UPDATE;
 
 		// Zones forcees
-		$this->notice_sgbd->ouvrirNotice($unimarc,0);
-		$champs_forces=$this->notice_sgbd->getChampsForces();
-		if($champs_forces and $champs_forces != $this->notice["champs_forces"])
-		{
-			// On sauvegarde les données propres à la bib
-			$id_origine=$this->notice["id_origine"];
-			$qualite=$this->notice["qualite"];
-			$statut_exemplaires = $this->notice["statut_exemplaires"];
-			$exemplaires = $this->notice["exemplaires"];
-			$warnings=$this->notice["warnings"];
-
-			// Merge champs forces
-			if($this->notice["champs_forces"])$new=array_merge_recursive($champs_forces,$this->notice["champs_forces"]);
-			else $new = $champs_forces;
-
-			// Si la notice de la base est de meilleure qualite on la prend
-			if($this->statut==5) $this->notice_sgbd->ouvrirNotice($this->notice["unimarc"],0);
-
-			// Fusion des champs forces
-			$champs_forces=array();
-			foreach($new as $zone => $valeurs)
-			{
-				$zone=substr($zone,1); // on retire le Z qui sert au array_merge_recursive
-				$this->notice_sgbd->delete_field($zone); // On supprime l'ancienne zone
-				// si champ matiere on dedoublonne directement
-				if(substr($zone,0,1)=="6")
-				{
-					$champs=array_unique($valeurs);
-					$champs_forces[$zone]=$champs;
-				}
-				// sinon on decoupe les elements on les dedoublonne et on les remet dans 1 seule zone
-				else
-				{
-					$champs=array();
-					foreach($valeurs as $valeur) $champs=array_merge($champs,$this->notice_sgbd->getValeursBloc($valeur));
-					$champs=array_unique($champs);
-					$champs_forces[$zone][]=$this->notice_sgbd->makeZoneByValeurs(substr($valeurs[0],0,2),"a",$champs);
-				}
-			}
-			// On remet les nouvelles zones
-			foreach($champs_forces as $zone => $valeurs)
-			{
-				foreach($valeurs as $valeur) $this->notice_sgbd->add_zone($zone,$valeur);
-			}
-			$this->notice["unimarc"]=$this->notice_sgbd->update();
-
-			// On reprend les titres et les matieres
-			$this->notice=$this->notice_sgbd->getNoticeIntegration();
-			$this->notice["statut_exemplaires"] = $statut_exemplaires;
-			$this->notice["exemplaires"] = $exemplaires;
-			$this->notice["warnings"] = $warnings;
-			$this->notice["qualite"]=$qualite;
-			$this->notice["id_origine"]=$id_origine;
-			$this->statut=3;
-		}
-		// Recup des facettes
-		//		$this->notice["facettes"]=$sql->fetchOne("select facettes from notices where id_notice=$id_notice");
-		if($this->statut == 4) return $id_notice;
+		$this->notice_sgbd->ouvrirNotice($unimarc, 0);
+		$champs_forces = $this->notice_sgbd->getChampsForces();
+
+		$id_origine = $this->notice["id_origine"];
+		$qualite = $this->notice["qualite"];
+		$statut_exemplaires = $this->notice["statut_exemplaires"];
+		$exemplaires = $this->notice["exemplaires"];
+		$warnings = $this->notice["warnings"];
+
+		// Si la notice de la base est de meilleure qualite on la prend
+		if ($this->statut == static::RECORD_RENEW)
+			$this->notice_sgbd->ouvrirNotice($this->notice["unimarc"], 0);
+
+		$this->updateForcedZones($champs_forces, $this->notice["champs_forces"]);
+		$this->notice = $this->notice_sgbd->getNoticeIntegration();
+		$this->notice["statut_exemplaires"] = $statut_exemplaires;
+		$this->notice["exemplaires"] = $exemplaires;
+		$this->notice["warnings"] = $warnings;
+		$this->notice["qualite"] = $qualite;
+		$this->notice["id_origine"] = $id_origine;
+
+		if ($this->statut == static::RECORD_UPDATE)
+			return $id_notice;
 
 		$this->traiteFacettes();
 
-		// Qualité égale ou zones forcees : on update
-		$sql->update("update notices set @SET@ Where id_notice=$id_notice", $this->noticeToDBEnreg($data));
+		Class_Notice::find($id_notice)
+			->updateAttributes($this->noticeToDBEnreg())
+			->save();
 		return $id_notice;
 	}
+
+
+	protected function updateForcedZones($existing, $current) {
+		if (!$existing || $existing == $current)
+			return;
+
+		$new = ($current) ?
+			array_merge_recursive($existing, $current) :
+			$existing;
+
+		// Fusion des champs forces
+		$champs_forces = [];
+		foreach ($new as $zone => $valeurs) {
+			$zone = substr($zone, 1); // on retire le Z qui sert au array_merge_recursive
+			$this->notice_sgbd->delete_field($zone); // On supprime l'ancienne zone
+			// si champ matiere on dedoublonne directement
+			if ('6' == substr($zone, 0, 1)) {
+				$champs = array_unique($valeurs);
+				$champs_forces[$zone] = $champs;
+				continue;
+			}
+			// sinon on decoupe les elements on les dedoublonne et on les remet dans 1 seule zone
+			$champs=array();
+			foreach($valeurs as $valeur)
+				$champs = array_merge($champs, $this->notice_sgbd->getValeursBloc($valeur));
+			$champs = array_unique($champs);
+			$champs_forces[$zone][] = $this->notice_sgbd->makeZoneByValeurs(substr($valeurs[0],0,2),"a",$champs);
+		}
+
+		// On remet les nouvelles zones
+		foreach($champs_forces as $zone => $valeurs)
+			foreach($valeurs as $valeur)
+			$this->notice_sgbd->add_zone($zone,$valeur);
+
+		$this->statut = 3;
+	}
+
+
 // --------------------------------------------------------------------------------
 // Suppression de notice (ne supprime pas l'enreg notice)
 // --------------------------------------------------------------------------------
@@ -749,7 +747,7 @@ class notice_integration
 			 * we can have one file with items for different libraries. We use "annexe" codification to find
 			 * to put each item in the library it belongs to.
 			 **/
-			if ($exemplaire->hasAnnexe() && ($annexe = Class_CodifAnnexe::findFirstBy(['code' => $ex['annexe']]) ) ) {
+			if ($exemplaire->hasAnnexe() && ($annexe =  CodifAnnexeCache::getInstance()->find($ex['annexe']))) {
 				$exemplaire->setIdBib($annexe->getIdBib());
 			}
 
@@ -803,6 +801,8 @@ class notice_integration
 
 	public function traiteFacettes() {
 		global $sql;
+
+		$facettes = [];
 		// Virer les facettes sauf les tags
 		$controle=explode(" ",$this->notice["facettes"]);
 		$this->notice["facettes"]="";
@@ -812,6 +812,12 @@ class notice_integration
 			if($tp =="Z") $this->notice["facettes"].=" ".$controle[$i];
 		}
 
+		if($type_doc = $this->notice['infos_type_doc']) {
+			if($code_type_doc = $type_doc['code']){
+				$facettes[] = 'T'.$code_type_doc;
+			}
+		}
+
 		// Dewey
 		if($this->notice["dewey"])
 		{
@@ -869,20 +875,26 @@ class notice_integration
 				$facettes[]="M".$id_matiere;
 			}
 		}
+
 		// Centres d'interet
-		if($this->notice["interet"])
-		{
-			foreach($this->notice["interet"] as $interet)
-			{
-				$code_alpha=$this->indexation->alphaMaj($interet);
-				if(!$code_alpha) continue;
-				$enreg=$sql->fetchEnreg("Select * from codif_interet where code_alpha='$code_alpha'");
-				if(!$enreg["id_interet"]) $id_interet=$sql->insert("codif_interet",array("libelle" => $interet,"code_alpha" => $code_alpha));
-				else $id_interet=$enreg["id_interet"];
-				$facettes[]="F".$id_interet;
-				$this->notice["full_dewey"].=$interet." ";
+		if ($this->notice["interet"]) {
+			foreach($this->notice["interet"] as $interet) {
+				$code_alpha = $this->indexation->alphaMaj($interet);
+				if (!$code_alpha)
+					continue;
+				$enreg = $sql->fetchEnreg("Select * from codif_interet where code_alpha='$code_alpha'");
+				if (!$enreg["id_interet"])
+					$id_interet = $sql->insert("codif_interet",
+																		 ["libelle" => $interet,
+																			"code_alpha" => $code_alpha]);
+				else
+					$id_interet = $enreg["id_interet"];
+
+				$facettes[] = "F".$id_interet;
+				$this->notice["full_dewey"] .= $interet." ";
 			}
 		}
+
 		// Langues
 		if($this->notice["langues"])
 		{
diff --git a/cosmogramme/php/classes/classe_profil_donnees.php b/cosmogramme/php/classes/classe_profil_donnees.php
index eec8d971c1fedf908e7b1dca7fee0754ae88120c..553b661502c6e81a189fb45282cf61aceee028ae 100644
--- a/cosmogramme/php/classes/classe_profil_donnees.php
+++ b/cosmogramme/php/classes/classe_profil_donnees.php
@@ -41,32 +41,25 @@ class profil_donnees
 	{
 		$this->varTypeDoc=getCodifsVariable("types_docs");
 	}
+
 //---------------------------------------------------------------------------------
 // Lit un profil et le decompresse
 //---------------------------------------------------------------------------------
-	public function lire($id_profil)
-	{
+	public function lire($id_profil)	{
 		// Profils d'homogeneisation : -1= isbn -2=ean
-		if($id_profil < 0)
-		{
+		if ($id_profil < 0) {
 			$this->getProfilStandard($id_profil);
 			return $id_profil;
 		}
-		// lire
-		global $sql;
-		$data=$sql->fetchEnreg("select * from profil_donnees where id_profil=$id_profil");
-		// si rien on initialise la structure
-		if(!$data)
-		{
-			// prendre l'unimarc standard si il existe
-			$test=$sql->fetchOne("select id_profil from profil_donnees where id_profil=1");
-			if($test == 1)
-			{
+
+		if (!$data = Class_IntProfilDonnees::find($id_profil)) {
+			if ($data = Class_IntProfilDonnees::find(1)) {
 				$this->lire(1);
 				$this->id_profil=0;
 				$this->libelle="** nouveau profil **";
 				return 0;
 			}
+
 			// Sinon on initialise a vide
 			$this->id_profil=0;
 			$this->libelle="** nouveau profil **";
@@ -78,54 +71,53 @@ class profil_donnees
 			$this->attributs=array();
 
 			// Init structure unimarc
-			foreach($this->varTypeDoc as $td)
-			{
+			foreach($this->varTypeDoc as $td)	{
 				$td["label"]=array();
 				$td["zone_995"]=array();
 				$this->attributs[0]["type_doc"][]=$td;
 			}
+			return 0;
 		}
-		else
-		{
-			$this->id_profil=$id_profil;
-			$this->libelle=$data["libelle"];
-			$this->accents=$data["accents"];
-			$this->rejet_periodiques=$data["rejet_periodiques"];
-			$this->id_article_periodique=$data["id_article_periodique"];
-			$this->type_fichier=$data["type_fichier"];
-			$this->format=$data["format"];
-			$this->attributs=unserialize($data["attributs"]);
 
-			// Decompacter et consolider les types de docs
-			$td=$this->attributs[0]["type_doc"];
-			for($i=0;$i < count($this->varTypeDoc); $i++)
+
+		$this->id_profil = $id_profil;
+		$this->libelle = $data->getLibelle();
+		$this->accents = $data->getAccents();
+		$this->rejet_periodiques = $data->getRejetPeriodiques();
+		$this->id_article_periodique = $data->getIdArticlePeriodique();
+		$this->type_fichier = $data->getTypeFichier();
+		$this->format = $data->getFormat();
+	  $this->attributs=unserialize($data->getAttributs());
+
+		// Decompacter et consolider les types de docs
+		$td=$this->attributs[0]["type_doc"];
+		for($i=0;$i < count($this->varTypeDoc); $i++)
 			{
 				$this->attributs[0]["type_doc"][$i]["code"]=$this->varTypeDoc[$i]["code"];
 				$this->attributs[0]["type_doc"][$i]["libelle"]=$this->varTypeDoc[$i]["libelle"];
 				$this->attributs[0]["type_doc"][$i]["label"] = array();
 				$this->attributs[0]["type_doc"][$i]["zone_995"] = array();
 				for($j=0; $j < count($td); $j++)
-				{
-					if($td[$j]["code"]==$this->varTypeDoc[$i]["code"])
 					{
-						$this->attributs[0]["type_doc"][$i]["label"]=explode(";",$td[$j]["label"]);
-						$this->attributs[0]["type_doc"][$i]["zone_995"]=explode(";",$td[$j]["zone_995"]);
-						break;
+						if($td[$j]["code"]==$this->varTypeDoc[$i]["code"])
+							{
+								$this->attributs[0]["type_doc"][$i]["label"]=explode(";",$td[$j]["label"]);
+								$this->attributs[0]["type_doc"][$i]["zone_995"]=explode(";",$td[$j]["zone_995"]);
+								break;
+							}
 					}
-				}
 			}
 
-			// decompacter et consolider champs xml
-			$xml=$this->attributs[5]["xml_champs_abonne"];
-			$champs=getCodifsVariable("champs_abonne");
-			foreach($champs as $champ)
-			{
-				$code=$champ["code"];
-				if($code !="NULL" and !isset($this->attributs[5]["xml_champs_abonne"][$code]))$this->attributs[5]["xml_champs_abonne"][$code]="";
-			}
+		// decompacter et consolider champs xml
+		$xml=$this->attributs[5]["xml_champs_abonne"];
+		$champs=getCodifsVariable("champs_abonne");
+		foreach($champs as $champ) {
+			$code=$champ["code"];
+			if($code !="NULL" and !isset($this->attributs[5]["xml_champs_abonne"][$code]))$this->attributs[5]["xml_champs_abonne"][$code]="";
 		}
 		return $this->id_profil;
 	}
+
 //---------------------------------------------------------------------------------
 // Renvoie toute la structure du profil
 //---------------------------------------------------------------------------------
@@ -200,7 +192,7 @@ class profil_donnees
 // Analyse d'un label et zones 995 pour determiner un type de doc
 //---------------------------------------------------------------------------------
 	public function getTypeDoc($label,$z995,$z995p)	{
-		if(strToUpper(trim($z995p[0]))=="P")
+		if($this->isknowAsSerieWith([$z995, $s995p]))
 			return ['code' => 2, 'libelle' => 'Périodiques'];
 
 		if ($this->isArticlePeriodique($label))
@@ -228,9 +220,13 @@ class profil_donnees
 
 
 	public function isTypeDocMatchLabel($label, $td) {
+		if (!trim($label))
+			return false;
+
 		foreach(array_filter($td["label"]) as $item) {
-			if (0 === strpos($label, $item))
+			if (0 === strpos($label, $item)) {
 				return true;
+			}
 		}
 		return false;
 	}
@@ -276,5 +272,15 @@ class profil_donnees
 			default: return false;
 		}
 	}
+
+
+
+	protected function isKnowAsSerieWith($codes = []) {
+		foreach($codes as $code) {
+			if(strToUpper(substr(trim($code[0]),0,1)) == "P")
+				return true;
+		}
+		return false;
+	}
 }
 ?>
\ No newline at end of file
diff --git a/cosmogramme/php/classes/classe_unimarc.php b/cosmogramme/php/classes/classe_unimarc.php
index 2452055a5f34905296abf10fa4df5057b3c28f12..6f2f727885c351ac80810903d942d0a6f6bf217c 100644
--- a/cosmogramme/php/classes/classe_unimarc.php
+++ b/cosmogramme/php/classes/classe_unimarc.php
@@ -25,6 +25,8 @@ require_once 'classe_dewey.php';
 require_once 'classe_pcdm4.php';
 require_once 'classe_indexation.php';
 require_once 'classe_isbn.php';
+require_once 'classe_codif_cache.php';
+
 
 class notice_unimarc extends iso2709_record {
 	private $id_profil;									// Id du profil de données pour le fichier chargé
@@ -79,7 +81,6 @@ class notice_unimarc extends iso2709_record {
 
 
 	public function getNoticeIntegration() {
-		// type de doc
 		$type_doc = $this->getTypeDoc(true);
 		if($type_doc['code'] == 100)
 			return $this->getNoticeIntegrationArticlePeriodique();
@@ -440,20 +441,18 @@ class notice_unimarc extends iso2709_record {
 	protected function isSectionInvisible($id) {
 		if (0==(int)$id)
 			return false;
-		return ($enreg = fetchEnreg('select * from codif_section where id_section=' . $id))
-						 && $enreg['invisible'] == 1;
+		return ($section = Class_CodifSection::find($id)) && ($section->getInvisible() == 1);
 	}
 
 
 	protected function isAnnexeInvisible($id) {
-		return ($enreg = fetchEnreg('select * from codif_annexe where code=\'' . $id . '\''))
-						 && $enreg['invisible'] == 1;
+		$annexe = CodifAnnexeCache::getInstance()->find($id);
+		return $annexe && !$annexe->isVisible();
 	}
 
 
 	protected function isEmplacementInvisible($id) {
-		return ($invisible = fetchOne('select ne_pas_afficher from codif_emplacement where id_emplacement=' . $id))
-						&& $invisible == 1;
+		return ($emplacement = Class_CodifEmplacement::find($id)) && ($emplacement->getInvisible() == 1);
 	}
 
 
@@ -797,13 +796,13 @@ class notice_unimarc extends iso2709_record {
 
 
 	public function getTypeDoc($infos=false) {
-		if($this->type_doc_force['label'] > '')
+		if($this->type_doc_force['label'])
 			$this->inner_guide['dt'] = $this->type_doc_force['label'];
-		$label = $this->inner_guide['dt'] . $this->inner_guide['bl'];
 
+		$label = $this->inner_guide['dt'] . $this->inner_guide['bl'];
 		$champ_code_barres = $this->profil['attributs'][0]['champ_code_barres'];
 
-		if ($this->profil['attributs'][0]['champ_type_doc'] > '') {
+		if ($this->profil['attributs'][0]['champ_type_doc']) {
 			$zone = (strlen($champ_code_barres) == 3) ? $champ_code_barres : '995';
 			$z995r = $this->get_subfield($zone,
 																	 $this->profil['attributs'][0]['champ_type_doc']);
@@ -1092,10 +1091,10 @@ class notice_unimarc extends iso2709_record {
 
 
 	public function getCentreInteret() {
-		$zone_interet = ($this->sigbIs1Or13()) ?
+		$zone_interet = (!$this->profil['attributs'][6]['zone']) ?
 			'932' : $this->profil['attributs'][6]['zone'];
 
-		$champ_interet = ($this->sigbIs1Or13()) ?
+		$champ_interet = (!$this->profil['attributs'][6]['champ']) ?
 			'a' : $this->profil['attributs'][6]['champ'];
 
 		if(!trim($zone_interet))
@@ -1288,15 +1287,15 @@ class notice_unimarc extends iso2709_record {
 
 	private function extractRegles() {
 		foreach(['section', 'genre', 'emplacement'] as $type) {
-			$enregs = fetchAll('select * from codif_' . $type);
-			if (!$enregs)
+			$classname = 'Class_Codif'.ucfirst($type);
+			if (!$enregs = $classname::findAll())
 				continue;
 
 			foreach ($enregs as $enreg) {
-				if (!$enreg['regles'])
+				if (!$regles = $enreg->getRegles())
 					continue;
 
-				$regles = explode("\n", $enreg['regles']);
+				$regles = explode("\n", $regles);
 				foreach ($regles as $regle) {
 					$zone = substr($regle, 0, 5);
 					$signe = substr($regle, 5, 1);
@@ -1304,7 +1303,7 @@ class notice_unimarc extends iso2709_record {
 					foreach ($valeurs as $valeur) {
 						$valeur = trim($valeur);
 						if ('' != $valeur)
-							$ret[$zone][$type][$signe][$valeur] = $enreg['id_' . $type];
+							$ret[$zone][$type][$signe][$valeur] = $enreg->getId();
 					}
 				}
 			}
diff --git a/cosmogramme/php/config_profil_donnees.php b/cosmogramme/php/config_profil_donnees.php
index 631efe8328793de3a5215541aaf0248f25f9959f..7661379536a651752f21a92ba2d0947821afd867 100644
--- a/cosmogramme/php/config_profil_donnees.php
+++ b/cosmogramme/php/config_profil_donnees.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 ///////////////////////////////////////////////////////////////////
 //
@@ -31,7 +31,7 @@ $oProfil = new profil_donnees();
 ?>
 
 <h1>Profils de données</h1>
- 
+
 <?PHP
 
 //---------------------------------------------------------------------------------
@@ -97,7 +97,7 @@ if($_REQUEST["action"]=="SUPPRIMER")
 }
 
 //---------------------------------------------------------------------------------
-// LISTE 
+// LISTE
 //---------------------------------------------------------------------------------
 print('<div class="liste">');
 
@@ -137,7 +137,7 @@ function afficherProfil($profil,$display)
 	$event='onChange="activerFormat(\''.$profil["id_profil"].'\')"';
 	print('<tr><td class="form" align="right" width="40%">Type de fichier</td><td class="form">'.getComboCodif("type_fichier","type_fichier",$profil["type_fichier"],$event).'</td></tr>');
 	print('<tr><td class="form" align="right" width="40%">Format de fichier</td><td class="form">'.getComboCodif("format","import_format",$profil["format"],$event).'</td></tr>');
-	
+
 	// Selon format
 	print('<tr><td class="form" colspan="2">');
 	paveUnimarcNotice($profil);
@@ -155,7 +155,7 @@ function afficherProfil($profil,$display)
 }
 
 function paveUnimarcNotice($profil)
-{	
+{
 	$id_profil=$profil["id_profil"];
 	if($profil["type_fichier"]==0 and ($profil["format"] == 0 or $profil["format"] == 6)) $display="block"; else $display="none";
 	print('<div id="unimarc_0" style="display:'.$display.'">');
@@ -164,7 +164,7 @@ function paveUnimarcNotice($profil)
 	// Types de docs
 	print('<tr><th class="form" align="left" colspan="2">Types de documents</th></tr>');
 	print('<tr><td class="form" align="left" colspan="2">');
-	
+
 	print('<div class="form" style="width:450px;margin-left:30px;margin-top:10px;margin-bottom:10px">');
 	print('<table class="form" cellspacing="0" cellpadding="5">');
 	print('<tr>');
@@ -195,9 +195,9 @@ function paveUnimarcNotice($profil)
 
 	// Indexation
 	print('<tr><th class="form" align="left" colspan="2">Indexation</th></tr>');
-	print('<tr><td class="form" align="right">Centre d\'intérêt : Zone / champ</td><td class="form">'.getChamp("interet_zone",$profil["attributs"][6]["zone"],3).'&nbsp;$&nbsp;'.getChamp("interet_champ",$profil["attributs"][6]["champ"],1).'</td></tr>');
+	print('<tr><td class="form" align="right">Centre d\'intérêt : Zone / champ</td><td class="form">'.getChamp("interet_zone",$profil["attributs"][6]["zone"],3).'&nbsp;$&nbsp;'.getChamp("interet_champ",$profil["attributs"][6]["champ"],1).' <span>932$a par défaut</span></td></tr>');
+
 
-	
 	// exemplaires
 	print('<tr><th class="form" align="left" colspan="2">Champs exemplaires</th></tr>');
 	print('<tr><td class="form_first" align="right" width="50%">Prendre le code-barres en</td><td class="form_first">'.getComboCodif("champ_code_barres","champ_code_barres",$profil["attributs"][0]["champ_code_barres"]).'</td></tr>');
@@ -207,7 +207,7 @@ function paveUnimarcNotice($profil)
 	print('<tr><td class="form" align="right">Genre</td><td class="form">'.getComboChampsExemplaires("champ_genre",$profil["attributs"][0]["champ_genre"]).'</td></tr>');
 	print('<tr><td class="form" align="right">Emplacement</td><td class="form">'.getComboChampsExemplaires("champ_emplacement",$profil["attributs"][0]["champ_emplacement"]).'</td></tr>');
 	print('<tr><td class="form" align="right">Annexe</td><td class="form">'.getComboChampsExemplaires("champ_annexe",$profil["attributs"][0]["champ_annexe"]).'</td></tr>');
-	
+
 	// date de nouveauté
 	print('<tr><th class="form" align="left" colspan="2">Date de nouveauté</th></tr>');
 	print('<tr><td class="form" align="right">Zone / champ</td><td class="form">'.getChamp("nouveaute_zone",$profil["attributs"][4]["zone"],3).'&nbsp;$&nbsp;'.getChamp("nouveaute_champ",$profil["attributs"][4]["champ"],1).'</td></tr>');
@@ -230,12 +230,12 @@ function paveUnimarcFichier($profil)
 }
 
 function paveAscii($profil)
-{	
+{
 	$id_profil=$profil["id_profil"];
 	$format=$profil["format"];
 	if( $format > 0 and $format !=4 and $format !=6) $display="block"; else $display="none";
 	print('<div id="ascii" style="display:'.$display.';">');
-	
+
 	print('<table class="form" width="100%" cellspacing="0" cellpadding="5">');
 	print('<tr><th class="form" colspan="2" align="left">Champs</th></tr>');
 	print('<tr><td class="form_first" colspan="2">');
@@ -264,7 +264,7 @@ function paveAscii($profil)
 	print('<input type="hidden" name="champs" id="'.$id_champ.'" value="'.$profil["attributs"][$format]["champs"].'">');
 	print('</td>');
 	print('</tr>');
-	
+
 	print('</table></div>');
 }
 
@@ -281,7 +281,7 @@ function paveXml($profil)
 	// ecran format pas supporté
 	if($type_fichier != 1) $display="block"; else $display="none";
 	print('<div id="xml_pas_supporte" style="display:'.$display.';padding:50px"><b>Le format Xml n\'est pas supporté pour ce type de fichier</b></div>');
-	
+
 	// Abonnés
 	print('<table class="form" id="xml_abonne" width="100%" cellspacing="0" cellpadding="5">');
 	print('<tr><th class="form" colspan="2" align="left">Description des champs</th></tr>');
diff --git a/cosmogramme/php/fonctions/objets_saisie.php b/cosmogramme/php/fonctions/objets_saisie.php
index e5c3c876886ee201d8c3456d85f6f3fcbe620cff..6bbe3ffd33573d666891e0c5dd90fcd107aeee48 100644
--- a/cosmogramme/php/fonctions/objets_saisie.php
+++ b/cosmogramme/php/fonctions/objets_saisie.php
@@ -103,7 +103,7 @@ function getBlocsParams($id_bib, $type, $valeurs) {
 														 }]];
 
 		if ($clef == COM_OPSYS)
-			$champs_params[0] = ['url_serveur', 'catalogue_web'];
+			$champs_params[0] = ['url_serveur', 'catalogue_web', 'reserver_retrait_bib_abonne'];
 
 		if ($clef == COM_DYNIX)
 			$champs_params[0] = ['url_serveur', 'client_id'];
diff --git a/cosmogramme/php/integre_traite_main.php b/cosmogramme/php/integre_traite_main.php
index 12272f1e7fd71a682ca180125d660ba40822d33c..9ff462ef76ca44cc72a8125203e8a7f9aad08863 100644
--- a/cosmogramme/php/integre_traite_main.php
+++ b/cosmogramme/php/integre_traite_main.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 /////////////////////////////////////////////////////////////////////////
@@ -30,14 +30,14 @@ if ($argc == 3 or $argc==4) {
 	$user = $argv[1];
 	$passe = $argv[2];
 	$cron_a_traiter=$argv[3];
-	if (!$cron_a_traiter) 
+	if (!$cron_a_traiter)
 		$cron_a_traiter = 'all';
 	$mode_cron = true;
 }
 include '_init_frame.php';
 
 // Includes
-if ($mode_cron == true) 
+if ($mode_cron == true)
 	setVariable('clef_traitements', '0');	// en mode cron : on debloque la base
 require_once 'classe_chronometre.php';
 require_once 'classe_parseur.php';
@@ -65,7 +65,7 @@ $compteur = [];
 $date = dateDuJour(0);
 $nb_notices = 0;
 $timeout = intval(ini_get("max_execution_time") * 0.75);
-if (!$timeout) 
+if (!$timeout)
 	$timeout = 25; // Pour le debugger
 $timeStart = time();
 $chrono->start();
@@ -93,9 +93,9 @@ if ($_REQUEST['reprise'] == 'oui') {
 	$log->ecrire('<h4>Début du traitement</h4>');
 	$log->ecrire('Date : ' . date('d-m-Y') . BR);
 	$log->ecrire('Heure : ' . date('G:i:s') . BR);
-	$log->ecrire('Mode : ' 
-							 . (($mode_cron == true) ? 'automatique (cron)' : 'manuel') 
-							 . BR); 
+	$log->ecrire('Mode : '
+							 . (($mode_cron == true) ? 'automatique (cron)' : 'manuel')
+							 . BR);
 
 	if ($cron_a_traiter > '') {
 		$txt = ['all' => 'tous types d\'imports',
@@ -120,33 +120,33 @@ if ($_REQUEST['reprise'] == 'oui') {
 	$transfert = new maj_auto();
 	$erreur = $transfert->transfertfichiersFtp();
 	if ($erreur) {
-		$log->ecrire(BR . BR 
+		$log->ecrire(BR . BR
 								 . '<span class="rouge">' . $erreur . ' : Abandon du traitement !</span><br>');
 		exit;
 	}
 	setVariable('integration_date', $date);
 	$transfert->supprimerEntetesPergame();
-	
+
 	// ----------------------------------------------------------------
 	// controle si on doit sortir en cas d'import total
 	// ----------------------------------------------------------------
 	if ($cron_a_traiter > '' and $cron_a_traiter != 'all') {
-		$controle = fetchOne("select count(*) from integrations,profil_donnees 
-				Where integrations.profil=profil_donnees.id_profil 
-				and traite='non' 
-				and type_operation=2 
+		$controle = fetchOne("select count(*) from integrations,profil_donnees
+				Where integrations.profil=profil_donnees.id_profil
+				and traite='non'
+				and type_operation=2
 				and type_fichier=0");
 
 		if ($cron_a_traiter == 'inc' and $controle > 0) {
 			$erreur = 'Il y a un import total à traiter et le cron demande de ne traiter que les imports incrementiels';
-			$log->ecrire(BR . BR 
+			$log->ecrire(BR . BR
 									 . '<span class="rouge">' . $erreur . ' : Abandon du traitement !</span><br>');
 			exit;
 		}
 
 		if ($cron_a_traiter == 'tot' and $controle == 0) {
 			$erreur = 'Il n\'y aucun import total à traiter et le cron demande de ne traiter que les imports totaux';
-			$log->ecrire(BR . BR 
+			$log->ecrire(BR . BR
 									 . '<span class="rouge">' . $erreur . ' : Abandon du traitement !</span><br>');
 			exit;
 		}
@@ -247,7 +247,7 @@ while ($ligne = $sql->fetchNext($resultat)) {
 				$log->ecrire(BR . '<span class="vert">' . $nb_notices . ' notices ont été traitées.</span>');
 				$msg = "temps de traitement " . $chrono_fichier->end() . " (" . $chrono_fichier->moyenne($nb_notices, "notices") . ")";
 			}
-			$log->ecrire(BR . '<span class="vert">' . $msg . '</span><br>');			
+			$log->ecrire(BR . '<span class="vert">' . $msg . '</span><br>');
 			break;
 		}
 
@@ -422,33 +422,43 @@ if ($phase == 4 and $ecart >= $frequence and $homogene_actif == 1)
 		$log->ecrire('<span class="vert">Mode de recherche sur les serveurs z39.50 : ' . getLibCodifVariable("Z3950_cache_only", $homogene_cache_only) . '</span>' . BR);
 	}
 	$result = $sql->prepareListe("select id_notice,isbn from notices where isbn > '" . $phase_data["isbn"] . "' and qualite < $qualite_homogene and z3950_retry <= $Z3950_retry_level order by isbn");
-	while ($data = $sql->fetchNext($result))
-	{
-		while (true)
-		{
-			if (!$mode_cron and ($chrono->tempsPasse() + $ret["timeout"]) > $timeout) sauveContexte();
-			$ret = $notice->traiteHomogene($data["id_notice"], $data["isbn"], "", "", $homogene_cache_only);
-			traceHomogene($data["id_notice"], $data["isbn"], "", "");
-			if ($ret["statut"] != "erreur" and $ret["statut_z3950"] > 0)
+	try {
+		while ($data = $sql->fetchNext($result))
 			{
-				$phase_data["nb_reconnexions"] = 0;
-				break;
+				while (true)
+					{
+						if (!$mode_cron and ($chrono->tempsPasse() + $ret["timeout"]) > $timeout) sauveContexte();
+						$ret = $notice->traiteHomogene($data["id_notice"], $data["isbn"], "", "", $homogene_cache_only);
+						traceHomogene($data["id_notice"], $data["isbn"], "", "");
+						if ($ret["statut"] != "erreur" and $ret["statut_z3950"] > 0)
+							{
+								$phase_data["nb_reconnexions"] = 0;
+								break;
+							}
+
+						// Tentatives de reconnexion
+						$phase_data["nb_reconnexions"]++;
+						if ($phase_data["nb_reconnexions"] >= $Z3950_max_reconnect)
+							{
+								$log->ecrire(BR . '<span class="rouge">Abandon du traitement : maximum de tentatives de reconnexions atteint</span>' . BR);
+								$fin = true;
+								break;
+							}
+						sleep(5);
+					}
+				if ($fin == true) break;
+				$phase_data["isbn"] = $data["isbn"];
+				$phase_data["nombre"]++;
 			}
+	} catch (PDOException $e) {
+			$log->ecrire('PDOException'.$e);
+			$cosmo_path = new CosmoPaths();
+			$site = '/' . $cosmo_path->getSite() . '/';
+			$cfgfile = $cosmo_path->getConfigPath();
+			$cfg=lireConfig($cfgfile);
+			$sql = new sql($cfg["integration_server"],$cfg["integration_user"],$cfg["integration_pwd"],$cfg["integration_base"]);
 
-			// Tentatives de reconnexion
-			$phase_data["nb_reconnexions"]++;
-			if ($phase_data["nb_reconnexions"] >= $Z3950_max_reconnect)
-			{
-				$log->ecrire(BR . '<span class="rouge">Abandon du traitement : maximum de tentatives de reconnexions atteint</span>' . BR);
-				$fin = true;
-				break;
-			}
-			sleep(5);
 		}
-		if ($fin == true) break;
-		$phase_data["isbn"] = $data["isbn"];
-		$phase_data["nombre"]++;
-	}
 	afficherRecapHomogene($phase_data, $chrono);
 }
 // ----------------------------------------------------------------
diff --git a/cosmogramme/sql/patch/patch_215.sql b/cosmogramme/sql/patch/patch_215.sql
deleted file mode 100644
index c548c87628a25f3d08783ad2d3ca34cee7b4b5f5..0000000000000000000000000000000000000000
--- a/cosmogramme/sql/patch/patch_215.sql
+++ /dev/null
@@ -1 +0,0 @@
-alter table bib_c_site add column MAIL_SUGGESTIONS varchar(150) null default null AFTER MAIL;
diff --git a/cosmogramme/sql/patch/patch_219.sql b/cosmogramme/sql/patch/patch_219.sql
new file mode 100644
index 0000000000000000000000000000000000000000..7e42965630d4b145c4a3de7986e31842069faf0f
--- /dev/null
+++ b/cosmogramme/sql/patch/patch_219.sql
@@ -0,0 +1,10 @@
+select count(*) into @exist from information_schema.columns 
+where table_schema = database()
+and COLUMN_NAME= 'MAIL_SUGGESTIONS'
+and table_name = 'bib_c_site';
+
+set @query =  IF(@exist <= 0 , 'ALTER TABLE bib_c_site add column MAIL_SUGGESTIONS varchar(150) null default null AFTER MAIL','select \'Column Exists\' status');
+
+prepare stmt from @query;
+
+EXECUTE stmt;
diff --git a/cosmogramme/tests/php/classes/NoticeIntegrationTest.php b/cosmogramme/tests/php/classes/NoticeIntegrationTest.php
index da2846080e8facc326cfedfeb98def8955c5e8f0..898d60ae4a061c32d96d7c0889efe6da29c2c3b9 100644
--- a/cosmogramme/tests/php/classes/NoticeIntegrationTest.php
+++ b/cosmogramme/tests/php/classes/NoticeIntegrationTest.php
@@ -46,6 +46,9 @@ abstract class NoticeIntegrationTestCase extends ModelTestCase {
 
 		$req_profils = 'select * from profil_donnees where id_profil='.$this->_profil_donnees['id_profil'];
 
+		$this->fixture('Class_IntProfilDonnees',
+									 $this->_profil_donnees);
+
 		$this->_mock_sql
 			->whenCalled('fetchEnreg')
 			->with($req_profils)
@@ -343,7 +346,13 @@ class NoticeIntegrationLollipopGeneratedNoticeRecordTest extends NoticeIntegrati
 
 	/** @test */
 	public function codeAlphaShouldBeLollipop() {
-		$this->assertEquals('LOLLIPOP--NOSTLINGERC--ECOLEDESLOISIRS-1987-0', $this->notice_data['clef_alpha']);
+		$this->assertEquals('LOLLIPOP--NOSTLINGERC--ECOLEDESLOISIRS-1987-1', $this->notice_data['clef_alpha']);
+	}
+
+
+	/** @test */
+	public function typeDocShouldBeBook() {
+		$this->assertEquals(Class_TypeDoc::LIVRE, $this->notice_data['type_doc']);
 	}
 
 
@@ -393,23 +402,20 @@ abstract class NoticeIntegrationMarc21ToUnimarcTest extends NoticeIntegrationTes
 
 class NoticeIntegrationMarc21CoupCavalierToUnimarcTest extends NoticeIntegrationTestCase {
 	protected $_profil_donnees = ['id_profil' => 150,
-	'libelle' => 'MARC21 Dynix',
-	'accents' => '4',
-	'rejet_periodiques' =>  '1',
-	'id_article_periodique' => '0',
-	'type_fichier' => '0',
-	'format' => '6',
-	'attributs' => 'a:7:{i:0;a:8:{s:8:"type_doc";a:12:{i:0;a:3:{s:4:"code";s:1:"0";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}i:1;a:3:{s:4:"code";s:1:"1";s:5:"label";s:5:"am;na";s:8:"zone_995";s:22:"LIV;MS;LDV;LVI;LV;LIVC";}i:2;a:3:{s:4:"code";s:1:"2";s:5:"label";s:2:"as";s:8:"zone_995";s:12:"PER;REVC;REV";}i:3;a:3:{s:4:"code";s:1:"3";s:5:"label";s:3:"i;j";s:8:"zone_995";s:17:"CD;LIVCD;LIVK7;K7";}i:4;a:3:{s:4:"code";s:1:"4";s:5:"label";s:1:"g";s:8:"zone_995";s:25:"DIAPO;DVD;VHS;VHD;VD;DVDJ";}i:5;a:3:{s:4:"code";s:1:"5";s:5:"label";s:3:"l;m";s:8:"zone_995";s:3:"CDR";}i:6;a:3:{s:4:"code";s:1:"7";s:5:"label";s:0:"";s:8:"zone_995";s:7:"LCA;LCD";}i:7;a:3:{s:4:"code";s:1:"8";s:5:"label";s:0:"";s:8:"zone_995";s:3:"DOS";}i:8;a:3:{s:4:"code";s:1:"9";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}i:9;a:3:{s:4:"code";s:2:"10";s:5:"label";s:0:"";s:8:"zone_995";s:6:"WEB;MF";}i:10;a:3:{s:4:"code";s:2:"11";s:5:"label";s:0:"";s:8:"zone_995";s:2:"JV";}i:11;a:3:{s:4:"code";s:3:"100";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}}s:17:"champ_code_barres";s:3:"999";s:10:"champ_cote";s:1:"k";s:14:"champ_type_doc";s:1:"r";s:11:"champ_genre";s:0:"";s:13:"champ_section";s:1:"z";s:17:"champ_emplacement";s:1:"u";s:12:"champ_annexe";s:1:"b";}i:1;a:1:{s:6:"champs";s:0:"";}i:2;a:1:{s:6:"champs";s:0:"";}i:3;a:1:{s:6:"champs";s:0:"";}i:5;a:3:{s:6:"champs";s:0:"";s:17:"xml_balise_abonne";s:0:"";s:17:"xml_champs_abonne";a:11:{s:6:"IDABON";s:0:"";s:9:"ORDREABON";s:0:"";s:3:"NOM";s:0:"";s:6:"PRENOM";s:0:"";s:9:"NAISSANCE";s:0:"";s:8:"PASSWORD";s:0:"";s:4:"MAIL";s:0:"";s:10:"DATE_DEBUT";s:0:"";s:8:"DATE_FIN";s:0:"";s:7:"ID_SIGB";s:0:"";s:9:"NUM_CARTE";s:0:"";}}i:4;a:5:{s:4:"zone";s:3:"995";s:5:"champ";s:1:"v";s:6:"format";s:1:"3";s:5:"jours";s:0:"";s:7:"valeurs";s:1:"n";}i:6;a:2:{s:4:"zone";s:3:"901";s:5:"champ";s:1:"a";}}'];
+																'libelle' => 'MARC21 Dynix',
+																'accents' => '4',
+																'rejet_periodiques' =>  '1',
+																'id_article_periodique' => '0',
+																'type_fichier' => '0',
+																'format' => '6',
+																'attributs' => 'a:7:{i:0;a:8:{s:8:"type_doc";a:12:{i:0;a:3:{s:4:"code";s:1:"0";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}i:1;a:3:{s:4:"code";s:1:"1";s:5:"label";s:5:"am;na";s:8:"zone_995";s:22:"LIV;MS;LDV;LVI;LV;LIVC";}i:2;a:3:{s:4:"code";s:1:"2";s:5:"label";s:2:"as";s:8:"zone_995";s:12:"PER;REVC;REV";}i:3;a:3:{s:4:"code";s:1:"3";s:5:"label";s:3:"i;j";s:8:"zone_995";s:17:"CD;LIVCD;LIVK7;K7";}i:4;a:3:{s:4:"code";s:1:"4";s:5:"label";s:1:"g";s:8:"zone_995";s:25:"DIAPO;DVD;VHS;VHD;VD;DVDJ";}i:5;a:3:{s:4:"code";s:1:"5";s:5:"label";s:3:"l;m";s:8:"zone_995";s:3:"CDR";}i:6;a:3:{s:4:"code";s:1:"7";s:5:"label";s:0:"";s:8:"zone_995";s:7:"LCA;LCD";}i:7;a:3:{s:4:"code";s:1:"8";s:5:"label";s:0:"";s:8:"zone_995";s:3:"DOS";}i:8;a:3:{s:4:"code";s:1:"9";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}i:9;a:3:{s:4:"code";s:2:"10";s:5:"label";s:0:"";s:8:"zone_995";s:6:"WEB;MF";}i:10;a:3:{s:4:"code";s:2:"11";s:5:"label";s:0:"";s:8:"zone_995";s:2:"JV";}i:11;a:3:{s:4:"code";s:3:"100";s:5:"label";s:0:"";s:8:"zone_995";s:0:"";}}s:17:"champ_code_barres";s:3:"999";s:10:"champ_cote";s:1:"k";s:14:"champ_type_doc";s:1:"r";s:11:"champ_genre";s:0:"";s:13:"champ_section";s:1:"z";s:17:"champ_emplacement";s:1:"u";s:12:"champ_annexe";s:1:"b";}i:1;a:1:{s:6:"champs";s:0:"";}i:2;a:1:{s:6:"champs";s:0:"";}i:3;a:1:{s:6:"champs";s:0:"";}i:5;a:3:{s:6:"champs";s:0:"";s:17:"xml_balise_abonne";s:0:"";s:17:"xml_champs_abonne";a:11:{s:6:"IDABON";s:0:"";s:9:"ORDREABON";s:0:"";s:3:"NOM";s:0:"";s:6:"PRENOM";s:0:"";s:9:"NAISSANCE";s:0:"";s:8:"PASSWORD";s:0:"";s:4:"MAIL";s:0:"";s:10:"DATE_DEBUT";s:0:"";s:8:"DATE_FIN";s:0:"";s:7:"ID_SIGB";s:0:"";s:9:"NUM_CARTE";s:0:"";}}i:4;a:5:{s:4:"zone";s:3:"995";s:5:"champ";s:1:"v";s:6:"format";s:1:"3";s:5:"jours";s:0:"";s:7:"valeurs";s:1:"n";}i:6;a:2:{s:4:"zone";s:3:"901";s:5:"champ";s:1:"a";}}'];
+
 	public function setUp() {
 		parent::setUp();
 
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_section', false)
-			->answers([
-				['id_section' => 2,
-				'regles' => '996$z=ADU']
-			]);
+		$this->fixture('Class_CodifSection',
+									 ['id' => 2,
+										'regles' => '996$z=ADU']);
 
 		$this->notice_marc21 = new notice_marc21();
 		$this->notice_marc21->ouvrirNotice(file_get_contents(dirname(__FILE__)."/marc21_coup_cavalier.txt"), $this->_profil_donnees['id_profil']);
@@ -467,17 +473,18 @@ class NoticeIntegrationBourdieuWithElectreGeneratedNoticeRecordTest extends Noti
 	public function setUp() {
 		parent::setUp();
 
-		Codif_langue::getInstance()->setCodif(['fre' => ['id_langue' => 'fre',
-			'libelle' => 'français']]);
+		Codif_langue::getInstance()
+			->setCodif(['fre' => ['id_langue' => 'fre',
+														'libelle' => 'français']]);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_CodifThesaurus')
-
 			->whenCalled('findByIdOrigineAndCode')
-			->with('T380500', 'th'.chr(0xC1).'emeelectre')
-			->answers(Class_CodifThesaurus::newInstanceWithId('2222',
-			['id_thesaurus'=>'AAAA0001222'])
-			->setCode('themeelectre')
-			->setLibelle('Modes de vie et comportements selon les pays'))
+			->with('T380500', 'thèmeelectre')
+			->answers($this->fixture('Class_CodifThesaurus',
+															 ['id' => '2222',
+																'id_thesaurus'=>'AAAA0001222',
+																'code' => 'themeelectre',
+																'libelle' => 'Modes de vie et comportements selon les pays']))
 
 			->whenCalled('findByIdOrigineAndCode')
 			->with('GDOC005', 'genreelectre')
@@ -485,11 +492,11 @@ class NoticeIntegrationBourdieuWithElectreGeneratedNoticeRecordTest extends Noti
 
 			->whenCalled('findByIdOrigineAndCode')
 			->with('PS0100', 'publicelectre')
-			->answers(Class_CodifThesaurus::newInstanceWithId('88',
-			['id_thesaurus' => 'AAAA88'])
-			->setCode('publicelectre')
-			->setLibelle('Public motivé'))
-
+			->answers($this->fixture('Class_CodifThesaurus',
+															 ['id' => '88',
+																'id_thesaurus' => 'AAAA88',
+																'code' => 'publicelectre',
+																'libelle' => 'Public motivé']))
 			->beStrict();
 
 
@@ -591,14 +598,10 @@ class NoticeIntegrationBienveillantesTest extends NoticeIntegrationTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_emplacement', false)
-			->answers([
-				['id_emplacement' => 2,
-				'regles' => '995$l=RES']
-			])
-			;
+		$this->fixture('Class_CodifEmplacement',
+									 ['id' => 2,
+										'libelle' => 'Reserve',
+										'regles' => '995$l=RES']);
 		$this->loadNotice("unimarc_bienveillantes");
 	}
 
@@ -844,29 +847,26 @@ class NoticeIntegrationDimancheALaPiscineTest extends NoticeIntegrationTestCase
 	public function setUp() {
 		parent::setUp();
 		$this->notice_sgbd=new notice_unimarc();
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_emplacement', false)
-			->answers([
-				['id_emplacement' => 54,
-				'regles' => '995$u=Littératureadulte']])
-
-			->whenCalled('fetchAll')
-			->with('select * from codif_section', false)
-			->answers([
-				['id_section' => 2,
-				'regles' => '995$q=A']])
-
-			->whenCalled('fetchAll')
-			->with('select * from codif_genre', false)
-			->answers([
-									['id_genre' => 8,
-									 'regles' => '902$a=Roman']]);
-
-		$this->fixture('Class_CodifAnnexe', [
-			'code' => 'A',
-			'libelle' => 'Antibes',
-			'id_bib' => 4]);
+
+		$this->fixture('Class_CodifEmplacement',
+									 ['id' => 54,
+										'libelle' => 'adulte',
+										'regles' => '995$u=Littératureadulte']);
+
+		$this->fixture('Class_CodifSection',
+									 ['id' => 2,
+										'libelle' => 'adulte',
+										'regles' => '995$q=A']);
+
+		$this->fixture('Class_CodifGenre',
+									 ['id' => 8,
+										'libelle' => 'roman',
+										'regles' => '902$a=Roman']);
+
+		$this->fixture('Class_CodifAnnexe', ['code' => 'A',
+																				 'libelle' => 'Antibes',
+																				 'id_bib' => 4,
+																				 'invisible' => 0]);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Exemplaire');
 		$this->loadNotice("unimarc_dimanche_a_la_piscine");
@@ -1018,18 +1018,17 @@ class NoticeIntegrationItemsIn999Test extends NoticeIntegrationTestCase {
 	public function setUp() {
 		parent::setUp();
 
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_section', false)
-			->answers([
-				['id_section' => 2,  'regles' => '996$z=ENF']
-			])
-
-			->whenCalled('fetchAll')
-			->with('select * from codif_emplacement', false)
-			->answers([
-				['id_emplacement' => 54, 'regles' => '996$l=07MJENF']
-			]);
+		$this->fixture('Class_CodifSection',
+									 ['id' => 2,
+										'libelle' => 'enfants',
+										'regles' => '996$z=ENF']);
+
+
+		$this->fixture('Class_CodifEmplacement',
+									 ['id' => 54,
+										'libelle' => 'enfants',
+										'regles' => '996$l=07MJENF']);
+
 
 		$this->loadNotice('unimarc_items_in_996');
 	}
@@ -1083,23 +1082,16 @@ class NoticeIntegrationItemsIn852Test extends NoticeIntegrationTestCase {
 	public function setUp() {
 		parent::setUp();
 
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_section', false)
-			->answers([
-									['id_section' => 2,
-									 'regles' => '852$q=AVJE'],
-									['id_section' => 3,
-									 'invisible' => 1,
-									 'regles' => '852$q=MOJE']])
+		$this->fixture('Class_CodifSection',
+									 ['id' => 2,
+										'invisible' => 0,
+										'regles' => '852$q=AVJE']);
 
-			->whenCalled('fetchEnreg')
-			->with('select * from codif_section where id_section=3', false)
-			->answers(['invisible' => 1])
 
-			->whenCalled('fetchEnreg')
-			->with('select * from codif_section where id_section=2', false)
-			->answers(['invisible' => 0]);
+		$this->fixture('Class_CodifSection',
+									 ['id' => 3,
+										'invisible' => 1,
+										'regles' => '852$q=MOJE']);
 
 		$this->loadNotice('unimarc_items_in_852');
 	}
@@ -1110,10 +1102,10 @@ class NoticeIntegrationItemsIn852Test extends NoticeIntegrationTestCase {
 	 */
 	public function itemsProvider() {
 		return [['0024100013', 0, 'code_barres'],
-		['JBD HER 16', 0, 'cote'],
-		[2, 0, 'section'],
-		['AVER', 0, 'annexe'],
-		[false, 0, 'ignore_exemplaire']];
+						['JBD HER 16', 0, 'cote'],
+						[2, 0, 'section'],
+						['AVER', 0, 'annexe'],
+						[false, 0, 'ignore_exemplaire']];
 	}
 
 
@@ -1297,16 +1289,17 @@ class NoticeIntegrationPergameEmplacementZeroTest extends NoticeIntegrationTestC
 
 	public function setUp() {
 		parent::setUp();
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_section', false)
-			->answers([
-				['id_section' => 1, 'regles' => '995$q=A']])
 
-			->whenCalled('fetchAll')
-			->with('select * from codif_emplacement', false)
-			->answers([
-				['id_emplacement' => 3, 'regles' => '995$6=0']]);
+		$this->fixture('Class_CodifSection',
+									 ['id' => 1,
+										'libelle' => 'adulte',
+										'regles' => '995$q=A']);
+
+
+		$this->fixture('Class_CodifEmplacement',
+									 ['id' => 3,
+										'libelle' => 'enfants',
+										'regles' => '995$6=0']);
 
 		$this->loadNotice('unimarc_emplacement_codif_zero');
 		$this->exemplaire = Class_Exemplaire::findFirstBy([]);
@@ -1400,24 +1393,21 @@ class NoticeIntegrationDossier64Test extends NoticeIntegrationTestCase {
 class NoticeIntegrationGenreMultiple902Test extends NoticeIntegrationTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->_mock_sql
-			->whenCalled('fetchAll')
-			->with('select * from codif_genre', false)
-			->answers([
-				[
-					'id_genre' => 81,
-					'regles' => '902$a=Genre1',
-				],
-				[
-					'id_genre' => 82,
-					'regles' => '902$a=Genre2',
-				],
-				[
-					'id_genre' => 83,
-					'regles' => '902$a=Genre3',
-				],
-			])
-			;
+
+		$this->fixture('Class_CodifGenre',
+									 ['id' => 81,
+										'libelle' => 'Genre1',
+										'regles' => '902$a=Genre1']);
+
+		$this->fixture('Class_CodifGenre',
+									 ['id' => 82,
+										'libelle' => 'Genre2',
+										'regles' => '902$a=Genre2']);
+
+		$this->fixture('Class_CodifGenre',
+									 ['id' => 83,
+										'libelle' => 'Genre3',
+										'regles' => '902$a=Genre3']);
 
 		$this->loadNotice('test-genre-multiple-902');
 	}
@@ -1508,4 +1498,215 @@ class NoticeIntegrationMachecoulTest extends NoticeIntegrationTestCase {
 																												'formes' => 'LEDUxSTEPHANIE']]));
 	}
 }
-?>
\ No newline at end of file
+
+
+
+/** @see http://forge.afi-sa.fr/issues/15762 */
+class NoticeIntegrationConcertoSaintSaensTest extends NoticeIntegrationTestCase {
+	public function getProfilDonnees() {
+		$profil = Class_IntProfilDonnees::forDynix()->setIdProfil(108);
+		return $profil->getRawAttributes();
+	}
+
+
+	public function setUp() {
+		parent::setUp();
+		$this->fixture('Class_Notice',
+									 ['id' => 239003,
+										'type_doc' => 3,
+										'alpha_titre' => 'CONCERTO POUR VIOLONCELLE N 1  OP  33  LA MINEUR',
+										'alpha_auteur' => 'SAINT SAENS  CAMILLE',
+										'titres' => 'CONCERTO KONSERTO POUR VIOLONCELLE VIOLONSEL 1  33 MINEUR MINER SONATE SONAT PIANO 32 UT ROMANCE ROMANS 36 SERENADE SERENAD SUITE SUIT 16 CARNAVAL KARNAVAL ANIMAUX ANIMO GRANDE GRAND FANTASIE FANTASI ZOOLOGIQUE ZOULOJIK',
+										'auteurs' => 'SAINT SIN SAENS SAN CAMILLE KAMIL DEMARQUETTE DEMARKET HENRI ANRI BEREZOVSKY BEREZOVSKI BORIS BORI ENGERER ANJER BRIGITTE BRIJIT SWENSEN SWENSAN JOSEPH JOS ENSEMBLE ANSANBL ORCHESTRAL ORKESTRAL PARIS PARI',
+										'editeur' => 'Mirare,',
+										'collection' => '',
+										'matieres' => 'MUSIQUE MUSIK INSTRUMENTALE INSTRUMANTAL FRANCE FRANS 19EME EM SIECLE SIEKL CONTES KONT MUSICAUX MUSIKO CONCERTOS KONSERTO VIOLONCELLE VIOLONSEL',
+										'dewey' => '',
+										'facettes' => 'A16708 A27427 A29866 A70213 A45981 A57131 M44307 M26694 M1319 T3 B2 YLB 2000-01',
+										'code' => '3 SAI 19.43',
+										'isbn' => '',
+										'ean' => '',
+										'id_commerciale' => 'MIRAREMIR108CONCERTOPOURVIOLONCE',
+										'id_bnf' => '',
+										'clef_alpha' => 'CONCERTOPOURVIOLONCELLEN1OP33LAMINEUR--SAINTSAENSCAMILLE--MIRARE-2010-3',
+										'clef_oeuvre' => 'CONCERTOPOURVIOLONCELLEN1OP33LAMINEUR--SAINTSAENSCAMILLE-',
+										'clef_chapeau' => '',
+										'tome_alpha' => '',
+										'annee' => 2010,
+										'qualite' => 5,
+										'exportable' => 1,
+										'date_creation' => '2000-01-01 00:00:00',
+										'date_maj' => '2014-09-16 12:25:58',
+										'unimarc' => '02580njm0 22003131i 450 001000700000005004100007071002100048200008900069210002600158215002100184330071300205464027100918464007501189464011601264464012301380464010901503464012401612464011601736606005001852606002001902606002801922700003901950702005001989702004302039702004302082702002002125711003302145996008802178419536140812s2010       |             | |||||d01aMIR108 ;bMirare01aConcerto pour violoncelle N°1, op. 33, la mineurb[enr. CD] /fCamille Saint-Saëns01aS.l. :cMirare,d201001a1 disque compact01aPour ce disque-concept autour des oeuvres pour violoncelle de Camille Saint-Saëns, Henri Demarquette s\'est entouré de ses amis et partenaires de prédilection Brigitte Engerer et Boris Berezovsky (piano), ainsi que l\'Ensemble Orchestral de Paris et ses solistes, sous la houlette de Joseph Swensen, pour présenter un disque original. Au côté de certaines oeuvres très connues, comme le facétieux Carnaval des animaux, et le Concerto pour violoncelle et orchestre n',
+										'z3950_retry' => 0,
+										'nb_visu' => 0,
+										'nb_resa' => 0,
+										'url_vignette' => '',
+										'url_image' => '']);
+
+
+		$this->fixture('Class_IntBib',
+									 ['id' => 1,
+										'qualite' => 5]);
+
+		$this->loadNotice('unimarc_concerto_saintsaens');
+	}
+
+
+	/** @test */
+	public function notesShouldNotContainsRawAsciiDegree() {
+		$this->assertNotContains('n' . chr(0xb0),
+														 Class_Notice::find(239003)->get_subfield(330, 'a')[0]);
+	}
+
+
+	/** @test */
+	public function notesShouldContainsValidUtf8Degree() {
+		$this->assertContains('n' . chr(0xc2).chr(0xb0),
+													Class_Notice::find(239003)->get_subfield(330, 'a')[0]);
+	}
+}
+
+
+
+/** @see http://forge.afi-sa.fr/issues/16358 */
+class NoticeIntegrationSymphonieTest extends NoticeIntegrationTestCase {
+	public function getProfilDonnees() {
+		$profil = Class_IntProfilDonnees::forNanook()->setIdProfil(110);
+		return $profil->getRawAttributes();
+	}
+
+
+	public function setUp() {
+		parent::setUp();
+
+		$symphonie = $this->fixture('Class_Notice',
+																['id' => 1,
+																 'type_doc' => 3,
+																 'alpha_titre' => 'SYMPHONIES 38  PRAGUE    41  JUPITER',
+																 'alpha_auteur' => 'MOZART WOLFGANG AMADEUS',
+																 'titres' => 'SYMPHONIES SINFONI 38  PRAGUE PRAG 41 JUPITER JUPIT',
+																 'auteurs' => 'MOZART MOZAR WOLFGANG OLFGANG AMADEUS AMAD JACOBS JAKOB RENE RAN FREIBURGER FREIBURJ BAROCKORCHESTER BAROKORKEST',
+																 'editeur' => 'Harmonia Mundi',
+																 'collection' => '',
+																 'matieres' => 'MUSIQUE MUSIK 18E  SIECLE SIEKL AUTRICHE OTRICH',
+																 'dewey' => '',
+																 'facettes' => '  A1 A2 A3 M1 T3 B1',
+																 'cote' => '3 MOZ 24',
+																 'isbn' => '',
+																 'ean' => '3149020195840',
+																 'id_commerciale' => 'HARMONIAMUNDI2901958SYMPHONIES38PRAGUE41',
+																 'id_bnf' => '',
+																 'clef_alpha' => 'SYMPHONIES38PRAGUE41JUPITER--MOZARTW--HARMONIAMUNDI-2012-3',
+																 'clef_oeuvre' => 'SYMPHONIES38PRAGUE41JUPITER--MOZARTW-',
+																 'clef_chapeau' => '',
+																 'tome_alpha' => '',
+																 'annee' => 2010,
+																 'qualite' => 5,
+																 'exportable' => 1,
+																 'date_creation' => '2000-01-01 00:00:00',
+																 'date_maj' => '2014-09-16 12:25:58',
+																 'unimarc' => "02135njm0 2200409   450 001000700000010001100007071002800018073001800046100004500064126004500109200013500154210002500289215002800314300002800342345002200370464006700392464005900459464006600518464006600584464006900650464007800719464006500797610003600862686004700898700005800945702005201003702005701055801002201112856006701134856005901201856006601260856006601326856006901392856007801461856006501539992012101604196508  d8,05 E01a2901958bHarmonia Mundi  a3149020195840  a20140613d2007    m  y0frea0103    ba      aax  hx       cd                         1 aSymphonies 38 \"Prague\" & 41 \"Jupiter\"bCDfWolfgang Amadeus Mozart, compos.gRené Jacobs, dir.gFreiburger Barockorchester, orch. 1cHarmonia Mundid2012 1a1 CD (68 min)e1 livret  aEnregistrement de 2007.  b3149020195840cCD  tSymphonii nع38 en ré majeur, k504 'prague' : adagio, allegro  tSymphonie nع38 en ré majeur, k504 'prague' : andante  tSymphonie n°38 en ré majeur, k504 'prague' : finale, presto  tSymphonie n°41 en ut majeur, k551 'jupiter' : allegro vivace  tSymphonie n°41 en ut majeur, k551 'jupiter' : andante cantabile  tSymphonie n°41 en ut majeur, k551 'jupiter' : menuetto, allegretto, trio  tSymphonie n°41 en ut majeur, k551 'jupiter' : molto allegro  aMusique - 18e siècleyAutriche  a3.24tSymphonie, poème symphonique2PCDM4 1aMozartbWolfgang Amadeusf1756-179142306Compositeur 1aJacobsbRenéf1946-....4qco6chef d'orchestre 1aFreiburger Barockorchester4ost6orchestre à cordes 1aFRbCVSc201406134 zSymphonie nع38 en ré majeur, k504 'prague' : adagio, allegro4 zSymphonie nع38 en ré majeur, k504 'prague' : andante4 zSymphonie nع38 en ré majeur, k504 'prague' : finale, presto4 zSymphonie nع41 en ut majeur, k551 'jupiter' : allegro vivace4 zSymphonie nع41 en ut majeur, k551 'jupiter' : andante cantabile4 zSymphonie nع41 en ut majeur, k551 'jupiter' : menuetto, allegretto, trio4 zSymphonie nع41 en ut majeur, k551 'jupiter' : molto allegro  uhttp://ecx.images-amazon.com/images/I/51nXuj1YJPL._SL160_.jpgvhttp://ecx.images-amazon.com/images/I/51nXuj1YJPL.jpg",
+																 'z3950_retry' => 0,
+																 'nb_visu' => 0,
+																 'nb_resa' => 0,
+																 'url_vignette' => '',
+																 'url_image' => '']);
+
+		$this->_mock_sql
+			->whenCalled('fetchEnreg')
+			->with('select * from int_bib where id_bib=1')
+			->answers(['id' => 1,
+								 'qualite' => 5]);
+
+
+		$this->_mock_sql
+			->whenCalled('fetchEnreg')
+			->with('select qualite,unimarc,facettes from notices where id_notice=1')
+			->answers($symphonie->toArray());
+
+
+			$this->loadNotice('unimarc_symphonie');
+	}
+
+
+	/** @test */
+	public function degreeShouldStayUTF8Degree() {
+		$this->assertContains('n°', Class_Notice::find(1)->get_subfield(464, 't')[0]);
+	}
+}
+
+
+
+class NoticeIntegrationUnimarcKohaFacetteTest extends NoticeIntegrationTestCase {
+	public function setUp() {
+		parent::setUp();
+		Class_Notice::beVolatile();
+		$this->loadNotice('unimarc_koha_okapi');
+	}
+
+
+	public function getProfilDonnees() {
+		return Class_IntProfilDonnees::forKoha()
+			->setIdProfil(111)
+			->getRawAttributes();
+	}
+
+
+	/** @test */
+	public function clefAlphaShouldBeAsExpected() {
+		$this->assertEquals('OKAPI---955-BAYARD--2', Class_Notice::find(1)->getClefAlpha());
+	}
+
+
+	/** @test */
+	public function contextShouldExpectation() {
+		$this->assertContains('T2', Class_Notice::find(1)->getFacettes());
+	}
+
+
+		/** @test */
+	public function okapi983ShouldHaveT2Facette() {
+		$okapi_983 = Class_Notice::findFirstBy(['tome_alpha' => '983']);
+		$this->assertContains('T2', $okapi_983->getFacettes());
+	}
+
+
+	/** @test */
+	public function loadSameUnimarcShouldNotDuplicateOkapi983() {
+		$this->loadNotice('unimarc_koha_okapi');
+		$okapi_983 = Class_Notice::findAllBy(['tome_alpha' => '983']);
+		$this->assertCount(1, $okapi_983);
+	}
+}
+
+
+
+/** @see http://forge.afi-sa.fr/issues/16628 */
+class NoticeIntegrationInterestEsperluette extends NoticeIntegrationTestCase {
+	public function getProfilDonnees() {
+		$profil = Class_IntProfilDonnees::forNanook()->setIdProfil(110);
+		return $profil->getRawAttributes();
+	}
+
+
+	public function setUp() {
+		parent::setUp();
+
+		$this->_mock_sql
+			->whenCalled('fetchEnreg')
+			->with('select * from int_bib where id_bib=1')
+			->answers(['id' => 1,
+								 'qualite' => 5,
+								 'sigb' => 13]);
+		$this->loadNotice('unimarc_esperluette_2014');
+		$this->loadNotice('unimarc_esperluette_2014');
+		$this->notice = Class_Notice::find(1);
+	}
+
+
+	/** @test */
+	public function deweyShouldContainsEsperluette() {
+		$this->assertEquals('ESPERLUETTE ESPERLUET 2014', $this->notice->getDewey());
+	}
+}
\ No newline at end of file
diff --git a/cosmogramme/tests/php/classes/unimarc_concerto_saintsaens.txt b/cosmogramme/tests/php/classes/unimarc_concerto_saintsaens.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1a17b56bc7941a60b849151a37ef8809aef44aae
--- /dev/null
+++ b/cosmogramme/tests/php/classes/unimarc_concerto_saintsaens.txt
@@ -0,0 +1 @@
+03042njm  22004331i 4500001000700000003000600007008004100013028002100054035001800075040000800093100003900101245008800140260002600228300002100254505026900275520071300544541003301257650005001290650002001340650002801360700005001388700004301438700004301481700002001524710003301544774005301577774006001630774004601690774006101736774005301797856007501850856011601925856012302041856010902164856012402273856011602397596000702513999008802520419536SIRSI140812s2010       |             | |||||d01aMIR108 ;bMirare  a3760127221081  aGAM10aSaint-Saèens, Camilled(1835-1921)10aConcerto pour violoncelle NÀ1, op. 33, la mineurh[enr. CD] /cCamille Saint-Saèens  aS.l. :bMirare,c2010  a1 disque compact1 aConcerto pour violoncelle NÀ1, op. 33, la mineur -- Sonate pour violoncelle et piano NÀ1, op. 32, ut mineur -- Romance pour violoncelle et piano, op. 36 -- Sâerâenade de la suite pour violoncelle et piano, op. 16 -- Carnaval des animaux, grande fantasie zoologique  aPour ce disque-concept autour des oeuvres pour violoncelle de Camille Saint-Saèens, Henri Demarquette s'est entourâe de ses amis et partenaires de prâedilection Brigitte Engerer et Boris Berezovsky (piano), ainsi que l'Ensemble Orchestral de Paris et ses solistes, sous la houlette de Joseph Swensen, pour prâesenter un disque original. Au cãotâe de certaines oeuvres tráes connues, comme le facâetieux Carnaval des animaux, et le Concerto pour violoncelle et orchestre n°1, l'on peut dâecouvrir d'autres perles de cet ãage d'or de la musique franðcaise, comme la Sonate pour violoncelle et piano n°1, injustement mâeconnue, ou la merveilleuse mâelodie de la Sâerâenade de la Suite pour violoncelle et piano.  aGAMadisque compacth20,01 E 7aMusique instrumentalezFrancey19áeme siáecle 7aContes musicaux 7aConcertos (violoncelle)11aDemarquette, Henrid(1970-....).eVioloncelle11aBerezovsky, Borisd(1969-....).ePiano11aEngerer, Brigitted(1952-2012).ePiano11aSwensen, Joseph21aEnsemble Orchestral de Paris0 aConcerto pour violoncelle NÀ1, op. 33, la mineur0 aSonate pour violoncelle et piano NÀ1, op. 32, ut mineur0 aRomance pour violoncelle et piano, op. 360 aSâerâenade de la suite pour violoncelle et piano, op. 160 aCarnaval des animaux, grande fantasie zoologique4 uhttp://www.gamannecy.com//upload/albums/201007/3760127221081_thumb.jpg4 uhttp://www.gamannecy.com/polysson/201009/01-3760127221081.mp3zConcerto pour violoncelle N°1, op. 33, la mineur4 uhttp://www.gamannecy.com/polysson/201009/02-3760127221081.mp3zSonate pour violoncelle et piano N°1, op. 32, ut mineur4 uhttp://www.gamannecy.com/polysson/201009/03-3760127221081.mp3zRomance pour violoncelle et piano, op. 364 uhttp://www.gamannecy.com/polysson/201009/04-3760127221081.mp3zSâerâenade de la suite pour violoncelle et piano, op. 164 uhttp://www.gamannecy.com/polysson/201009/05-3760127221081.mp3zCarnaval des animaux, grande fantasie zoologique  a16  a3 SAI 19.43wAUTOc1i00788786l09JENRmLBpE20.01rYsYt1MUSu12/8/2014xCDzTPUB
\ No newline at end of file
diff --git a/cosmogramme/tests/php/classes/unimarc_esperluette_2014.txt b/cosmogramme/tests/php/classes/unimarc_esperluette_2014.txt
new file mode 100644
index 0000000000000000000000000000000000000000..71a76d9c495ce452834d6902e22feba30b3c3467
--- /dev/null
+++ b/cosmogramme/tests/php/classes/unimarc_esperluette_2014.txt
@@ -0,0 +1 @@
+01942nam0 2200313   450 00100060000001000360000602000170004210000130005910100080007210200070008010500450008710600450013220000850017721000400026221500540030222500410035630000100039733004490040741000570085660600600091367600150097370000590098870100560104780100700110393001160117393200210128999202390131099500790154989901  a978-2-36183-130-1brel.d25 EUR  aFRb01366816  a201404170 afre  aFR  a||||e   00|y|                             ar                                       1 aLe dico des super hérosbTexte impriméfJean-Marc Lofficier & Jean-Marc Lainé  cLes Moutons électriquesdcop. 2013  a1 vol. (395 p.)cill., couv. ill. en coul.d22 cm| aBibliothèque des miroirsx1968-5955  aIndex  aA comme Aquaman. B comme Batman, C comme Captain America... Depuis soixante-quinze ans, les super-héros ont envahi l'imaginaire populaire et conquis tous les territoires, en Amérique, en Europe, dans les librairies, les salles obscures et les consoles de jeux vidéo. Il est temps, aujourd'hui, de rendre hommage à cette population disparate et pourtant si reconnaissable, de justiciers aux costumes colorés et aux pouvoirs spectaculaires.  0041449458tBibliothèque des miroirsx1968-5955d2013  316139342aSuper-héros311931877xDictionnaires2rameau  a809.933 52 |aLofficierbJean-Marcf1954-....31214684040706Auteur |aLainébJean-Marcf1970-....31440410040706Auteur 0aFRbFR-751131015c20131129gAFNORhFRBNF4372001400000012intermrc  5FR-751131010:43720014001001a2013-417405b759999999cTolbiac - Rez de Jardin - Littérature et art - MagasindO  aEsperluette 2014  uhttp://ecx.images-amazon.com/images/I/51zzHj3dWhL._SL160_.jpguhttp://ecx.images-amazon.com/images/I/51zzHj3dWhL._SL160_.jpgvhttp://ecx.images-amazon.com/images/I/51zzHj3dWhL.jpgvhttp://ecx.images-amazon.com/images/I/51zzHj3dWhL.jpg  aMédiathèque des Allobrogesf1000065539kD 809.93 LOFm20141003qaraaop
\ No newline at end of file
diff --git a/cosmogramme/tests/php/classes/unimarc_koha_okapi.txt b/cosmogramme/tests/php/classes/unimarc_koha_okapi.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7ef7c14fa8fe945b1c5f3959aef031d6e1a7d13a
--- /dev/null
+++ b/cosmogramme/tests/php/classes/unimarc_koha_okapi.txt
@@ -0,0 +1 @@
+07172     2200577   450000100060000001100140000609000100002009100190003009900280004910000410007710100080011820000100012621000110013680100500014799501520019799501520034999501520050199501520065399501520080599501520095799501520110999501520126199501520141399501520156599501520171799501520186999501710202199501840219299501860237699501890256299501870275199501920293899501960313099501750332699502070350199501860370899501930389499502050408799502090429299502160450199502220471799501980493999502250513799502220536299502190558499501610580399501490596499501490611399501760626299501560643884465  a0751-6002  a84465  a2b20140702c0  s1tPRESSEeBIBLIOTHEQUE  a20130613a19989999m   0frey50        0 afre1 aOkapi  cBayard 1aFRbB.M. Saint Marcellin en Forezc2013-07-17  f1004134225611w2014-06-033000985220cMEDSTMAR20kPER52013-06-24vFascicule;955;01/04/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1003544225617w2014-05-123000985230cMEDSTMAR20kPER52013-06-24vFascicule;956;15/04/2013o0eJeunesserPRESSEm2014-03-29bMEDSTMAR6MEDSTMAR  f1059514225613w2014-06-173000985241cMEDSTMAR20kPER52013-06-24vFascicule;957;01/05/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1015094225610w2014-06-033000985893cMEDSTMAR20kPER52013-06-24vFascicule;959;01/06/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1074404225610w2014-06-173000985905cMEDSTMAR20kPER52013-06-24vFascicule;958;15/05/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1000324225614w2014-06-173000985926cMEDSTMAR20kPER52013-06-24vFascicule;960;15/06/2013o0eJeunesserPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR  f1025704225619w2014-03-173000986096cMEDSTMAR20kPER52013-06-24vFascicule;949;01/01/2013o0eJeunesserPRESSEm2014-02-17bMEDSTMAR6MEDSTMAR  f1036374225618w2014-06-173000986105cMEDSTMAR20kPER52013-06-24vFascicule;950;15/01/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1061634225619w2014-06-173000986112cMEDSTMAR20kPER52013-06-24vFascicule;951;01/02/2013o0eJeunesserPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR  f1024534225615w2014-04-263000986124cMEDSTMAR20kPER52013-06-24vFascicule;952;15/02/2013o0eJeunesserPRESSEm2014-04-09bMEDSTMAR6MEDSTMAR  f1031264225617w2014-06-033000986134cMEDSTMAR20kPER52013-06-24vFascicule;953;01/03/2013o0eJeunesserPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR  f1026964225616w2014-02-013000986140cMEDSTMAR20kPER52013-06-24vFascicule;954;15/03/2013o0eJeunesserPRESSEm2014-01-15bMEDSTMAR6MEDSTMAR  f1102104225613i3.95w2014-04-0230009122266cMEDSTMAR20k961 juil 201352013-07-16gPRESSEv961 juil 2013o0eJeunessesddcrPRESSEm2014-03-07bMEDSTMAR6MEDSTMAR  f1102114225610i5.20w2014-06-0630009122267cMEDSTMAR20k962 aout 201352013-07-16u962 aout 2013gPRESSEv962 aout 2013o0epressesddcrPRESSEm2014-05-16bMEDSTMAR6MEDSTMAR  f1102684225614i5.20w2014-04-1630009125387cMEDSTMAR20k963 sept 201352013-08-19u963 sept 2013gPRESSEv963 sept 2013o0eJeunessesddcrPRESSEm2014-04-02bMEDSTMAR6MEDSTMAR  f1103584225612i5.20w2014-05-2130009128945cMEDSTMAR20k964 15/09/201352013-09-12u964 15/09/2013gPRESSEv964 15/09/2013o0eJeunessesddcrPRESSEm2014-04-26bMEDSTMAR6MEDSTMAR  f1103954225617i5.20w2014-06-1730009131380cMEDSTMAR20k965 1er oct 201352013-09-26gPRESSEv965 oct 2013o0eJeunessesddcrPRESSEm2014-04-01bMEDSTMARx965 oct 20136MEDSTMAR  f1104324225619i5.20w2014-04-2630009134457cMEDSTMAR20k966 15 oct 201352013-10-11gPRESSEv966 15 oct 2013o0eJeunessesddcrPRESSEm2014-04-09bMEDSTMARx966 15 oct 20136MEDSTMAR  f1104594225616i5.20w2014-06-1730009137244cMEDSTMAR20k967  1er nov 201352013-10-21gPRESSEv967 1er nov 2013o0eJeunessesddcrPRESSEm2014-06-03bMEDSTMARx967 1er nov 20136MEDSTMAR  f1105454225616i5.20w2013-11-0530009138725cMEDSTMAR20k968  15 nov 201352013-11-05u968 nov 2013gPRESSEv968 nov 2013o0eJeunessesddcrPRESSEbMEDSTMAR6MEDSTMAR  f1105874225616i5.20w2014-06-1730009141115cMEDSTMAR20k969 1er dec 201352013-11-19u969 1er dec 2013gPRESSEv969 1er dec 2013o0eJeunessesddcrPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1106144225619i5.20w2014-02-2230009145178cMEDSTMAR20k970 15 dec 201352013-11-29u970 dec 2013gPRESSEv970 dec 2013o0eJeunessesddcrPRESSEm2014-02-12bMEDSTMAR6MEDSTMAR  f1106524225611i5.20w2014-06-1030009161469cMEDSTMAR20k971 jan 201452013-12-20u971 jan 2014gPRESSEv971 jan 2014o0epressesddcrPRESSEm2014-02-24bMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1106624225610i5.20w2014-06-1730009162679cMEDSTMAR20k972 15 janv 201450000-00-00u972 15 janv 2014gPRESSEv972 15 janv 2014o0epressesddcrPRESSEm2014-03-24bMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1052064225614i5.20w2014-08-0230009167328cMEDSTMAR20k973 01/02/201450000-00-00u973 fev 2014gPRESSEv973 fev 2014o0eJeunessesddcrPRESSEm2014-05-21bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1001244225616i5.20w2014-06-3030009173177cMEDSTMAR20k974 15 fev 201450000-00-00u974 15 fev 2014gPRESSEv974 15 fev 2014o0eJeunessesddcrPRESSEm2014-06-17bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1008284225613i5.20w2014-06-1830009174355cMEDSTMAR20k975 1er mars 201452014-02-19u975 1er mars 2014gPRESSEv975 1er mars 2014o0eJeunessesddcrPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1019314225619i5.20w2014-05-3130009177928cMEDSTMAR20k976 15 mars 201450000-00-00gPRESSEv976 mars 2014o0eJeunessesddcrPRESSEm2014-03-25bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1037104225618i5.20w2014-06-0330009180550cMEDSTMAR20k977 1er avril 201450000-00-00u977 1er avril 2014gPRESSEv977 1er avril 2014o0eJeunessesddcrPRESSEm2014-04-17bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1032684225614i5.20w2014-06-1730009183524cMEDSTMAR20k978 15 avril 201450000-00-00u978 15 avril 2014gPRESSEv978 15 avril 2014o0eJeunessesddcrPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1032694225611i5.20w2014-06-1730009184893cMEDSTMAR20k979 1er mai 201452014-04-16u979 1er mai 2014gPRESSEv979 1er mai 2014o0eJeunessesddcrPRESSEm2014-06-03bMEDSTMAR6MEDSTMAR7jj/mm/aaaaaabonnement  f1106844225612w2014-06-2830009217440cMEDSTMAR20k980 15 mai 201452014-05-19v980o0eJeunessesddcrPRESSEm2014-06-02bMEDSTMAR6MEDSTMAR715/05/2014  f1106974225612w2014-05-2730009218397cMEDSTMAR20k981 juin 2014 PER52014-05-27v981o0epressesddcrPRESSEbMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1107074225618w2014-06-0330009221218cMEDSTMAR20k982 juin 2014 PER52014-06-03v983o0epressesddcrPRESSEbMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1055294225614w2014-07-2130009227468cMEDSTMAR20k983 juillet 2014 PER52014-06-26n2014-08-25v983o0epressesddcrPRESSEm2014-07-21bMEDSTMAR6MEDSTMAR7jj/mm/aaaa  f1015264225617i5.00w2014-07-1830009236066cMEDSTMAR20k984 août 2014 PER52014-07-18v984o1epressesddcrPRESSEbMEDSTMAR6MEDSTMAR7jj/mm/aaaa12890nas0a2201069   45000010006000000050017000060110026000230900010000490910019000590990014000781000041000921010008001331020007001411100016001482000026001642100035001903260014002257020191002398010039004309950130004699950130005999950154007299950143008839950155010269950156011819950155013379950155014929950157016479950144018049950145019489950157020939950157022509950146024079950158025539950147027119950144028589950156030029950155031589950145033139950157034589950155036159950143037709950156039139950147040699950160042169950156043769950154045329950156046869950161048429950147050039950168051509950144053189950144054629950150056069950142057569950156058989950153060549950156062079950161063639950156065249950164066809950160068449950143070049950168071479950180073159950175074959950168076709950175078389950168080139950168081819950187083499950168085369950166087049950162088709950156090329950160091889950168093489950168095169950173096849950156098579950166100139950156101799950167103359950156105029950179106589950176108379950166110139950167111799950168113469950151115149950155116654143620130728051441.0  a0751-6002d5.20 Euros  a41436  a2b20130728c0  s1tPRESSE  a20090311a2009    d||y0frey50  0103ba0 afre  aFR  aa|a||||0|||1 aOkapigFrappat, Bruno  aMontrougecBayard pressed2009  aBimensuel 13123852913http://catalogue.bnf.fr/ark:/12148/cb12385291h3http://catalogue.bnf.fr/ark:/12148/cb12385291h3http://catalogue.bnf.fr/ark:/12148/cb12385291h934364aFrappatbBrunof1945-.... 02AFNORaFRbBM de MontbrisongAFNOR  f34202000895690w2013-01-073000940665cMTRMTB20kN°929 (28/01/2012)52013-01-07o0eJeunessesddcrPRESSEbMTRMTB6MTRMTB  f34202000900987w2013-01-073000940667cMTRMTB20kN°931 (28/02/2012)52013-01-07o0eJeunessesddcrPRESSEbMTRMTB6MTRMTB  f34202000930059w2014-07-193000952676cMTRMTB20kN°952 (15/02/2013)52013-02-19n2014-08-30o0eJeunessesddcrPRESSEm2014-07-19bMTRMTB6MTRMTB  f34202000934085w2014-08-203000957275cMTRMTB20kN° 955 (30/03/2013)52013-03-26o0eJeunessesddcrPRESSEm2014-08-02bMTRMTB6MTRMTB  f34202000937245w2014-07-093000961117cMTRMTB20kN°957 (01/05/2013) 52013-04-26n2014-08-20o0eJeunessesddcrPRESSEm2014-07-09bMTRMTB6MTRMTB  f34202000939621w2014-08-203000962542cMTRMTB20kN° 959 (30/05/ 2013)52013-05-21n2014-10-01o0eJeunessesddcrPRESSEm2014-08-20bMTRMTB6MTRMTB  f34202000939886w2014-08-203000962723cMTRMTB20kN° 958 (15/05/2013)52013-05-24n2014-10-01o0eJeunessesddcrPRESSEm2014-08-20bMTRMTB6MTRMTB  f34202000939316w2014-08-203000963238cMTRMTB20kN° 960 (15/06/2013)52013-06-05n2014-10-01o0eJeunessesddcrPRESSEm2014-08-20bMTRMTB6MTRMTB  fSTJ017569i5.20w2014-07-083000972464cMTRSTJ20kN° 944 (15/10/2012)52013-06-14n2014-09-09o0efonds adosddcrPRESSEm2014-07-08bMTRSTJ6MTRSTJ  fSTJ017568i5.20w2014-07-303000972467cMTRSTJ20kN°945 (01/11/2012)52013-06-14o0efonds adosddcrPRESSEm2014-06-25bMTRSTJ6MTRSTJ  fSTJ017570i5.20w2014-05-273000972468cMTRSTJ20kN° 943 (01/10/2012)52013-06-14o0efonds adosddcrPRESSEm2014-04-30bMTRSTJ6MTRSTJ  fSTJ017571i5.20w2014-07-113000972469cMTRSTJ20kN° 942 (15/09/2012)52013-06-14n2014-09-12o0efonds adosddcrPRESSEm2014-07-11bMTRSTJ6MTRSTJ  fSTJ017572i5.20w2014-07-113000972470cMTRSTJ20kN° 953 (01/03/2013)52013-06-14n2014-09-12o0efonds adosddcrPRESSEm2014-07-11bMTRSTJ6MTRSTJ  fSTJ017580i5.20w2014-07-173000972481cMTRSTJ20kN° 954 (15/03/ 2013)52013-06-14o0efonds adosddcrPRESSEm2014-07-09bMTRSTJ6MTRSTJ  fSTJ017581i5.20w2014-07-163000972482cMTRSTJ20kN° 951 (01/02/ 2013)52013-06-14n2014-09-17o0efonds adosddcrPRESSEm2014-07-16bMTRSTJ6MTRSTJ  fSTJ017582i5.20w2014-06-203000972483cMTRSTJ20kN° 948 (15 /12/ 2012)52013-06-14o0efonds adosddcrPRESSEm2014-05-23bMTRSTJ6MTRSTJ  fSTJ017583i5.20w2014-07-163000972487cMTRSTJ20kN°947 (01/12/2012)52013-06-14o0efonds adosddcrPRESSEm2014-06-21bMTRSTJ6MTRSTJ  fSTJ017584i5.20w2014-01-153001972488cMTRSTJ20kN°946 (15/11/2012)52013-06-14o1efonds adosddcrPRESSEm2013-12-26bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ017585i5.20w2014-07-223000972490cMTRSTJ20kN° 952 (15//2013)52013-06-14n2014-09-23o0efonds adosddcrPRESSEm2014-07-22bMTRSTJ6MTRSTJ  fSTJ017586i5.20w2013-10-043001972492cMTRSTJ20kN° 950 (15/01/2013)52013-06-14o1efonds adosddcrPRESSEm2013-09-03bMTRSTJ6MTRSTJ  fSTJ017587i5.20w2014-03-083001972494cMTRSTJ20kN° 949 (01/01/2013)52013-06-14o1efonds adosddcrPRESSEm2014-02-01bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ017588i5.95w2014-05-213001972495cMTRSTJ20kN° 380 (Fev.2013)52013-06-14o1efonds adosddcrPRESSEm2014-04-09bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ017589i5.95w2014-03-053000972497cMTRSTJ20kN° 379 (Jan.2013)52013-06-14o0efonds adosddcrPRESSEm2014-02-26bMTRSTJ6MTRSTJ  fSTJ017590i5.95w2014-08-193000972498cMTRSTJ20kN° 381 (Mars 2013)52013-06-14n2014-09-09o0efonds adosddcrPRESSEm2014-08-19bMTRSTJ6MTRSTJ  fSTJ018171i5.20w2014-07-223000990308cMTRSTJ20kN°(960 (15 Juin 2013)52013-07-05o0efonds adosddcrPRESSEm2014-07-09bMTRSTJ6MTRSTJ  f34202000946980w2014-07-1930009125410cMTRMTB20kN° 963 (SEPTEMBRE 2013)52013-08-20n2014-08-30o0eJeunessesddcrPRESSEm2014-07-19bMTRMTB6MTRMTB  fSTJ005913w2014-04-1130009125444cMTRSTJ20kn°963 (septembre 2013)52013-08-20gPRESSEv963o0efonds adosddcrPRESSEm2014-04-02bMTRSTJ6MTRSTJ  fSTJ015086i5.20w2014-07-0830009128897cMTRSTJ20k964 (15 septembre 2013)52013-09-11v964o0efonds adosddcrPRESSEm2014-06-17bMTRSTJ6MTRSTJ  f34202000950867w2014-07-1830009128948cMTRMTB20kN° 964 (12/09/2013)52013-09-12n2014-08-29o0eJeunessesddcrPRESSEm2014-07-18bMTRMTB6MTRMTB  fSTJ023187i5.00w2014-07-2230009129084cMTRSTJ20kn°962 (août 201352013-09-13n2014-09-23v962o0efonds adosddcrPRESSEm2014-07-22bMTRSTJ6MTRSTJ  fSTJ024030w2014-07-2230009131378cMTRSTJ20kN°965 (1er oct. 2103)52013-09-26v965o0efonds adosddcrPRESSEm2014-07-09bMTRSTJ6MTRSTJ  fSTJ020506i5.20w2014-07-1230009134262cMTRSTJ20kn° 966 (15 octobre 2013)52013-10-09n2014-09-13v966o0efonds adosddcrPRESSEm2014-07-12bMTRSTJ6MTRSTJ  f34202000952426w2014-08-1330009134332cMTRMTB20kN° 966 (15/10/2013)52013-10-10o0eJeunessesddcrPRESSEm2014-07-23bMTRMTB6MTRMTB  f34202000952665w2014-08-1330009134633cMTRMTB20kN° 665 (01/10/2013)52013-10-15o0eJeunessesddcrPRESSEm2014-07-23bMTRMTB6MTRMTB  fSTJ008805i5.20w2014-07-0130009137448cMTRSTJ20k967 (Novembre 2013)52013-10-23v967o0efonds adosddcrPRESSEm2014-05-17bMTRSTJ6MTRSTJ  f34202000953085w2014-07-0930009138708cMTRMTB20kN° 967 (01/11/2013)52013-11-05o0eAdultesddcrPRESSEm2014-06-25bMTRMTB6MTRMTB  f34202000954265w2014-07-2530009139835cMTRMTB20kN° 968 (15/11/2013)52013-11-12n2014-09-05o0eJeunessesddcrPRESSEm2014-07-25bMTRMTB6MTRMTB  fSTJ020759i5.20w2014-08-2030009139922cMTRSTJ20k968 (15 novembre 2013)52013-11-13v968o0efonds adosddcrPRESSEm2014-07-23bMTRSTJ6MTRSTJ  f34202000956724w2014-07-1230009141456cMTRMTB20kN° 969 (01/12/2013)52013-11-22n2014-08-23o0eJeunessesddcrPRESSEm2014-07-12bMTRMTB6MTRMTB  fSTJ029629w2014-07-1230009141478cMTRSTJ20kn°969 (1 decembre 2013)52013-11-22n2014-09-13v969o0efonds adosddcrPRESSEm2014-07-12bMTRSTJ6MTRSTJ  f34202000957144w2014-07-1830009145173cMTRMTB20kN° 970 (15/12/2013)52013-11-29n2014-08-29o0eJeunessesddcrPRESSEm2014-07-18bMTRMTB6MTRMTB  fSTJ024292w2014-07-3030009145207cMTRSTJ20kn° 970 (décembre)52013-11-29n2014-10-01gPRESSEv970o0efonds adosddcrPRESSEm2014-07-30bMTRSTJ6MTRSTJ  fSTJ015459i6.20w2014-05-2730009161683cMTRSTJ20kn°971 (jan 2014)52013-12-24v971o0efonds adosddcrPRESSEm2014-05-06bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000956104w2014-07-1830009161702cMTRMTB20kN°971 (01/01/2014)52013-12-24o0eJeunessesddcrPRESSEm2014-07-09bMTRMTB6MTRMTB  f34202000960239w2014-07-1930009162642cMTRMTB20kN° 972 (15/01/2014)52014-01-07n2014-08-30o0eJeunessesddcrPRESSEm2014-07-19bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ028069i5.20w2014-07-1130009162645cMTRSTJ20kn° 972 (15 janvier 2014)52014-01-07n2014-09-12v972o0efonds adosddcrPRESSEm2014-07-11bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ015610i5.20w2014-07-1730009167480cMTRSTJ20kn°973 (du 1° au 15 fév. 2014)52014-01-21v973o0efonds adosddcrPRESSEm2014-07-09bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000961864w2014-07-1230009169044cMTRMTB20kN° 973 (01/02/2014)52014-01-30n2014-08-23o0eJeunessesddcrPRESSEm2014-07-12bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ024860i5.20w2014-07-1230009173384cMTRSTJ20kn°974 (15 Février)52014-02-08n2014-09-13v974o0efonds adosddcrPRESSEm2014-07-12bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000962821w2014-08-2030009174149cMTRMTB20kN° 974 (15/02/2014)52014-02-18n2014-10-01o0eJeunessesddcrPRESSEm2014-08-20bMTRMTB6MTRMTB7jj/mm/aaaa  f34202000964504w2014-07-1230009174453cMTRMTB20kN° 975 (01/03/2014)52014-02-20n2014-08-23o0eJeunessesddcrPRESSEm2014-07-12bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ024940i5.20w2014-07-1630009174471cMTRSTJ20kn°975 (du  1° au 15 mar. 2014)52014-02-20n2014-09-17v975o0efonds adosddcrPRESSEm2014-07-16bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000965121w2014-07-3030009177981cMTRMTB20kN° 976 (15/03/2014)52014-03-11n2014-09-10o0eJeunessesddcrPRESSEm2014-07-30bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ027189w2014-08-1930009178160cMTRSTJ20k976 (15 Mar 2014)52014-03-12n2014-09-09v976o0efonds adosddcrPRESSEm2014-08-19bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ030214i5.20w2014-07-1630009180442cMTRSTJ20kn° 97752014-03-22n2014-09-17v977o0efonds adosddcrPRESSEm2014-07-16bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000967044w2014-08-2230009180597cMTRMTB20kN° 977 (01/04/2014)52014-03-25o0eJeunessesddcrPRESSEm2014-08-01bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ030247i5.20w2014-07-2430009184025cMTRSTJ20k978 (15 avr 2014)52014-04-08v978o0efonds adosddcrPRESSEm2014-07-11bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000967770w2014-07-3030009184787cMTRMTB20kN° 978 (15/04/2014)52014-04-15n2014-09-10o0eJeunessesddcrPRESSEm2014-07-30bMTRMTB6MTRMTB7jj/mm/aaaa  f34202000968042w2014-07-1930009184887cMTRMTB20kN° 979 (01/05/2014)52014-04-16n2014-08-30o0eJeunessesddcrPRESSEm2014-07-19bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ026015i5.20w2014-07-2230009184927cMTRSTJ20kN°979 (du 1° au 31 mai 2014)52014-04-16v979o0efonds adosddcrPRESSEm2014-07-09bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000971020w2014-08-2230009188988cMTRMTB20kN° 980 (15/05/2014)52014-05-09o0eJeunessesddcrPRESSEm2014-08-01bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ033104w2014-07-1630009189011cMTRSTJ20k980 (15 mai 2014)52014-05-09n2014-09-17v980o0efonds adosddcrPRESSEm2014-07-16bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000971285w2014-08-2030009217453cMTRMTB20kN° 981 (01/06/2014)52014-05-20o0eJeunessesddcrPRESSEm2014-08-02bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ009225w2014-07-1630009217572cMTRSTJ20kn°981 (juin 2014)52014-05-21n2014-09-17v981o0efonds adosddcrPRESSEm2014-07-16bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000969123w2014-08-2230009221309cMTRMTB20kN° 982 (15/06/2014)52014-06-04o0eJeunessesddcrPRESSEm2014-08-01bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ033241i5.20w2014-07-0830009221321cMTRSTJ20kN°982 (du 15 juin 2014)52014-06-04n2014-09-09v982o1efonds adosddcrPRESSEm2014-07-08bMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ025357i4.95w2014-07-2230009227394cMTRSTJ20kn°983 (Juillet 2014)52014-06-26n2014-09-23v983o0efonds adosddcrPRESSEm2014-07-22bMTRSTJ6MTRSTJ7jj/mm/aaaa  f34202000972754w2014-08-0630009227416cMTRMTB20kN° 983 (JUILLET 2014)52014-06-26n2014-09-17o0eJeunessesddcrBDm2014-08-06bMTRMTB6MTRMTB7jj/mm/aaaa  f34202000975534w2014-08-2230009236032cMTRMTB20kN° 984 (AOUT 2014)52014-07-18n2014-10-03o0eJeunessesddcrPRESSEm2014-08-22bMTRMTB6MTRMTB7jj/mm/aaaa  f34202000977621w2014-08-2030009242241cMTRMTB20kN° 985 (01/09/2014)52014-08-19n2014-10-01o0eJeunessesddcrPRESSEm2014-08-20bMTRMTB6MTRMTB7jj/mm/aaaa  fSTJ033837i5.20w2014-08-1930009242311cMTRSTJ20kN°985 ( sept. 2014)52014-08-19v985o1efonds adosddcrPRESSEbMTRSTJ6MTRSTJ7jj/mm/aaaa  fSTJ025547w2014-08-1930009242320cMTRSTJ2052014-08-19n2014-09-09gPRESSEv984o0efonds adosddcrPRESSEm2014-08-19bMTRSTJ6MTRSTJ7jj/mm/aaaa
diff --git a/cosmogramme/tests/php/classes/unimarc_symphonie.txt b/cosmogramme/tests/php/classes/unimarc_symphonie.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a8952155831d0c949491d76d5631ddaba400a9fa
--- /dev/null
+++ b/cosmogramme/tests/php/classes/unimarc_symphonie.txt
@@ -0,0 +1 @@
+02261njm0 2200421   450 001000700000010001100007071002800018073001800046100004500064126004500109200013500154210002500289215002800314300002800342345002200370464006700392464005900459464006600518464006600584464006900650464007800719464006500797610003600862686004700898700005800945702005201003702005701055801002201112856006701134856005901201856006601260856006601326856006901392856007801461856006501539992012101604995011401725196508  d8,05 E01a2901958bHarmonia Mundi  a3149020195840  a20140613d2007    m  y0frea0103    ba      aax  hx       cd                         1 aSymphonies 38 "Prague" & 41 "Jupiter"bCDfWolfgang Amadeus Mozart, compos.gRené Jacobs, dir.gFreiburger Barockorchester, orch. 1cHarmonia Mundid2012 1a1 CD (68 min)e1 livret  aEnregistrement de 2007.  b3149020195840cCD  tSymphonie n°38 en ré majeur, k504 'prague' : adagio, allegro  tSymphonie n°38 en ré majeur, k504 'prague' : andante  tSymphonie n°38 en ré majeur, k504 'prague' : finale, presto  tSymphonie n°41 en ut majeur, k551 'jupiter' : allegro vivace  tSymphonie n°41 en ut majeur, k551 'jupiter' : andante cantabile  tSymphonie n°41 en ut majeur, k551 'jupiter' : menuetto, allegretto, trio  tSymphonie n°41 en ut majeur, k551 'jupiter' : molto allegro  aMusique - 18e siècleyAutriche  a3.24tSymphonie, poème symphonique2PCDM4 1aMozartbWolfgang Amadeusf1756-179142306Compositeur 1aJacobsbRenéf1946-....4qco6chef d'orchestre 1aFreiburger Barockorchester4ost6orchestre à cordes 1aFRbCVSc201406134 zSymphonie nع38 en ré majeur, k504 'prague' : adagio, allegro4 zSymphonie nع38 en ré majeur, k504 'prague' : andante4 zSymphonie nع38 en ré majeur, k504 'prague' : finale, presto4 zSymphonie nع41 en ut majeur, k551 'jupiter' : allegro vivace4 zSymphonie nع41 en ut majeur, k551 'jupiter' : andante cantabile4 zSymphonie nع41 en ut majeur, k551 'jupiter' : menuetto, allegretto, trio4 zSymphonie nع41 en ut majeur, k551 'jupiter' : molto allegro  uhttp://ecx.images-amazon.com/images/I/51nXuj1YJPL._SL160_.jpgvhttp://ecx.images-amazon.com/images/I/51nXuj1YJPL.jpg  aMédiathèquef3601051398k3 MOZ 24m20140922qdrjzop2[DIS][Disponible][0][1][][0][0][0][0]64471128195
diff --git a/library/Class/AdminVar.php b/library/Class/AdminVar.php
index 19da2d6a2cc1707d9ca94db9e037cb90a3ced2b0..d3ace323f5bdbad4ce8f80d09046e8f4349cd3cd 100644
--- a/library/Class/AdminVar.php
+++ b/library/Class/AdminVar.php
@@ -1,303 +1,308 @@
 <?php
-/**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
- *
- * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
- */
-
-class Class_AdminVar extends Storm_Model_Abstract {
-	protected $_table_name = 'bib_admin_var';
-	protected $_table_primary = 'CLEF';
-
-	/** @var array */
-	protected static $_knownVars;
+ /**
+	* Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+	*
+	* AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+	* it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+	* the Free Software Foundation.
+	*
+	* There are special exceptions to the terms and conditions of the AGPL as it
+	* is applied to this software (see README file).
+	*
+	* AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+	* but WITHOUT ANY WARRANTY; without even the implied warranty of
+	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+	*
+	* You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+	* along with AFI-OPAC 2.0; if not, write to the Free Software
+	* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+	*/
+
+ class Class_AdminVar extends Storm_Model_Abstract {
+	 protected $_table_name = 'bib_admin_var';
+	 protected $_table_primary = 'CLEF';
+
+	 /** @var array */
+	 protected static $_knownVars;
+
+
+	 /**
+		* @param string $name
+		* @return mixed
+		*/
+	 public static function get($name) {
+		 $var = static::getLoader()->find($name);
+		 if ($var == null)
+			 return null;
+		 return $var->getValeur();
+	 }
 
 
-	/**
-	 * @param string $name
-	 * @return mixed
-	 */
-	public static function get($name) {
-		$var = static::getLoader()->find($name);
-		if ($var == null)
-			return null;
-		return $var->getValeur();
-	}
+	 /**
+		* @param string $name
+		* @param mixed $value
+		*/
+	 public static function set($name, $value) {
+		 if (null === ($instance = self::getLoader()->find($name))) {
+			 $instance = self::getLoader()->newInstance()->setClef($name);
+		 }
+
+		 $instance
+			 ->setValeur($value)
+			 ->save();
+
+		 // très particulier à cette table qui n'a pas de primary autoincrément
+		 // si on vient de la créer, last insertid est vide
+		 // donc ici on reprend le champ clef
+		 $instance->setId($instance->getClef());
 
+		 return $instance;
+	 }
 
-	/**
-	 * @param string $name
-	 * @param mixed $value
-	 */
-	public static function set($name, $value) {
-		if (null === ($instance = self::getLoader()->find($name))) {
-			$instance = self::getLoader()->newInstance()->setClef($name);
-		}
 
-		$instance
-			->setValeur($value)
-			->save();
+	 public static function getDefaultLanguage() {
+		 return 'fr';
+	 }
 
-		// très particulier à cette table qui n'a pas de primary autoincrément
-		// si on vient de la créer, last insertid est vide
-		// donc ici on reprend le champ clef
-		$instance->setId($instance->getClef());
 
-		return $instance;
-	}
+	 public static function getLangues() {
+		 if (!$langues_value = self::get('LANGUES'))
+			 return array();
 
+		 $langues = array(self::getDefaultLanguage());
+
+		 foreach(explode(';', strtolower($langues_value)) as $langue)
+			 $langues []= trim($langue);
+		 return array_unique(array_filter($langues));
+	 }
 
-	public static function getDefaultLanguage() {
-		return 'fr';
-	}
 
+	 public static function getLanguesWithoutDefault() {
+		 return array_diff(self::getLangues(), array(self::getDefaultLanguage()));
+	 }
 
-	public static function getLangues() {
-		if (!$langues_value = self::get('LANGUES'))
-			return array();
 
-		$langues = array(self::getDefaultLanguage());
+	 /**
+		* @return bool
+		*/
+	 public static function isTranslationEnabled() {
+		 return count(self::getLangues()) > 1;
+	 }
 
-		foreach(explode(';', strtolower($langues_value)) as $langue)
-			$langues []= trim($langue);
-		return array_unique(array_filter($langues));
-	}
 
+	 /**
+		* @return bool
+		*/
+	 public static function isModuleEnabled($name) {
+		 if (!$value = self::get($name)) {
+			 return false;
+		 }
 
-	public static function getLanguesWithoutDefault() {
-		return array_diff(self::getLangues(), array(self::getDefaultLanguage()));
-	}
+		 return (1 == (int)$value);
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isTranslationEnabled() {
-		return count(self::getLangues()) > 1;
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isWorkflowEnabled() {
+		 return self::isModuleEnabled('WORKFLOW');
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isModuleEnabled($name) {
-		if (!$value = self::get($name)) {
-			return false;
-		}
-
-		return (1 == (int)$value);
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isWorkflowEnabled() {
-		return self::isModuleEnabled('WORKFLOW');
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isBibNumEnabled() {
+		 return self::isModuleEnabled('BIBNUM');
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isBibNumEnabled() {
-		return self::isModuleEnabled('BIBNUM');
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isFormationEnabled() {
+		 return self::isModuleEnabled('FORMATIONS');
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isFormationEnabled() {
-		return self::isModuleEnabled('FORMATIONS');
-	}
+	 public static function isLecturaEnabled() {
+		 return  '' != self::get('LECTURA_DOMAIN');
+	 }
 
 
-	public static function beModuleEnabled($module) {
-		self::set($module,1);
-	}
+	 public static function beModuleEnabled($module) {
+		 self::set($module,1);
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isVodeclicEnabled() {
-		return (('' != self::get('VODECLIC_KEY')) && ('' != self::get('VODECLIC_ID')) && ('' != self::get('VODECLIC_BIB_ID')));
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isVodeclicEnabled() {
+		 return (('' != self::get('VODECLIC_KEY')) && ('' != self::get('VODECLIC_ID')) && ('' != self::get('VODECLIC_BIB_ID')));
+	 }
 
 
-	public static function isToutApprendreEnabled() {
-		return (('' != self::get('TOUTAPPRENDRE_BIB_ID')) && ('' != self::get('TOUTAPPRENDRE_KEY')));
-	}
+	 public static function isToutApprendreEnabled() {
+		 return (('' != self::get('TOUTAPPRENDRE_BIB_ID')) && ('' != self::get('TOUTAPPRENDRE_KEY')));
+	 }
 
 
-	public static function isNumeriquePremiumEnabled() {
-		return '' != self::get('NUMERIQUE_PREMIUM_URL');
-	}
+	 public static function isNumeriquePremiumEnabled() {
+		 return '' != self::get('NUMERIQUE_PREMIUM_URL');
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isCVSEnabled() {
-		return (('' != self::get('CVS_BMKEY')) && ('' != self::get('CVS_BMID')) &&
-						('' != self::get('CVS_SOURCEPASSWORD')) && ('' != self::get('CVS_SOURCEKEY')) &&
-						('' != self::get('CVS_SOURCEID')) && ('' != self::get('CVS_SOURCENAME'))
-			);
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isCVSEnabled() {
+		 return (('' != self::get('CVS_BMKEY')) && ('' != self::get('CVS_BMID')) &&
+						 ('' != self::get('CVS_SOURCEPASSWORD')) && ('' != self::get('CVS_SOURCEKEY')) &&
+						 ('' != self::get('CVS_SOURCEID')) && ('' != self::get('CVS_SOURCENAME'))
+			 );
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isNumilogEnabled() {
-		return ('' != self::get('NUMILOG_URL') );
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isNumilogEnabled() {
+		 return ('' != self::get('NUMILOG_URL') );
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isCyberlibrisEnabled() {
-		return ('' != self::get('CYBERLIBRIS_URL') );
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isCyberlibrisEnabled() {
+		 return ('' != self::get('CYBERLIBRIS_URL') );
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isTypo3Enabled() {
-		return ('' != self::get('URL_TYPO3'));
-	}
+	 /**
+		* @return bool
+		*/
+	 public static function isTypo3Enabled() {
+		 return ('' != self::get('URL_TYPO3'));
+	 }
 
 
-	/**
-	 * @return bool
-	 */
-	public static function isOAIServerEnabled() {
-		return self::isModuleEnabled('OAI_SERVER');
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isPackMobileEnabled() {
-		return self::isModuleEnabled('PACK_MOBILE');
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isPlanningOuverturesEnabled() {
-		return self::isMultimediaEnabled();
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isArteVodEnabled() {
-		return (('' != self::get('ARTE_VOD_LOGIN'))
-						&& ('' != self::get('ARTE_VOD_KEY'))
-						&& ('' != self::get('ARTE_VOD_SSO_KEY')));
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isMusicMeEnabled() {
-		return ('' != self::get('MUSICME_URL'));
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isMultimediaEnabled() {
-		return ('' != self::get('MULTIMEDIA_KEY'));
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isWebkioskEnabled() {
-		return ('' != self::get('WEBKIOSK_KEY'));
-	}
-
-
-	public static function isLeKioskEnabled() {
-		return '' != self::get('LEKIOSK_ID');
-	}
-
-
-	/**
-	 * @return bool
-	 */
-	public static function isBeforeDateLastFullIntegrationUsers($date) {
-		if ('' == self::get('DATE_LAST_FULL_INTEGRATION_USERS'))	return true;
-		return $date >= self::get('DATE_LAST_FULL_INTEGRATION_USERS');
-	}
-
-
-	public static function isBoitePanierAutoEnabled() {
-		return self::isModuleEnabled('BOITE_PANIER_AUTO');
-	}
-
-
-	public static function getKnownVarsKeys() {
-		return array_keys(static::getKnownVars());
-	}
-
-
-	/**
-	 * @return array
-	 */
-	public static function getKnownVars() {
-		if (null === self::$_knownVars)
-			self::$_knownVars = [
-				'AVIS_MAX_SAISIE' => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
-				'AVIS_MIN_SAISIE' => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
-				'BLOG_MAX_NB_CARAC' => 'Nombre de caractères maximum à afficher dans le bloc critiques.',
-				'NB_AFFICH_AVIS_PAR_AUTEUR'  => 'Nombre d\'avis maximum à afficher par utilisateur.',
-				'CLEF_GOOGLE_MAP' => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
-				'MODO_AVIS' => 'Modération des avis des lecteurs.<br /> 0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-				'MODO_AVIS_BIBLIO' => 'Modération des avis des bibliothèquaires.<br />  0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
-				'AVIS_BIB_SEULEMENT' => '0 = Les lecteurs peuvent donner leur avis. <br /> 1 = Seuls les bibliothèquaires peuvent donner leur avis',
-				'MODO_BLOG' => '0 = Ne requiert pas d\'identification pour saisir des  commentaires. <br /> 1 = Requiert l\'identification pour saisir des commentaires.',
-				'REGISTER_OK' => 'Texte visible par l\'internaute après son inscription.',
-				'RESA_CONDITION' => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
-				'SITE_OK' => '0 = Site en maintenance. <br /> 1 = Site ouvert.',
-				'ID_BIBLIOSURF' => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
-				'JS_STAT' => 'Javascript code for statistics',
-				'ID_READ_SPEAKER' => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
-				'BLUGA_API_KEY' => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
-				'AIDE_FICHE_ABONNE' => 'Texte d\'aide affiché dans la fiche abonné',
-				'INTERDIRE_ENREG_UTIL' => 'Supprime l\'affichage du lien d\'enregistrement dans les différents formulaires de connexion et interdit l\'enregistrement d\'utilisateurs',
-				'LANGUES' => 'Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es',
-				'CACHE_ACTIF' => implode('<br/>',
-																 ['Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . ((int)Zend_Registry::get('cache')->getOption('lifetime')) / 60 . 'mn)',
-																	'0 = inactif',
-																	'1 = actif',
-																	sprintf('<a href="%s" >Vider le cache</a>',
-																					Class_Url::assemble(['module' => 'admin',
+	 /**
+		* @return bool
+		*/
+	 public static function isOAIServerEnabled() {
+		 return self::isModuleEnabled('OAI_SERVER');
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isPackMobileEnabled() {
+		 return self::isModuleEnabled('PACK_MOBILE');
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isPlanningOuverturesEnabled() {
+		 return self::isMultimediaEnabled();
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isArteVodEnabled() {
+		 return (('' != self::get('ARTE_VOD_LOGIN'))
+						 && ('' != self::get('ARTE_VOD_KEY'))
+						 && ('' != self::get('ARTE_VOD_SSO_KEY')));
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isMusicMeEnabled() {
+		 return ('' != self::get('MUSICME_URL'));
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isMultimediaEnabled() {
+		 return ('' != self::get('MULTIMEDIA_KEY'));
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isWebkioskEnabled() {
+		 return ('' != self::get('WEBKIOSK_KEY'));
+	 }
+
+
+	 public static function isLeKioskEnabled() {
+		 return '' != self::get('LEKIOSK_ID');
+	 }
+
+
+	 /**
+		* @return bool
+		*/
+	 public static function isBeforeDateLastFullIntegrationUsers($date) {
+		 if ('' == self::get('DATE_LAST_FULL_INTEGRATION_USERS'))	return true;
+		 return $date >= self::get('DATE_LAST_FULL_INTEGRATION_USERS');
+	 }
+
+
+	 public static function isBoitePanierAutoEnabled() {
+		 return self::isModuleEnabled('BOITE_PANIER_AUTO');
+	 }
+
+
+	 public static function getKnownVarsKeys() {
+		 return array_keys(static::getKnownVars());
+	 }
+
+
+	 /**
+		* @return array
+		*/
+	 public static function getKnownVars() {
+		 if (null === self::$_knownVars)
+			 self::$_knownVars = [
+				 'AVIS_MAX_SAISIE' => 'Nombre de caractères maximum autorisé à saisir dans les avis.',
+				 'AVIS_MIN_SAISIE' => 'Nombre de caractères minimum autorisé à saisir dans les avis.',
+				 'BLOG_MAX_NB_CARAC' => 'Nombre de caractères maximum à afficher dans le bloc critiques.',
+				 'NB_AFFICH_AVIS_PAR_AUTEUR'  => 'Nombre d\'avis maximum à afficher par utilisateur.',
+				 'CLEF_GOOGLE_MAP' => 'Clef d\'activation pour le plan d\'accès google map. <a target="_blank" href="http://code.google.com/apis/maps/signup.html">Obtenir la clé google map</a>',
+				 'MODO_AVIS' => 'Modération des avis des lecteurs.<br /> 0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
+				 'MODO_AVIS_BIBLIO' => 'Modération des avis des bibliothèquaires.<br />  0 = Affichage sans attente de validation<br /> 1 = Affichage seulement après validation.',
+				 'AVIS_BIB_SEULEMENT' => '0 = Les lecteurs peuvent donner leur avis. <br /> 1 = Seuls les bibliothèquaires peuvent donner leur avis',
+				 'MODO_BLOG' => '0 = Ne requiert pas d\'identification pour saisir des  commentaires. <br /> 1 = Requiert l\'identification pour saisir des commentaires.',
+				 'REGISTER_OK' => 'Texte visible par l\'internaute après son inscription.',
+				 'RESA_CONDITION' => 'Texte visible après l\'envoi d\'e-mail de demande de réservation.',
+				 'SITE_OK' => '0 = Site en maintenance. <br /> 1 = Site ouvert.',
+				 'ID_BIBLIOSURF' => 'Nom de la bibliothèque chez bibliosurf (en minuscules)',
+				 'JS_STAT' => 'Javascript code for statistics',
+				 'ID_READ_SPEAKER' => 'Numéro de client Read Speaker <a target="_blank" href="http://webreader.readspeaker.com">http://webreader.readspeaker.com</a>',
+				 'BLUGA_API_KEY' => 'Clé API Bluga Webthumb <a target="_blank" href="http://webthumb.bluga.net/home">http://webthumb.bluga.net/home</a>',
+				 'AIDE_FICHE_ABONNE' => 'Texte d\'aide affiché dans la fiche abonné',
+				 'INTERDIRE_ENREG_UTIL' => 'Supprime l\'affichage du lien d\'enregistrement dans les différents formulaires de connexion et interdit l\'enregistrement d\'utilisateurs',
+				 'LANGUES' => 'Liste des codes langue utilisées en plus du français séparées par des ;. Exemple: en;ro;es',
+				 'CACHE_ACTIF' => implode('<br/>',
+																	['Activer le cache des boîtes (meilleure performance mais mise à jour toutes les ' . ((int)Zend_Registry::get('cache')->getOption('lifetime')) / 60 . 'mn)',
+																	 '0 = inactif',
+																	 '1 = actif',
+																	 sprintf('<a href="%s" >Vider le cache</a>',
+																					 Class_Url::assemble(['module' => 'admin',
 																															 'action' => 'clearcache']))]),
 				'WORKFLOW' => 'Activer ou désactiver la gestion des validations des articles<br />1 = Activé, Autre valeur = désactivé',
 				'WORKFLOW_TEXT_MAIL_ARTICLE_PENDING' => 'Contenu de l\'email de notification d\'article en attente de validation',
@@ -359,8 +364,11 @@ class Class_AdminVar extends Storm_Model_Abstract {
 				'EXTRA_SKIN_PATH' => 'Chemin vers les skins personnalisées, relatif à ' . Class_Profil_Skin::EXTRA_PATH,
 				'ENABLE_COLLABORATIVE_BROWSING' => 'Activation de la navigation collaborative. 0 = inactif, 1 = actif',
 				'KOHA_MULTI_SITES' => 'WS KOHA : Reservation d\'exemplaires pour les multi sites. 0 = inactif, 1 = actif',
-				'LEKIOSK_ID' => 'Identifiant fournit par lekiosk.com'
+				'LECTURA_DOMAIN' => 'Domaine utilisée par le serveur lectura pour authentification',
+  		  'LEKIOSK_ID' => 'Identifiant fournit par lekiosk.com',
+				'TEXT_REPLACEMENTS' => 'Remplacement de textes à la volée. <br/>Ex:<br/>Panier;Sélection<br/>Vous avez %d paniers;Vous avez %d sélections'
 				];
+
 		return self::$_knownVars;
 	}
 
diff --git a/library/Class/AlbumCategorie.php b/library/Class/AlbumCategorie.php
index 6163413898440ddfa6427bfee4b8a76dfb8eb22d..c2fd9b2f433c17da08e6165232fe2eee6af9cf23 100644
--- a/library/Class/AlbumCategorie.php
+++ b/library/Class/AlbumCategorie.php
@@ -16,15 +16,15 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class AlbumCategorieLoader extends Storm_Model_Loader {
-	/** 
-	 * @return array 
+	/**
+	 * @return array
 	 */
 	public function getCollections() {
-		return $this->findAllBy(array('parent_id' => 0, 
+		return $this->findAllBy(array('parent_id' => 0,
 																	'order' => 'libelle'));
 	}
 
@@ -75,6 +75,7 @@ class Class_AlbumCategorie extends Storm_Model_Abstract {
 
 															 'albums' => array('model' => 'Class_Album',
 																								 'role' => 'categorie',
+																								 'order' => 'titre',
 																								 'dependents' => 'delete'));
 
 	protected $_default_attribute_values = array('parent_id' => 0);
@@ -98,7 +99,7 @@ class Class_AlbumCategorie extends Storm_Model_Abstract {
 	public function getChildrenCount() {
 		return $this->numberOfAlbums();
 	}
-		
+
 
 	public function hasNoChild() {
 		return !$this->hasChildren();
@@ -111,7 +112,7 @@ class Class_AlbumCategorie extends Storm_Model_Abstract {
 	public function isNew() {
 		return parent::isNew() || 0 == $this->getId();
 	}
-	
+
 
 	/**
 	 * @param array $datas
diff --git a/library/Class/Article.php b/library/Class/Article.php
index 1f0c5fcc30ffe13eed260f8213903fbf468d36ec..181dd716caa6e108cfe7987d690926f9341b8bf6 100644
--- a/library/Class/Article.php
+++ b/library/Class/Article.php
@@ -250,6 +250,28 @@ class ArticleLoader extends Storm_Model_Loader {
 	}
 
 
+	protected function _byIdLieu($id_lieu) {
+		if (null == $id_lieu)
+			return $this;
+
+		$this->_select->where('ID_LIEU=?', $id_lieu);
+		return $this;
+	}
+
+	protected function _byCustomFields($custom_fields) {
+		foreach ($custom_fields as $id => $value) {
+			$this->_select
+				->join(
+					[ "cfv$id" => 'custom_field_values' ],
+					"cms_article.ID_ARTICLE = cfv$id.model_id AND cfv$id.custom_field_id = $id",
+					[]
+				)
+				->where("cfv$id.value = ?", $value);
+		}
+
+		return $this;
+	}
+
 	/**
 	 * @return ArticleLoader
 	 */
@@ -270,21 +292,23 @@ class ArticleLoader extends Storm_Model_Loader {
 	 */
 	public function getArticlesByPreferences($preferences) {
 		$defaults = [
-			'id_categorie' => '', // catégories d'article, ex: 12-2-8-1-89
-			'id_items' => '', // liste d'articles, ex: 39-28-7
-			'display_order' => '', // tri, cf. méthodes Class_Article::sortByXXX, Random, Selection
-			'nb_analyse' => 0, // afficher nb_aff articles (aléatoires) parmis nb_analyse articles ramenés sur un critère
-			'nb_aff' => null, // nb d'article à retourner
-			'langue' => null, // que les traductions de cette langue
-			'event_date' => null, // que les articles dont les dates de début et/ou de fin inclue cette date
-			'event_start_after' => null, // que les articles dont l'évènement commence après cette date
-			'event_end_after' => null, // que les articles dont l'évènement termine à ou après cette date
-			'id_bib' => null, // filtre par cette bibliothèque
-			'status' => null, // filtre par cet état de workflow cf. Class_Article::STATUS_XXX
-			'events_only' => false, // filtre que les évènements,
-			'published' => true, // seulement les articles dont les date de debut / fin incluent le jour en cours
-			'display_mode' => 'Title'
-			];
+								 'id_categorie' => '', // catégories d'article, ex: 12-2-8-1-89
+								 'id_items' => '', // liste d'articles, ex: 39-28-7
+								 'display_order' => '', // tri, cf. méthodes Class_Article::sortByXXX, Random, Selection
+								 'nb_analyse' => 0, // afficher nb_aff articles (aléatoires) parmis nb_analyse articles ramenés sur un critère
+								 'nb_aff' => null, // nb d'article à retourner
+								 'langue' => null, // que les traductions de cette langue
+								 'event_date' => null, // que les articles dont les dates de début et/ou de fin inclue cette date
+								 'event_start_after' => null, // que les articles dont l'évènement commence après cette date
+								 'event_end_after' => null, // que les articles dont l'évènement termine à ou après cette date
+								 'id_bib' => null, // filtre par cette bibliothèque
+								 'status' => null, // filtre par cet état de workflow cf. Class_Article::STATUS_XXX
+								 'events_only' => false, // filtre que les évènements,
+								 'published' => true, // seulement les articles dont les date de debut / fin incluent le jour en cours,
+								 'id_lieu' => null,  // id du lieu Class_Lieu
+								 'display_mode' => 'Title',
+								 'custom_fields' => [],
+		];
 
 		$preferences = array_merge($defaults, $preferences);
 
@@ -300,16 +324,20 @@ class ArticleLoader extends Storm_Model_Loader {
 		$this->_event_end_after = $preferences['event_end_after'];
 		$this->_event_start_after = $preferences['event_start_after'];
 		$this->_id_bib = $preferences['id_bib'];
+		$this->_id_lieu = (int)$preferences['id_lieu'];
 		$this->_status = $preferences['status'];
 		$this->_events_only = (bool)$preferences['events_only'];
 		$this->_published = (bool)$preferences['published'];
 		$this->_display_mode = $preferences['display_mode'];
+		$this->_custom_fields = $preferences['custom_fields'];
 
 
 		$select = $this
 			->_selectArticles()
 			->_publishedNow()
 			->_byIdBib($this->_id_bib)
+			->_byIdLieu($this->_id_lieu)
+			->_byCustomFields($this->_custom_fields)
 			->_whereSelectionIn($this->_id_articles, $this->_id_categories)
 			->_whereEventDateIn($this->_event_date)
 			->_whereEventStartAfter($this->_event_start_after)
@@ -1077,7 +1105,6 @@ class Class_Article extends Storm_Model_Abstract {
 
 		return $copy
 			->updateAttributes($attributes)
-			->setLibelle('** Nouvel Article **')
 			->setAuteur(Class_Users::getIdentity());
 	}
 
diff --git a/library/Class/Calendar.php b/library/Class/Calendar.php
index 10d99a7f05e78c1f0966c97956b94e1baeccd7e0..35d19b1a34490e81750b92df5a66fbd46538de9f 100644
--- a/library/Class/Calendar.php
+++ b/library/Class/Calendar.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //	 OPAC- 3																				Class_Calendar
@@ -24,7 +24,6 @@
 class Class_Calendar {
 	use Trait_TimeSource;
 	var $PREFIX					= "calendar_";
-	var $CSS_PREFIX			= "calendar_";
 	var $URL_PARAMETER	= "date";
 	var $PRESERVE_URL		= true;
 	var $LANGUAGE_CODE	= "fr";
@@ -38,11 +37,8 @@ class Class_Calendar {
 	protected $id_module;
 	protected $_translate;
 	protected $_article_event_helper;
-	protected $_view;
 
-
-	public function __construct($param_array, $view) {
-		$this->_view = $view;
+	public function __construct($param_array) {
 		$this->param = $param_array;
 	}
 
@@ -50,10 +46,11 @@ class Class_Calendar {
 	public function initializeParams() {
 		$this->_translate = Zend_Registry::get('translate');
 
-
+		$day = '';
 		// Month and year to display (gotten from URL)
 		if (isset($this->param["DATE"]) && $this->param["DATE"] != "") {
 			$date_array = explode('-', $this->param["DATE"]);
+			$day = isset($date_array[2]) ? (int)$date_array[2]: '';
 			$this->month = (int)$date_array[1];
 			$this->year	 = (int)$date_array[0];
 		}
@@ -62,6 +59,8 @@ class Class_Calendar {
 			$this->year = date("Y", $this->getTimeSource()->time());
 		}
 		$this->param["DATE"] = sprintf('%4d-%02d', $this->year, $this->month);
+		if($day)
+			$this->param['DAY'] = $this->param['DATE'] . sprintf('-%02d', $day);
 		$this->id_module = $this->param["ID_MODULE"];
 	}
 
@@ -70,7 +69,7 @@ class Class_Calendar {
 		return $this->_loadArticles([]);
 	}
 
-	
+
 	protected function _loadArticles($extra_prefs) {
 		if (('all' !== $this->param["SELECT_ID_CAT"]) and ($this->param['DISPLAY_CAT_SELECT']))
 			$id_cat = (int)$this->param['SELECT_ID_CAT'];
@@ -81,13 +80,15 @@ class Class_Calendar {
 			$id_cat = '';
 
 		$time = $this->getTimeSource()->time();
-		
+
 		$prefs = array_merge(['display_order' => 'EventDebut',
 													'id_categorie' => $id_cat,
 													'events_only' => true,
 													'event_date' => $this->param['DATE'],
 													'id_bib' => $this->param['ID_BIB'],
-													'published' => $this->param['DATE'] >= strftime('%Y-%m',$time)], 
+													'id_lieu' => $this->getPlaceParam(),
+													'custom_fields' => $this->getCustomFieldParams(),
+													'published' => $this->param['DATE'] >= strftime('%Y-%m',$time)],
 												 $extra_prefs);
 
 		$articles = Class_Article::getArticlesByPreferences($prefs);
@@ -95,6 +96,14 @@ class Class_Calendar {
 		return $articles;
 	}
 
+	protected function getPlaceParam() {
+		return isset($this->param['PLACE']) ? $this->param['PLACE'] : '';
+	}
+
+	public function getCustomFieldParams() {
+		return isset($this->param['CUSTOM_FIELDS']) ? $this->param['CUSTOM_FIELDS'] : [];
+	}
+
 
 	protected function _getNextEvents(){
 
@@ -180,7 +189,10 @@ class Class_Calendar {
 
 
 	public function getArticles() {
-		$articles = $this->_getNextEvents();
+		$articles = isset($this->param['DAY'])
+			? $this->_loadArticles(['event_date' => $this->param['DAY']])
+			: $this->_getNextEvents();
+
 		$nb_news = $this->param["NB_NEWS"];
 	  return array_slice($articles, 0, $nb_news);
 	}
diff --git a/library/Class/Catalogue.php b/library/Class/Catalogue.php
index defc18aebcc7a49eb6f541581e17e4c3f3e7c9b4..d33514042e1fe0144430a60f5f18c8ebf380e98b 100644
--- a/library/Class/Catalogue.php
+++ b/library/Class/Catalogue.php
@@ -16,13 +16,13 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 ////////////////////////////////////////////////////////////////////////////////
 // OPAC3 - Catalogues de notices
 ////////////////////////////////////////////////////////////////////////////////
 class CatalogueLoader extends Storm_Model_Loader {
-	
+
 	const DEFAULT_ITEMS_BY_PAGE = 100;
 
 	public function loadNoticesFor($catalogue, $itemsByPage = self::DEFAULT_ITEMS_BY_PAGE, $page = 1, $find_all_params = null) {
@@ -37,7 +37,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 		if ('' == ($where = $this->clausesFor($catalogue)))
 			return array();
-		
+
 		$find_all_params['where'] = $where;
 		return Class_Notice::getLoader()->findAllBy($find_all_params);
 	}
@@ -48,7 +48,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 		return $catalogues;
 	}
 
-	
+
 	public function getDomainsForBreadcrumb($breadcrumb) {
 		$domains_ids=array_filter(explode(';',$breadcrumb));
 		$domains=[];
@@ -77,7 +77,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 	public function countNoticesFor($catalogue) {
 		if (!$catalogue)
 			return 0;
-		
+
 		if ('' == ($where = $this->clausesFor($catalogue)))
 			return 0;
 
@@ -96,11 +96,11 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 		if ($facets = $this->facetsClauseFor($catalogue))
 			$conditions[] = $facets;
-		
-		if ($docType = $this->docTypeClauseFor($catalogue)) 
+
+		if ($docType = $this->docTypeClauseFor($catalogue))
 			$conditions[] = $docType;
 
-		if ($year = $this->yearClauseFor($catalogue)) 
+		if ($year = $this->yearClauseFor($catalogue))
 			$conditions[] = $year;
 
 		if ($cote = $this->coteClauseFor($catalogue))
@@ -112,7 +112,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 		if (0 == count($conditions))
 			return '';
-		
+
 		return implode(' and ', $conditions);
 	}
 
@@ -130,9 +130,9 @@ class CatalogueLoader extends Storm_Model_Loader {
 										'Y' => $catalogue->getAnnexe(),
 										'E' => $catalogue->getEmplacement());
 
-		foreach ($facets as $k => $v) 
+		foreach ($facets as $k => $v)
 			$against .= Class_Catalogue::getSelectionFacette($k, $v);
-		
+
 		$facets = array('A' => $catalogue->getAuteur(),
 										'M' => $catalogue->getMatiere(),
 										'D' => $catalogue->getDewey(),
@@ -141,11 +141,11 @@ class CatalogueLoader extends Storm_Model_Loader {
 										'Z' => $catalogue->getTags(),
 										'F' => $catalogue->getInteret());
 
-		foreach ($facets as $k => $v) 
+		foreach ($facets as $k => $v)
 			$against_ou .= Class_Catalogue::getSelectionFacette($k, $v, in_array($k, array('M', 'D', 'P','H')), false);
 
 
-		if ('' != $against_ou) 
+		if ('' != $against_ou)
 			$against .= ' +(' . $against_ou . ")";
 
 		if ('' == $against)
@@ -160,7 +160,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 			return '';
 
 		$parts = array_filter(explode(';', $docType));
-		if (1 == count($parts)) 
+		if (1 == count($parts))
 			return 'type_doc=' . $parts[0];
 
 		return 'type_doc IN (' . implode(', ', $parts) .  ')';
@@ -169,10 +169,10 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 	public function yearClauseFor($catalogue) {
 		$clauses = array();
-		if ($start = $catalogue->getAnneeDebut()) 
+		if ($start = $catalogue->getAnneeDebut())
 			$clauses[] = "annee >= '" . $start . "'";
 
-		if($end = $catalogue->getAnneeFin()) 
+		if($end = $catalogue->getAnneeFin())
 			$clauses[] = "annee <= '" . $end . "'";
 
 		if (0 == count($clauses))
@@ -184,10 +184,10 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 	public function coteClauseFor($catalogue) {
 		$clauses = array();
-		if ($start = $catalogue->getCoteDebut()) 
+		if ($start = $catalogue->getCoteDebut())
 			$clauses[] = "cote >= '" . strtoupper($start) . "'";
 
-		if ($end = $catalogue->getCoteFin()) 
+		if ($end = $catalogue->getCoteFin())
 			$clauses[] = "cote <= '". strtoupper($end) . "'";
 
 		if (0 == count($clauses))
@@ -209,10 +209,10 @@ class CatalogueLoader extends Storm_Model_Loader {
 	public function fromUntilClauseFor($catalogue) {
 		$clauses = array();
 
-		if ($start = $catalogue->getFrom()) 
+		if ($start = $catalogue->getFrom())
 			$clauses[] = "left(date_maj, 10) >= '" . $start . "'";
 
-		if($end = $catalogue->getUntil()) 
+		if($end = $catalogue->getUntil())
 			$clauses[] = "left(date_maj, 10) <= '" . $end . "'";
 
 		if (0 == count($clauses))
@@ -248,7 +248,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 	 * @return Class_Catalogue
 	 */
 	public function getRoot() {
-		return Class_Catalogue::newInstanceWithId(null, 
+		return Class_Catalogue::newInstanceWithId(null,
 																							['sous_domaines' => Class_Catalogue::findTopCatalogues()]);
 	}
 
@@ -262,24 +262,24 @@ class CatalogueLoader extends Storm_Model_Loader {
 	}
 
 	public function fetchAllNoticesByPreferences($preferences, $cache_vignette) {
-		$requetes=$this->getRequetes($preferences);
+		$requetes = $this->getRequetes($preferences);
 		if (!array_key_exists("req_liste", $requetes))
 			return array();
 
 		$req_liste = str_replace('select *',
-														 'select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre', 
+														 'select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre',
 														 $requetes["req_liste"]);
 
-		$catalogue=fetchAll($req_liste);
-		if (!$catalogue) 
+		$catalogue = fetchAll($req_liste);
+		if (!$catalogue)
 			return [];
-		
+
 		$class_notice = new Class_Notice();
 		$class_img = new Class_WebService_Vignette();
-		
+
 		$notices = [];
 		foreach($catalogue as $notice)	{
-			$enreg = ($model = Class_Notice::find($notice['id_notice'])) 
+			$enreg = ($model = Class_Notice::find($notice['id_notice']))
 				? $model->getNotice('JA') : [];
 			$vignette = '';
 			if ($cache_vignette)	{
@@ -289,7 +289,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 			if (!$cache_vignette or $vignette) {
 				$notices[] = ["id_notice" => $enreg["id_notice"],
-											"titre" => $enreg["J"], 
+											"titre" => $enreg["J"],
 											"auteur" => $enreg["A"],
 											"vignette" => $vignette,
 											"type_doc" => $enreg["type_doc"],
@@ -305,45 +305,50 @@ class CatalogueLoader extends Storm_Model_Loader {
 		return $notices;
 	}
 
+
 	public function getRequetes($preferences, $fields = null)	{
 		if (isset($preferences["id_panier"])
-				&& (0 !== (int)$preferences["id_panier"])) 
+				&& (0 !== (int)$preferences["id_panier"]))
 			return $this->getRequetesPanier($preferences);
 
 		$against = $this->selectionFacettesForCatalogueRequestByPreferences($preferences);
 		if ($catalogue = $this->find($preferences['id_catalogue'])) {
-			$conditions = array($this->facetsClauseFor($catalogue, $against));
+			$conditions = [$this->facetsClauseFor($catalogue, $against)];
 
 			$conditions []= $this->docTypeClauseFor($catalogue);
 			$conditions []= $this->yearClauseFor($catalogue);
 			$conditions []= $this->coteClauseFor($catalogue);
 			$conditions []= $this->nouveauteClauseFor($catalogue);
 		} else {
-			$conditions = $against ? array("MATCH(facettes) AGAINST('".$against."' IN BOOLEAN MODE)") : array();
+			$conditions = $against
+				? ["MATCH(facettes) AGAINST('" . $against . "' IN BOOLEAN MODE)"]
+				: [];
 		}
 
-		if (isset($preferences['only_img']) && ($preferences['only_img'] == 1)) 
+		if (isset($preferences['only_img']) && ($preferences['only_img'] == 1))
 			$conditions[] = "url_vignette > '' and url_vignette != 'NO'";
 
-		$join = (isset($preferences['avec_avis']) && ($preferences['avec_avis'] == 1)) 
+		$join = (isset($preferences['avec_avis']) && ($preferences['avec_avis'] == 1))
 			?	' INNER JOIN notices_avis ON notices.clef_oeuvre=notices_avis.clef_oeuvre '
 			: '';
 
 		if ($where = implode(' and ', array_filter($conditions)))
-			$where = ' where '.$where;
+			$where = ' where ' . $where;
 
 		$order_by = $this->orderByForCatalogueRequestByPreferences($preferences);
 		$limite = $this->limitForCatalogueRequestByPreferences($preferences);
 
-		$select_fields = $fields ? implode(',', $fields): '*';
+		$sql = 'select %s from notices' . $join . $where;
 
-		$ret['req_liste'] = 'select ' . $select_fields . ' from notices ' . $join . $where . $order_by . $limite;
-		$ret['req_comptage'] = 'select count(*) from notices ' . $join . $where;
-		$ret['req_facettes'] = 'select notices.id_notice, type_doc, facettes from notices ' . $join . $where . $limite;
-
-		return $ret;
+		return ['req_liste' => sprintf($sql, $fields ? implode(',', $fields) : '*')
+						. $order_by . $limite,
+						'req_comptage' => sprintf($sql, 'count(*)'),
+						'req_facettes' => sprintf($sql, 'notices.id_notice, type_doc, facettes')
+						. $limite,
+						'req_ids' => sprintf($sql, 'notices.id_notice') . $order_by . $limite];
 	}
 
+
 	public function selectionFacettesForCatalogueRequestByPreferences($preferences) {
 		if (!isset($preferences['facettes']))
 			return '';
@@ -351,7 +356,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 		$against = '';
 		$facettes = explode(';', $preferences['facettes']);
 		foreach($facettes as $facette) {
-			$facette = trim($facette); 
+			$facette = trim($facette);
 			$against .= $this->getSelectionFacette(substr($facette, 0, 1), substr($facette, 1));
 		}
 
@@ -359,14 +364,14 @@ class CatalogueLoader extends Storm_Model_Loader {
 	}
 
 	public function orderByForCatalogueRequestByPreferences($preferences) {
-		if(!array_key_exists('tri', $preferences) 
-			 || ($preferences["tri"] == '0' 
+		if(!array_key_exists('tri', $preferences)
+			 || ($preferences["tri"] == '0'
 					 || $preferences["tri"] == 'alpha_titre'))
 			return ' order by alpha_titre ';
-		
+
 		if ($preferences['tri'] == '1' || $preferences['tri'] == 'date_creation desc')
 			return ' order by date_creation DESC ';
-		
+
 		if ($preferences['tri'] == '2' || $preferences['tri'] == 'nb_visu desc')
 			return ' order by nb_visu DESC ';
 
@@ -378,20 +383,20 @@ class CatalogueLoader extends Storm_Model_Loader {
 	public function limitForCatalogueRequestByPreferences($preferences, $no_limit=false) {
 		$limite = 0;
 
-		if (isset($preferences["aleatoire"]) && (int)$preferences["aleatoire"]==1) 
+		if (isset($preferences["aleatoire"]) && (int)$preferences["aleatoire"]==1)
 			$limite = (int)$preferences["nb_analyse"];
 		else if (isset($preferences['nb_notices']))
 			$limite = (int)$preferences["nb_notices"];
 
-		if ($limite and !$no_limit) 
+		if ($limite and !$no_limit)
 			return ' LIMIT 0,' . $limite;
 
 	  return ' LIMIT 5000'; //LL: j'ai rajouté une limite max car explosion mémoire sur des catalogues mal définis
 	}
 
-	
+
 	public static function getSelectionFacette($type, $valeurs, $descendants = false, $signe = true) {
-		if (!$valeurs) 
+		if (!$valeurs)
 			return false;
 
 		$valeurs = explode(';', $valeurs);
@@ -412,7 +417,7 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 			if (!$matiere = Class_Matiere::getLoader()->find($valeur))
 				continue;
-			
+
 			if ('' != ($sous_vedettes = trim($matiere->getSousVedettes())))
 			  $valeur .= str_replace(' ', ' M', ' ' . $sous_vedettes);
 			$cond .= $type . $valeur . ' ';
@@ -423,86 +428,85 @@ class CatalogueLoader extends Storm_Model_Loader {
 		return ($signe) ? ' +(' . $cond . ')' : ' ' . $cond;
 	}
 
+
 	public function getRequetesPanier($preferences) {
 		$panier = null;
-
 		if (array_key_exists('id_user', $preferences))
 			$panier = Class_PanierNotice::findFirstBy(['id_user' => $preferences['id_user'],
 																								 'id_panier' => $preferences['id_panier']]);
-
 		if (!$panier)
 			$panier = Class_PanierNotice::find($preferences['id_panier']);
 
-		if (!$panier) 
+		if (!$panier)
 			return ['nombre' => 0];
 
 		$cles_notices = $panier->getClesNotices();
-		if (empty($cles_notices)) {
-			$ret['nombre'] = 0;
-			return $ret;
-		}
-		
-		$in_sql = '';
+		if (empty($cles_notices))
+			return ['nombre' => 0];
+
+		$keys = [];
 		foreach($cles_notices as $notice) {
-			if (!trim($notice)) continue;
-			$in_sql .= ('' != $in_sql ? ',' : '') . "'" . $notice . "'";
+			if (!trim($notice))
+				continue;
+			$keys[] = "'" . $notice . "'";
 		}
+		$in_sql = implode(',', $keys);
 
-		if ($preferences['aleatoire'] == 1) 
-			$limite = $preferences['nb_analyse'];
-		else 
-			$limite = $preferences['nb_notices'];
-
-		if ($limite) 
-			$limite = 'LIMIT 0,' . $limite; 
-		else 
-			$limite = '';
+		$limite = ($preferences['aleatoire'] == 1)
+			? $preferences['nb_analyse'] : $preferences['nb_notices'];
+		$limite = ($limite) ? 'LIMIT 0,' . $limite : '';
 
 		$order_by = '';
-		if($preferences["tri"]==0) 
+		if($preferences["tri"]==0)
 			$order_by=" order by alpha_titre ";
-		if($preferences["tri"]==1) 
+		if($preferences["tri"]==1)
 			$order_by=" order by date_creation DESC ";
-		if($preferences["tri"]==2) 
+		if($preferences["tri"]==2)
 			$order_by=" order by nb_visu DESC ";
 
-		$condition = '';
-		if (array_isset("only_img", $preferences) && $preferences["only_img"] == 1) 
-			$condition=" and url_vignette > '' and url_vignette != 'NO' ";
+		$condition = (array_isset("only_img", $preferences)
+									&& $preferences["only_img"] == 1)
+			? " and url_vignette > '' and url_vignette != 'NO' "
+			: '';
+
+		$join = (array_isset("avec_avis", $preferences) && $preferences["avec_avis"] == 1)
+			? ' INNER JOIN notices_avis ON notices.clef_oeuvre=notices_avis.clef_oeuvre '
+			: '';
 
-		$join = '';
-		if (array_isset("avec_avis", $preferences) && $preferences["avec_avis"] == 1) 
-			$join = " INNER JOIN notices_avis ON notices.clef_oeuvre=notices_avis.clef_oeuvre ";
+		$sql = 'select %s from notices '
+			. $join
+			. 'where notices.clef_alpha in(' . $in_sql . ')'
+			. $condition;
 
-		$ret['req_liste'] = "select * from notices ".$join."where notices.clef_alpha in(".$in_sql.")".$condition.$order_by.$limite;
-		$ret['req_comptage'] = "select count(*) from notices ".$join."where notices.clef_alpha in(".$in_sql.")".$condition;
-		$ret['req_facettes'] = "select id_notice,type_doc,facettes from notices ".$join."where notices.clef_alpha in(".$in_sql.") ".$condition.$limite;
-		return $ret;
+		return ['req_liste' => sprintf($sql, '*') . $order_by . $limite,
+						'req_comptage' => sprintf($sql, 'count(*)'),
+						'req_facettes' => sprintf($sql, 'id_notice, type_doc, facettes') . $limite,
+						'req_ids' => sprintf($sql, 'notices.id_notice') . $order_by . $limite];
 	}
 
-	
-		public function getNoticesFromCacheByPreferences($preferences, $cache_vignette) {
+
+	public function getNoticesFromCacheByPreferences($preferences, $cache_vignette) {
 		return (new Storm_Cache())
 			->memoize([$preferences, __CLASS__, __FUNCTION__, $cache_vignette],
 								function() use ($preferences, $cache_vignette) {
-							     return Class_Catalogue::getLoader()->fetchAllNoticesByPreferences($preferences, $cache_vignette);		
+							     return Class_Catalogue::getLoader()->fetchAllNoticesByPreferences($preferences, $cache_vignette);
 						    });
 	}
 
 
 	public function getNoticesByPreferences($preferences, $cache_vignette=false)	{
-		if (isset($preferences['id_catalogue']) 
+		if (isset($preferences['id_catalogue'])
 				&& ($catalogue = Class_Catalogue::getLoader()->find($preferences['id_catalogue']))) {
 			$preferences['catalogue_cache_key'] = serialize($catalogue->toArray());
 		}
 
 		$notices = $this->getNoticesFromCacheByPreferences($preferences, $cache_vignette);
 
-		if ((int)$preferences["aleatoire"] !== 1) 
+		if ((int)$preferences["aleatoire"] !== 1)
 			return $notices;
 
 		shuffle($notices);
-		return array_slice ($notices, 0, $preferences["nb_notices"]);   
+		return array_slice ($notices, 0, $preferences["nb_notices"]);
 	}
 
 }
@@ -512,8 +516,8 @@ class CatalogueLoader extends Storm_Model_Loader {
 
 class Class_Catalogue extends Storm_Model_Abstract {
 	use Trait_TreeNode, Trait_Translator;
-	
-	protected 
+
+	protected
 		$_table_name = 'catalogue',
 		$_table_primary = 'ID_CATALOGUE',
 		$_loader_class = 'CatalogueLoader',
@@ -548,7 +552,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 										 'user' => ['model' => 'Class_Users',
 																	 'referenced_in' => 'id_user']
 			],
-		
+
 		$_has_many = ['sous_domaines' => ['model' => 'Class_Catalogue',
 																			'role' => 'domaine_parent',
 																			'dependents' => 'delete',
@@ -563,7 +567,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$_from,
 		$_until;
 
-	
+
 	public static function newCatalogueForAll() {
 		return new AllNoticesCatalogue();
 	}
@@ -571,7 +575,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 	/** [[file:~/public_html/afi-opac3/library/Trait/TreeNode.php::trait%20Trait_TreeNode%20{][voir Trait_TreeNode]] */
 	public function getParent() {
-		return $this->getDomaineParent(); 
+		return $this->getDomaineParent();
 	}
 
 
@@ -609,7 +613,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 		$start=$nb_par_page*$numero_page;
 		$requete_ids=str_replace('LIMIT 5000',
-														 "limit ".$nb_par_page*$numero_page.','.$nb_par_page, 
+														 "limit ".$nb_par_page*$numero_page.','.$nb_par_page,
 														 $req['req_liste']);
 
 		$sql = Zend_Registry::get('sql');
@@ -629,7 +633,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		 * Sites, articles and RSS records are first destroyed and then get their own selection of domains.
 		 * So therauri facettes must not be deleted. By the way, need to find a nicer implementation ...
 		 */
-		$query = 
+		$query =
 			'update notices set facettes = clean_spaces(replace(facettes,"H'.$id_thesaurus.'","")) '.
 			'where type_doc not in ('.implode(',', [Class_TypeDoc::ARTICLE, Class_TypeDoc::RSS, Class_TypeDoc::SITE]).') '.
 			'and match(facettes) against("+H'.$id_thesaurus.'" in boolean mode)';
@@ -645,14 +649,14 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 		$sql = Zend_Registry::get('sql');
 		$thesaurus=Class_CodifThesaurus::findThesaurusForCatalogue($this->getId());
-		if (!$thesaurus) 
+		if (!$thesaurus)
 			$this->saveThesaurus();
 		if ($thesaurus) {
 			if ($page==0) $this->deleteThesaurusInFacette($thesaurus->getIdThesaurus());
-	
+
 			$sql->query('update notices set facettes=concat(facettes," H'.$thesaurus->getIdThesaurus().'") where id_notice in ('.implode(',',$ids).')');
 			return true;
-			
+
 		}
 		return false;
 	}
@@ -662,7 +666,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		return Class_Catalogue::getLoader()->countNoticesFor($this);
 	}
 
-	
+
 	public function isMatchingAllNotices() {
 		return false;
 	}
@@ -680,7 +684,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$ret["requete"] = $requetes["req_liste"];
 		$temps = time();
 
-		$ret["notices"] = $this->getNotices(null, null, 
+		$ret["notices"] = $this->getNotices(null, null,
 																				['limitPage' => [1, $preferences['nb_notices']],
 																				 'order' => 'alpha_titre']);
 
@@ -688,13 +692,13 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$ret["nb_notices"] = fetchOne($requetes["req_comptage"]);
 
 		$req = $requetes["req_comptage"];
-		if (strpos($req,"where") > 0) 
-			$req.=" and "; 
-		else 
+		if (strpos($req,"where") > 0)
+			$req.=" and ";
+		else
 			$req.=" where ";
 
 		$req .= "url_vignette > '' and url_vignette != 'NO'";
-		$ret["avec_vignettes"] = fetchOne($req);		
+		$ret["avec_vignettes"] = fetchOne($req);
 		return $ret;
 	}
 
@@ -705,7 +709,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 			if (!$v)
 				continue;
 
-			$concat = '';				
+			$concat = '';
 			$values = array_filter(explode(';', $v));
 			foreach ($values as $value) {
 				if (in_array($k, ['D', 'P', 'H']))
@@ -777,11 +781,11 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 
 	public function getCatalogue($id_catalogue)	{
-		return ($id_catalogue) 
+		return ($id_catalogue)
 			? fetchEnreg("select * from catalogue where ID_CATALOGUE=$id_catalogue")
 			: fetchAll("select * from catalogue order by LIBELLE");
 	}
-	
+
 
 	public static function getCataloguesForCombo()	{
 		if (!$catalogues = Class_Catalogue::findTopCatalogues())
@@ -819,7 +823,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 	public function getChildren() {
 		return $this->getSousDomaines();
 	}
-	
+
 
 	public function checkAndSetAnnee($attribute, $value) {
 		$value = (int)$value;
@@ -831,13 +835,13 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 	public function validate() {
 		$this->checkAttribute('libelle', $this->getLibelle(), 'Le libellé est requis');
-		$this->checkAttribute('annee_fin', 
+		$this->checkAttribute('annee_fin',
 													!($this->getAnneeDebut() and $this->getAnneeFin()) || $this->getAnneeDebut() <= $this->getAnneeFin(),
 													"L'année de début doit être inférieure ou égale à l'année de fin");
 		$this->checkAttribute('oai_spec',
 													!$this->getOaiSpec() || preg_match('/^[a-zA-Z0-9_.-]+$/', $this->getOaiSpec()),
-													"La spec OAI ne peut contenir que les caractères suivants: de a à z, 0 à 9, - _ ."); 
-		
+													"La spec OAI ne peut contenir que les caractères suivants: de a à z, 0 à 9, - _ .");
+
 	}
 
 
@@ -887,7 +891,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 			'}';
 	}
 
-	
+
 	public function toDataForJson($options = []) {
 		$data_domaines = [];
 		$data_panier = [];
@@ -925,7 +929,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 						 'options' => array_merge(['ico' => URL_ADMIN_IMG.'picto/domaines_16.png'],$options)];
 	}
 
-	
+
 	public function afterSave(){
 		$this->saveThesaurus();
 	}
@@ -965,8 +969,8 @@ class Class_Catalogue extends Storm_Model_Abstract {
 				$thesaurus_parent = $catalogue_parent->saveThesauriParents();
 				if (!$thesaurus_parent)
 					return null;
-				$new_thesaurus_id=Class_CodifThesaurus::findNextThesaurusChildId($thesaurus_parent->getIdThesaurus());			
-				$thesaurus->setIdThesaurus($new_thesaurus_id);					
+				$new_thesaurus_id=Class_CodifThesaurus::findNextThesaurusChildId($thesaurus_parent->getIdThesaurus());
+				$thesaurus->setIdThesaurus($new_thesaurus_id);
 				$thesaurus->setLibelle($this->getLibelle());
 				$thesaurus->save();
 				return  $thesaurus;
@@ -976,12 +980,12 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		return $thesaurus;
 	}
 
-	
-	
+
+
 	public function saveThesaurus(){
 		if ($thesaurus=Class_CodifThesaurus::findThesaurusForCatalogue($this->getId()))
 			$this->deleteThesaurusInFacette($thesaurus->getIdThesaurus());
-		else 
+		else
 			if (!$thesaurus = $this->saveThesauriParents()) return;
 
 		if($this->hasDomaineParent()){
@@ -993,26 +997,26 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		}
 		else if (strlen($thesaurus->getIdThesaurus())>8) {
 			$new_thesaurus_id=Class_CodifThesaurus::findNextRacineCatalogue();}
-		else 
+		else
 			return $thesaurus;
 
 		if ($thesaurus->getId() && ($new_thesaurus_id != $thesaurus->getIdThesaurus())) {
-			$thesaurus->setIdThesaurus($new_thesaurus_id);					
+			$thesaurus->setIdThesaurus($new_thesaurus_id);
 			$thesaurus->setLibelle($this->getLibelle());
 			$thesaurus->save();
-				
+
 			Class_Catalogue::getLoader()->updateAllThesaurusForCatalogueChildren($this->getId(),$new_thesaurus_id);
 			return $thesaurus;
 		}
 
-		$thesaurus->setIdThesaurus($new_thesaurus_id);					
+		$thesaurus->setIdThesaurus($new_thesaurus_id);
 		$thesaurus->setLibelle($this->getLibelle());
 		$thesaurus->save();
-			
+
 		return $thesaurus;
 	}
-		
-	
+
+
 	public function startsWith($haystack, $needle) {
 		return !strncmp($haystack, $needle, strlen($needle));
 	}
@@ -1025,7 +1029,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$thesaurus_ids = explode(';',$this->getThesaurus());
 		foreach($thesaurus_ids as $thesaurus_id) {
 			if ($this->startsWith($thesaurus_id,$startWith)) {
-				if ($ids!='') 
+				if ($ids!='')
 					$ids.=';';
 				$ids.=$thesaurus_id;
 			}
@@ -1038,7 +1042,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$thesaurus_ids='';
 		foreach (Class_CodifThesaurus::getIndices('root') as $thesaurus) {
 			if (isset($req_attributes[$thesaurus->getIdThesaurus()])) {
-				if ($thesaurus_ids !='') 
+				if ($thesaurus_ids !='')
 					$thesaurus_ids.=';';
 				$thesaurus_ids.=$req_attributes[$thesaurus->getIdThesaurus()];
 				unset($req_attributes[$thesaurus->getIdThesaurus()]);}
@@ -1058,8 +1062,8 @@ class Class_Catalogue extends Storm_Model_Abstract {
 
 		if (!$user->hasRightToAccess(Class_UserGroup::RIGHT_USER_DOMAINES_SUPPRESSION_LIMIT))
 			return false;
-		
-		return  ($this->hasUser() && 
+
+		return  ($this->hasUser() &&
 						 ($this->getUser()->getId() == $user->getId()));
 
 	}
@@ -1075,12 +1079,12 @@ class Class_Catalogue extends Storm_Model_Abstract {
 		$copy = new Class_Catalogue();
 		$attributes = $this->_attributes;
 		unset($attributes['id']);
-			
+
 		return $copy
 		->updateAttributes($attributes)
 		->setLibelle('** Nouveau Domaine **');
 	}
-	
+
 
 	public function getDomainesJson($options = []) {
 		$domaines = Class_Catalogue::getLoader()->findTopCatalogues();
@@ -1095,7 +1099,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 										'items' => [],
 										'options' => ['ico' => URL_ADMIN_IMG.'picto/domaines_16.png',
 																	'multipleSelection' => false]];
-			
+
 	}
 
 
@@ -1112,7 +1116,7 @@ class Class_Catalogue extends Storm_Model_Abstract {
 										'items' => [],
 										'options' => ['ico' => URL_ADMIN_IMG.'picto/domaines_16.png',
 																	'multipleSelection' => false]];
-			
+
 	}
 }
 
diff --git a/library/Class/CodifAnnexe.php b/library/Class/CodifAnnexe.php
index 3a2ea77e584dadd4142f9e84588e197724fe8801..5a58684e3dfbb9415139875fd8700e0dddb9af82 100644
--- a/library/Class/CodifAnnexe.php
+++ b/library/Class/CodifAnnexe.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class Class_CodifAnnexe extends Storm_Model_Abstract {
@@ -38,6 +38,11 @@ class Class_CodifAnnexe extends Storm_Model_Abstract {
 	public function getMailIntBib() {
 		return $this->getIntBib()->getMail();
 	}
+
+
+	public function isVisible() {
+		return (1 != $this->getInvisible());
+	}
 }
 
 ?>
diff --git a/library/Class/CodifEmplacement.php b/library/Class/CodifEmplacement.php
index f9026ddb471a217a6499b232b63be3367276787f..d3e2b8c9dc59701b1b98295d8c2abac48d42b4b0 100644
--- a/library/Class/CodifEmplacement.php
+++ b/library/Class/CodifEmplacement.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class Class_CodifEmplacement extends Storm_Model_Abstract {
@@ -24,6 +24,7 @@ class Class_CodifEmplacement extends Storm_Model_Abstract {
   protected $_table_name = 'codif_emplacement';
   protected $_table_primary = 'id_emplacement';
 
+	protected $_default_attribute_values = ['invisible' => 0];
 
 	public function validate() {
 		$this->check('' != $this->getLibelle(), 'Vous devez définir le libellé');
@@ -37,29 +38,29 @@ class Class_CodifEmplacement extends Storm_Model_Abstract {
 
 			$zone = substr($regle, 0, 3);
 			$this->check(
-				intval($zone) == $zone, 
+				intval($zone) == $zone,
 				'La zone doit être un nombre pour la règle ' . $regle);
 
 			$this->check(
-				substr($regle, 3, 1) == '$', 
+				substr($regle, 3, 1) == '$',
 				'Le $ est absent ou mal positionné pour la règle ' . $regle);
-			
-			$champ = substr($regle, 4, 1); 
+
+			$champ = substr($regle, 4, 1);
 			$this->check(
-				preg_match('/^[a-z0-9]$/', $champ),  
+				preg_match('/^[a-z0-9]$/', $champ),
 				'Le champ n\'est pas compris entre a et z ni entre 0 et 9 pour la règle ' . $regle);
 
-			$valeurs = substr($regle, 6); 
+			$valeurs = substr($regle, 6);
 			$this->check(
-				'' != trim($valeurs), 
+				'' != trim($valeurs),
 				'Indiquez des valeurs pour la règle ' . $regle);
-			
+
 			$signe = substr($regle, 5, 1);
 			$this->check(
-				false !== strpos("=/*",$signe),  
+				false !== strpos("=/*",$signe),
 				'Signe de comparaison incorrect pour la règle ' . $regle);
 		}
-		
+
 	}
 }
 ?>
diff --git a/library/Class/CodifSection.php b/library/Class/CodifSection.php
index 2c240abf083e37a37fbca1b39fdd01dd9691476d..b0b9aa5f92cff389421c8fce91b77728f247ff8d 100644
--- a/library/Class/CodifSection.php
+++ b/library/Class/CodifSection.php
@@ -16,12 +16,14 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class Class_CodifSection extends Storm_Model_Abstract {
 	const CODE_FACETTE='S';
   protected $_table_name = 'codif_section';
   protected $_table_primary = 'id_section';
+
+	protected $_default_attribute_values = ['invisible' => 0];
 }
 ?>
diff --git a/library/Class/CustomField/Meta.php b/library/Class/CustomField/Meta.php
index 23da3ad537d4f842627f5492dd2b69293e2ce76d..b48671899da8b24a1c2c066569882d684b802639 100644
--- a/library/Class/CustomField/Meta.php
+++ b/library/Class/CustomField/Meta.php
@@ -16,23 +16,24 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
 class Class_CustomField_Meta extends Storm_Model_Abstract {
 	use Trait_Translator;
 
-	const 
+	const
 		TEXT_INPUT = 'text',
 		TEXT_AREA = 'textarea',
+		CKEDITOR = 'ckeditor',
 		SELECT = 'select';
 
 	protected static $_models = [];
 
-	protected 
+	protected
 		$_table_name = 'custom_field_meta',
-		$_has_many = ['custom_fields' => 
+		$_has_many = ['custom_fields' =>
 									['model' => 'Class_CustomField',
 									 'role' => 'meta',
 									 'dependents' => 'delete']],
@@ -40,11 +41,18 @@ class Class_CustomField_Meta extends Storm_Model_Abstract {
 																	'field_type' => self::TEXT_INPUT,
 																	'options_list' => ''];
 
-
 	public function getLibelle() {
 		return $this->getLabel();
 	}
 
+	public function getFieldTypes() {
+		return
+			[Class_CustomField_Meta::TEXT_INPUT => $this->_('Texte'),
+			 Class_CustomField_Meta::TEXT_AREA => $this->_('Zone de texte simple'),
+			 Class_CustomField_Meta::CKEDITOR => $this->_('Zone de texte HTML'),
+			 Class_CustomField_Meta::SELECT => $this->_("Liste d'options")];
+	}
+
 
 	public function getOptionsListAsArray() {
 		$options = explode(';',$this->getOptionsList());
@@ -54,11 +62,7 @@ class Class_CustomField_Meta extends Storm_Model_Abstract {
 
 
 	public function getFieldTypeLabel() {
-		$field_type_array = 
-			[Class_CustomField_Meta::TEXT_INPUT => $this->_('Champ texte'),
-			 Class_CustomField_Meta::TEXT_AREA => $this->_('Champ zone de texte'),
-			 Class_CustomField_Meta::SELECT => $this->_("Liste d'options")];
-		return $field_type_array[$this->getFieldType()];
+		return $this->getFieldTypes()[$this->getFieldType()];
 	}
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/CustomField/ModelValues.php b/library/Class/CustomField/ModelValues.php
index 9e859a5d0dbc1f0f2273d750c334c3badaa00509..30bd19981724369f316abcfb79e9d110888fca3e 100644
--- a/library/Class/CustomField/ModelValues.php
+++ b/library/Class/CustomField/ModelValues.php
@@ -26,6 +26,7 @@ class Class_CustomField_ModelValues {
 		$_model,
 		$_values;
 
+
 	public function __construct($customized_model, $model) {
 		$this->_customized_model = $customized_model;
 		$this->_model = $model;
@@ -88,8 +89,10 @@ class Class_CustomField_ModelValues {
 
 	public function save() {
 		$values = $this->getFieldValues();
-		foreach($values as $value)
-			$value->save();
+		foreach($values as $value) {
+			$inner_value = $value->getValue();
+			empty($inner_value) ? $value->delete() : $value->save();
+		}
 		return $this;
 	}
 }
diff --git a/library/Class/CustomField/Value.php b/library/Class/CustomField/Value.php
index 1dbaa916387e70d0f37253e3d9d260fba4b77d10..a45c6cd594ecd2ae4c507d19471987364c312561 100644
--- a/library/Class/CustomField/Value.php
+++ b/library/Class/CustomField/Value.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301	 USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301	 USA
  */
 
 class Class_CustomField_ValueLoader extends Storm_Model_Loader {
@@ -24,18 +24,28 @@ class Class_CustomField_ValueLoader extends Storm_Model_Loader {
 		$instance = Class_CustomField_Value::findFirstBy(['model_id' => $model_id,
 																											'custom_field_id' => $custom_field_id]);
 
-		return $instance 
+		return $instance
 			? $instance
 			: Class_CustomField_Value::newInstance(['model_id' => $model_id,
 																							'custom_field_id' => $custom_field_id]);
 	}
+
+
+	public function findAllByInstance($instance) {
+		$model = Class_CustomField_Model::getModel(get_class($instance));
+		$fields = $model->getFields();
+		$field_ids = array_map(function($f) {return $f->getId();},
+													 $fields);
+		return $this->findAllBy(['model_id' => $instance->getId(),
+														 'custom_field_id' => $field_ids]);
+	}
 }
 
 
 
 
 class Class_CustomField_Value extends Storm_Model_Abstract {
-	protected 
+	protected
 		$_table_name = 'custom_field_values',
 		$_loader_class = 'Class_CustomField_ValueLoader',
 		$_belongs_to = ['field' => ['model' => 'Class_CustomField',
diff --git a/library/Class/IntBib.php b/library/Class/IntBib.php
index 57b247db9860ab7d1d509baecd23c631fe08b144..cb46f935cb87fc2810ab794e0b22c6656dcde535 100644
--- a/library/Class/IntBib.php
+++ b/library/Class/IntBib.php
@@ -60,7 +60,9 @@ class Class_IntBib extends Storm_Model_Abstract {
 	protected $_has_many = ['int_maj_autos' => ['model' => 'Class_IntMajAuto',
 																							'role' => 'int_bib']];
 
-	protected $_default_attribute_values = ['comm_params' => ''];
+	protected $_default_attribute_values = ['comm_params' => '',
+																					'qualite' => 0,
+																					'sigb' => 0];
 
 
 	public static function allCommSigbCodes() {
diff --git a/library/Class/IntProfilDonnees.php b/library/Class/IntProfilDonnees.php
index 55f79ae264fc1dd6b2ca64e780c72334b1f0cd79..7c2d4de4004443d72f4372243763ac13ed092745 100644
--- a/library/Class/IntProfilDonnees.php
+++ b/library/Class/IntProfilDonnees.php
@@ -51,44 +51,87 @@ class Class_IntProfilDonnees extends Storm_Model_Abstract {
 	protected $_table_primary = 'id_profil';
 
 
+	public static function forNanook() {
+		return self::
+			newInstance(['libelle' => 'Unimarc Nanok',
+									 'accents' => self::ENCODING_UTF8,
+									 'rejet_periodiques' => '1',
+									 'id_article_periodique' => self::SERIAL_FORMAT_PERGAME,
+									 'type_fichier' => self::FT_RECORDS,
+									 'format' => self::FORMAT_UNIMARC,
+									 'attributs' =>
+									 [['type_doc' =>
+										 [[ 'code' => '0', 'label' => '', 'zone_995' => '' ],
+											[ 'code' => '1', 'label' => 'am', 'zone_995' => '' ],
+											[ 'code' => '2', 'label' => 'as', 'zone_995' => ''],
+											[ 'code' => '3', 'label' => 'j;jm', 'zone_995' => ''],
+											[ 'code' => '4', 'label' => '','zone_995' => 'gf'],
+											[ 'code' => '5', 'label' => '', 'zone_995' => 'gz'],
+											[ 'code' => '6', 'label' => 'm;m', 'zone_995' => '' ],
+											[ 'code' => '7', 'label' => '', 'zone_995' => 'iz' ],
+											[ 'code' => '8', 'label' => '', 'zone_995' => 'mz'],
+											[ 'code' => '9', 'label' => '', 'zone_995' => ''],
+											[ 'code' => '10', 'label' => '', 'zone_995' => ''],
+											[ 'code' => '11', 'label' => '', 'zone_995' => ''],
+											[ 'code' => '12', 'label' => '', 'zone_995' => 'jd']
+										 ],
+										 'champ_code_barres' => 'f',
+										 'champ_cote' => 'k',
+										 'champ_type_doc' => '',
+										 'champ_genre' => '7',
+										 'champ_section' => '9',
+										 'champ_emplacement' => '6',
+										 'champ_annexe' => '8'
+										 ],
+										['zone' => '995',
+										 'champ' => '4',
+										 'format' => self::NOVELTY_DATE_FORMAT_VALUES,
+										 'jours' => '',
+										 'valeurs' => '']
+									 ]
+									 ]
+			);
+	}
+
+
 	public static function forALOES() {
 		return self::newInstance(
-			 ['libelle' => 'Unimarc Aloes',
-				'accents' => self::ENCODING_ISO2709,
-				'rejet_periodiques' =>  '1',
-				'id_article_periodique' => self::SERIAL_FORMAT_ALOES_INDEXPRESS,
-				'type_fichier' => self::FT_RECORDS,
-				'format' => self::FORMAT_UNIMARC,
-				'attributs' => [
-						['type_doc' =>  [
-														 [ 'code' => '0', 'label' => '', 'zone_995' => '' ],
-														 [ 'code' => '1', 'label' => 'am;na', 'zone_995' => 'LIV;MS;az' ],
-														 [ 'code' => '2', 'label' => 'as', 'zone_995' => 'PER;uu'],
-														 [ 'code' => '3', 'label' => 'i;j', 'zone_995' => 'CD;LIVCD;LIVK7;K7'],
-														 [ 'code' => '4', 'label' => 'g','zone_995' => 'DIAPO;DVD;VHS;VHD;VD;ge'],
-														 [ 'code' => '5', 'label' => 'l;m', 'zone_995' => 'CDR;le'],
-														 [ 'code' => '6', 'label' => '', 'zone_995' => 'LCD' ],
-														 [ 'code' => '7', 'label' => '', 'zone_995' => 'CAR' ],
-														 [ 'code' => '8', 'label' => '', 'zone_995' => 'PAD'],
-														 [ 'code' => '9', 'label' => '', 'zone_995' => 'WEB;MF'],
-														 [ 'code' => '10', 'label' => '', 'zone_995' => 'BRD'],
-														 [ 'code' => '11', 'label' => '', 'zone_995' => 'PAR']
-						 ],
-						 'champ_code_barres' => 'f',
-						 'champ_cote' => 'k',
-						 'champ_type_doc' => '',
-						 'champ_genre' => '',
-						 'champ_section' => 'q',
-						 'champ_emplacement' => 'l',
-						 'champ_annexe' => 'b'
-						 ],
-					['zone' => '995',
-					 'champ' => 'v',
-					 'format' => self::NOVELTY_DATE_FORMAT_VALUES,
-					 'jours' => '',
-					 'valeurs' => 'nouveaute']
-				 ]
-				]
+														 ['libelle' => 'Unimarc Aloes',
+															'accents' => self::ENCODING_ISO2709,
+															'rejet_periodiques' =>  '1',
+															'id_article_periodique' => self::SERIAL_FORMAT_ALOES_INDEXPRESS,
+															'type_fichier' => self::FT_RECORDS,
+															'format' => self::FORMAT_UNIMARC,
+															'attributs' => [
+																							['type_doc' =>  [
+																															 [ 'code' => '0', 'label' => '', 'zone_995' => '' ],
+																															 [ 'code' => '1', 'label' => 'am;na', 'zone_995' => 'LIV;MS;az' ],
+																															 [ 'code' => '2', 'label' => 'as', 'zone_995' => 'PER;uu'],
+																															 [ 'code' => '3', 'label' => 'i;j', 'zone_995' => 'CD;LIVCD;LIVK7;K7'],
+																															 [ 'code' => '4', 'label' => 'g','zone_995' => 'DIAPO;DVD;VHS;VHD;VD;ge'],
+																															 [ 'code' => '5', 'label' => 'l;m', 'zone_995' => 'CDR;le'],
+																															 [ 'code' => '6', 'label' => '', 'zone_995' => 'LCD' ],
+																															 [ 'code' => '7', 'label' => '', 'zone_995' => 'CAR' ],
+																															 [ 'code' => '8', 'label' => '', 'zone_995' => 'PAD'],
+																															 [ 'code' => '9', 'label' => '', 'zone_995' => 'WEB;MF'],
+																															 [ 'code' => '10', 'label' => '', 'zone_995' => 'BRD'],
+																															 [ 'code' => '11', 'label' => '', 'zone_995' => 'PAR']
+																								],
+																							 'champ_code_barres' => 'f',
+																							 'champ_cote' => 'k',
+																							 'champ_type_doc' => '',
+																							 'champ_genre' => '',
+																							 'champ_section' => 'q',
+																							 'champ_emplacement' => 'l',
+																							 'champ_annexe' => 'b'
+																							],
+																							['zone' => '995',
+																							 'champ' => 'v',
+																							 'format' => self::NOVELTY_DATE_FORMAT_VALUES,
+																							 'jours' => '',
+																							 'valeurs' => 'nouveaute']
+															]
+														 ]
 		);
 	}
 
@@ -96,56 +139,102 @@ class Class_IntProfilDonnees extends Storm_Model_Abstract {
 
 	public static function forKoha() {
 		return self::newInstance(
-			 ['libelle' => 'Unimarc Koha',
-				'accents' => self::ENCODING_UTF8,
-				'rejet_periodiques' =>  0,
-				'id_article_periodique' => self::SERIAL_FORMAT_KOHA,
-				'type_fichier' => self::FT_RECORDS,
-				'format' => self::FORMAT_UNIMARC,
-				'attributs' => [
-						['type_doc' =>  [
-														 [ 'code' => '0',  'label' => '',       'zone_995' => 'IND' ],
-														 [ 'code' => '1',  'label' => 'am;na',  'zone_995' => 'LIV;LIVJ;LIVA;DOC;MANUEL' ],
-														 [ 'code' => '2',  'label' => 'as',     'zone_995' => 'REV;REVA;REVJ;'],
-														 [ 'code' => '3',  'label' => 'i;j',    'zone_995' => 'CD'],
-														 [ 'code' => '4',  'label' => 'g',      'zone_995' => 'DVD;JDVD;DVDA;DVDJ;VID'],
-														 [ 'code' => '5',  'label' => 'l;m',    'zone_995' => 'CDROM;CDR'],
-														 [ 'code' => '6',  'label' => '',       'zone_995' => 'LCD' ],
-														 [ 'code' => '7',  'label' => '',       'zone_995' => 'PAR;JPAR;' ],
-														 [ 'code' => '8',  'label' => '',       'zone_995' => ''],
-														 [ 'code' => '9',  'label' => '',       'zone_995' => ''],
-														 [ 'code' => '10', 'label' => ' ',      'zone_995' => ''],
-														 [ 'code' => '11', 'label' => '',       'zone_995' => 'JVID'],
-														 [ 'code' => '12', 'label' => '',       'zone_995' => 'MAT'],
-														 [ 'code' => '13', 'label' => 'km',     'zone_995' => 'EST'],
-														 [ 'code' => '14', 'label' => '',       'zone_995' => 'TLU'],
-														 [ 'code' => '15', 'label' => '',       'zone_995' => 'CAR'],
-														 [ 'code' => '16', 'label' => '',       'zone_995' => 'DIS']
-						 ],
-						 'champ_code_barres' => 'f',
-						 'champ_cote' => 'k',
-						 'champ_type_doc' => 'r',
-						 'champ_genre' => '',
-						 'champ_section' => 'q',
-						 'champ_emplacement' => 'e',
-						 'champ_annexe' => 'b'
-						 ],
-					['zone' => '801',
-					 'champ' => 'c',
-					 'format' => self::NOVELTY_DATE_FORMAT_AAAA_MM_JJ,
-					 'jours' => '90',
-					 'valeurs' => '']
-				 ]
-				]
+														 ['libelle' => 'Unimarc Koha',
+															'accents' => self::ENCODING_UTF8,
+															'rejet_periodiques' =>  0,
+															'id_article_periodique' => self::SERIAL_FORMAT_KOHA,
+															'type_fichier' => self::FT_RECORDS,
+															'format' => self::FORMAT_UNIMARC,
+															'attributs' => [
+																							['type_doc' =>  [
+																															 [ 'code' => '0',  'label' => '',       'zone_995' => 'IND' ],
+																															 [ 'code' => '1',  'label' => 'am;na',  'zone_995' => 'LIV;LIVJ;LIVA;DOC;MANUEL' ],
+																															 [ 'code' => '2',  'label' => 'as',     'zone_995' => 'REV;REVA;REVJ;'],
+																															 [ 'code' => '3',  'label' => 'i;j',    'zone_995' => 'CD'],
+																															 [ 'code' => '4',  'label' => 'g',      'zone_995' => 'DVD;JDVD;DVDA;DVDJ;VID'],
+																															 [ 'code' => '5',  'label' => 'l;m',    'zone_995' => 'CDROM;CDR'],
+																															 [ 'code' => '6',  'label' => '',       'zone_995' => 'LCD' ],
+																															 [ 'code' => '7',  'label' => '',       'zone_995' => 'PAR;JPAR;' ],
+																															 [ 'code' => '8',  'label' => '',       'zone_995' => ''],
+																															 [ 'code' => '9',  'label' => '',       'zone_995' => ''],
+																															 [ 'code' => '10', 'label' => ' ',      'zone_995' => ''],
+																															 [ 'code' => '11', 'label' => '',       'zone_995' => 'JVID'],
+																															 [ 'code' => '12', 'label' => '',       'zone_995' => 'MAT'],
+																															 [ 'code' => '13', 'label' => 'km',     'zone_995' => 'EST'],
+																															 [ 'code' => '14', 'label' => '',       'zone_995' => 'TLU'],
+																															 [ 'code' => '15', 'label' => '',       'zone_995' => 'CAR'],
+																															 [ 'code' => '16', 'label' => '',       'zone_995' => 'DIS']
+																								],
+																							 'champ_code_barres' => 'f',
+																							 'champ_cote' => 'k',
+																							 'champ_type_doc' => 'r',
+																							 'champ_genre' => '',
+																							 'champ_section' => 'q',
+																							 'champ_emplacement' => 'e',
+																							 'champ_annexe' => 'b'
+																							],
+																							['zone' => '801',
+																							 'champ' => 'c',
+																							 'format' => self::NOVELTY_DATE_FORMAT_AAAA_MM_JJ,
+																							 'jours' => '90',
+																							 'valeurs' => '']
+															]
+														 ]
 		);
 	}
 
 
+	public function forDynix() {
+		$type_doc = [['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '1', 'label' => 'am;na;ac;ad', 'zone_995' => ''],
+								 ['code' => '2', 'label' => 'as;aa;ab', 'zone_995' => ''],
+								 ['code' => '3', 'label' => 'j', 'zone_995' => 'CD'],
+								 ['code' => '4', 'label' => 'g', 'zone_995' => 'DVD'],
+								 ['code' => '5', 'label' => 'l;m', 'zone_995' => ''],
+								 ['code' => '6', 'label' => 'c', 'zone_995' => 'PAR'],
+								 ['code' => '7', 'label' => 'em', 'zone_995' => ''],
+								 ['code' => '8', 'label' => '', 'zone_995' => ''],
+								 ['code' => '9', 'label' => '', 'zone_995' => ''],
+								 ['code' => '10', 'label' => '', 'zone_995' => ''],
+								 ['code' => '15', 'label' => 'i', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => ''],
+								 ['code' => '0', 'label' => '', 'zone_995' => '']];
+
+		return self::newInstance(['libelle' => 'Marc21 Dynix',
+															'accents' => self::ENCODING_MARC21,
+															'rejet_periodiques' => 1,
+															'id_article_periodique' => 0,
+															'type_fichier' => self::FT_RECORDS,
+															'format' => self::FORMAT_MARC21,
+															'attributs' => [['type_doc' => $type_doc,
+																							 'champ_code_barres' => '999',
+																							 'champ_cote' => 'k',
+																							 'champ_type_doc' => 'x',
+																							 'champ_genre' => '',
+																							 'champ_section' => 'z',
+																							 'champ_emplacement' => 'l',
+																							 'champ_annexe' => 'm'],
+																							['zone' => '996',
+																							 'champ' => 'u',
+																							 'format' => self::NOVELTY_DATE_FORMAT_AAAA_MM_JJ,
+																							 'jours' => '90',
+																							 'valeurs' => '']]]);
+	}
+
+
 	public function setAttributs($array_or_string) {
 		return $this->_set('attributs',
 											 is_array($array_or_string)
-												 ? serialize($array_or_string)
-												 : $array_or_string);
+											 ? serialize($array_or_string)
+											 : $array_or_string);
 	}
 
 
diff --git a/library/Class/MoteurRecherche.php b/library/Class/MoteurRecherche.php
index d7998fc14ca7b7a6a3f703b30456f574e30c63b4..98ea5bf2836259ac854531ea3acb0109000613f2 100644
--- a/library/Class/MoteurRecherche.php
+++ b/library/Class/MoteurRecherche.php
@@ -16,13 +16,13 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class Class_MoteurRecherche {
 	use Trait_Singleton, Trait_Translator, Trait_TimeSource;
 
 	private $ix;																			// Classe d'indexation
-	private $limite_facettes = " limit 15000";					// limite pour le calcul des facettes
+	private $limite_facettes = ' limit 15000';					// limite pour le calcul des facettes
 	protected $all_facettes;
 	protected $_notices_not_shown = false;
 	protected $fil_ariane;
@@ -34,17 +34,22 @@ class Class_MoteurRecherche {
 
 
 	public function createReqForIsbn($expression) {
-		if ($this->_isISBN($expression)) {
-			$cls = new Class_Isbn($expression);
-			$isbn = $cls->getAll();
-			if ($isbn["isbn10"]) {
-				$this->setCondition("(isbn='".$isbn["isbn10"]."' or isbn='".$isbn["isbn13"]."')");
-				return true;
-			} elseif($isbn["ean"]) {
-				$this->setCondition("ean='".$isbn["ean"]."'");
-				return true;
-			}
+		if (!$this->_isISBN($expression))
+			return false;
+
+		$cls = new Class_Isbn($expression);
+		$isbn = $cls->getAll();
+
+		if ($isbn["isbn10"]) {
+			$this->setCondition("(isbn='".$isbn["isbn10"]."' or isbn='".$isbn["isbn13"]."')");
+			return true;
 		}
+
+		if($isbn["ean"]) {
+			$this->setCondition("ean='".$isbn["ean"]."'");
+			return true;
+		}
+
 		return false;
 	}
 
@@ -54,22 +59,20 @@ class Class_MoteurRecherche {
 	}
 
 
-	public function visitSerie($serie,$tri) {
-
-		$this->setCondition('clef_chapeau="'.$serie.'" ');
-	
-		if ($tri=='date_creation desc')
-				$this->order_by=" order by tome_alpha desc";
+	public function visitSerie($serie, $tri) {
+		$this->setCondition('clef_chapeau="' . $serie . '" ');
 
+		if ($tri == 'date_creation desc')
+			$this->order_by = " order by tome_alpha desc";
 	}
 
-	
+
 	public function setErreur($message) {
-		$this->erreur["statut"] = 'erreur'; 
-		$this->erreur["erreur"] = $this->_($message); 
+		$this->erreur["statut"] = 'erreur';
+		$this->erreur["erreur"] = $this->_($message);
 	}
 
-	
+
 	public function hasErreur() {
 		return isset($this->erreur["statut"]) && ('erreur' == $this->erreur["statut"]);
 	}
@@ -78,25 +81,23 @@ class Class_MoteurRecherche {
 	public function visitExpression($expression,$pertinence,$tri) {
 		// Analyse de l'expression
 		$expression = trim($expression);
-		if ($expression == '*') {
+		if ($expression == '*')
 			return;
-		} 
 
 		// Recherche par isbn (1 seul mot et isbn ou ean valide)
 		$recherche = '';
 		$against_titre = '';
 		if (!$mode_isbn = $this->createReqForIsbn($expression)) {
 			$mots = $this->ix->getMots($expression);
-			foreach ($mots as $mot) 
-			{
-				$against_titre.=" ".$mot;
-				$mot = $this->ix->getExpressionRecherche($mot);
-				if ($mot) {
-					$this->nb_mots++;
-					if ($recherche !='')
-						$recherche .= ' ';
-					$recherche .= ($pertinence ? ' ' : '+') . $mot;
-				}
+			foreach ($mots as $mot) {
+				$against_titre .= ' ' . $mot;
+				if (!$mot = $this->ix->getExpressionRecherche($mot))
+					continue;
+
+				$this->nb_mots++;
+				if ($recherche !='')
+					$recherche .= ' ';
+				$recherche .= ($pertinence ? ' ' : '+') . $mot;
 			}
 
 			$recherche = trim($recherche);
@@ -105,57 +106,54 @@ class Class_MoteurRecherche {
 				$this->setErreur(("Il n'y aucun mot assez significatif pour la recherche"));
 				return ;
 			}
-			
-			if ($pertinence == true) 
-				$against=" AGAINST('".$recherche."')";
-			else 
-				$against=" AGAINST('".$recherche."' IN BOOLEAN MODE)";
-			
-			$this->setCondition("MATCH(titres,auteurs,editeur,collection,matieres,dewey)".$against);
+
+			$against = " AGAINST('".$recherche."'" . ($pertinence ? '' : ' IN BOOLEAN MODE')  .  ')';
+
+			$this->setCondition('MATCH(titres, auteurs, editeur, collection, matieres, dewey)' . $against);
 		}
 
-		if (! ($tri and $tri!="*" and !$pertinence or $mode_isbn==true))	{
-			//$filtre_against=str_replace("+"," ",$against);
-			//$filtre_against=str_replace("IN BOOLEAN MODE","",$filtre_against);
-			$this->select_notices="id_notice,MATCH(alpha_titre) AGAINST('".$against_titre."') as rel1, ";
-			$this->select_notices.="MATCH(alpha_auteur) AGAINST('".$against_titre."') as rel2 ";
-			$this->select_notices.="from notices ";
-			//$this->order_by=" order by (rel1 * 1.5)+(rel2) desc";
-			$this->order_by=" order by (rel1 * 1.5)+(rel2) desc";
+		if (!($tri and $tri != '*' and !$pertinence or $mode_isbn))	{
+			$this->select_notices = 'id_notice, '
+				. "MATCH(alpha_titre) AGAINST('" . $against_titre . "') as rel1, "
+				. "MATCH(alpha_auteur) AGAINST('" . $against_titre . "') as rel2 "
+				. 'from notices ';
+			$this->order_by = ' order by (rel1 * 1.5) + (rel2) desc';
 		}
 	}
 
-	
+
 	public function setCondition($condition) {
-		if ($this->conditions <> '')
-			$this->conditions.=' and ';
+		if ($this->conditions != '')
+			$this->conditions .= ' and ';
 		$this->conditions .= $condition;
 	}
 
 
-	public function visitAnneeDebutFin($annee_debut,$annee_fin) {
-		if($annee_debut) $this->setCondition("annee >='".$annee_debut."'");
-		if($annee_fin) $this->setCondition("annee <='".$annee_fin."'");
+	public function visitAnneeDebutFin($annee_debut, $annee_fin) {
+		if ($annee_debut)
+			$this->setCondition("annee >='" . $annee_debut . "'");
 
+		if ($annee_fin)
+			$this->setCondition("annee <='" . $annee_fin . "'");
 	}
 
 
 	public function visitCoteDebutFin($cote_debut, $cote_fin) {
-		if ($cote_debut) 
+		if ($cote_debut)
 			$this->setCondition(" cote >='" . strtoupper($cote_debut) . "'");
 
-		if ($cote_fin) 
+		if ($cote_fin)
 			$this->setCondition(" cote <= '". strtoupper($cote_fin) . "'");
 	}
 
 
 	public function visitTypeDoc($type_doc) {
-	  $this->setCondition(" type_doc in(".$type_doc.")");
+	  $this->setCondition(" type_doc in(" . $type_doc . ")");
 	}
 
 
 	public function visitSection($section) {
-		$this->visitFacette('S'.$section);
+		$this->visitFacette('S' . $section);
 	}
 
 
@@ -165,36 +163,42 @@ class Class_MoteurRecherche {
 
 
 	public function visitFiltre($filtre) {
-		$this->all_facettes .= ' +('.implode(' ', $filtre).') ';
+		$this->all_facettes .= ' +(' . implode(' ', $filtre) . ') ';
 	}
 
 
 	public function visitClesNotices($cles_notices) {
+		$keys = [];
 		foreach($cles_notices as $notice) {
-			if(!trim($notice)) continue;
-			if(isset($in_sql)) $in_sql .=","; else $in_sql = '';
-			$in_sql.="'".$notice."'";
+			if (!trim($notice))
+				continue;
+			$keys[] = "'" . $notice . "'";
 		}
-		$this->setCondition("notices.clef_alpha in(".$in_sql.")");
+
+		$this->setCondition("notices.clef_alpha in(" . implode(', ', $keys) . ")");
 	}
 
 
 	public function visitMatiere($matiere_id) {
 		if (!$matiere = Class_Matiere::getLoader()->find($matiere_id))
 			continue;
-		
+
 		if ('' != ($sous_vedettes = trim($matiere->getSousVedettes())))
 			$valeur .= str_replace(' ', ' M', ' ' . $sous_vedettes);
 	}
 
-	
+
 	public function visitAnnexe($annexe) {
 		$this->all_facettes .= ' +Y'.$annexe;
 	}
 
 
 	public function visitNouveaute($nouveaute) {
-		$time = $this->getTimeSource()->mktime(0, 0, 0, date('m')-$nouveaute, date('d'), date('Y'));
+		$time = $this->getTimeSource()->mktime(0, 0, 0,
+																					 date('m') - $nouveaute,
+																					 date('d'),
+																					 date('Y'));
+
 		$this->setCondition("date_creation >'" . date('Y-m-d', $time) . "'");
 	}
 
@@ -206,108 +210,106 @@ class Class_MoteurRecherche {
 	}
 
 
-	public function visitTextInput($name,$operateur,$type_recherche,$valeur,$pertinence) {
-		if($type_recherche == "commence") 
-			$recherche = $this->ix->alphaMaj($valeur);
-		else {
-			$recherche="";
-			$mots=$this->ix->getMots($valeur);
-			foreach($mots as $mot)	{
-				$mot=$this->ix->getExpressionRecherche($mot);
-				if($mot)	{
-					if($pertinence) $recherche.=" ".$mot;
-					else $recherche.=" +".$mot;
-				}
-			}
-		}
+	public function visitTextInput($name, $operateur, $type_recherche, $valeur, $pertinence) {
+		if (!$recherche = $this->_visitTextInputTermsIn($valeur, $type_recherche, $pertinence))
+			return;
+
+		if (!$operateur)
+			$operateur = 'and';
+
+		if($this->conditions)
+			$this->conditions .= ' ' . $operateur . ' ';
+		elseif(stripos($operateur, 'NOT'))
+			$this->conditions .= 'not ';
 
-		$recherche=trim($recherche);
-		if(!$recherche) return ;
-		if (!$operateur) $operateur='and';
-		if($this->conditions) $this->conditions.=" ".$operateur." ";
-		elseif(striPos($operateur,"NOT")) $this->conditions.="not ";
-				
 		// Type de recherche
-		if($type_recherche == "fulltext")
-			$this->conditions.="MATCH(".$name.") AGAINST('".$recherche."' IN BOOLEAN MODE)";
-		else 
-			$this->conditions.=$name." like '".$recherche."%'";
+		$this->conditions .= ($type_recherche == 'fulltext')
+			? "MATCH(".$name.") AGAINST('".$recherche."' IN BOOLEAN MODE)"
+			: $name . " like '" . $recherche . "%'";
 	}
 
 
-	function lancerRecherche($criteres_recherche) {
-		$this->criteres_recherche=$criteres_recherche;
-		
-		$tri = $criteres_recherche->getTri();
+	protected function _visitTextInputTermsIn($value, $type, $by_relevancy) {
+		if ('commence' == $type)
+			return trim($this->ix->alphaMaj($value));
+
+		$terms = '';
+		foreach($this->ix->getMots($value) as $term)
+			if ($term = $this->ix->getExpressionRecherche($term))
+				$terms .= ' ' . (($by_relevancy) ? '' : '+') . $term;
+
+		return trim($terms);
+	}
+
+
+	public function lancerRecherche($criteres_recherche) {
+		$ret = ['nb_mots' => null,
+						'statut' => '',
+						'nombre' => 0];
+
+		$this->criteres_recherche = $criteres_recherche;
 		$this->conditions = '';
 		$this->all_facettes = '';
-		$this->select_notices = "id_notice from notices ";
+		$this->select_notices = 'id_notice from notices ';
 		$this->nb_mots = 0;
-		$ret = array('nb_mots' => null,
-								 'statut' => '',
-								 'nombre' => 0);
 
-		if (($tri > "") && ($tri !== '*')) 
-			$this->order_by=" order by ".$tri;
-		else
-			$this->order_by = '';
-		
+		$tri = $criteres_recherche->getTri();
+		$this->order_by = ($tri > '' && $tri !== '*') ? ' order by ' . $tri : '';
+
 		$criteres_recherche->acceptVisitor($this);
 
 		if (!empty($this->fil_ariane))
-			$ret["fil_ariane"]=$this->fil_ariane;
+			$ret['fil_ariane'] = $this->fil_ariane;
 
 		if (!empty($this->rubriques))
-			$ret["rubriques"] = $this->rubriques;
+			$ret['rubriques'] = $this->rubriques;
 
 		if ($this->_notices_not_shown) {
-				$ret["statut"]="erreur"; 
-				$ret["erreur"]='';
+				$ret['statut'] = 'erreur';
+				$ret['erreur'] = '';
 				return $ret;
 		}
 
 		if ($this->all_facettes) {
-			$this->setCondition("MATCH(facettes) AGAINST('".trim($this->all_facettes)."' IN BOOLEAN MODE)");
+			$this->setCondition("MATCH(facettes) AGAINST('" . trim($this->all_facettes)."' IN BOOLEAN MODE)");
 		}
 
-		$where='';
+		$where = '';
 		if ($this->conditions)
-			$where="Where ".$this->conditions;
+			$where = 'Where ' . $this->conditions;
 
 		// Finalisation des requetes
-		$req_notices = "Select ".$this->select_notices.$where.$this->order_by;
-		$req_comptage = "Select count(*) from notices ".$where;
-		$req_facettes = "Select id_notice,type_doc,facettes from notices ".$where.$this->limite_facettes;
-		
+		$req_notices = 'Select ' . $this->select_notices . $where . $this->order_by;
+		$req_comptage = 'Select count(*) from notices ' . $where;
+		$req_facettes = 'Select id_notice, type_doc, facettes from notices ' . $where . $this->limite_facettes;
+
 		// Lancer les requetes
-		$nb=fetchOne($req_comptage);
+		$nb = fetchOne($req_comptage);
 		$ret['statut'] = '';
 		if(!$nb && ($this->criteres_recherche->getPertinence() || $this->nb_mots <=1)) {
-			$ret["statut"]="erreur"; 
-			$ret["erreur"]=$this->_("Aucun résultat trouvé");
-			$this->addStatEchec(2,$criteres_recherche->getCriteres());
+			$ret["statut"] = 'erreur';
+			$ret["erreur"] = $this->_('Aucun résultat trouvé');
+			$this->addStatEchec(2, $criteres_recherche->getCriteres());
 			return $ret;
 		}
 
-		if (!$nb)	{
-			$this->criteres_recherche->rechercheElargie();
-			return $this->lancerRecherche($this->criteres_recherche);
-		}
+		if (!$nb)
+			return $this->lancerRecherche($this->criteres_recherche->rechercheElargie());
 
 		if (!empty($this->erreur)) {
-			$ret['statut']=$this->erreur['statut'];
-			$ret['erreur']=$this->erreur['erreur'];
+			$ret['statut'] = $this->erreur['statut'];
+			$ret['erreur'] = $this->erreur['erreur'];
 		}
 
-		$ret["nombre"]=$nb;
-		$ret["req_liste"]=$req_notices;
-		$ret["req_facettes"]=$req_facettes;
+		$ret['nombre'] = $nb;
+		$ret['req_liste'] = $req_notices;
+		$ret['req_facettes'] = $req_facettes;
 		$ret['nb_mots'] = $this->nb_mots;
 		return $ret;
 	}
-	
 
-	public function visitRubrique($indice,$fil) {
+
+	public function visitRubrique($indice, $fil) {
 		if ($indice=='guidee') {
 			$rubriques_tmp=['X1','X2'];
 			if ($thesauri = Class_CodifThesaurus::getIndices('root')) {
@@ -315,42 +317,40 @@ class Class_MoteurRecherche {
 					$rubriques_tmp[]='H'.$thesaurus->getIdThesaurus();
 				}
 			}
-				
+
 			$this->_notices_not_shown=true;
 			$indice='';
 		}
 		else
-			$rubriques_tmp=$this->getRubriquesGuidees($indice);
+			$rubriques_tmp = $this->getRubriquesGuidees($indice);
 
 		$this->all_facettes .= ' +'.$indice.'*';
 		$this->fil_ariane = $this->getFilAriane($fil,$indice);
-		
+
     // Tableau des rubriques
-		if($rubriques_tmp)	{
-			$codification = Class_Codification::getInstance();
-			foreach($rubriques_tmp as $rubrique) {
-					$libelle=$codification->getLibelleFacette($rubrique);
-					$url=$this->criteres_recherche->getUrlCriteresWithFacettes();
-					$url['rubrique'] = $rubrique;
-					$url = $this->addFilArianeInUrl($url, $this->fil_ariane['fil']);
-					$this->rubriques[]=["libelle" => $libelle,"url" => $url];
-				}
+		if(!$rubriques_tmp)
+			return;
+
+		$codification = Class_Codification::getInstance();
+		foreach($rubriques_tmp as $rubrique) {
+			$libelle = $codification->getLibelleFacette($rubrique);
+			$url = $this->criteres_recherche->getUrlCriteresWithFacettes();
+			$url['rubrique'] = $rubrique;
+			$url = $this->addFilArianeInUrl($url, $this->fil_ariane['fil']);
+			$this->rubriques[]=["libelle" => $libelle, "url" => $url];
 		}
 	}
 
 
-	public function addFilArianeInUrl($url,$fil_ariane)	{
+	public function addFilArianeInUrl($url, $fil_ariane)	{
 		if ($fil_ariane && !empty($fil_ariane))
 			$url['fil'] = $fil_ariane;
-		else 
+		else
 			unset($url['fil']);
 		return $url;
 	}
 
 
-//------------------------------------------------------------------------------------------------------
-// recup des rubriques guidees
-//------------------------------------------------------------------------------------------------------
 	private function getRubriquesGuidees($tag){
 		$rubrique=$tag[0];
 		$id=substr($tag,1);
@@ -392,14 +392,11 @@ class Class_MoteurRecherche {
 			if(!$liste) return $items;
 			foreach($liste as $thesaurus) $items[]="H".$thesaurus->getIdThesaurus();
 		}
-		
+
 		return $items;
 	}
 
 
-// ----------------------------------------------------------------
-// Fil d'ariane pour le catalogue guidé
-// ----------------------------------------------------------------
 	private function getFilAriane($fil,$rubrique)	{
 		$fil_ariane = [];
 		$ret = ['rubriques' => []];
@@ -419,19 +416,16 @@ class Class_MoteurRecherche {
 
 		foreach($elems as $elem) {
 			$url_rubrique = $this->addFilArianeInUrl($url, implode(';', $fil_ariane));
-
-			if(!$elem) continue;
+			if (!$elem)
+				continue;
 
 			$url_rubrique['rubrique'] = $elem;
-
 			$fil_ariane []= $elem;
-
 			$libelle=Class_Codification::getInstance()->getLibelleFacette($elem);
-
 			$ret["liens"][]=["libelle" => $libelle,
 											 "url" => $url_rubrique];
-
-			if($elem == $rubrique) break;
+			if ($elem == $rubrique)
+				break;
 		}
 
 		$ret["fil"] = implode(';', $fil_ariane);
@@ -444,16 +438,13 @@ class Class_MoteurRecherche {
 	}
 
 
-	function getFacettes($req,$preferences)	{
+	public function getFacettes($req,$preferences)	{
 		return (new Class_MoteurRecherche_Facettes())->getFacettes($req,$preferences);
 	}
-	
- 
-// ----------------------------------------------------------------
-// Stats : recherches infructueuses
-// ----------------------------------------------------------------
+
+
 	private function addStatEchec($type_recherche,$criteres) {
-		$criteres=addslashes(serialize($criteres));
+		$criteres = addslashes(serialize($criteres));
 		sqlExecute("insert into stats_recherche_echec(type_recherche,criteres) values($type_recherche,'$criteres')");
 	}
 
diff --git a/library/Class/Notice.php b/library/Class/Notice.php
index 92e89458225dd4b6b024baf64492c2557978b1cb..8b0ea4ebcb4673cd5b5698cdebfeda9f3909ac99 100644
--- a/library/Class/Notice.php
+++ b/library/Class/Notice.php
@@ -19,13 +19,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
-//////////////////////////////////////////////////////////////////////////////////////
-// OPAC3 : CLASSE NOTICE (Surcharge la classe Class_NoticeUnimarc)
-//////////////////////////////////////////////////////////////////////////////////////
-
 class NoticeLoader extends Storm_Model_Loader {
-
-
 	public function getNoticesFromPreferences($preferences) {
 		$requetes = Class_Catalogue::getRequetes($preferences);
 		$notices = $this->findAll($requetes["req_liste"]);
@@ -48,19 +42,15 @@ class NoticeLoader extends Storm_Model_Loader {
 	public function getNoticeIdsByRequeteRecherche($req) {
 		if (!$req)
 			return [];
-		$req=$this->selectIdsFromRequest($req);
-
-		return	(new Storm_Cache())
-			->useImplodeExplodeSerialization()
-			->memoize([$req,__CLASS__,__FUNCTION__],
-								function() use ($req) {
-																				 return Zend_Registry::get('sql')->fetchAllByColumn($req);
-																			 });
-	}
 
+		$closure = function() use ($req) {
+			return Zend_Registry::get('sql')->fetchAllByColumn($req);
+		};
 
-	public function selectIdsFromRequest($request) {
-		return "Select inner_table.id_notice   from ( ".$request." ) inner_table";
+		return (new Storm_Cache())
+			->useImplodeExplodeSerialization()
+			->memoize([$req, __CLASS__, __FUNCTION__],
+								$closure);
 	}
 
 
diff --git a/library/Class/Notice/NavigationRecherche.php b/library/Class/Notice/NavigationRecherche.php
index faeeea22565956e9f45f289da002c79a80161cc5..6d2e1381035c907e46884de06f0fcf636b6fd543 100644
--- a/library/Class/Notice/NavigationRecherche.php
+++ b/library/Class/Notice/NavigationRecherche.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class Class_Notice_NavigationRecherche {
@@ -49,10 +49,10 @@ class Class_Notice_NavigationRecherche {
 
 
 	public function getCurrentNoticeIndex() {
-		return array_search($this->_current_notice->getId(), 
+		return array_search($this->_current_notice->getId(),
 												$this->getAllNoticeIds());
 	}
-	
+
 
 	public function getNoticeIdAtOffset($offset) {
 		$current_notice_id = $this->_current_notice->getId();
@@ -62,14 +62,16 @@ class Class_Notice_NavigationRecherche {
 		$new_position = $position + $offset;
 		$all_ids = $this->getAllNoticeIds();
 		return isset($all_ids[$new_position])
-			? $all_ids[$new_position] 
+			? $all_ids[$new_position]
 			: $current_notice_id;
 	}
 
 
 	public function getAllNoticeIds() {
-		if (!isset($this->_all_notice_ids)) {
-			$result = $this->_moteur_recherche->lancerRecherche($this->_criteres_recherche);
+		if (!isset($this->_all_notice_ids)
+				&& ($result = $this->_moteur_recherche
+						->lancerRecherche($this->_criteres_recherche))
+				&& isset($result['req_liste'])) {
 			$this->_all_notice_ids = Class_Notice::getNoticeIdsByRequeteRecherche($result['req_liste']);
 		}
 		return $this->_all_notice_ids;
diff --git a/library/Class/NoticeUnimarc/Writer.php b/library/Class/NoticeUnimarc/Writer.php
index 53c9e2a2075dcc9b91da7a11502bd43e922f83bc..6f5b139d3c49c23399b3ac97aa9f4496b17e5244 100644
--- a/library/Class/NoticeUnimarc/Writer.php
+++ b/library/Class/NoticeUnimarc/Writer.php
@@ -764,6 +764,8 @@ class Class_NoticeUnimarc_Writer extends Class_NoticeUnimarc {
 			chr(0xf0).chr(0x43) =>  'Ç',
 			chr(0xf0).chr(0x63) =>  'ç',
 			chr(0xc0) => '°',
+			'n'.chr(0xb0) => 'n°',
+			'N'.chr(0xb0) => 'N°',
 		];
 
 
diff --git a/library/Class/ScriptLoader.php b/library/Class/ScriptLoader.php
index 161408a64b05569c03d6425ac9d1d349363e6716..2c3f7d609eb37f8e95199c16d4e17516cfbb198f 100644
--- a/library/Class/ScriptLoader.php
+++ b/library/Class/ScriptLoader.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
@@ -28,7 +28,7 @@ class Class_ScriptLoader {
 
 	protected static $instance;
 
-	protected 
+	protected
 		$_script_lines,
 		$_css_lines,
 		$_should_load_amber,
@@ -80,6 +80,7 @@ class Class_ScriptLoader {
 			$this
 				->addScript(AMBERURL.'src/js/lib/jQuery/jquery.textarea.js')
 				->addScript(AMBERURL.'src/js/lib/CodeMirror/codemirror.js')
+				->addScript(AMBERURL.'src/js/lib/CodeMirror/css.js')
 				->addStyleSheet(AMBERURL.'src/js/lib/CodeMirror/codemirror.css')
 				->addStyleSheet(AMBERURL.'src/js/lib/CodeMirror/amber.css')
 				->addStyleSheet(AMBERURL.'src/css/amber.css')
@@ -101,7 +102,7 @@ class Class_ScriptLoader {
 		$this->addScript(AMBERURL.'src/js/amber.js');
 
 		$deploy =  $this->isAmberModeDeploy();
-		
+
 		$amber_options = sprintf('{"home":"%s", "files":%s, "deploy":%s, "ready":%s}',
 														 AMBERURL.'src/',
 														 json_encode($this->_amberAdditionalFiles($deploy)),
@@ -218,14 +219,14 @@ class Class_ScriptLoader {
 		return $this;
 	}
 
-	
+
 	public function addJQueryBackEnd($js) {
 		if(Class_Users::getLoader()->isCurrentUserCanAccesBackend())
 			$this->addJQueryReady($js);
-		 
+
 		return $this;
 	}
-	
+
 
 	/**
 	 * @return ScriptLoader
@@ -320,9 +321,9 @@ class Class_ScriptLoader {
 		return $this
 			->loadNotificationJS()
 			->addJQueryReady(sprintf('showNotification(%s)',
-															 json_encode(array('message' => $message, 
-																								 'autoClose' => true, 
-																								 'duration' => 10, 
+															 json_encode(array('message' => $message,
+																								 'autoClose' => true,
+																								 'duration' => 10,
 																								 'type' => 'information'))));
 	}
 
@@ -352,12 +353,12 @@ class Class_ScriptLoader {
 			unset($attributes['ie_version']);
 		}
 
-		$attributes = array_merge(['type' => 'text/css', 
-															 'rel' => 'stylesheet', 
+		$attributes = array_merge(['type' => 'text/css',
+															 'rel' => 'stylesheet',
 															 'href' => $file,
 															 'media' => 'screen'],
 															$attributes);
-		
+
 		$html_attributes = '';
 		foreach($attributes as $name => $value)
 			$html_attributes .= sprintf(' %s="%s" ', $name, $value);
@@ -439,15 +440,15 @@ class Class_ScriptLoader {
 			$this->addAdminStyleSheet($file, $additional_attributes);
 		return $this;
 	}
-	
 
-	/** 
+
+	/**
 	 * @param $file string
 	 * @param $additional_attributes array
-	 * @return Class_ScriptLoader 
+	 * @return Class_ScriptLoader
 	 */
 	public function addOPACPluginStyleSheet($file, $additional_attributes=null) {
-		return $this->addStyleSheet(BASE_URL . '/public/opac/java/' . $file, 
+		return $this->addStyleSheet(BASE_URL . '/public/opac/java/' . $file,
 																$additional_attributes);
 	}
 
@@ -458,7 +459,7 @@ class Class_ScriptLoader {
 	 * @return Class_ScriptLoader
 	 */
 	public function addOPACPluginStyleSheets($files, $additional_attributes=null) {
-		foreach($files as $file) 
+		foreach($files as $file)
 			$this->addOPACPluginStyleSheet($file, $additional_attributes);
 		return $this;
 	}
@@ -494,7 +495,7 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return ScriptLoader
-	 */	
+	 */
 	 public function _scriptsAddLine($line) {
 		 $this->_script_lines []= $line;
 		 return $this;
@@ -503,7 +504,7 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return ScriptLoader
-	 */	
+	 */
 	 public function cssAddLine($line) {
 		 $this->_css_lines []= $line;
 		 return $this;
@@ -512,7 +513,7 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return Boolean
-	 */	
+	 */
 	public function isAmberModeDeploy() {
 		if (null == $amber = Zend_Registry::get('cfg')->get('amber'))
 			return true;
@@ -525,7 +526,7 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return Array
-	 */	
+	 */
 	public function &getAmberFiles() {
 		if (!isset($this->_amber_files)) {
 			$this->_amber_files = array('AFI-Core');
@@ -540,7 +541,7 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return Array
-	 */	
+	 */
 	public function &getAmberReadyScripts() {
 		if (!isset($this->_amber_ready_scripts))
 			$this->_amber_ready_scripts = array(sprintf('smalltalk.Package._defaultCommitPathJs_("%s/admin/amber/commitJs")', BASE_URL),
@@ -553,7 +554,7 @@ class Class_ScriptLoader {
 	/**
 	 * @param String package
 	 * @return Class_ScriptLoader
-	 */	
+	 */
 	public function addAmberPackage($package) {
 		if (in_array($package, $this->getAmberFiles()))
 				return $this;
@@ -568,7 +569,7 @@ class Class_ScriptLoader {
 	/**
 	 * @param String js
 	 * @return Class_ScriptLoader
-	 */	
+	 */
 	public function addAmberReady($js) {
 		if (!in_array($js, $this->getAmberReadyScripts()))
 			array_push($this->getAmberReadyScripts(), $js);
@@ -578,14 +579,14 @@ class Class_ScriptLoader {
 
 	/**
 	 * @return Boolean
-	 */	
+	 */
 	protected function _amberAdditionalFiles($deploy) {
 		$additional_files = array();
 		foreach ($this->getAmberFiles() as $file) {
 			if ($deploy) $file .= '.deploy';
 			$additional_files []= sprintf('../../afi/js/%s.js', $file);
 		}
-		
+
 		return $additional_files;
 	}
 
@@ -632,7 +633,7 @@ class Class_ScriptLoader {
 
 		$template = $templates[$this->_jquery_ready_mode];
 
-		foreach ($this->_jquery_ready_scripts as $js) 
+		foreach ($this->_jquery_ready_scripts as $js)
 			$this->addInlineScript(sprintf($template, $js));
 
 		return $this;
@@ -695,7 +696,7 @@ class Class_ScriptLoader {
 	}
 
 
-	
+
 	protected function getVersionPergameHash() {
 		if (null == $this->_version_pergame_hash)
 			$this->_version_pergame_hash = md5(VERSION_PERGAME);
diff --git a/library/Class/Systeme/ModulesAccueil/Calendrier.php b/library/Class/Systeme/ModulesAccueil/Calendrier.php
index 663f03505b6ec186e01bfff4c72c429ec9955c88..6657e7259dddcd973d384083c8967e7383a066e1 100644
--- a/library/Class/Systeme/ModulesAccueil/Calendrier.php
+++ b/library/Class/Systeme/ModulesAccueil/Calendrier.php
@@ -16,12 +16,14 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class Class_Systeme_ModulesAccueil_Calendrier extends Class_Systeme_ModulesAccueil_Null{
+	use Trait_Translator;
+
 	/** @var string */
 	protected $_group = Class_Systeme_ModulesAccueil::GROUP_INFO;
-	
+
 	/** @var string */
 	protected $_libelle = 'Calendrier';
 
@@ -38,22 +40,25 @@ class Class_Systeme_ModulesAccueil_Calendrier extends Class_Systeme_ModulesAccue
 	protected $_isPhone = true;
 
 	/** @var array */
-	protected $_defaultValues = [
-		'titre' => 'Calendrier des animations',	 // Titre de la boite
-		'id_categorie' => '',										// Catégories d'articles à afficher. ex: 2-3-4
-		'display_cat_select' => false,					 // Afficher le sélecteur de catégories
-		// Information à afficher en préfixed du titre de l'article: bib, cat ou none.
-		'display_event_info'=> false,
-		'rss_avis' => false,                     //RSS
+	protected $_defaultValues =
+		[
+		 'titre' => 'Calendrier des animations',	 // Titre de la boite
+		 'id_categorie' => '',										// Catégories d'articles à afficher. ex: 2-3-4
+		 'display_cat_select' => false,					 // Afficher le sélecteur de catégories
+		 // Information à afficher en préfixed du titre de l'article: bib, cat ou none.
+		 'display_event_info'=> false,
+		 'rss_avis' => false,                     //RSS
 
-		'display_next_event' => '1',//Afficher Prochains rendez-vous
-		'display_order' => 'EventDebut',  //Tri des articles
-		'display_mode' => 'Title', // Mode d'affichage Title, Summary, FullArticle,
-		'nb_events' => '3', // Nombre de rendez-vous à afficher
-		'display_calendar' => '1', // Mode d'affichage du calendrier: 0 (caché) / 1 (calendrier) / 2 (frise chrono)
-		'mode-affichage' => 'simple', // mode d'affichage des prochains événements dans la boite: none (aucun) / simple (titre + catégorie ou bib) / article (résumé article)
-		'event_filter' => 'none' // filtre les articles par mois à l'affichage
-	];
+		 'display_next_event' => '1',//Afficher Prochains rendez-vous
+		 'display_order' => 'EventDebut',  //Tri des articles
+		 'display_mode' => 'Title', // Mode d'affichage Title, Summary, FullArticle,
+		 'display_full_page' => '1', // Transforme les url en render/ajax si 0
+		 'nb_events' => '3', // Nombre de rendez-vous à afficher
+		 'display_calendar' => '1', // Mode d'affichage du calendrier: 0 (caché) / 1 (calendrier) / 2 (frise chrono)
+		 'mode-affichage' => 'simple', // mode d'affichage des prochains événements dans la boite: none (aucun) / simple (titre + catégorie ou bib) / article (résumé article)
+		 'event_filter' => 'none', // filtre les articles par mois à l'affichage
+		 'enabled_filters' => '' // liste des filtres (mois, lieu, custom_fields) d'articles
+		];
 
 
 	/** @return array */
@@ -62,5 +67,17 @@ class Class_Systeme_ModulesAccueil_Calendrier extends Class_Systeme_ModulesAccue
 		$properties['display_event_info'] = 'bib';
 		return $properties;
 	}
+
+	public function getAvailableFilters() {
+		$available_filters = [
+													'date' => $this->_('Mois'),
+													'place' => $this->_('Lieu'),
+		];
+		$custom_fields = Class_CustomField_Model::getModel('Article')->getFields();
+		foreach ($custom_fields as $field) {
+			$available_filters['custom_field_' . $field->getId()] = $field->getLabel();
+		}
+		return $available_filters;
+	}
 }
 ?>
\ No newline at end of file
diff --git a/library/Class/TextReplacements.php b/library/Class/TextReplacements.php
new file mode 100644
index 0000000000000000000000000000000000000000..6958e6d058ba2a273dcaf3400b382d75d02a2256
--- /dev/null
+++ b/library/Class/TextReplacements.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class Class_TextReplacements  {
+	protected static $_instance;
+	protected $_replacements = [];
+
+	public static function reset() {
+		static::$_instance = null;
+	}
+
+
+	public static function replace($text) {
+		if (!isset(static::$_instance))
+			static::$_instance = new static();
+		return static::$_instance->getReplacement($text);
+	}
+
+
+	public function __construct() {
+		if (!$var_replacements = Class_AdminVar::get('TEXT_REPLACEMENTS'))
+			return $this;
+
+		$lines = array_filter(explode("\n", $var_replacements));
+		foreach($lines as $line) {
+			list($search, $replace) = explode(';', $line.';');
+			if (!trim($search))
+				continue;
+			$this->_replacements[trim($search)] = trim($replace);
+		}
+	}
+
+
+	public function getReplacement($text) {
+		foreach($this->_replacements as $search => $replace) {
+			if (false !== strpos($text, $search))
+				return str_replace($search, $replace, $text);
+		}
+		return $text;
+	}
+}
+
+?>
diff --git a/library/Class/WebService/SIGB/Opsys.php b/library/Class/WebService/SIGB/Opsys.php
index 483b0014b61f8ccf7b225695cf5d030240ea7037..db9c3f588eb27c0f39e0ff4b5a275723c313dee8 100644
--- a/library/Class/WebService/SIGB/Opsys.php
+++ b/library/Class/WebService/SIGB/Opsys.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 /*
@@ -30,7 +30,7 @@
 	- getName: nom de l'emprunteur
 	- getId: identifiant
 
-	** Notice: 
+	** Notice:
 	- getId
 	- getExemplaires: liste des exemplaires disponibles
 	- nbExemplaires: nombre d'exemplaires disponibles
@@ -40,11 +40,11 @@
 	- getTitre
 	- getNotice
 
-  ** Reservation: 
+  ** Reservation:
 	- getId
 	- getExemplaire
 
-  ** Emprunt: 
+  ** Emprunt:
 
 	- getId
 	- getExemplaire
@@ -58,13 +58,13 @@
 	- ::soapui: créé un OsysService connecté à un service SOAPUI local
 
 	** OpsysService: interface de haut niveau pour communiquer avec le serveur Opsys
-	- connect: ouvre une session, récupère un GUID 
+	- connect: ouvre une session, récupère un GUID
 	- disconnect: ferme la session ouverte
 	- getEmprunteur(login, password): retourne une instance Emprunteur avec ses réservations et emprunts
 	- getNotice($id): retourne une instance Notice avec ses exemplaires disponible
-	- reserverExemplaire(login, password, notice_id): réserve un exemplaire de l'id notice 
+	- reserverExemplaire(login, password, notice_id): réserve un exemplaire de l'id notice
 	donnée pour l'utilisateur
-	- supprimerReservation($reservation_id): supprime la réservation avec l'id donné. 
+	- supprimerReservation($reservation_id): supprime la réservation avec l'id donné.
 	(pour récupérer l'id en question, voir Emprunteur)
 	- getExemplaire($notice_id): retourne l'exemplaire suivant de la notice (via cache de notice)
 
@@ -89,7 +89,7 @@
 	unset($service);
 
 
-	note: 
+	note:
 	- les __toString() des modèles sont tous implémentés. On peut faire "echo $notice"
 	- toutes les autres classes servent à faire le mapping WSDL
 */
@@ -107,9 +107,9 @@ class Class_WebService_SIGB_Opsys {
 
 	public static function setProxy($proxy_host, $proxy_port,	$proxy_login, $proxy_password){
 		self::$service_options=array(
-																 'proxy_host' => $proxy_host, 
-																 'proxy_port' => $proxy_port, 
-																 'proxy_login' => $proxy_login, 
+																 'proxy_host' => $proxy_host,
+																 'proxy_port' => $proxy_port,
+																 'proxy_login' => $proxy_login,
 																 'proxy_password' =>	$proxy_password);
 	}
 
@@ -117,8 +117,9 @@ class Class_WebService_SIGB_Opsys {
 	public static function getService($params) {
 		if (!isset(self::$service)) {
 			$instance = new self();
-			self::$service = $instance->createService($params['url_serveur'], 
-																								array_key_exists('catalogue_web', $params) ? $params['catalogue_web'] : true);
+			self::$service = $instance->createService($params['url_serveur'],
+																								array_key_exists('catalogue_web', $params) ? $params['catalogue_web'] : true,
+																								array_key_exists('reserver_retrait_bib_abonne', $params) ? $params['reserver_retrait_bib_abonne'] : false);
 		}
 
 		return self::$service;
@@ -131,16 +132,16 @@ class Class_WebService_SIGB_Opsys {
 
 
 	protected static function createServiceOptions(){
-		if (class_exists("Zend_Registry") && 
+		if (class_exists("Zend_Registry") &&
 				Zend_Registry::isRegistered('http_proxy') &&
 				array_isset('proxy_host', Zend_Registry::get('http_proxy'))) {
 			$proxy = Zend_Registry::get('http_proxy');
 			self::setProxy(
 										 $proxy['proxy_host'],
-										 $proxy['proxy_port'],		
+										 $proxy['proxy_port'],
 										 $proxy['proxy_user'],
 										 $proxy['proxy_pass']);
-		} 
+		}
 		if (!isset(self::$service_options))
 			self::$service_options = array();
 	}
@@ -150,9 +151,10 @@ class Class_WebService_SIGB_Opsys {
 		return self::$service_options;
 	}
 
-	public function createService($url_aloes, $with_catalog_web = true){
-		return $this->newOpsysServiceFactory()->createOpsysService($url_aloes, 
+	public function createService($url_aloes, $with_catalog_web = true, $is_reserver_retrait_bib_abonne = false){
+		return $this->newOpsysServiceFactory()->createOpsysService($url_aloes,
 																															 $with_catalog_web,
+																															 $is_reserver_retrait_bib_abonne,
 																															 self::getServiceOptions());
 	}
 
diff --git a/library/Class/WebService/SIGB/Opsys/Service.php b/library/Class/WebService/SIGB/Opsys/Service.php
index d68b434abda09c7a8b3c5589c38502629958addc..0a7c0f33ab0125e2940c0dfa4524e88369be6bb8 100644
--- a/library/Class/WebService/SIGB/Opsys/Service.php
+++ b/library/Class/WebService/SIGB/Opsys/Service.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
@@ -77,7 +77,7 @@
  *** Type libelle (casqy)
 
 
- * EmprListerEntite (EUEntiteEmp::ListeRetard) 
+ * EmprListerEntite (EUEntiteEmp::ListeRetard)
  ** Entite
  *** No Prêt
  *** Code barre
@@ -96,7 +96,7 @@
  *** Code barre
  *** Notice
  *** Lieu
- *** Supprimable 
+ *** Supprimable
 
  * Service catalogue web, EcrireNotice:
  Configurer une grille AFI qui prends en compte:
@@ -116,6 +116,9 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 	/** @var Class_WebService_MappedSoapClient */
 	protected $catalog_client;
 
+	/** @var bool */
+	protected $_is_reserver_retrait_bib_abonne;
+
 	protected $guid;
 
 
@@ -123,9 +126,10 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 	 * @param Class_WebService_MappedSoapClient $search_client
 	 * @param Class_WebService_MappedSoapClient $catalog_client
 	 */
-	public function __construct($search_client, $catalog_client = null){
+	public function __construct($search_client, $catalog_client = null, $is_reserver_retrait_bib_abonne=false){
 		$this->search_client = $search_client;
 		$this->catalog_client = $catalog_client;
+		$this->_is_reserver_retrait_bib_abonne = ($is_reserver_retrait_bib_abonne == '1') ? true : false;
 		$this->connect();
 	}
 
@@ -145,6 +149,11 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 	}
 
 
+	public function isReserverRetraitBibAbonne() {
+		return $this->_is_reserver_retrait_bib_abonne;
+	}
+
+
 	public function connect(){
 		try {
 			$osr = $this->search_client->OuvrirSession(new OuvrirSession());
@@ -214,8 +223,8 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 	 * @return Class_WebService_SIGB_Emprunteur
 	 */
 	public function authentifierEmprunteur($user) {
-		$auth = new EmprAuthentifier($this->guid, 
-																 $user->hasIdabon() ? $user->getIdabon() : $user->getLogin(), 
+		$auth = new EmprAuthentifier($this->guid,
+																 $user->hasIdabon() ? $user->getIdabon() : $user->getLogin(),
 																 $user->getPassword());
 		try {
 			$auth_result = $this->search_client->EmprAuthentifier($auth);
@@ -236,8 +245,8 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 			$date_fin_abonnement = implode('-', array_reverse(explode('/', $date_fin_abonnement)));
 			$emprunteur->setEndDate($date_fin_abonnement);
 		}
-		
-		
+
+
 		if ($date_naissance = $entite_result->findAttribute('DateNaissance')) {
 			$date_naissance = implode('-', array_reverse(explode('/', $date_naissance)));
 			$emprunteur->setDateNaissance($date_naissance);
@@ -277,10 +286,11 @@ class Class_WebService_SIGB_Opsys_Service extends Class_WebService_SIGB_Abstract
 	public function reserverExemplaire($user, $exemplaire, $code_annexe){
 		$exemplaire_sigb = $this->getExemplaire($exemplaire->getIdOrigine(), $exemplaire->getCodeBarres());
 		$emprunteur = $this->authentifierEmprunteur($user);
-		$reserv_result = $this->search_client->EmprReserver(
-																								 new EmprReserver($this->guid,
-																																	$exemplaire_sigb->getId(),
-																																	$code_annexe));
+		$reserv_result = $this->search_client
+			->EmprReserver(
+										 new EmprReserver($this->guid,
+																			$exemplaire_sigb->getId(),
+																			$this->_is_reserver_retrait_bib_abonne ? '' : $code_annexe));
 		return $reserv_result->getReussite();
 	}
 
@@ -1257,7 +1267,7 @@ class EntiteEmp {
 		$attributes = array_combine($this->LibelleDonnee->string, $ligne->ValeursDonnees->string);
 		return $this->_findAttribute($name, $attributes);
 	}
-	
+
 
 	public function getExemplaires($container_class){
 		$entites = array();
@@ -1266,13 +1276,13 @@ class EntiteEmp {
 
 			$exemplaire = new Class_WebService_SIGB_Exemplaire(NULL);
 			$exemplaire->setTitre($this->_findAttribute('Titre', $attributes));
-	
+
 
 			if ($code_barre = $this->_findAttribute('code', $attributes))
 				$exemplaire_params = array('code_barres' => $code_barre);
 			else
 				$exemplaire_params = array('id_origine' => $this->_findAttribute('notice', $attributes));
-			
+
 			$exemplaire_opac = Class_Exemplaire::getLoader()->findFirstBy($exemplaire_params);
 			$exemplaire->setExemplaireOPAC($exemplaire_opac);
 			$entite = new $container_class($data->ValeursDonnees->string[0], $exemplaire);
diff --git a/library/Class/WebService/SIGB/Opsys/ServiceFactory.php b/library/Class/WebService/SIGB/Opsys/ServiceFactory.php
index f2dbfdb74f452fb08a4c7d51f0c22a189f8450fc..eedc19f39b29f51192cbfe02cd55a7484bfc941f 100644
--- a/library/Class/WebService/SIGB/Opsys/ServiceFactory.php
+++ b/library/Class/WebService/SIGB/Opsys/ServiceFactory.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 include_once('Service.php');
@@ -29,7 +29,7 @@ class Class_WebService_SIGB_Opsys_ServiceFactory{
 
 	protected static $SOAP_CLIENT_CLASS='Class_WebService_MappedSoapClient';
 
-	
+
 	public static function newSoapClient($wsdl, $options) {
 		$soap_class = self::$SOAP_CLIENT_CLASS;
 		return new $soap_class($wsdl, $options);
@@ -61,19 +61,22 @@ class Class_WebService_SIGB_Opsys_ServiceFactory{
 		return $this->getAloesRootFromUrl($url_aloes).'/'.self::SERVICE_CATALOG;
 	}
 
-	public function createOpsysService($url_aloes, $with_catalog_web, $extra_options){
+	public function createOpsysService($url_aloes,
+																		 $with_catalog_web,
+																		 $is_reserver_retrait_bib_abonne,
+																		 $extra_options) {
 		$options = array_merge($this->defaultOptions(), $extra_options);
 		$search_client = self::newSoapClient($this->getWsdlSearchURL($url_aloes), $options);
 
 		try {
-			$catalog_client = $with_catalog_web 
-				? self::newSoapClient($this->getWsdlCatalogURL($url_aloes), $options) 
+			$catalog_client = $with_catalog_web
+				? self::newSoapClient($this->getWsdlCatalogURL($url_aloes), $options)
 				: new NullCatalogSoapClient;
 		} catch (Exception $e) {
 			$catalog_client = new NullCatalogSoapClient();
 		}
 
-		return new Class_WebService_SIGB_Opsys_Service($search_client, $catalog_client);
+		return new Class_WebService_SIGB_Opsys_Service($search_client, $catalog_client, $is_reserver_retrait_bib_abonne);
 	}
 
 	public static function createService($url_aloes, $extra_options=array()){
@@ -84,11 +87,11 @@ class Class_WebService_SIGB_Opsys_ServiceFactory{
 	/** @codeCoverageIgnore */
 	public static function production(){
 		return self::createService(
-															 self::OPSYS_WSDL, 
+															 self::OPSYS_WSDL,
 															 array(
-																		 'proxy_host' => '192.168.2.2', 
-																		 'proxy_port' => '3128', 
-																		 'proxy_login' => 'guest', 
+																		 'proxy_host' => '192.168.2.2',
+																		 'proxy_port' => '3128',
+																		 'proxy_login' => 'guest',
 																		 'proxy_password' =>	'guest'));
 	}
 
diff --git a/library/ZendAfi/Controller/Action.php b/library/ZendAfi/Controller/Action.php
index 0086773c0b3004e24fd6f7ad061e0ae5af0a73ea..caf443014572f33074cdc345f8b386354a6719f0 100644
--- a/library/ZendAfi/Controller/Action.php
+++ b/library/ZendAfi/Controller/Action.php
@@ -209,6 +209,7 @@ class ZendAfi_Controller_Action extends Zend_Controller_Action {
   protected function _setupFormAndSave($model) {
 		$form = $this->_getForm($model);
 
+
 		$this->view->form = $form;
 		if ($this->_request->isPost()) {
 			// for multicheckboxes, if none is checked nothing is posted, default to empty
@@ -218,13 +219,14 @@ class ZendAfi_Controller_Action extends Zend_Controller_Action {
 			$post = array_merge($defaults, $this->_getPost());
 
 			$custom_values = [];
+
 			foreach ($post as $k=>$v)
 				if (preg_match('/field_[0-9]+/', $k)) {
 					$custom_values[$k] = $v;
 					unset($post[$k]);
 				}
 			$model->updateAttributes($post);
-			if ((!$form->isValid($model)))
+			if ((!$form->isValidModelAndArray($model,$this->_getPost())))
 				return false;
 			if  (!$model->save())
 				return false;
@@ -273,9 +275,15 @@ class ZendAfi_Controller_Action extends Zend_Controller_Action {
 
 	protected function _getFormWith($model, $custom_form) {
 		$formClass = $this->_definitions->getFormClassName();
+		foreach ($custom_form->getElements() as $element) {
+			if (!$value=$this->_request->getParam($element->getName()))
+				continue;
+			$element->setValue($value);
+		}
+
 		$form = $formClass::newWith(
-			array_merge($this->_getFormValues($model), $this->_request->getParams()),
-			$custom_form
+																array_merge($this->_getFormValues($model), $this->_request->getParams()),
+																$custom_form
 		);
 		$form->setAction($this->view->url());
 		return $form;
diff --git a/library/ZendAfi/Controller/Action/Helper/View.php b/library/ZendAfi/Controller/Action/Helper/View.php
index 8f53b86a20bdc9ec2b16ec209e4e674aafaa2b7a..4fe74796ad21926ce0eb7498c950a1ca6f879f8a 100644
--- a/library/ZendAfi/Controller/Action/Helper/View.php
+++ b/library/ZendAfi/Controller/Action/Helper/View.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 ////////////////////////////////////////////////////////////////////////////////////////////
 // OPAC3 : Surcharge de la class Zend_View
@@ -24,14 +24,14 @@
 
 class ZendAfi_Controller_Action_Helper_View extends Zend_View {
 	use Trait_Translator;
-	
+
 	protected static $instance;
 
 	private $ouverture_boite;					// Html du haut de la boite
 	private $fermeture_boite;					// Html du bas de la boite
 	protected $_titles = [''];
 
-	protected 
+	protected
 		$_is_popup = false;
 
 
@@ -45,13 +45,16 @@ class ZendAfi_Controller_Action_Helper_View extends Zend_View {
 		$this->setEscape('htmlentities');
 
 		$this->doctype('HTML5');
-		
+
 	}
 
 
 	public function setModuleControllerActionNames($module, $controller, $action) {
-		$this->bodyParam = sprintf('class="%s_%s profil_%d"',
-															 $controller, $action, Class_Profil::getCurrentProfil()->getId());
+		$this->bodyParam = sprintf('class="%s_%s profil_%d" data-logged="%s"',
+															 $controller,
+															 $action,
+															 Class_Profil::getCurrentProfil()->getId(),
+															 Class_Users::getIdentity() ? 'true' : 'false');
 	}
 
 
diff --git a/library/ZendAfi/Controller/Plugin/Lectura.php b/library/ZendAfi/Controller/Plugin/Lectura.php
new file mode 100644
index 0000000000000000000000000000000000000000..6191cf9fdb1b30cf14789fe89c5336cee9dc8ce9
--- /dev/null
+++ b/library/ZendAfi/Controller/Plugin/Lectura.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class ZendAfi_Controller_Plugin_Lectura extends Zend_Controller_Plugin_Abstract {
+	public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) {
+		if (!Class_AdminVar::isLecturaEnabled('LECTURA_DOMAIN')
+				|| $request->getHttpHost() != Class_AdminVar::get('LECTURA_DOMAIN')
+				|| $request->getScheme() != 'https')
+			return;
+		$request->setActionName('login')
+						->setControllerName('auth')
+						->setParam('lectura', true);
+
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/library/ZendAfi/Form.php b/library/ZendAfi/Form.php
index 09f8ceb00e1df3608b59b6f48d53fc4cc7c29697..66f4ff19770d86fa27808ba277716b54e54d5ba6 100644
--- a/library/ZendAfi/Form.php
+++ b/library/ZendAfi/Form.php
@@ -32,6 +32,7 @@ class ZendAfi_Form extends Zend_Form {
 
 
 	public static function newWith($datas = [], $custom_form = null) {
+
 		return (new static())
 			->populate($datas)
 			->setCustomForm($custom_form);
@@ -115,6 +116,13 @@ class ZendAfi_Form extends Zend_Form {
 		return $valid;
 	}
 
+	public function isValidModelAndArray($model, $array) {
+		$valid = parent::isValid($array) && $model->isValid();
+		$this->addModelErrors($model);
+
+		$this->_errorsExist = !$valid;
+		return $valid;
+	}
 
 	/**
 	 * @param  Storm_Model_Abstrict $model
@@ -129,6 +137,7 @@ class ZendAfi_Form extends Zend_Form {
 
 
 	public function populateFormFromGroupsDefinitions($groups_definitions) {
+
 		foreach($groups_definitions as $name => $definition)
 			$this
 				->addElementsFromDefinition($definition['elements'])
diff --git a/library/ZendAfi/Form/Admin/CustomFields.php b/library/ZendAfi/Form/Admin/CustomFields.php
index 681ba733e9d7359c25ce8f933ad2a8f30527ce3d..fd73f570be1b474b6b7aaa887381f2fd8d1035e5 100644
--- a/library/ZendAfi/Form/Admin/CustomFields.php
+++ b/library/ZendAfi/Form/Admin/CustomFields.php
@@ -16,12 +16,12 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
 class ZendAfi_Form_Admin_CustomFields extends ZendAfi_Form {
-	
+
 	public function init() {
 		parent::init();
 		$this->_toggleOptionsList();
@@ -35,10 +35,10 @@ class ZendAfi_Form_Admin_CustomFields extends ZendAfi_Form {
 										'size' => 50,
 										'required' => true,
 										'allowEmpty' => false])
-			->addElement('select', 
+			->addElement('select',
 									 'field_type',
 									 ['label' => $this->_('Type de champ'),
-										'multioptions' => $this->_getFieldTypes(),
+										'multioptions' => (new Class_CustomField_Meta())->getFieldTypes(),
 										'required' => true,
 										'allowEmpty' => false])
 			->addElement('text',
@@ -49,17 +49,17 @@ class ZendAfi_Form_Admin_CustomFields extends ZendAfi_Form {
 	}
 
 
-	protected function _getFieldTypes() {
-		return [Class_CustomField_Meta::TEXT_INPUT => $this->_('champ texte'),
-						Class_CustomField_Meta::TEXT_AREA => $this->_('champ zone de texte'),
-						Class_CustomField_Meta::SELECT => $this->_("liste d'options")];
-	}
 
-	
+
 	protected function _toggleOptionsList() {
 		return Class_ScriptLoader::getInstance()
 			->addJQueryBackEnd('formSelectToggleVisibilityForElement("#field_type", "#fieldset-options", "'.Class_CustomField_Meta::SELECT.'");');
 	}
 
+	public function getFieldTypeLabel($fieldType) {
+		return (new Class_CustomField_Meta())->getFieldTypes()[$fieldType];
+
+	}
+
 }
 ?>
\ No newline at end of file
diff --git a/library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php b/library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php
index 1aab8c753dd4405c3eeaadc82d496c0c67a448cf..e6014f14e6412e741f16b3426873cf9cbd1925c8 100644
--- a/library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php
+++ b/library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php
@@ -16,12 +16,12 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
 class ZendAfi_Form_Admin_CustomFields_CustomFieldMeta extends ZendAfi_Form_Admin_CustomFields {
-	public static function newWith($custom_field_meta_array) {
+	public static function newWith($custom_field_meta_array=[], $custom_form=null) {
 		$form = new self();
 		$form
 			->populate($custom_field_meta_array)
diff --git a/library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php b/library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php
index dcb6672820c69f1d3eafefa46a5f9b4e80d86cf0..40899b26eca702e65723b24734b675557ec34956 100644
--- a/library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php
+++ b/library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php
@@ -16,13 +16,13 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
 class ZendAfi_Form_Admin_CustomFields_CustomFieldModel extends ZendAfi_Form_Admin_CustomFields {
 
-	public static function newWith($custom_field_array) {
+	public static function newWith($custom_field_array=[], $custom_form=null) {
 		$form = new self();
 		$form
 			->addElement('hidden', 'model')
diff --git a/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php b/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
index 73e6b7eb4d76414c4c33ff0bc8072e88c3250063..1702c9d26172c03502ee5e53b69aafee3c5ab834 100644
--- a/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
+++ b/library/ZendAfi/Form/Admin/CustomFields/ModelValues.php
@@ -16,19 +16,19 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
 class ZendAfi_Form_Admin_CustomFields_ModelValues extends ZendAfi_Form {
 	const FIELD_PREFIX = 'field_';
 
-	protected 
+	protected
 		$_model_values;
 
 	public function setModel_Values($model_values) {
 		$this->_model_values = $model_values;
-		$this->setAttrib('data-backurl', 
+		$this->setAttrib('data-backurl',
 										 Class_Url::assemble($this->_model_values->getEditURL()));
 	}
 
@@ -76,13 +76,13 @@ class ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy {
 
 	public function addElement($field, $label, $value) {
 		$this->_field = $field;
-		$this->_form->addElement($field->getFieldType(), 
-														 $label, 
+		$this->_form->addElement($field->getFieldType(),
+														 $label,
 														 array_merge(['label' => $field->getLabel(),
-																					'value' => $value], 
+																					'value' => $value],
 																				 $this->getOptions()));
 	}
-	
+
 
 	protected function getOptions() {
 		return [];
@@ -106,6 +106,13 @@ class ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy_textarea extend
 }
 
 
+class ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy_ckeditor extends ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy {
+	protected function getOptions() {
+		return ['cols' => 35, 'rows' => 10];
+	}
+}
+
+
 
 class ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy_select extends ZendAfi_Form_Admin_CustomFields_ModelValues_Field_Strategy {
 	protected function getOptions() {
diff --git a/library/ZendAfi/Form/Mobile/Login.php b/library/ZendAfi/Form/Mobile/Login.php
index 01369d0a85b2f8b9147d6d547ad1324e405bf213..ab3959b42ac211ea845a269ae312bc29b324481b 100644
--- a/library/ZendAfi/Form/Mobile/Login.php
+++ b/library/ZendAfi/Form/Mobile/Login.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class ZendAfi_Form_Mobile_Login extends ZendAfi_Form {
@@ -24,22 +24,24 @@ class ZendAfi_Form_Mobile_Login extends ZendAfi_Form {
 		parent::init();
 		$this
 			->setMethod(Zend_Form::METHOD_POST)
-			->setAttrib('autocomplete', 
+			->setAttrib('autocomplete',
 									'off')
-			->setDecorators(['FormElements', 
+			->setDecorators(['FormElements',
 											 'Form'])
-			->addElement('text', 
-									 'username', 
+			->addElement('text',
+									 'username',
 									 ['required' => true,
 										'allowEmpty' => false])
-			->addElement('password', 
-									 'password', 
+			->addElement('password',
+									 'password',
 									 ['required' => true,
 										'allowEmpty' => false])
-			->setElementDecorators(['ViewHelper', 
+			->addElement('hidden',
+									 'service')
+			->setElementDecorators(['ViewHelper',
 															'Label'])
-			->addElement('submit', 
-									 'login', 
+			->addElement('submit',
+									 'login',
 									 ['decorators' => ['ViewHelper']]);
 	}
 }
\ No newline at end of file
diff --git a/library/ZendAfi/Form/NewsletterRegister.php b/library/ZendAfi/Form/NewsletterRegister.php
index 354044de128b21c24dd3f23bc1adf26cbf7cef23..22f6ec021c0fdc0b96e7d1e4f00a2c28e4a10f6b 100644
--- a/library/ZendAfi/Form/NewsletterRegister.php
+++ b/library/ZendAfi/Form/NewsletterRegister.php
@@ -21,9 +21,6 @@
 
 
 class ZendAfi_Form_NewsletterRegister extends ZendAfi_Form {
-	use Trait_Translator;
-
-
 	public function init() {
 		parent::init();
 		$this
diff --git a/library/ZendAfi/Translate.php b/library/ZendAfi/Translate.php
index 9e11ceca7020986fdc8f23a8af2da11f3dcd8138..ccf0f9c8b981f2a789f632fce0f04e7d779a3e77 100644
--- a/library/ZendAfi/Translate.php
+++ b/library/ZendAfi/Translate.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class ZendAfi_Translate extends Zend_Translate {
@@ -27,13 +27,13 @@ class ZendAfi_Translate extends Zend_Translate {
 		if (!$num)
 			return '';
 
-    $args[0] = parent::_($args[0]);
-        
+    $args[0] = parent::_(Class_TextReplacements::replace($args[0]));
+
     if($num <= 1) {
       return $args[0];
     }
 
-    return call_user_func_array('sprintf', $args);  
+    return call_user_func_array('sprintf', $args);
 	}
 
 
@@ -41,10 +41,10 @@ class ZendAfi_Translate extends Zend_Translate {
 	/**
 	 * Voir TranslateTest.php
 	 *
-	 * $this->translate->plural(1, 
-	 *                          "Pas d'enfants manquant", 
-	 *                          "%d enfant manquant sur %d", 
-	 *													"%d enfants manquant sur %d", 
+	 * $this->translate->plural(1,
+	 *                          "Pas d'enfants manquant",
+	 *                          "%d enfant manquant sur %d",
+	 *													"%d enfants manquant sur %d",
 	 *													1, 20);
 	 * ==> "1 child missing among 20"
 	 */
@@ -55,7 +55,7 @@ class ZendAfi_Translate extends Zend_Translate {
 		$sentence = $args[$sentence_nb];
 		if (!$sentence)
 			return '';
-		$translation = $this->translate($sentence);
+		$translation = $this->translate(Class_TextReplacements::replace($sentence));
 
 		$_args = array_slice($args, 4);
 		array_unshift($_args, $sentence);
diff --git a/library/ZendAfi/View/Helper/Accueil/Base.php b/library/ZendAfi/View/Helper/Accueil/Base.php
index ea87bd314056ad73c036c9842c257b09a8cff644..ad7e49049d52d3ae6a92d53fa2cb0ff27b7957a3 100644
--- a/library/ZendAfi/View/Helper/Accueil/Base.php
+++ b/library/ZendAfi/View/Helper/Accueil/Base.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // OPAC 3 : classe de base pour le gestion des modules de la page D'ACCUEIL
@@ -26,7 +26,7 @@
 class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstract {
 	protected static $modules_config;
 
- 	protected 
+ 	protected
 		$division,									// Division dans laquelle se trouve le module
 		$titre,											// Titre du module
 		$contenu,										// Contenu du module
@@ -34,7 +34,7 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 		$rss_interne,								// Lien sur fil rss interne
 		$_fonction_admin_helper = 'FonctionsAdmin_Boite',
 		$_id_menu;									//identifiant du menu si rendu dans un menu
-	
+
 
 
 	/**
@@ -50,10 +50,10 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 			$this->division = $params["division"];
 
 		$modules_accueil = new Class_Systeme_ModulesAccueil();
-	
-		if (!$this->preferences) 
+
+		if (!$this->preferences)
 			$this->preferences = $modules_accueil->getValeursParDefaut($this->type_module);
-		$this->preferences = array_merge($modules_accueil->getValeursParDefaut($this->type_module), 
+		$this->preferences = array_merge($modules_accueil->getValeursParDefaut($this->type_module),
 																		 $this->preferences);
 	}
 
@@ -103,7 +103,7 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 			$profil = Class_Profil::getCurrentProfil();
 
 		$templates =  (new Class_Profil_Templates($profil))->toArray();
-	
+
 		$combo='<select name="boite">';
 		foreach($templates as $clef => $libelle)
 		{
@@ -201,7 +201,7 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 	}
 
 
-	/** 
+	/**
 	 * Tout le temps exécuté dans le rendu, cache actif ou non
 	 * ce qui permet d'inclure notamment les actions javascripts
 	 */
@@ -224,15 +224,16 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 			return '';
 
 		$this->_beforeCache();
+		$closure = function() {
+			$template = $this->getTemplate();
+			$html_array = $this->getHtml();
+			return $this->getBoiteFromTemplate($template, $html_array);
+		};
+
 		return (new Storm_Cache())
 			->setEnabled($this->shouldCacheContent())
 			->disableSerialization()
-			->memoize($this->getCacheKey(), function() {
-			                               $template = $this->getTemplate();
-																		 $html_array = $this->getHtml();
-																		 return $this->getBoiteFromTemplate($template, $html_array);
-
-		});
+			->memoize($this->getCacheKey(), $closure);
 	}
 
 	//------------------------------------------------------------------------------------------------------
@@ -282,7 +283,7 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 			$html=str_replace("{URL_IMG}",URL_IMG,$html);
 			foreach($html_array as $clef => $valeur) $html=str_replace("{".$clef."}",$valeur,$html);
 		}
-		else 
+		else
 			$html=$html_array["TITRE"].BR.$html_array["CONTENU"];
 
 		return '<div id="boite_'.$this->id_module.'" class="boite '.strtolower($this->type_module).'">'.$html.'</div>';
@@ -340,7 +341,7 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 
 	/** Paramètres commun pour les affichages diaporame */
 	public function getDisplayType() {
-		if (!array_key_exists('style_liste', $this->preferences) 
+		if (!array_key_exists('style_liste', $this->preferences)
 				|| 'none' == $this->preferences['style_liste'])
 			return 'none';
 		return $this->preferences['style_liste'];
@@ -378,9 +379,15 @@ class ZendAfi_View_Helper_Accueil_Base extends ZendAfi_View_Helper_ModuleAbstrac
 	}
 
 
-	public function renderScriptForDiaporameNavigation($script_loader, $width, $height, $button_strategy) {
-		$script_loader
+	public function renderScriptForDiaporameNavigation($preferences = []) {
+		$options = new stdClass;
+		$options->width = $preferences['op_navigation_window_width'];
+		$options->height= $preferences['op_navigation_window_height'];
+		$options->strategy = $preferences['op_navigation_mode'];
+		$options->cycle = isset($preferences['op_navigation_cycle']) ? $preferences['op_navigation_cycle'] : 0 ;
+
+		Class_ScriptLoader::getInstance()
 			->addScript(URL_JAVA . 'slider_navigation/slider_navigation.js')
-			->addJQueryReady('$("#boite_'.$this->getIdModule().'").slider_navigation("'.BASE_URL.'" ,'.$width.','.$height.',"'.$button_strategy.'");');
+			->addJQueryReady('$("#boite_'.$this->getIdModule().'").slider_navigation('. json_encode($options) .');');
 	}
 }
diff --git a/library/ZendAfi/View/Helper/Accueil/Calendar.php b/library/ZendAfi/View/Helper/Accueil/Calendar.php
index 0433fa8f48774ebf4649175952b2f45edbbbd107..1c46a977cc548dd43ddaa77360277fe8311151de 100644
--- a/library/ZendAfi/View/Helper/Accueil/Calendar.php
+++ b/library/ZendAfi/View/Helper/Accueil/Calendar.php
@@ -16,27 +16,24 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class ZendAfi_View_Helper_Accueil_Calendar extends ZendAfi_View_Helper_Accueil_Base {
-	
+
 
 	protected $class_calendar;
 
 	protected function _renderHeadScriptsOn($script_loader) {
 		$script_loader->addOPACScript('calendrier');
-		
+
 		if($this->isDisplayDiaporamaNavigation())
-			$this->renderScriptForDiaporameNavigation($script_loader, 
-																								$this->preferences['op_navigation_window_width'], 
-																								$this->preferences['op_navigation_window_height'],
-																								$this->preferences['op_navigation_mode']);
+			$this->renderScriptForDiaporameNavigation($this->preferences);
 	}
 
 
 	public function getDisplayType() {
-		if (!array_key_exists('mode-affichage', $this->preferences) 
+		if (!array_key_exists('mode-affichage', $this->preferences)
 				|| 'none' == $this->preferences['mode-affichage'])
 			return 'none';
 		return $this->preferences['mode-affichage'];
@@ -54,11 +51,8 @@ class ZendAfi_View_Helper_Accueil_Calendar extends ZendAfi_View_Helper_Accueil_B
 
 		if ($this->preferences['rss_avis'])
 			$this->rss_interne = $this->_getRSSurl('cms', 'calendarrss');
-		
 
 		$param = [];
-		
-
 		$param['DATE'] = array_isset('display_date', $this->preferences) ? $this->preferences['display_date'] : '';
 		$param['URL']='';
 		$param['ID_BIB']=Class_Profil::getCurrentProfil()->getIdSite();
@@ -72,8 +66,9 @@ class ZendAfi_View_Helper_Accueil_Calendar extends ZendAfi_View_Helper_Accueil_B
 		$param['MODE_AFFICHAGE'] = array_key_exists('mode-affichage', $this->preferences) ? $this->preferences['mode-affichage'] : 'simple';
 		$param['DISPLAY_CALENDAR'] = $this->preferences['display_calendar'];
 		$param['EVENT_FILTER'] = array_isset('event_filter', $this->preferences) ? $this->preferences['event_filter'] : '';
-		;
-	
+		$param['ENABLED_FILTERS'] = $this->preferences['enabled_filters'];
+		$param['DISPLAY_FULL_PAGE'] = $this->preferences['display_full_page'];
+
 		$this->contenu = $this->view->calendarContent($param);
 
 		return $this->getHtmlArray();
diff --git a/library/ZendAfi/View/Helper/Accueil/Kiosque.php b/library/ZendAfi/View/Helper/Accueil/Kiosque.php
index 96b191e940ad95d72825a2510cd32ffe975560ff..1b1e4c7963a88e4562e71567c2f0e7458f80289a 100644
--- a/library/ZendAfi/View/Helper/Accueil/Kiosque.php
+++ b/library/ZendAfi/View/Helper/Accueil/Kiosque.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Base {
 	protected $_nombre_notices_par_page;
@@ -34,7 +34,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 
 
 	public function shouldCacheContent() {
-		return parent::shouldCacheContent() && in_array($this->preferences['style_liste'], 
+		return parent::shouldCacheContent() && in_array($this->preferences['style_liste'],
 																										['mur', 'vignettes', 'chrono']);
 	}
 
@@ -60,7 +60,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 		$this->contenu = 	(in_array($this->preferences['style_liste'], ['mur', 'vignettes', 'chrono']))
 			? $this->getKiosqueHtml()
 			: $this->getKiosqueIFrame();
-		$this->contenu = 
+		$this->contenu =
 			$this->getAddEditLinks()
 			.$this->getChangeKiosqueData()
 			.$this->contenu;
@@ -80,7 +80,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 																													 'controller' => 'catalogue',
 																													 'action' => 'edit',
 																													 'id_catalogue' => $this->preferences['id_catalogue']]),
-																				 $this->view->tagImg(URL_ADMIN_IMG.'ico/edit.gif',['title' => $this->view->_('Modifier le domaine affiché')]), 
+																				 $this->view->tagImg(URL_ADMIN_IMG.'ico/edit.gif',['title' => $this->view->_('Modifier le domaine affiché')]),
 																				 ['data-popup' => 'true']);
 
 		if (!$domaine_parent = $catalogue->getDomaineParent())
@@ -91,7 +91,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 																												 'action' => 'add',
 																												 'id_catalogue' => $domaine_parent->getId(),
 																												 'id_module' => $this->id_module]),
-																			 $this->view->tagImg(URL_ADMIN_IMG.'ico/add.gif',['title' => $this->view->_('Afficher un nouveau domaine')]), 
+																			 $this->view->tagImg(URL_ADMIN_IMG.'ico/add.gif',['title' => $this->view->_('Afficher un nouveau domaine')]),
 																			 ['data-popup' => 'true']);
 
 		return $edit_link.$add_link;
@@ -102,24 +102,24 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 		if (!Class_Users::isCurrentUserCanAccesBackend())
 			return '<div style="display:none"></div>';
 
-		$id_panier = isset($this->preferences['id_panier']) 
-			? $this->preferences['id_panier'] 
+		$id_panier = isset($this->preferences['id_panier'])
+			? $this->preferences['id_panier']
 			: 0;
-		$id_catalogue = isset($this->preferences['id_catalogue']) 
-			? $this->preferences['id_catalogue'] 
+		$id_catalogue = isset($this->preferences['id_catalogue'])
+			? $this->preferences['id_catalogue']
 			: 0;
-	
 
-	  $change_kiosque_selection_url = 
-			$this->view->url(['module' => 'admin', 
-												'controller' => 'modules', 
-												'action' => 'kiosque-change-data', 
+
+	  $change_kiosque_selection_url =
+			$this->view->url(['module' => 'admin',
+												'controller' => 'modules',
+												'action' => 'kiosque-change-data',
 												'id_module' => $this->id_module
 												 ],null,true);
-			
-		return 
+
+		return
 			'<div class="change_kiosque_data">'.
-			$this->view->tagAnchor($change_kiosque_selection_url, 
+			$this->view->tagAnchor($change_kiosque_selection_url,
 														 $this->view->tagImg(URL_ADMIN_IMG.'picto/domaines_16.png',
 																								 ['title' => $this->view->_('Modifier la source de données du kiosque')]),
 														 ['data-popup'=>'true']).
@@ -130,9 +130,9 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 
 	public function getKiosqueIFrame() {
 		extract($this->preferences);
-		
+
 		// Proprietes en fonction du type de liste
-		$args = array("id_module" => $this->id_module, 
+		$args = array("id_module" => $this->id_module,
 									'id_profil' => Class_Profil::getCurrentProfil()->getId());
 
 		$action = "kiosque";
@@ -141,7 +141,7 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 			$controler = "java";
 			$args["vue"]="slide_show";
 			$hauteur = $op_hauteur_img + 7;
-			if ($hauteur == 7) 
+			if ($hauteur == 7)
 				$hauteur = 117;
 			break;
 		case "protoflow":
@@ -230,24 +230,27 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 						 '1' => 'date_creation desc',
 						 '2' => 'nb_visu desc',
 						 '3' => 'annee desc'];
+
+		$titre = $this->preferences['titre'];
+		$this->preferences['titre'] = str_replace(['/', '%2F'], ' ', $this->preferences['titre']);
+
 		$url_options = array_merge(['controller' => 'recherche', 'action' => 'simple'],
 															 $this->preferences);
 		$url_options['tri'] = ($this->preferences['tri']) ? $tris[$this->preferences['tri']] : $tris[0];
 		return sprintf('<a href="%s">%s</a>',
-									 $this->view->url($url_options, null, true), 
-									 htmlentities($this->preferences['titre']));
+									 $this->view->url($url_options, null, true),
+									 htmlentities($titre));
 	}
 
 
 	public function getRss() {
-		return $this->preferences['rss_avis'] 
+		return $this->preferences['rss_avis']
 			? $this->rss_interne = $this->_getRSSurl('rss', 'kiosque')
 			: '';
 	}
 
 
 	public function getKiosqueHtml($page = 1) {
-		$catalogue=new Class_Catalogue();
 		$this->_nombre_notices_par_page = $this->preferences['nb_notices'];
 		$this->preferences['nb_notices'] = 0;
 		$this->preferences['nb_analyse'] = 0;
@@ -258,14 +261,17 @@ class ZendAfi_View_Helper_Accueil_Kiosque extends ZendAfi_View_Helper_Accueil_Ba
 
 		if (isset($requetes['req_comptage'])) {
 			$nombre_total_notices = Class_Notice::countBySQLSelect($requetes['req_comptage']);
-			$notices = 	Class_Notice::findAllByRequeteRecherche($requetes['req_liste'],
-																													$this->_nombre_notices_par_page,
-																													$page);
+			$notices = Class_Notice::findAllByRequeteRecherche($requetes['req_ids'],
+																												 $this->_nombre_notices_par_page,
+																												 $page);
 	  }
 
 		$html = $this->renderNoticesKiosqueHtml($notices);
 		if (!$this->isModeChrono())
-			$html = $this->getPagerHtml($page, $this->_nombre_notices_par_page, $nombre_total_notices).$html;
+			$html = $this->getPagerHtml($page,
+																	$this->_nombre_notices_par_page,
+																	$nombre_total_notices)
+				. $html;
 
 		return $html;
 	}
diff --git a/library/ZendAfi/View/Helper/Accueil/News.php b/library/ZendAfi/View/Helper/Accueil/News.php
index 18fc265d7bda7415a7c9ec6443e8059ccd44e218..00f7ff321508b895894a02c763591e5f18a6bffc 100644
--- a/library/ZendAfi/View/Helper/Accueil/News.php
+++ b/library/ZendAfi/View/Helper/Accueil/News.php
@@ -33,10 +33,7 @@ class ZendAfi_View_Helper_Accueil_News extends ZendAfi_View_Helper_Accueil_Base
 																			array('width' => $this->preferences['op_largeur_img'],
 																						'height' => $this->preferences['op_hauteur_boite']));
 		if($this->isDisplayDiaporamaNavigation())
-			$this->renderScriptForDiaporameNavigation($script_loader,
-																								$this->preferences['op_navigation_window_width'],
-																								$this->preferences['op_navigation_window_height'],
-																								$this->preferences['op_navigation_mode']);
+			$this->renderScriptForDiaporameNavigation($this->preferences);
 	}
 
 
diff --git a/library/ZendAfi/View/Helper/Accueil/Sito.php b/library/ZendAfi/View/Helper/Accueil/Sito.php
index f604eb6732dcda0150873c011ef903475dd41f9f..0d01a23aecf8f019fd3a1301ec18a1c7d4474ed2 100644
--- a/library/ZendAfi/View/Helper/Accueil/Sito.php
+++ b/library/ZendAfi/View/Helper/Accueil/Sito.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // OPAC3 - Class_Module_Sito -> Sitothèque
@@ -35,7 +35,7 @@ class ZendAfi_View_Helper_Accueil_Sito extends ZendAfi_View_Helper_Accueil_Base
 
 	//---------------------------------------------------------------------
 	// CONSTRUCTION du Html
-	//--------------------------------------------------------------------- 
+	//---------------------------------------------------------------------
 	public function getHtml()	{
 		extract($this->preferences);
 		$contenu = '';
@@ -46,7 +46,7 @@ class ZendAfi_View_Helper_Accueil_Sito extends ZendAfi_View_Helper_Accueil_Base
 																										 explode('-', $id_categorie));
 
 			shuffle($sites);
-			$contenu.=$this->renderSitesSlice($sites,$nb_aff);			
+			$contenu.=$this->renderSitesSlice($sites,$nb_aff);
 			$titre= sprintf('<a href="%s" title="%s">%s</a>',
 											htmlspecialchars(BASE_URL.'/opac/sito/viewselection/id_module/'.$this->id_module),
 											$this->translate()->_('Sélection de sites'),
@@ -58,14 +58,14 @@ class ZendAfi_View_Helper_Accueil_Sito extends ZendAfi_View_Helper_Accueil_Base
 			$last_sito = Class_Sitotheque::getLoader()->findAllBy(array('limit' => 50));
 			shuffle($last_sito);
 
-			if(!$titre) 
+			if(!$titre)
 				$titre = $this->translate()->_("Derniers sites ajoutés");
 
 			$titre= sprintf('<a href="%s" title="%s">%s</a>',
 											htmlspecialchars(BASE_URL.'/opac/sito/viewrecent/nb/50'),
 											$this->translate()->_('Liste des derniers sites ajoutés'),
 											$titre);
-			$contenu.=$this->renderSitesSlice($last_sito,$nb_aff);	
+			$contenu.=$this->renderSitesSlice($last_sito,$nb_aff);
 		}
 		$this->titre=$titre;
 		$this->contenu = $contenu;
@@ -111,14 +111,14 @@ class ZendAfi_View_Helper_Accueil_Sito extends ZendAfi_View_Helper_Accueil_Base
 
 		$sites = array_slice($sites, 0, $nb_aff);
 
-		if (!$this->isGroupByCategorie()) 
-			return $this->renderSites($sites, 
+		if (!$this->isGroupByCategorie())
+			return $this->renderSites($sites,
 																'<div style="clear:both;width:100%;background:transparent url('.URL_IMG.'box/menu/separ.gif) repeat-x scroll center bottom;margin-bottom:5px">&nbsp;</div>');
 
 		$categories = $this->groupSitesByCategorie($sites);
 		$htmls = array();
 		foreach ($categories as $libelle_categorie => $sites)
-			$htmls []= sprintf('<li><h2><a href="#">%s</a></h2><ul><li>%s</li></ul></li>', 
+			$htmls []= sprintf('<li><h2><a href="#">%s</a></h2><ul><li>%s</li></ul></li>',
 												 $libelle_categorie,
 												 $this->renderSites($sites));
 
@@ -148,7 +148,7 @@ class ZendAfi_View_Helper_Accueil_Sito extends ZendAfi_View_Helper_Accueil_Base
 		if ($img_url = $this->getThumbnail($site->getUrl()))
 			$html.= sprintf('<img src="%s" alt="%s" />',$img_url,	$this->translate()->_('vignette du site %s', $site->getTitre()));
 
-		$html .= '&raquo;&nbsp;'.$site->getTitre().'</a></h2>';
+		$html .= $site->getTitre().'</a></h2>';
 		$html .= $site->getDescription();
 
 		return '<div class="sitotheque">'.$html.'</div>';
diff --git a/library/ZendAfi/View/Helper/Calendar/MonthList.php b/library/ZendAfi/View/Helper/Calendar/MonthList.php
index 2ecacebdb3a4b9ba94736d7f0c90793fb0df40f6..a144a92df19c4da3b8274ddbf901909527661e48 100644
--- a/library/ZendAfi/View/Helper/Calendar/MonthList.php
+++ b/library/ZendAfi/View/Helper/Calendar/MonthList.php
@@ -29,63 +29,48 @@ class ZendAfi_View_Helper_Calendar_MonthList extends Zend_View_Helper_HtmlElemen
 	public function calendar_MonthList($articles, $selected_month, $year, $param) {
 		$this->_id_module = $param['ID_MODULE'];
 		$this->_id_profil = Class_Profil::getCurrentProfil()->getId();
-		$current_year = date('Y', $this->getTimeSource()->time());
 		$current_month = date('m', $this->getTimeSource()->time());
 
-		$this->_libelle_months = ['01' => $this->_('Jan'),
-															'02' => $this->_('Fév'),
-															'03' => $this->_('Mars'),
-															'04' => $this->_('Avril'),
-															'05' => $this->_('Mai'),
-															'06' => $this->_('Juin'),
-															'07' => $this->_('Juillet'),
-															'08' => $this->_('Août'),
-															'09' => $this->_('Sept'),
-															'10' => $this->_('Oct'),
-															'11' => $this->_('Nov'),
-															'12' => $this->_('Déc')];
-
 		$htmls = [];
-		foreach($this->_libelle_months as $index => $libelle) {
-			$year = ($current_month > (int)$index) ? $current_year + 1 : $current_year;
- 
-			$htmls[$year.$index] =
+		foreach($this->view->calendar_Months(true) as $date => $label) {
+			$htmls[$date] =
 				$this->renderMonth(
-					$year,
-					$index,
-					$this->addAttribs($selected_month, $current_month, $index));
+					$date,
+					$label,
+					$this->addAttribs($selected_month, $current_month, $date));
 		}
-		ksort($htmls);
 		
 		return '<div class="month_list">'.implode('<span>&gt;</span>', $htmls).'</div>';
 	}
 
 
-	protected function addAttribs($selected_month, $current_month, $index) {
-		$attribs = '';
-		$attribs .= 	
-			($selected_month == (int)$index) 
-			? 'selected ' : '';
-		$attribs .=
-			($current_month == $index)
-			? 'current ' : '';
-		$attribs .=
-			Class_Article::hasEventForMonth($index)
-			 ? '' : 'no_event ';
+	protected function addAttribs($selected_month, $current_month, $date) {
+		list($year, $month) = explode('-', $date);
+
+		$classes = [];
+		if ($selected_month == (int) $month)
+			$classes[] = 'selected';
+		if ($current_month == (int) $month)
+			$classes[] = 'current';
+		if (!Class_Article::hasEventForMonth((int) $month))
+			$classes[] = 'no_event';
 		
-		return 	$attribs ? ['class' => $attribs] : [];
+		return !empty($classes) ? ['class' => implode(' ', $classes)] : [];
 	}
 	
 
-	public function renderMonth($year, $month, $attribs) {
-		return $this->view->tagAnchor($this->view->url(['controller' => 'cms',
-																										'action' => 'calendar',
-																										'date' => $year.'-'.$month,
-																										'id_profil' => $this->_id_profil,
-																										'id_module' => $this->_id_module],
-																									 null, true),
-																	$this->_libelle_months[$month],
-																	$attribs);
+	public function renderMonth($date, $label, $attribs) {
+		return $this->view->tagAnchor(
+			$this->view->url([
+				'controller' => 'cms',
+				'action' => 'calendar',
+				'date' => $date,
+				'id_profil' => $this->_id_profil,
+				'id_module' => $this->_id_module
+			], null, true),
+			$label,
+			$attribs
+		);
 	}
 }
 ?>
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/Calendar/Months.php b/library/ZendAfi/View/Helper/Calendar/Months.php
new file mode 100644
index 0000000000000000000000000000000000000000..809cf0b3a555f081a3fc10c5989d21d7e73d7f39
--- /dev/null
+++ b/library/ZendAfi/View/Helper/Calendar/Months.php
@@ -0,0 +1,55 @@
+<?php
+
+class ZendAfi_View_Helper_Calendar_Months extends Zend_View_Helper_Abstract {
+	use Trait_Translator, Trait_TimeSource;
+
+	protected function monthsLabels($short = false) {
+		if ($short) {
+			return [
+				$this->_('Jan'),
+				$this->_('Fév'),
+				$this->_('Mars'),
+				$this->_('Avril'),
+				$this->_('Mai'),
+				$this->_('Juin'),
+				$this->_('Juillet'),
+				$this->_('Août'),
+				$this->_('Sept'),
+				$this->_('Oct'),
+				$this->_('Nov'),
+				$this->_('Déc')
+			];
+		}
+
+		return [
+			$this->_('Janvier'),
+			$this->_('Février'),
+			$this->_('Mars'),
+			$this->_('Avril'),
+			$this->_('Mai'),
+			$this->_('Juin'),
+			$this->_('Juillet'),
+			$this->_('Août'),
+			$this->_('Septembre'),
+			$this->_('Octobre'),
+			$this->_('Novembre'),
+			$this->_('Décembre')
+		];
+	}
+
+	public function calendar_Months($short = false) {
+		$labels = $this->monthsLabels($short);
+		$year = date('Y', $this->getTimeSource()->time());
+		$month = (int) date('n', $this->getTimeSource()->time());
+
+		$months = [];
+		foreach ($labels as $i => $label) {
+			$yr = ($month > $i + 1) ? $year + 1 : $year;
+			$date = $yr . '-' . sprintf("%02d", $i + 1);
+			$months[$date] = $label;
+		}
+		ksort($months);
+
+		return $months;
+	}
+}
diff --git a/library/ZendAfi/View/Helper/Calendar/RenderFilters.php b/library/ZendAfi/View/Helper/Calendar/RenderFilters.php
new file mode 100644
index 0000000000000000000000000000000000000000..2fb298c700ad9c687ec12a4c28e960c0a2c8fa4c
--- /dev/null
+++ b/library/ZendAfi/View/Helper/Calendar/RenderFilters.php
@@ -0,0 +1,210 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+class ZendAfi_View_Helper_Calendar_RenderFilters extends Zend_View_Helper_HtmlElement {
+	use Trait_Translator;
+
+	public function Calendar_RenderFilters($filters, $calendar) {
+		$active_filters = [];
+		foreach ($calendar->getCustomFieldParams() as $id => $value)
+			$active_filters['custom_field_'.$id] = $value;
+
+		foreach ($filters as $filter) {
+			if (isset($calendar->param[strtoupper($filter)])) {
+				$active_filters[$filter] = $calendar->param[strtoupper($filter)];
+			}
+		}
+
+		$html = '';
+		foreach ($filters as $filter) {
+			$html .= $this->renderFilter($filter, $active_filters, $calendar);
+		}
+
+		return '<ul class="filters">' . $html . '</ul>';
+	}
+
+
+
+	/**
+	 * @param $filter string
+	 * @param $active_filters array
+	 * @param $calendar Class_Calendar
+	 */
+	protected function renderFilter($filter, $active_filters, $calendar) {
+		$renderer = ZendAfi_View_Helper_Calendar_FilterElements::forFilter($filter);
+		$renderer->setView($this->view);
+		return $renderer->render($filter, $active_filters, $calendar);
+	}
+
+
+}
+
+
+
+
+abstract class ZendAfi_View_Helper_Calendar_FilterElements extends Zend_View_Helper_HtmlElement {
+	public static function forFilter($filter) {
+		if (preg_match('/^custom_field_(\d+)/', $filter, $matches))
+			return new ZendAfi_View_Helper_Calendar_FilterElementsCustomField($matches[1]);
+
+		$class = 'ZendAfi_View_Helper_Calendar_FilterElements' . ucfirst($filter);
+		if (!class_exists($class))
+			$class = 'ZendAfi_View_Helper_Calendar_FilterElementsNull';
+
+		return new $class();
+	}
+
+	/**
+	 * @param $value string
+	 * @param $label string
+	 * @param $calendar Class_Calendar
+	 */
+	protected function _renderFilterItem($url_params, $label, $selected) {
+		return $this->view->tag('li',
+														$this->view->tagAnchor($this->view->url($url_params, null, true), $label),
+														$selected ? ['class' => 'selected'] : []);
+	}
+
+
+	protected function _renderAnyValueItem($url_params, $selected) {
+		return $this->_renderFilterItem($url_params,
+																		$this->view->_('Tous'),
+																		$selected);
+	}
+
+
+	public function render($filter, $active_filters, $calendar) {
+		if (!$elements = $this->elements())
+			return '';
+
+		$url_base_params = array_merge(['controller' => 'cms',
+																		'action' => 'calendar',
+																		'id_module' => $calendar->param['ID_MODULE']],
+
+																	 $active_filters,
+
+																	 [$filter => null]);
+
+
+		return
+			'<li class="' . $filter . '">'
+			  . '<h2>' . $this->_renderTitle($active_filters, $elements, $filter ) . '</h2>'
+			  . '<ul>'
+			  . $this->_renderFilterItems($active_filters, $url_base_params, $filter, $elements)
+		    . '</ul>'
+			.'</li>';
+	}
+
+
+	protected function _renderTitle($active_filters, $elements, $filter ) {
+		$available_filters = (new Class_Systeme_ModulesAccueil_Calendrier())->getAvailableFilters();
+		if (!isset($available_filters[$filter]))
+			return '';
+
+		$title = $available_filters[$filter];
+
+		if (!isset($active_filters[$filter]))
+				return $title;
+
+		$current_value = $active_filters[$filter];
+		if (!isset($elements[$current_value]))
+			return $title;
+
+		$current_label = $elements[$current_value];
+		return $title . ': '. $current_label;
+	}
+
+
+	protected function _renderFilterItems($active_filters, $url_base_params, $filter, $elements) {
+		$output = $this->_renderAnyValueItem($url_base_params, !isset($active_filters[$filter]));
+
+		foreach ($elements as $value => $label) {
+			$selected = (isset($active_filters[$filter]) && $active_filters[$filter] == $value);
+			$output .= $this->_renderFilterItem(array_merge($url_base_params, [$filter => $value]),
+																					$label,
+																					$selected);
+		}
+		return $output;
+	}
+
+	abstract public function elements();
+}
+
+
+class ZendAfi_View_Helper_Calendar_FilterElementsNull extends ZendAfi_View_Helper_Calendar_FilterElements {
+	public function elements() {
+		return [];
+	}
+}
+
+
+class ZendAfi_View_Helper_Calendar_FilterElementsDate extends ZendAfi_View_Helper_Calendar_FilterElements {
+	use Trait_Translator;
+
+	protected function _renderAnyValueItem($base_url, $selected) {
+		return '';
+	}
+
+	public function elements() {
+		return $this->view->calendar_Months();
+	}
+}
+
+
+
+
+class ZendAfi_View_Helper_Calendar_FilterElementsPlace extends ZendAfi_View_Helper_Calendar_FilterElements {
+	public function elements() {
+		$elements = [];
+
+		$labels = Class_Lieu::getLoader()->getAllLibelles();
+		foreach ($labels as $id => $label) {
+			$elements[$id] = $label;
+		}
+
+		return $elements;
+	}
+}
+
+
+
+
+class ZendAfi_View_Helper_Calendar_FilterElementsCustomField extends ZendAfi_View_Helper_Calendar_FilterElements {
+	protected $custom_field_id;
+
+	public function __construct($custom_field_id) {
+		$this->custom_field_id = $custom_field_id;
+	}
+
+	public function elements() {
+		$values = Class_CustomField_Value::findAllBy([
+			'custom_field_id' => $this->custom_field_id,
+		]);
+
+		$elements = [];
+		foreach ($values as $value) {
+			$elements[ $value->getValue() ] = $value->getValue();
+		}
+
+		return $elements;
+	}
+}
+
+?>
diff --git a/library/ZendAfi/View/Helper/Calendar/Table.php b/library/ZendAfi/View/Helper/Calendar/Table.php
index 91ded5bd57b149cc03e0c36b1fe3772f2f16f9bc..074e6825288197941c8bb2b84d299676cb31b1d5 100644
--- a/library/ZendAfi/View/Helper/Calendar/Table.php
+++ b/library/ZendAfi/View/Helper/Calendar/Table.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class ZendAfi_View_Helper_Calendar_Table extends Zend_View_Helper_HtmlElement {
 	use Trait_Translator, Trait_TimeSource;
@@ -55,126 +55,39 @@ class ZendAfi_View_Helper_Calendar_Table extends Zend_View_Helper_HtmlElement {
 													$this->_('novembre'),
 													$this->_('décembre'));
 
-		$html ="<div><table class=\"calendar_main\">";
-		$html.="	<tr class=\"calendar_title\">";
-		$html.="		<td class=\"calendar_title_left_arrow\"></td>";
-		$html.="		<td class=\"calendar_title_month\">
-										<a  data-ajax='false' href=\"".$this->getURL("LAST_MONTH")."\" class=\"calendar_title_month_clickable\">&laquo;&nbsp;</a>
-										<a href=\"".$this->getURL("MONTH")."\" class=\"calendar_title_month_clickable\" target='_parent'>".$this->MONTHS[$this->month-1].strftime(" %Y", mktime(5,0,0, $this->month, 1, $this->year))."</a>
-										<a  data-ajax='false' href=\"".$this->getURL("NEXT_MONTH")."\" class=\"calendar_title_month_clickable\">&nbsp;&raquo;</a></td>";
-
-		$html.="		<td class=\"calendar_title_right_arrow\"></td>";
-		$html.="	</tr>";
-		$html.="	<tr>";
-		$html.="		<td colspan=\"3\">";
-		$html.="			<table class=\"calendar_table\">";
-		$html.="				<tr>";
-
-		///////////////////////////////////////////////////////////////////////////
-		// HTML - Nom des jours
-		///////////////////////////////////////////////////////////////////////////
-		for ($counter = 0; $counter < 7; $counter++) {
-			$html.="					<th>".$this->WEEK_DAYS[(1 + $counter) % 7]."</th>";
-		}
-		$html.="				</tr>";
-
-
-		$first_month_day = gmmktime(0, 0, 0, $this->month, 1, $this->year);
-		$offset = (7 - (1 % 7 - gmdate("w", $first_month_day))) % 7;
-		$current_day = $first_month_day - 3600 * 24 * $offset;
-		$row_number = ceil((gmdate("t", $first_month_day) + $offset) / 7);
+		return $this->getTableCalendar($articles);
 
-		///////////////////////////////////////////////////////////////////////////
-		// HTML - No des jours
-		///////////////////////////////////////////////////////////////////////////
-		for ($row = 1; $row <= $row_number; $row++) {
-			// The first loop displays the rows
-			$html.="				<tr>";
-
-			for ($column = 1; $column <= 7; $column++) {
-				// Day currently displayed
-				$day = gmdate("j", $current_day);
-
-				// If it is saturday or sunday, we use the "weekend" style
-				if (gmdate("w", $current_day) == 6 || gmdate("w", $current_day) == 0) {
-					$table_cell = "					<td class=\"calendar_weekend\">";
-				}
-				else {
-					$table_cell = "					<td>";
-				}
-
-				// We display the current day
-				$day_classes = array();
-
-				if (gmdate("dmY", $current_day) == $this->today) {
-					$day_classes []= "calendar_today_clickable";
-					$today_click = '<b>'.$day.'</b>';
-				} else {
-					$today_click=$day;
-					if (gmdate("n", $current_day) != $this->month) {
-						$day_classes []= "calendar_other_month";
-					}	else {
-						$day_classes []= "calendar_day_non_clickable";
-					}
-				}
-				///////////////////////////////////////////////////////////////////////////
-				// HTML - News
-				///////////////////////////////////////////////////////////////////////////
-				if ($this->dayHasEvents($current_day, $articles))	$day_classes []= "day_clickable";
-				if ($this->anEventStartThisDay($current_day, $articles)) $day_classes []= "calendar_day_event_start";
-
-				$cell_classes = implode(' ', array_unique($day_classes));
-				if (in_array('day_clickable', $day_classes)) {
-					$table_cell .= "<a href=\"".$this->getURL('EVENTS',$day)."\" class='".$cell_classes."' target='_parent'>".$today_click."</a>";
-				}	else {
-					$table_cell .= "<span class=\"".$cell_classes."\">".$day."</span>";
-				}
-
-				// End of day cell
-				$html.=$table_cell."</td>";
-				// Next day
-				$current_day += 3600 * 24 + 1;
-			}
-			$html.="				</tr>";
-		}
-
-		$html.="			</table>";
-		$html.="		</td>";
-		$html.="	</tr>";
-		$html.="</table></div>";
-
-		return $html;
 	}
 
 
 	function getURL($type,$jour = "") {
 		switch($type) {
-		case "LAST_MONTH" :
-			$url = ['controller' => 'cms',
-							'action' => 'calendar',
-							'date' => $this->getLastMonth($this->month, $this->year)];
-			break;
-
-		case "MONTH" :
-			if(strlen($this->month) == 1) $mois='0'.$this->month; else $mois = $this->month;
-			$url = ['controller' => 'cms',
-							'action' => 'articleviewbydate',
-							'd' => $this->year.'-'.$mois];
-			break;
-
-		case "NEXT_MONTH" :
-			$url = ['controller' => 'cms',
-							'action' => 'calendar',
-							'date' => $this->getNextMonth($this->month, $this->year)];
-			break;
-
-		case "EVENTS" :
-			if(strlen($this->month) == 1) $mois='0'.$this->month; else $mois = $this->month;
-			if(strlen($jour) == 1) $day='0'.$jour; else $day = $jour;
-			$url = ['controller' => 'cms',
-							'action' => 'articleviewbydate',
-							'd' => $this->year.'-'.$mois.'-'.$day];
-			break;
+			case "LAST_MONTH" :
+				$url = $this->buildUrl(['controller' => 'cms',
+								'action' => 'calendar',
+																'date' => $this->getLastMonth($this->month, $this->year)]);
+				break;
+
+			case "MONTH" :
+				if(strlen($this->month) == 1) $mois='0'.$this->month; else $mois = $this->month;
+				$url = $this->buildUrl(['controller' => 'cms',
+								'action' => 'articleviewbydate',
+																'd' => $this->year.'-'.$mois]);
+				break;
+
+			case "NEXT_MONTH" :
+				$url = $this->buildUrl(['controller' => 'cms',
+								'action' => 'calendar',
+																'date' => $this->getNextMonth($this->month, $this->year)]);
+				break;
+
+			case "EVENTS" :
+				if(strlen($this->month) == 1) $mois='0'.$this->month; else $mois = $this->month;
+				if(strlen($jour) == 1) $day='0'.$jour; else $day = $jour;
+				$url = $this->buildUrl(['controller' => 'cms',
+								'action' => 'articleviewbydate',
+																'd' => $this->year.'-'.$mois.'-'.$day]);
+				break;
 		}
 
 		return $this->view->url($url + ['id_module' => $this->id_module,
@@ -263,6 +176,153 @@ class ZendAfi_View_Helper_Calendar_Table extends Zend_View_Helper_HtmlElement {
 	}
 
 
-}
+	protected function getTableCalendar($articles) {
+		return $this->view->tag('div',$this->getTableCalendarContent($articles));
+	}
+
+
+	protected function getTableCalendarContent($articles) {
+		return $this->view->tag('table',
+														$this->getTableCalendarHeader() . $this->getTableCalendarTable($articles),
+														['class' => 'calendar_main']);
+	}
+
+
+	protected function getTableCalendarHeader() {
+		$anchor_class=  ['class' => 'calendar_title_month_clickable'];
+
+		$anchor_class['class'].= $this->param['DISPLAY_FULL_PAGE'] ? '' : ' calendar_ajax_ready';
+
+		$previews_month =
+			$this->view->tagAnchor($this->getURL('LAST_MONTH'),
+														 '&laquo;&nbsp;',
+														 $anchor_class);
+		$current_month =
+			$this->view->tagAnchor($this->getURL('MONTH'),
+														 $this->MONTHS[$this->month-1].strftime(" %Y", mktime(5,0,0, $this->month, 1, $this->year)),
+														 $anchor_class);
+		$next_month =
+			$this->view->tagAnchor($this->getURL('NEXT_MONTH'),
+														 '&nbsp;&raquo;',
+														 $anchor_class);
+
+		$tds_content = $this->view->tag('td', $previews_month, ['class' => 'calendar_title_left_arrow']);
+		$tds_content.= $this->view->tag('td', $current_month, ['class' => 'calendar_title_month']);
+		$tds_content.= $this->view->tag('td', $next_month, ['class' => 'calendar_title_right_arrow']);
+
+		return $this->view->tag('tr', $tds_content, ['class' => 'calendar_title']);
+	}
+
+
+	protected function buildUrl($url = []) {
+		if (!$this->param['DISPLAY_FULL_PAGE']) {
+			$url['action'] = 'calendar';
+
+			if(isset($url['d'])){
+				$url['date'] = $url['d'];
+				unset($url['d']);
+			}
+
+			$url = $url + ['render' => 'ajax'];
+		}
+		return $url;
+	}
+
+
+	protected function getTableCalendarTable($articles) {
+		return $this->view->tag('tr',
+														$this->view->tag('td',
+																						 $this->calendarTable($articles),
+																						 ['colspan' => 3]));
+	}
+
+
+	protected function calendarTable($articles) {
+		return $this->view->tag('table',
+														$this->getCalendarTableHeaders().$this->getCalendarTableDays($articles),
+														['class' => 'calendar_table']);
+	}
+
+
+	protected function getCalendarTableHeaders() {
+		$headers='';
+		for ($counter = 0; $counter < 7; $counter++) {
+			$headers.= $this->view->tag('th', $this->WEEK_DAYS[(1 + $counter) % 7]);
+		}
+		return $this->view->tag('tr', $headers);
+	}
+
 
+	protected function getCalendarTableDays($articles) {
+		$html='';
+		$first_month_day = gmmktime(0, 0, 0, $this->month, 1, $this->year);
+		$offset = (7 - (1 % 7 - gmdate("w", $first_month_day))) % 7;
+		$current_day = $first_month_day - 3600 * 24 * $offset;
+		$row_number = ceil((gmdate("t", $first_month_day) + $offset) / 7);
+
+		for ($row = 1; $row <= $row_number; $row++)
+			$html.= $this->view->tag('tr', $this->getCalendarTableCols($articles, $current_day));
+
+		return $html;
+	}
+
+
+	protected function getCalendarTableCols($articles, &$current_day) {
+		$html = '';
+		for ($column = 1; $column <= 7; $column++) {
+			$html.= $this->getCalendarTableColsDays($articles, $current_day);
+			$current_day += 3600 * 24 + 1;
+		}
+		return $html;
+	}
+
+
+	protected function getCalendarTableColsDays($articles, $current_day) {
+		$html = '';
+		// Day currently displayed
+		$day = gmdate("j", $current_day);
+
+		// If it is saturday or sunday, we use the "weekend" style
+		if (gmdate("w", $current_day) == 6 || gmdate("w", $current_day) == 0) {
+			$table_cell = "					<td class=\"calendar_weekend\">";
+		}
+		else {
+			$table_cell = "					<td>";
+		}
+
+		// We display the current day
+		$day_classes = [];
+
+		if (gmdate("dmY", $current_day) == $this->today) {
+			$day_classes []= "calendar_today_clickable";
+			$today_click = $this->view->tag('b', $day);
+		} else {
+			$today_click=$day;
+			if (gmdate("n", $current_day) != $this->month) {
+				$day_classes []= "calendar_other_month";
+			}	else {
+				$day_classes []= "calendar_day_non_clickable";
+			}
+		}
+
+		if ($this->dayHasEvents($current_day, $articles))
+			$day_classes[]= "day_clickable";
+
+		if ($this->anEventStartThisDay($current_day, $articles))
+			$day_classes[]= "calendar_day_event_start";
+
+		$cell_classes = implode(' ', array_unique($day_classes));
+		if (in_array('day_clickable', $day_classes)) {
+			$options = ['class' => $cell_classes,	'target' => '_parent'];
+			$options['class'].= $this->param['DISPLAY_FULL_PAGE'] ? '' : ' calendar_ajax_ready';
+			$table_cell.= $this->view->tagAnchor($this->getURL('EVENTS',$day), $today_click, $options);
+		}	else {
+			$table_cell .= $this->view->tag('span', $day,['class' => $cell_classes]);
+		}
+
+		// End of day cell
+		return $html.=$table_cell."</td>";
+		// Next day
+	}
+}
 ?>
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/CalendarContent.php b/library/ZendAfi/View/Helper/CalendarContent.php
index c0e2f57d60e71a5e291520b0a332ecadd691a8aa..481da57bbb40937ecbe413d6622c11d04ae62b23 100644
--- a/library/ZendAfi/View/Helper/CalendarContent.php
+++ b/library/ZendAfi/View/Helper/CalendarContent.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 	use Trait_TimeSource;
@@ -44,7 +44,7 @@ class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 			$year	 = (int)$date_array[0];
 		}
 
-		$calendar = new Class_Calendar($param, $this->view);
+		$calendar = new Class_Calendar($param);
 		$calendar->setTimeSource($this->getTimeSource());
 		$calendar->initializeParams();
 
@@ -53,11 +53,21 @@ class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 		$html.= $this->rendDateSelection($calendar->getSelectedMonthArticles(),
 																		 $month,
 																		 $year);
+		$html.= $this->renderFilters($calendar);
 		$html.= $this->renderArticlesByList($calendar->getArticles());
 		return $html.='</div>';
 	}
 
 
+	protected function renderFilters($calendar) {
+		$filters = array_filter(explode(';', $this->param['ENABLED_FILTERS']));
+		if (empty($filters))
+			return '';
+
+		return $this->view->Calendar_RenderFilters($filters, $calendar);
+	}
+
+
 	protected function rendDateSelection($articles, $month, $year) {
 		if (!$mode = (int)$this->param['DISPLAY_CALENDAR'])
 			return '';
@@ -68,22 +78,22 @@ class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 
 		$helper = $this->view->getHelper($helper_name);
 		$helper->setTimeSource($this->getTimeSource());
-		return call_user_func_array([$helper, $helper_name], 
+		return call_user_func_array([$helper, $helper_name],
 																[$articles,
 																 $month,
 																 $year,
 																 $this->param]);
 	}
 
-	
+
 	protected function renderArticlesByList($articles) {
 		if(!$articles || $this->param['MODE_AFFICHAGE']=='none')
 			return '';
-			
+
 		$html= '<div class="agenda-summaries">'.
 			'<b>'.$this->view->_('Prochains évènements').'</b>';
 
-		
+
 		if($this->param['MODE_AFFICHAGE']=='simple')
 			$html .= $this->rendArticlesBySimpleList($articles);
 
@@ -97,11 +107,11 @@ class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 		return $html.='</div>';
 	}
 
-	
+
 
 	protected function renderArticlesModeWall($articles) {
 		$html ='';
-		
+
 		foreach($articles as $article){
 			$html.=$this->view->article_RenderWall($article);
 		}
@@ -126,15 +136,15 @@ class ZendAfi_View_Helper_CalendarContent extends Zend_View_Helper_HtmlElement {
 		return $html.'</ul>';
 	}
 
-	
+
 	protected function renderTitleOnlyWithInfo($article) {
-		return 
+		return
 			$this->param['EVENT_INFO']=='bib'
 			?	$this->view->article_RenderTitleOnlyCalendarWithBib($article)
-			: ($this->param['EVENT_INFO'] == 'cat' 
+			: ($this->param['EVENT_INFO'] == 'cat'
 				 ? $this->view->article_RenderTitleOnlyCalendarWithCatalogue($article)
 				 : $this->view->article_RenderTitleOnlyCalendar($article));
-	} 
+	}
 
 }
 
diff --git a/library/ZendAfi/View/Helper/CkEditor.php b/library/ZendAfi/View/Helper/CkEditor.php
index 3a4c7123851446b71f19502f188f6a5dafbff9f7..24b017adf4f6870529a8e59c68d20ea506e4aaa7 100644
--- a/library/ZendAfi/View/Helper/CkEditor.php
+++ b/library/ZendAfi/View/Helper/CkEditor.php
@@ -87,7 +87,6 @@ class ZendAfi_View_Helper_CkEditor extends ZendAfi_View_Helper_BaseHelper
 
 		
 		$oCKeditor = new CKeditor(CKBASEURL);
-		$oCKeditor->textareaAttributes['id'] = $editorId;
 		$oCKeditor->returnOutput = true;
 		return $oCKeditor->editor($editorId, $initial, $config);
 	}
diff --git a/library/ZendAfi/View/Helper/FormSortableConnectLists.php b/library/ZendAfi/View/Helper/FormSortableConnectLists.php
new file mode 100644
index 0000000000000000000000000000000000000000..2eed1689e0075050156b0e877d101fc8371dfd7f
--- /dev/null
+++ b/library/ZendAfi/View/Helper/FormSortableConnectLists.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+
+class ZendAfi_View_Helper_FormSortableConnectLists extends ZendAfi_View_Helper_BaseHelper {
+	protected function renderList($title, $values) {
+		$output = '<div><h2>' . $title . '</h2>';
+		$output .= '<ul>';
+		foreach ($values as $v => $label) {
+			$output .= '<li data-value="' . $v . '">' . $label . '</li>';
+		}
+		$output .= '</ul>';
+		$output .= '</div>';
+
+		return $output;
+	}
+
+	public function formSortableConnectLists($name, $value = null, $available_values = []) {
+		$values = explode(';', $value);
+		$enabled_values = [];
+		foreach ($values as $v) {
+			if (isset($available_values[$v])) {
+				$enabled_values[$v] = $available_values[$v];
+				unset($available_values[$v]);
+			}
+		}
+
+		$output = $this->view->formHidden($name, $value);
+		$output .= $this->renderList($this->view->_('Filtres activés'), $enabled_values);
+		$output .= $this->renderList($this->view->_('Filtres disponibles'), $available_values);
+
+		Class_ScriptLoader::getInstance()
+			->addOPACScript('input_connect_list/input_connect_list')
+			->addOPACStyleSheet('../js/input_connect_list/input_connect_list')
+			->addJQueryReady('$("div#input_'.$name.'").inputConnectList()');
+
+		return '<div id="input_' . $name . '">' . $output . '</div>';
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/WebThumbnail.php b/library/ZendAfi/View/Helper/WebThumbnail.php
index 140a976707135f90a83bb0e568f4254bf7844a88..8bb050bd42b9c4f9e8508615dbe035e3cb031fb8 100644
--- a/library/ZendAfi/View/Helper/WebThumbnail.php
+++ b/library/ZendAfi/View/Helper/WebThumbnail.php
@@ -33,10 +33,8 @@ class ZendAfi_View_Helper_WebThumbnail extends ZendAfi_View_Helper_BaseHelper {
 		$filename = $this->fileNameFromUrl($url);
 		$filepath = $this->fullPath($filename);
 		
-		if (!file_exists($filepath)) {
-			if (!$this->getThumbnailer()->fetchUrlToFile($url, $filepath))
-				return '';
-		}
+		if (!$this->getFileWriter()->fileExists($filepath))
+			return BASE_URL."/sito/webthumbnail?url=$url";
 
 		return $this->fullUrl($filename);
 	}
diff --git a/library/startup.php b/library/startup.php
index 760521207b82c9523a9b24a4dc4322ea8410b0a1..28f9dc640491ccbeca22b9c93dcaed10f1927284 100644
--- a/library/startup.php
+++ b/library/startup.php
@@ -56,8 +56,8 @@ function defineConstant($name, $value) {
 
 
 function setupConstants() {
-	defineConstant('VERSION_PERGAME','6.52');
-	defineConstant('RELEASE_NUMBER', VERSION_PERGAME . '.3');
+	defineConstant('VERSION_PERGAME','6.54');
+	defineConstant('RELEASE_NUMBER', VERSION_PERGAME . '.2');
 
 	defineConstant('ROOT_PATH',  realpath(dirname(__FILE__).'/..').'/');
 
@@ -191,7 +191,7 @@ function setupLanguage() {
 function setupDatabase($cfg) {
 	// setup database
 	$sql = Zend_Db::factory($cfg->sgbd->adapter, $cfg->sgbd->config->toArray());
-
+	$sql->usePrepared(false);
 	Zend_Db_Table::setDefaultAdapter($sql);
 
 	$afi_sql = new Class_Systeme_Sql(
@@ -277,6 +277,7 @@ function setupFrontController($cfg) {
 		->registerPlugin(new ZendAfi_Controller_Plugin_Popup())
 		->registerPlugin(new ZendAfi_Controller_Plugin_TogetherJS())
 		->registerPlugin(new ZendAfi_Controller_Plugin_CustomFields())
+		->registerPlugin(new ZendAfi_Controller_Plugin_Lectura())
 		->registerPlugin(new ZendAfi_Controller_Plugin_InspectorGadget())
 		->setParam('useDefaultControllerAlways', true);
 
diff --git a/library/storm b/library/storm
index 6f470b3a4810a7e6a942fadcd61eaab4762c6a45..43139b708408945afa30c7ec40d1f5551ea1353a 160000
--- a/library/storm
+++ b/library/storm
@@ -1 +1 @@
-Subproject commit 6f470b3a4810a7e6a942fadcd61eaab4762c6a45
+Subproject commit 43139b708408945afa30c7ec40d1f5551ea1353a
diff --git a/library/translation/collect_strings.sh b/library/translation/collect_strings.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9aad70f84ad09cf0efa8fd06bd909e2407a5683a
--- /dev/null
+++ b/library/translation/collect_strings.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+export LC_ALL="fr_FR.UTF-8"
+
+for i in {2..4}
+do
+    find \
+	../../application \
+	../../library \
+	-type f \( -name "*.php" -o -name "*.phtml" \) \
+	-exec  xgettext \
+	-j \
+	-L PHP \
+	-o fr.pot \
+	--from-code=utf-8 \
+	--keyword=traduire \
+	--keyword=openBoite \
+	--keyword=_plural:$i \
+	{} \;
+done
+
+
+for i in `ls *.po`
+do
+    msgmerge -s $i fr.pot -o $i
+done
diff --git a/library/translation/compile_po.sh b/library/translation/compile_po.sh
new file mode 100644
index 0000000000000000000000000000000000000000..22cfb2828bd01ecd6cbf8b572fb9e9456af26a8f
--- /dev/null
+++ b/library/translation/compile_po.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+export LC_ALL="fr_FR.UTF-8"
+
+for i in `ls *.po`
+do
+    msgfmt -o `echo $i|cut -d '.' -f1`.mo $i
+done
diff --git a/library/translation/en.mo b/library/translation/en.mo
index cc9d0c3ee2f3e4fd40b6f96591ad597e8e753119..b8fae440334c0a82e28f429388c93704bc4c2a19 100644
Binary files a/library/translation/en.mo and b/library/translation/en.mo differ
diff --git a/library/translation/en.po b/library/translation/en.po
index 648a38522f4b880a6c1a8c1e078018f92769fae9..c109e96fea63f3e0d872672e7feed22752416e71 100644
--- a/library/translation/en.po
+++ b/library/translation/en.po
@@ -1,7 +1,7 @@
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-11 14:22+0200\n"
+"POT-Creation-Date: 2014-10-02 16:13+0200\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -26,6 +26,7 @@ msgstr " (Sorted by relevance extended search)"
 #: ../../application/modules/admin/controllers/CmsController.php:48
 #: ../../application/modules/admin/controllers/UsergroupController.php:28
 #: ../../application/modules/admin/controllers/UsergroupController.php:48
+#: ../../application/modules/admin/controllers/CmsController.php:64
 #, fuzzy
 msgid " Ajouter une catégorie"
 msgstr " Add a category"
@@ -73,6 +74,10 @@ msgstr " Your baskets "
 msgid " aux lettres d'information: "
 msgstr "  at newsletters: : "
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid " avec l'adresse suivante: "
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:343
 #: ../../application/modules/opac/controllers/RechercheController.php:363
 #: ../../application/modules/opac/controllers/RechercheController.php:382
@@ -142,17 +147,20 @@ msgstr "  or  "
 
 #: ../../application/modules/opac/controllers/AbonneController.php:451
 #: ../../application/modules/opac/controllers/AbonneController.php:511
+#: ../../application/modules/opac/controllers/AbonneController.php:516
 #, fuzzy
 msgid " par E-Mail"
 msgstr " E-mail"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:452
 #: ../../application/modules/opac/controllers/AbonneController.php:512
+#: ../../application/modules/opac/controllers/AbonneController.php:517
 msgid " par SMS"
 msgstr " SMS"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:450
 #: ../../application/modules/opac/controllers/AbonneController.php:510
+#: ../../application/modules/opac/controllers/AbonneController.php:515
 msgid " par courrier postal"
 msgstr " by mail"
 
@@ -410,6 +418,7 @@ msgstr "(This comment was reported to moderators)"
 #: ../../application/modules/admin/controllers/BibController.php:556
 #: ../../application/modules/admin/controllers/BibController.php:553
 #: ../../application/modules/admin/controllers/BibController.php:493
+#: ../../application/modules/admin/controllers/BibController.php:498
 msgid "** nouveau plan **"
 msgstr "** new map **"
 
@@ -442,6 +451,7 @@ msgstr "** new info **"
 #: ../../application/modules/admin/controllers/BibController.php:445
 #: ../../application/modules/admin/controllers/BibController.php:442
 #: ../../application/modules/admin/controllers/BibController.php:401
+#: ../../application/modules/admin/controllers/BibController.php:406
 msgid "** nouvelle localisation **"
 msgstr "** new position **"
 
@@ -609,6 +619,7 @@ msgstr "Subscription"
 #: ../../application/modules/opac/controllers/AbonneController.php:410
 #: ../../application/modules/opac/controllers/AbonneController.php:460
 #: ../../application/modules/opac/controllers/AbonneController.php:520
+#: ../../application/modules/opac/controllers/AbonneController.php:525
 msgid "Abonnement aux lettres d'information"
 msgstr "Newsletter subscriptions"
 
@@ -659,6 +670,7 @@ msgstr "Letter preview:: "
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/ComboProfils.php:114
 #: ../../library/Class/MoteurRecherche.php:415
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
 msgid "Accueil"
 msgstr "Home"
 
@@ -688,6 +700,11 @@ msgstr "Open Cosmogramme"
 msgid "Accéder au document Numérique Premium"
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:33
+#, fuzzy
+msgid "Accéder au livre numérique"
+msgstr "OAI resources"
+
 #: ../../application/modules/admin/views/scripts/users/index.phtml:19
 #: ../../application/modules/admin/views/scripts/users/index.phtml:21
 msgid "Action"
@@ -749,6 +766,8 @@ msgstr "Administer the AFI-Multimedia Server"
 #: ../../application/modules/opac/controllers/IndexController.php:94
 #: ../../application/modules/opac/controllers/IndexController.php:93
 #: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../application/modules/opac/controllers/AbonneController.php:441
+#: ../../library/ZendAfi/Form/ContactForm.php:67
 msgid "Adresse"
 msgstr "Enable accessibility tools"
 
@@ -759,6 +778,7 @@ msgstr "Address :  : "
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:122
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
 msgid "Adresse URL"
 msgstr "URL address"
 
@@ -934,6 +954,7 @@ msgstr "Show only answers to validate"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:112
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:108
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:103
+#: ../../library/ZendAfi/Form/Admin/News.php:62
 msgid "Agenda"
 msgstr "Calendar"
 
@@ -1038,6 +1059,11 @@ msgstr "Add the record to the basket : :"
 msgid "Ajouter les utilisateurs sélectionnés"
 msgstr "See son selected RSS"
 
+#: ../../application/modules/admin/controllers/CmsController.php:39
+#, fuzzy
+msgid "Ajouter un article"
+msgstr "Add a location"
+
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:4
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:5
 msgid "Ajouter un catalogue"
@@ -1074,6 +1100,7 @@ msgstr "Add a menu"
 
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:76
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:81
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:78
 #, fuzzy
 msgid "Ajouter un nouvel article"
 msgstr "Add a location"
@@ -1087,6 +1114,7 @@ msgstr "Add a plan"
 #: ../../application/modules/admin/controllers/BibController.php:566
 #: ../../application/modules/admin/controllers/BibController.php:563
 #: ../../application/modules/admin/controllers/BibController.php:504
+#: ../../application/modules/admin/controllers/BibController.php:509
 #, php-format
 msgid "Ajouter un plan de la bibliothèque: %s"
 msgstr "Add a map of the library: %s"
@@ -1142,6 +1170,7 @@ msgid "Ajouter une collection"
 msgstr "Add a location"
 
 #: ../../application/modules/admin/views/scripts/formation/index.phtml:5
+#: ../../application/modules/admin/controllers/FormationController.php:37
 #, fuzzy
 msgid "Ajouter une formation"
 msgstr "Add a location"
@@ -1165,6 +1194,11 @@ msgstr "Add a category"
 msgid "Ajouter une relation"
 msgstr "Add a link"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:37
+#, fuzzy
+msgid "Ajouter une session"
+msgstr "Add a link"
+
 #: ../../application/modules/admin/views/scripts/batch/index.phtml:4
 #, fuzzy
 msgid "Ajouter une tâche"
@@ -1221,6 +1255,7 @@ msgstr "Add an event"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:102
 #: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:141
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
 msgid "Annexe"
 msgstr "Event"
 
@@ -1306,6 +1341,8 @@ msgid "Aout"
 msgstr "August"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:42
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:16
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:32
 msgid "Août"
 msgstr "August"
 
@@ -1359,9 +1396,21 @@ msgstr "Arte VOD"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:152
 #: ../../library/Class/CustomFieldsCategory.php:85
 #: ../../library/Class/CustomField/ModelConfiguration/Article.php:26
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:35
+#: ../../library/ZendAfi/Form/Admin/News.php:105
 msgid "Article"
 msgstr "Article"
 
+#: ../../application/modules/admin/controllers/CmsController.php:35
+#, fuzzy, php-format
+msgid "Article \"%s\" sauvegardé"
+msgstr " \"%s\" group has been saved"
+
+#: ../../application/modules/admin/controllers/CmsController.php:37
+#, fuzzy, php-format
+msgid "Article \"%s\" supprimé"
+msgstr "Cart nb %s deleted"
+
 #: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:24
 #: ../../library/Class/NoticeHtml.php:222
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:24
@@ -1396,6 +1445,8 @@ msgstr "Warning......"
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:76
 #: ../../application/modules/admin/controllers/CmsController.php:259
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:77
+#: ../../application/modules/admin/controllers/CmsController.php:247
+#: ../../library/ZendAfi/Form/Admin/News.php:185
 msgid "Aucun"
 msgstr "No"
 
@@ -1431,6 +1482,7 @@ msgstr "No review for %s"
 #: ../../library/Class/NoticeHtml.php:742
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:90
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:86
 msgid "Aucun avis pour le moment"
 msgstr "No review now"
 
@@ -1456,6 +1508,7 @@ msgstr "No content"
 #: ../../application/modules/admin/controllers/ModoController.php:679
 #: ../../application/modules/admin/controllers/ModoController.php:747
 #: ../../application/modules/opac/controllers/AbonneController.php:896
+#: ../../application/modules/opac/controllers/AbonneController.php:901
 msgid "Aucun courriel envoyé, erreur: "
 msgstr "No email sent, error:"
 
@@ -1574,6 +1627,7 @@ msgstr "No location data found for this item"
 #: ../../application/modules/opac/controllers/RssController.php:233
 #: ../../application/modules/opac/controllers/RssController.php:252
 #: ../../application/modules/opac/controllers/RssController.php:248
+#: ../../application/modules/opac/controllers/RssController.php:249
 msgid "Aucune donnée à modérer"
 msgstr "No data to moderate"
 
@@ -1633,6 +1687,7 @@ msgid "Aucune réservation"
 msgstr "Moderation"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:4
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:6
 msgid "Aucune suggestion à modérer"
 msgstr "No suggestion to moderate"
 
@@ -1695,6 +1750,10 @@ msgstr "No results"
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:48
 #: ../../library/Class/CriteresRecherche.php:107
 #: ../../library/Class/NoticeHtml.php:88
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:12
+#: ../../library/ZendAfi/Form/Admin/News.php:46
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/Class/SuggestionAchat.php:95
 msgid "Auteur"
 msgstr "Author"
 
@@ -1762,6 +1821,7 @@ msgstr "Login"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:199
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:177
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:193
+#: ../../library/ZendAfi/Form/Admin/News.php:87
 msgid "Autoriser les commentaires d'internautes (Mode blog) ?"
 msgstr "Allow comments from readers (blog mode) ?"
 
@@ -1844,6 +1904,8 @@ msgid "Avr."
 msgstr "Apr.."
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:38
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:12
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:28
 #, fuzzy
 msgid "Avril"
 msgstr "april"
@@ -1947,6 +2009,8 @@ msgstr "Bibliographies"
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
 #: ../../application/modules/opac/views/scripts/abonne/prets.phtml:23
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:14
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
 msgid "Bibliothèque"
 msgstr "Library"
 
@@ -1954,6 +2018,11 @@ msgstr "Library"
 msgid "Bibliothèque : "
 msgstr "Library : : "
 
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:15
+#, fuzzy
+msgid "Bibliothèque de destination"
+msgstr "Library : : "
+
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:29
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:71
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
@@ -2054,6 +2123,10 @@ msgstr ""
 msgid "Bloc fermé"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:27
+msgid "Boite"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:117
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:126
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:173
@@ -2082,6 +2155,8 @@ msgstr "Default style for the column"
 #: ../../library/Class/Users.php:446 ../../library/Class/Users.php:592
 #: ../../library/Class/Users.php:659 ../../library/Class/Users.php:747
 #: ../../library/Class/Users.php:870 ../../library/Class/Users.php:885
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:1
+#: ../../library/Class/Users.php:892
 msgid "Bonjour,"
 msgstr "Hello,"
 
@@ -2090,6 +2165,7 @@ msgstr "Hello,"
 #: ../../library/Class/Users.php:510 ../../library/Class/Users.php:659
 #: ../../library/Class/Users.php:726 ../../library/Class/Users.php:814
 #: ../../library/Class/Users.php:927 ../../library/Class/Users.php:943
+#: ../../library/Class/Users.php:950
 #, fuzzy
 msgid "Bonne navigation sur le portail"
 msgstr "Create an account"
@@ -2180,6 +2256,7 @@ msgstr "Youth catalogs"
 #: ../../library/Class/Calendar.php:176
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:12
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:51
+#: ../../library/ZendAfi/Form/Admin/News.php:49
 msgid "Catégorie"
 msgstr "Category"
 
@@ -2206,6 +2283,7 @@ msgstr "Cause"
 #: ../../application/modules/opac/controllers/AbonneController.php:639
 #: ../../application/modules/opac/controllers/AbonneController.php:671
 #: ../../application/modules/opac/controllers/AbonneController.php:731
+#: ../../application/modules/opac/controllers/AbonneController.php:736
 msgid "Ce créneau n'est pas dans les heures d'ouverture."
 msgstr "This niche is not in hours."
 
@@ -2242,6 +2320,12 @@ msgstr "The basket is empty"
 msgid "Ceci apparaîtra sous le nom de votre site dans les moteurs de recherche"
 msgstr "This will be displayed in search engines"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:10
+msgid ""
+"Celui-ci vous permet de vous connecter en temps qu'invité et de vous "
+"désincrire de la newsletter."
+msgstr ""
+
 #: ../../library/Class/Codification.php:102
 #: ../../library/Class/Codification.php:104
 #: ../../library/Class/Codification.php:105
@@ -2284,6 +2368,7 @@ msgstr "This article is a draft"
 #: ../../library/Class/Users.php:409 ../../library/Class/Users.php:556
 #: ../../library/Class/Users.php:623 ../../library/Class/Users.php:711
 #: ../../library/Class/Users.php:833 ../../library/Class/Users.php:868
+#: ../../library/Class/Users.php:875
 msgid "Cet identifiant existe déjà."
 msgstr "This identifier already exists."
 
@@ -2360,6 +2445,7 @@ msgstr "Available fields"
 #: ../../library/ZendAfi/View/Helper/Admin/TagCustomFields.php:31
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:257
 #: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsValuesUrl.php:43
+#: ../../library/ZendAfi/Form/Admin/News.php:214
 #, fuzzy
 msgid "Champs personnalisés"
 msgstr "Selected fields"
@@ -2431,6 +2517,7 @@ msgstr "Loading in progress..."
 #: ../../application/modules/opac/controllers/AbonneController.php:664
 #: ../../application/modules/opac/controllers/AbonneController.php:696
 #: ../../application/modules/opac/controllers/AbonneController.php:756
+#: ../../application/modules/opac/controllers/AbonneController.php:761
 msgid "Choisir"
 msgstr "Choose"
 
@@ -2440,6 +2527,7 @@ msgid "Choisir des medias"
 msgstr "Choose media"
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:63
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:61
 msgid "Choisissez le domaine de départ"
 msgstr "Choose the parent domain"
 
@@ -2448,6 +2536,11 @@ msgstr "Choose the parent domain"
 msgid "Choisissez les formations à afficher"
 msgstr " Edit my profile"
 
+#: ../../library/ZendAfi/Form/ContactForm.php:40
+#, fuzzy
+msgid "Choisissez votre bibliothèque"
+msgstr "Library's location"
+
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:3
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:26
 msgid "Clef"
@@ -2500,11 +2593,14 @@ msgstr "Anti-spam code:"
 #: ../../application/modules/opac/controllers/IndexController.php:97
 #: ../../application/modules/opac/controllers/IndexController.php:96
 #: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../application/modules/opac/controllers/AbonneController.php:442
+#: ../../library/ZendAfi/Form/ContactForm.php:69
 msgid "Code postal"
 msgstr "Postal code"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:42
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:44
 msgid "Code-barres / ISBN"
 msgstr "Barcode / ISBN"
 
@@ -2560,6 +2656,7 @@ msgstr "starts with"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:98
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
 msgid "Comment se procurer ce document "
 msgstr "How to get this document "
 
@@ -2576,6 +2673,8 @@ msgstr "How to get this document "
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:356
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
 #: ../../library/Class/SuggestionAchat.php:81
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:34
+#: ../../library/Class/SuggestionAchat.php:102
 msgid "Commentaire"
 msgstr "Comment"
 
@@ -2589,6 +2688,7 @@ msgstr "Communication ILS unavailable"
 
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:42
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:45
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:48
 msgid "Complet"
 msgstr "Complete"
 
@@ -2604,6 +2704,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:41
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:44
 msgid "Compte"
 msgstr "Account"
 
@@ -2614,12 +2716,14 @@ msgstr "Conditions registration:"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:114
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:113
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
 msgid "Configuration"
 msgstr "Configuration"
 
 #: ../../application/modules/admin/controllers/ProfilController.php:539
 #: ../../application/modules/admin/controllers/ProfilController.php:550
 #: ../../application/modules/admin/controllers/ProfilController.php:552
+#: ../../application/modules/admin/controllers/ProfilController.php:551
 msgid "Configuration des pages appliquée à tous les autres profils."
 msgstr "Configuration pages applied to all other profiles."
 
@@ -2632,10 +2736,16 @@ msgstr "Access plan"
 #: ../../application/modules/opac/controllers/AbonneController.php:745
 #: ../../application/modules/opac/controllers/AbonneController.php:777
 #: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../application/modules/opac/controllers/AbonneController.php:842
 #, fuzzy
 msgid "Confirmation"
 msgstr "Configuration"
 
+#: ../../application/modules/opac/controllers/AuthController.php:347
+#, fuzzy
+msgid "Confirmation d'inscription à la newsletter: "
+msgstr "Conditions registration:"
+
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:45
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:13
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:64
@@ -2660,6 +2770,7 @@ msgstr "Confirm password"
 #: ../../application/modules/opac/controllers/AbonneController.php:395
 #: ../../application/modules/opac/controllers/AbonneController.php:414
 #: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:479
 msgid "Confirmez le mot de passe"
 msgstr "Confirm password"
 
@@ -2675,6 +2786,7 @@ msgstr "Confirm password"
 
 #: ../../application/modules/opac/controllers/AuthController.php:86
 #: ../../application/modules/opac/controllers/AuthController.php:89
+#: ../../application/modules/telephone/controllers/AuthController.php:43
 #, fuzzy
 msgid "Connexion"
 msgstr "Login box"
@@ -2848,6 +2960,7 @@ msgstr "Reviews written by %s"
 #: ../../application/modules/opac/controllers/RssController.php:258
 #: ../../application/modules/opac/controllers/RssController.php:277
 #: ../../application/modules/opac/controllers/RssController.php:266
+#: ../../application/modules/opac/controllers/RssController.php:268
 #, php-format
 msgid "Critiques de la sélection: %s"
 msgstr "Reviews from selection: %s"
@@ -3032,6 +3145,11 @@ msgstr "A to B"
 msgid "De B à A"
 msgstr "B to A"
 
+#: ../../application/modules/opac/controllers/AuthController.php:284
+#, fuzzy
+msgid "Demande d'inscription à la lettre d'information: "
+msgstr "  to the newsletter: : "
+
 #: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:5
 msgid "Demande de réservation d'un document du réseau:"
 msgstr "Booking request of a document from the network:"
@@ -3067,6 +3185,7 @@ msgid "Demandes d'inscription"
 msgstr "Subscription requests"
 
 #: ../../library/Class/SuggestionAchat.php:78
+#: ../../library/Class/SuggestionAchat.php:99
 msgid "Demandeur"
 msgstr "Applicant"
 
@@ -3076,6 +3195,7 @@ msgstr "Applicant"
 #: ../../application/modules/opac/controllers/CmsController.php:154
 #: ../../application/modules/opac/controllers/CmsController.php:170
 #: ../../application/modules/opac/controllers/CmsController.php:171
+#: ../../application/modules/opac/controllers/CmsController.php:172
 msgid "Derniers Articles"
 msgstr "Latest Articles"
 
@@ -3154,6 +3274,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:44
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:38
 #: ../../library/ZendAfi/Form/Album.php:52
+#: ../../library/ZendAfi/Form/Admin/Formation.php:35
 msgid "Description"
 msgstr "Description"
 
@@ -3332,6 +3453,7 @@ msgstr "Domains"
 #: ../../library/Class/NoticeHtml.php:819
 #: ../../library/Class/NoticeHtml.php:691
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:40
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:114
 msgid "Donnez ou modifiez votre avis"
 msgstr "Write or edit review"
 
@@ -3374,6 +3496,11 @@ msgstr "Duplicating domain: %s"
 msgid "Dupliquer l'article: "
 msgstr "Duplicate article:"
 
+#: ../../application/modules/admin/controllers/CmsController.php:209
+#, fuzzy, php-format
+msgid "Dupliquer l'article: %s"
+msgstr "Duplicate article:"
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:9
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:10
@@ -3407,6 +3534,7 @@ msgid "Début matinée"
 msgstr "Early morning"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:46
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:20
 msgid "Déc"
 msgstr "December"
 
@@ -3414,6 +3542,11 @@ msgstr "December"
 msgid "Déc."
 msgstr "December"
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:36
+#, fuzzy
+msgid "Décembre"
+msgstr "december"
+
 #: ../../application/modules/admin/controllers/LieuController.php:29
 #: ../../application/modules/admin/views/scripts/lieu/index.phtml:4
 msgid "Déclarer un nouveau lieu"
@@ -3441,9 +3574,17 @@ msgstr "Domain definition"
 msgid "Dépouillements"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:323
+#, fuzzy
+msgid "Désinscription de la lettre d'information: "
+msgstr "  to the newsletter: : "
+
 #: ../../application/modules/opac/views/scripts/error/404.phtml:4
 #: ../../application/modules/opac/controllers/CmsController.php:124
 #: ../../application/modules/opac/controllers/CmsController.php:125
+#: ../../application/modules/opac/controllers/CmsController.php:121
+#: ../../application/modules/opac/controllers/CmsController.php:126
+#: ../../application/modules/telephone/views/scripts/error/404.phtml:4
 msgid "Désolé, cette page n'existe pas"
 msgstr "Sorry, this page does not exist"
 
@@ -3465,6 +3606,8 @@ msgstr "Session details"
 #: ../../application/modules/opac/controllers/AbonneController.php:379
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../application/modules/opac/controllers/AbonneController.php:444
+#: ../../library/Class/SuggestionAchat.php:100
 msgid "E-Mail"
 msgstr "E-mail"
 
@@ -3479,6 +3622,7 @@ msgstr "E-mail"
 #: ../../application/modules/opac/controllers/IndexController.php:105
 #: ../../application/modules/opac/controllers/IndexController.php:104
 #: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../library/ZendAfi/Form/ContactForm.php:75
 msgid "E-mail"
 msgstr "E-mail"
 
@@ -3637,6 +3781,14 @@ msgid ""
 msgstr ""
 "Enter a coma separated keyword and expression list that describe you site."
 
+#: ../../library/ZendAfi/Form/Admin/News.php:83
+#, fuzzy
+msgid ""
+"Entrez la liste des mots-clefs et expressions qui caractérisent votre "
+"article séparés par ;"
+msgstr ""
+"Enter a coma separated keyword and expression list that describe you site."
+
 #: ../../application/modules/opac/controllers/AuthController.php:30
 #: ../../application/modules/opac/controllers/AuthController.php:48
 #: ../../application/modules/opac/controllers/AuthController.php:68
@@ -3660,6 +3812,7 @@ msgid "Entrez votre mot de passe S.V.P."
 msgstr "Confirm password."
 
 #: ../../application/modules/admin/controllers/AuthController.php:39
+#: ../../application/modules/admin/controllers/AuthController.php:49
 msgid "Entrez votre nom d'utilisateur puis validez S.V.P."
 msgstr "Enter your login, password then validate."
 
@@ -3683,7 +3836,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:46 ../../library/Class/Bib.php:47
 #: ../../library/Class/Bib.php:78 ../../library/Class/Bib.php:97
 #: ../../library/Class/Bib.php:117 ../../library/Class/Bib.php:128
-#: ../../library/Class/Bib.php:148
+#: ../../library/Class/Bib.php:148 ../../library/Class/Bib.php:168
 msgid "Envoie des données"
 msgstr "Send data"
 
@@ -3696,6 +3849,7 @@ msgstr "Send data"
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:58
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:72
 msgid "Envoyer"
 msgstr "Send"
 
@@ -3726,6 +3880,7 @@ msgstr "Send"
 #: ../../application/modules/opac/controllers/RssController.php:40
 #: ../../application/modules/opac/controllers/RssController.php:45
 #: ../../application/modules/opac/controllers/RssController.php:64
+#: ../../application/modules/opac/controllers/AbonneController.php:399
 msgid "Erreur"
 msgstr "Error"
 
@@ -3753,6 +3908,7 @@ msgstr "Error file transfer to userfiles"
 #: ../../application/modules/opac/controllers/UploadController.php:78
 #: ../../application/modules/admin/controllers/BibController.php:326
 #: ../../application/modules/admin/controllers/BibController.php:298
+#: ../../application/modules/admin/controllers/BibController.php:303
 msgid ""
 "Erreur au téléchargement du fichier : L'image que vous essayez de "
 "télécharger est trop volumineuse ou inaccessible."
@@ -3786,6 +3942,11 @@ msgstr "Configuration error"
 msgid "Erreur lors de l'enregistrement de la vignette"
 msgstr "Error saving the thumbnail"
 
+#: ../../application/modules/opac/controllers/AuthController.php:357
+#, fuzzy
+msgid "Erreur lors de l\\inscription à la newsletter."
+msgstr "Error creating thumbnail %s"
+
 #: ../../library/Class/AlbumRessource.php:278
 #: ../../library/Class/AlbumRessource.php:318
 #: ../../library/Class/AlbumRessource.php:327
@@ -4008,6 +4169,7 @@ msgstr "Kind of document"
 #: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:7
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:8
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:45
 msgid "Fermer"
 msgstr "Close"
 
@@ -4043,6 +4205,7 @@ msgstr "File"
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:321
 #: ../../application/modules/admin/controllers/BibController.php:291
+#: ../../application/modules/admin/controllers/BibController.php:296
 #, php-format
 msgid "Fichier photo : %s"
 msgstr "Photo file: %s"
@@ -4091,6 +4254,16 @@ msgstr "Filter"
 msgid "Filtrer par statut : "
 msgstr "Filter by status:"
 
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:46
+#, fuzzy
+msgid "Filtres activés"
+msgstr "Filter"
+
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:47
+#, fuzzy
+msgid "Filtres disponibles"
+msgstr "Available fields"
+
 #: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
 msgid "Fin"
 msgstr "End"
@@ -4110,27 +4283,41 @@ msgstr "Action"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:94
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
 msgid "Fonds"
 msgstr "Fonds"
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:67
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:91
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:64
 #, fuzzy
 msgid "Format"
 msgstr "Information"
 
 #: ../../library/Class/CustomFieldsCategory.php:61
 #: ../../library/Class/CustomField/ModelConfiguration/Formation.php:26
+#: ../../library/ZendAfi/Form/Admin/Formation.php:40
 #, fuzzy
 msgid "Formation"
 msgstr "Information"
 
+#: ../../application/modules/admin/controllers/FormationController.php:32
+#, fuzzy, php-format
+msgid "Formation \"%s\" sauvegardée"
+msgstr "Domain %s saved"
+
+#: ../../application/modules/admin/controllers/FormationController.php:34
+#, fuzzy, php-format
+msgid "Formation \"%s\" supprimée"
+msgstr "Cart nb %s deleted"
+
 #: ../../application/modules/opac/views/scripts/abonne/formations.phtml:2
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
 #: ../../application/modules/admin/controllers/FormationController.php:38
+#: ../../application/modules/admin/controllers/FormationController.php:60
 #, fuzzy
 msgid "Formations"
 msgstr "Information"
@@ -4166,6 +4353,7 @@ msgid "Formulaires"
 msgstr "Schedules"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:36
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:10
 msgid "Fév"
 msgstr "February"
 
@@ -4173,6 +4361,11 @@ msgstr "February"
 msgid "Fév."
 msgstr "February"
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:26
+#, fuzzy
+msgid "Février"
+msgstr "february"
+
 #: ../../library/Class/Codification.php:103
 #: ../../library/Class/MoteurRecherche.php:349
 #: ../../library/Class/Codification.php:105
@@ -4253,6 +4446,7 @@ msgstr "Groups"
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:41
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:18
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:32
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:33
 msgid "Généralités"
 msgstr "General"
 
@@ -4312,6 +4506,7 @@ msgstr "Top"
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:94
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:31
 msgid "Hauteur"
 msgstr "Height"
 
@@ -4322,6 +4517,7 @@ msgstr " contains :"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:106
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:109
 msgid "Horaire"
 msgstr "Schedules"
 
@@ -4333,6 +4529,7 @@ msgstr "Schedules"
 #: ../../application/modules/opac/controllers/AbonneController.php:774
 #: ../../application/modules/opac/controllers/AbonneController.php:834
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:89
+#: ../../application/modules/opac/controllers/AbonneController.php:839
 #, fuzzy
 msgid "Horaires"
 msgstr "Schedules"
@@ -4348,6 +4545,8 @@ msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:76
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:97
 msgid "ISBN"
 msgstr "ISBN"
 
@@ -4417,6 +4616,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:180
 #: ../../application/modules/opac/controllers/AbonneController.php:183
 #: ../../application/modules/opac/controllers/AbonneController.php:184
+#: ../../application/modules/opac/controllers/AbonneController.php:182
 msgid "Il faut compléter tous les champs."
 msgstr "Must complete all fields."
 
@@ -4532,6 +4732,7 @@ msgstr "Cannot find this address"
 #: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:43
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:218
+#: ../../library/ZendAfi/Form/Admin/News.php:222
 #, fuzzy
 msgid "Indexation"
 msgstr "Login"
@@ -4545,6 +4746,7 @@ msgstr "Login"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:209
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:187
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:203
+#: ../../library/ZendAfi/Form/Admin/News.php:89
 msgid "Indexer l'article dans le catalogue ?"
 msgstr "Index article in catalog ?"
 
@@ -4586,6 +4788,7 @@ msgstr "Info"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:82
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:81
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 msgid "Information"
 msgstr "Information"
 
@@ -4599,6 +4802,7 @@ msgstr "Information"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:52
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:50
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:66
 #, fuzzy
 msgid "Informations sur le document"
 msgstr "Information"
@@ -4624,9 +4828,19 @@ msgstr "Records display"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:86
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:69
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
 msgid "Inscription"
 msgstr "Subscription"
 
+#: ../../application/modules/opac/controllers/AuthController.php:267
+#, fuzzy
+msgid "Inscription à la lettre d'information: "
+msgstr "  to the newsletter: : "
+
+#: ../../application/modules/opac/controllers/AuthController.php:350
+msgid "Inscription à la newsletter invalide."
+msgstr ""
+
 #: ../../application/modules/admin/controllers/FormationController.php:333
 #: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:62
 #, fuzzy
@@ -4645,6 +4859,7 @@ msgstr "Prohibit outgoing links"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:126
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:129
 msgid "Interdire les réservations"
 msgstr "Prohibit bookings"
 
@@ -4660,7 +4875,7 @@ msgstr "Given such invalid, value shoulds be a string"
 #: ../../library/Class/Bib.php:44 ../../library/Class/Bib.php:45
 #: ../../library/Class/Bib.php:76 ../../library/Class/Bib.php:95
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:126
-#: ../../library/Class/Bib.php:146
+#: ../../library/Class/Bib.php:146 ../../library/Class/Bib.php:166
 msgid "Invisible"
 msgstr "Invisible"
 
@@ -4668,7 +4883,12 @@ msgstr "Invisible"
 msgid "Isbn"
 msgstr "Isbn"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register.phtml:8
+msgid "J'ai déjà un compte."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:35
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:9
 msgid "Jan"
 msgstr "January"
 
@@ -4676,6 +4896,11 @@ msgstr "January"
 msgid "Janv."
 msgstr "Jan"
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:25
+#, fuzzy
+msgid "Janvier"
+msgstr "january"
+
 #: ../../application/modules/telephone/views/scripts/recherche/grandeimage.phtml:2
 msgid "Jaquette"
 msgstr "Jacket"
@@ -4693,6 +4918,7 @@ msgstr "Javascript"
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
 #: ../../application/modules/opac/controllers/AbonneController.php:773
 #: ../../application/modules/opac/controllers/AbonneController.php:833
+#: ../../application/modules/opac/controllers/AbonneController.php:838
 msgid "Jour"
 msgstr "Day"
 
@@ -4701,12 +4927,16 @@ msgid "Juil."
 msgstr "July"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:41
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:15
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:31
 #, fuzzy
 msgid "Juillet"
 msgstr "july"
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:11
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:40
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:14
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:30
 msgid "Juin"
 msgstr "June"
 
@@ -4715,6 +4945,7 @@ msgstr "June"
 #: ../../application/modules/opac/controllers/JavaController.php:71
 #: ../../application/modules/opac/controllers/JavaController.php:80
 #: ../../application/modules/opac/controllers/JavaController.php:66
+#: ../../application/modules/opac/controllers/JavaController.php:67
 msgid "Kiosque de notices"
 msgstr "Records gallery"
 
@@ -4750,6 +4981,11 @@ msgstr "The e-mail address is invalid or already used."
 msgid "L'album \"%s\" a été créé"
 msgstr "The album  \"%s\" was created"
 
+#: ../../application/modules/admin/controllers/CmsController.php:36
+#, fuzzy, php-format
+msgid "L'article \"%s\" a été sauvegardé"
+msgstr "The site \"%s\" has been saved"
+
 #: ../../application/modules/opac/controllers/AbonneController.php:70
 #: ../../application/modules/opac/controllers/AbonneController.php:74
 #: ../../application/modules/opac/controllers/AbonneController.php:99
@@ -4757,6 +4993,7 @@ msgstr "The album  \"%s\" was created"
 #: ../../application/modules/opac/controllers/AbonneController.php:178
 #: ../../application/modules/opac/controllers/AbonneController.php:181
 #: ../../application/modules/opac/controllers/AbonneController.php:182
+#: ../../application/modules/opac/controllers/AbonneController.php:180
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %d et %d caractères"
 msgstr "The review lenght must be between %d and %d characters"
@@ -4765,6 +5002,7 @@ msgstr "The review lenght must be between %d and %d characters"
 #: ../../library/Class/AvisNotice.php:276
 #: ../../library/Class/AvisNotice.php:311
 #: ../../library/Class/AvisNotice.php:245
+#: ../../library/Class/AvisNotice.php:244
 #, fuzzy, php-format
 msgid "L'avis doit avoir une longueur comprise entre %s et %s caractères"
 msgstr "The review lenght must be between %d and %d characters"
@@ -4774,6 +5012,7 @@ msgstr "The review lenght must be between %d and %d characters"
 #: ../../library/Class/Users.php:356 ../../library/Class/Users.php:500
 #: ../../library/Class/Users.php:567 ../../library/Class/Users.php:648
 #: ../../library/Class/Users.php:770 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:828
 msgid "L'identifiant que vous avez choisi existe déjà."
 msgstr "The username you chose already exists."
 
@@ -4782,6 +5021,7 @@ msgstr "The username you chose already exists."
 #: ../../application/modules/admin/controllers/BibController.php:535
 #: ../../application/modules/admin/controllers/BibController.php:532
 #: ../../application/modules/admin/controllers/BibController.php:477
+#: ../../application/modules/admin/controllers/BibController.php:482
 msgid "L'image du plan est obligatoire."
 msgstr "The image plane is mandatory."
 
@@ -4798,6 +5038,10 @@ msgstr "The image you selected is too big. Maximum size:%d KB"
 msgid "L'utilisateur n'a pas renseigné son adresse e-mail."
 msgstr "The user has not specified his or her e-mail address."
 
+#: ../../library/ZendAfi/Form/Admin/News.php:73
+msgid "L'évenement dure toute la journée"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:131
 msgid "L'évènement dure toute la journée"
 msgstr ""
@@ -4813,6 +5057,7 @@ msgstr "The library contains %s records."
 #: ../../library/Class/Users.php:364 ../../library/Class/Users.php:508
 #: ../../library/Class/Users.php:575 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:778 ../../library/Class/Users.php:830
+#: ../../library/Class/Users.php:837
 #, php-format
 msgid "La bibliothèque est obligatoire pour le rôle : %s"
 msgstr "The library is required for the role:%s"
@@ -4838,6 +5083,11 @@ msgstr "Class \"%s\" was added"
 msgid "La catégorie \"%s\" a été sauvegardée"
 msgstr "Class  \"%s\"  has been saved"
 
+#: ../../application/modules/admin/controllers/FormationController.php:33
+#, fuzzy, php-format
+msgid "La formation \"%s\" a été sauvegardée"
+msgstr "Class  \"%s\"  has been saved"
+
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:6
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:14
 #, fuzzy
@@ -4853,6 +5103,7 @@ msgstr "The new URL has been registered"
 #: ../../application/modules/admin/controllers/BibController.php:336
 #: ../../application/modules/admin/controllers/BibController.php:333
 #: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:310
 #, php-format
 msgid ""
 "La photo que vous avez sélectionnée doit être de type : 'image/jpg' et pas "
@@ -4865,6 +5116,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:337
 #: ../../application/modules/admin/controllers/BibController.php:334
 #: ../../application/modules/admin/controllers/BibController.php:307
+#: ../../application/modules/admin/controllers/BibController.php:312
 #, php-format
 msgid "La photo que vous avez sélectionnée est trop volumiseuse : %d ko"
 msgstr "The photo you have selected is too big %d KB"
@@ -4873,6 +5125,11 @@ msgstr "The photo you have selected is too big %d KB"
 msgid "La prolongation a échoué"
 msgstr "The extension failed"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:33
+#, fuzzy, php-format
+msgid "La session \"%s\" a été sauvegardée"
+msgstr "The site \"%s\" has been saved"
+
 #: ../../library/Class/CriteresRecherche.php:268
 #: ../../library/Class/CriteresRecherche.php:301
 #: ../../library/Class/CriteresRecherche.php:312
@@ -4989,10 +5246,11 @@ msgstr "The album  \"%s\" was created"
 #: ../../library/Class/Users.php:352 ../../library/Class/Users.php:496
 #: ../../library/Class/Users.php:563 ../../library/Class/Users.php:644
 #: ../../library/Class/Users.php:766 ../../library/Class/Users.php:817
+#: ../../library/Class/Users.php:824
 msgid "Le champ 'Identifiant' doit être inférieur à 50 caractères"
 msgstr "The field 'id' should be less than 50 characters"
 
-#: ../../library/Class/Users.php:826
+#: ../../library/Class/Users.php:826 ../../library/Class/Users.php:833
 #, fuzzy
 msgid "Le champ 'Mot de passe' doit être inférieur à 255 caractères"
 msgstr "The field 'Password' must be less than 50 characters"
@@ -5084,6 +5342,7 @@ msgstr "Lost password."
 #: ../../library/Class/Users.php:369 ../../library/Class/Users.php:513
 #: ../../library/Class/Users.php:580 ../../library/Class/Users.php:661
 #: ../../library/Class/Users.php:783 ../../library/Class/Users.php:835
+#: ../../library/Class/Users.php:842
 msgid ""
 "Le numéro de carte est obligatoire pour les abonnés identifiés dans un sigb."
 msgstr "The card number is required for subscribers identified in an ILS."
@@ -5152,6 +5411,8 @@ msgstr "Last subdomains of"
 #: ../../application/modules/opac/controllers/AbonneController.php:419
 #: ../../application/modules/opac/controllers/AbonneController.php:469
 #: ../../application/modules/opac/controllers/AbonneController.php:479
+#: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:484
 msgid "Les mots de passe ne correspondent pas"
 msgstr "Passwords do not match"
 
@@ -5235,6 +5496,7 @@ msgid "Libellé du champ"
 msgstr "Label"
 
 #: ../../library/Class/SuggestionAchat.php:77
+#: ../../library/Class/SuggestionAchat.php:98
 msgid "Lien"
 msgstr "Link"
 
@@ -5245,11 +5507,13 @@ msgid "Lien \"Suggérer un achat\""
 msgstr "Suggest a Purchase"
 
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
 msgid "Lien Internet vers une description"
 msgstr "Web link to a description"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:75
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:78
 msgid "Lien cartographique"
 msgstr "Map link"
 
@@ -5268,6 +5532,7 @@ msgstr "Internet link"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:38
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
 msgid "Lien internet vers une description"
 msgstr "Web link to a description"
 
@@ -5322,11 +5587,15 @@ msgstr "Web Links"
 #: ../../application/modules/opac/controllers/AbonneController.php:832
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:77
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:67
+#: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../library/ZendAfi/Form/Admin/News.php:76
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:73
 msgid "Lieu"
 msgstr "Place"
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
 #: ../../application/modules/opac/controllers/RechercheController.php:589
+#: ../../application/modules/opac/controllers/RechercheController.php:591
 msgid "Lieu de mise à disposition demandé"
 msgstr "Instead of providing requested"
 
@@ -5369,6 +5638,7 @@ msgid "Liste"
 msgstr "List"
 
 #: ../../library/Class/CustomField/Meta.php:60
+#: ../../library/Class/CustomField/Meta.php:53
 #, fuzzy
 msgid "Liste d'options"
 msgstr "Newsletters"
@@ -5458,6 +5728,7 @@ msgstr "Library's location"
 #: ../../application/modules/admin/controllers/BibController.php:405
 #: ../../application/modules/admin/controllers/BibController.php:402
 #: ../../application/modules/admin/controllers/BibController.php:369
+#: ../../application/modules/admin/controllers/BibController.php:374
 #, php-format
 msgid "Localisations de la bibliothèque: %s"
 msgstr "Locations of the library: %s"
@@ -5484,6 +5755,8 @@ msgstr "Moderation"
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:10
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:39
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:13
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:29
 msgid "Mai"
 msgstr "May"
 
@@ -5499,12 +5772,18 @@ msgstr "E-mail"
 msgid "Mail : "
 msgstr "E-mail : : "
 
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:63
+msgid "Mail suggestions"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/UsergroupController.php:123
 msgid "Manuel"
 msgstr "Manual"
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:37
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:11
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:27
 msgid "Mars"
 msgstr "March"
 
@@ -5532,6 +5811,7 @@ msgstr "Maximum amount of reservation for this document"
 #: ../../application/modules/admin/controllers/ProfilController.php:532
 #: ../../application/modules/admin/controllers/ProfilController.php:543
 #: ../../application/modules/admin/controllers/ProfilController.php:545
+#: ../../application/modules/admin/controllers/ProfilController.php:544
 msgid "Menu horizontal dupliqué sur tous les autres profils."
 msgstr "Horizontal menu duplicated on all other profiles."
 
@@ -5552,11 +5832,13 @@ msgid "Mes derniers paniers"
 msgstr "Export this basket"
 
 #: ../../library/Class/Users.php:1304 ../../library/Class/Users.php:1320
+#: ../../library/Class/Users.php:1328
 #, fuzzy
 msgid "Mes paniers"
 msgstr "Your baskets"
 
 #: ../../library/Class/Users.php:1337 ../../library/Class/Users.php:1353
+#: ../../library/Class/Users.php:1361
 msgid "Mes paniers rattachés à un domaine"
 msgstr "My baskets attached to a domain"
 
@@ -5569,6 +5851,7 @@ msgstr "Mess1"
 #: ../../application/modules/opac/controllers/IndexController.php:124
 #: ../../application/modules/opac/controllers/IndexController.php:116
 #: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../library/ZendAfi/Form/ContactForm.php:84
 msgid "Message"
 msgstr "Message"
 
@@ -5590,6 +5873,10 @@ msgstr "Message 1"
 msgid "Message au dessus de la boite"
 msgstr "Message over the box"
 
+#: ../../library/ZendAfi/Form/Admin/News.php:158
+msgid "Message d'explication du refus."
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:459
 #: ../../application/modules/opac/controllers/RechercheController.php:492
 #: ../../application/modules/opac/controllers/RechercheController.php:517
@@ -5641,10 +5928,12 @@ msgstr "Layout"
 #: ../../application/modules/admin/controllers/BibController.php:470
 #: ../../application/modules/admin/controllers/BibController.php:467
 #: ../../application/modules/admin/controllers/BibController.php:425
+#: ../../application/modules/admin/controllers/BibController.php:430
 msgid "Mise à jour de la localisation"
 msgstr "Update location"
 
 #: ../../application/modules/admin/controllers/CmsController.php:71
+#: ../../application/modules/admin/controllers/CmsController.php:87
 #, fuzzy
 msgid "Mise à jour des articles"
 msgstr "Articles reviews"
@@ -5716,6 +6005,7 @@ msgid "Modifier"
 msgstr "Edit"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:325
 #, fuzzy, php-format
 msgid "Modifier l'avis \"%s\""
 msgstr " Edit my profile"
@@ -5725,6 +6015,7 @@ msgstr " Edit my profile"
 #: ../../application/modules/admin/controllers/BibController.php:268
 #: ../../application/modules/admin/controllers/BibController.php:265
 #: ../../application/modules/admin/controllers/BibController.php:247
+#: ../../application/modules/admin/controllers/BibController.php:252
 #, php-format
 msgid "Modifier la bibliothèque: %s"
 msgstr "Edit library: %s"
@@ -5740,6 +6031,16 @@ msgstr " Edit my profile"
 msgid "Modifier la configuration du tableau des exemplaires"
 msgstr "Change the configuration of the table copies"
 
+#: ../../application/modules/admin/controllers/FormationController.php:38
+#, fuzzy, php-format
+msgid "Modifier la formation: %s"
+msgstr " Edit my profile"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:38
+#, fuzzy, php-format
+msgid "Modifier la session: %s"
+msgstr "Edit library: %s"
+
 #: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:124
 msgid "Modifier la source de données du kiosque"
 msgstr "Edit the data source kiosk"
@@ -5808,6 +6109,7 @@ msgstr "Update link type"
 #: ../../application/modules/admin/controllers/BibController.php:568
 #: ../../application/modules/admin/controllers/BibController.php:565
 #: ../../application/modules/admin/controllers/BibController.php:505
+#: ../../application/modules/admin/controllers/BibController.php:510
 #, php-format
 msgid "Modifier un plan de la bibliothèque: %s"
 msgstr "Edit a map of the library: %s"
@@ -5863,6 +6165,7 @@ msgid "Modération des formulaires: "
 msgstr "Moderation alerts: "
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:1
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:2
 #, fuzzy
 msgid "Modération des suggestions d'achat"
 msgstr "Moderation alerts"
@@ -5879,6 +6182,10 @@ msgstr "Records tags moderation"
 msgid "Modérations"
 msgstr "Moderation"
 
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:72
+msgid "Mois"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/HarvestController.php:43
 #: ../../application/modules/admin/controllers/HarvestController.php:44
 #: ../../application/modules/admin/controllers/HarvestController.php:26
@@ -5959,6 +6266,7 @@ msgstr "Password"
 
 #: ../../application/modules/telephone/controllers/AuthController.php:81
 #: ../../application/modules/telephone/controllers/AuthController.php:75
+#: ../../application/modules/telephone/controllers/AuthController.php:89
 #, fuzzy
 msgid "Mot de passe ou date de naissance"
 msgstr "Lost password"
@@ -6003,7 +6311,7 @@ msgstr "Music"
 #: ../../library/Class/Bib.php:45 ../../library/Class/Bib.php:46
 #: ../../library/Class/Bib.php:77 ../../library/Class/Bib.php:96
 #: ../../library/Class/Bib.php:116 ../../library/Class/Bib.php:127
-#: ../../library/Class/Bib.php:147
+#: ../../library/Class/Bib.php:147 ../../library/Class/Bib.php:167
 msgid "N'envoie pas de données"
 msgstr "Does not send data"
 
@@ -6143,6 +6451,8 @@ msgstr "Black on white"
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:16
 #: ../../application/modules/opac/controllers/IndexController.php:83
 #: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../library/ZendAfi/Form/ContactForm.php:59
 msgid "Nom"
 msgstr "Last name"
 
@@ -6241,6 +6551,7 @@ msgid "Nombre de traductions : %s"
 msgstr "Number of translations: %s"
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 #, fuzzy
 msgid "Non"
 msgstr "Last name"
@@ -6351,6 +6662,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:385
 #: ../../application/modules/opac/controllers/AbonneController.php:404
 #: ../../application/modules/opac/controllers/AbonneController.php:464
+#: ../../application/modules/opac/controllers/AbonneController.php:469
 msgid "Nouveau mot de passe"
 msgstr "New password"
 
@@ -6440,6 +6752,7 @@ msgid "Nouvelle relation"
 msgstr "New link"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:45
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:19
 #, fuzzy
 msgid "Nov"
 msgstr "Last name"
@@ -6448,6 +6761,11 @@ msgstr "Last name"
 msgid "Nov."
 msgstr "Nov."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:35
+#, fuzzy
+msgid "Novembre"
+msgstr "november"
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:61
 #, fuzzy
 msgid "Nuage de tags"
@@ -6469,16 +6787,19 @@ msgid "Numéro"
 msgstr "Number"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:13
 msgid "N° abonné"
 msgstr "No subscriber"
 
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../library/Class/SuggestionAchat.php:80
+#: ../../library/Class/SuggestionAchat.php:101
 msgid "N° carte abonné"
 msgstr "No membership card"
 
 #: ../../application/modules/telephone/controllers/AuthController.php:77
 #: ../../application/modules/telephone/controllers/AuthController.php:74
+#: ../../application/modules/telephone/controllers/AuthController.php:88
 msgid "N° de carte"
 msgstr "Card #"
 
@@ -6526,6 +6847,7 @@ msgid "Objets javascript"
 msgstr "Javascript objects"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:44
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:18
 msgid "Oct"
 msgstr "October"
 
@@ -6533,6 +6855,11 @@ msgstr "October"
 msgid "Oct."
 msgstr "Oct."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:34
+#, fuzzy
+msgid "Octobre"
+msgstr "october"
+
 #: ../../library/ZendAfi/View/Helper/Avis.php:26
 #: ../../library/ZendAfi/View/Helper/Avis.php:28
 #: ../../library/ZendAfi/View/Helper/Avis.php:47
@@ -6556,6 +6883,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:175
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php:31
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php:29
+#: ../../library/ZendAfi/Form/Admin/News.php:114
 msgid "Options"
 msgstr "Options"
 
@@ -6587,6 +6915,7 @@ msgid "Os"
 msgstr "Bone"
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Oui"
 msgstr "Yes"
 
@@ -6835,6 +7164,7 @@ msgstr "Librarie maps"
 #: ../../application/modules/admin/controllers/BibController.php:518
 #: ../../application/modules/admin/controllers/BibController.php:515
 #: ../../application/modules/admin/controllers/BibController.php:463
+#: ../../application/modules/admin/controllers/BibController.php:468
 #, php-format
 msgid "Plans de la bibliothèque: %s"
 msgstr "Librarie maps: %s"
@@ -6890,6 +7220,7 @@ msgstr "Pagination"
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:8
 #: ../../application/modules/opac/controllers/AbonneController.php:776
 #: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/opac/controllers/AbonneController.php:841
 msgid "Poste"
 msgstr "Post"
 
@@ -6907,7 +7238,7 @@ msgstr "Posted by"
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant :"
 msgstr "To activate your account, thank you to click on the following link:"
 
-#: ../../library/Class/Users.php:887
+#: ../../library/Class/Users.php:887 ../../library/Class/Users.php:894
 #, fuzzy
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant:"
 msgstr "To activate your account, thank you to click on the following link:"
@@ -6920,6 +7251,7 @@ msgstr "What day?"
 #: ../../application/modules/opac/controllers/AbonneController.php:661
 #: ../../application/modules/opac/controllers/AbonneController.php:693
 #: ../../application/modules/opac/controllers/AbonneController.php:753
+#: ../../application/modules/opac/controllers/AbonneController.php:758
 msgid "Pour quelle durée ?"
 msgstr "For how long?"
 
@@ -6929,8 +7261,21 @@ msgid ""
 "dessous."
 msgstr "To book or document (s), please complete the form below."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:19
+#, fuzzy
+msgid "Pour valider l'abonnement, merci de cliquer sur le lien suivant:"
+msgstr "To activate your account, thank you to click on the following link:"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:33
+#, fuzzy
+msgid ""
+"Pour vous désinscrire de la lettre d'information, merci de cliquer sur le "
+"lien suivant:"
+msgstr "To activate your account, thank you to click on the following link:"
+
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:70
 msgid "Pourquoi suggérez-vous ce document ?"
 msgstr "Why would you suggest this document?"
 
@@ -6941,6 +7286,7 @@ msgid "Prochains rendez-vous"
 msgstr "Upcoming events"
 
 #: ../../library/ZendAfi/View/Helper/CalendarContent.php:84
+#: ../../library/ZendAfi/View/Helper/CalendarContent.php:94
 msgid "Prochains évènements"
 msgstr "Upcoming Events"
 
@@ -7048,6 +7394,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/users/index.phtml:18
 #: ../../application/modules/opac/controllers/IndexController.php:88
 #: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../library/ZendAfi/Form/ContactForm.php:63
 msgid "Prénom"
 msgstr "First name"
 
@@ -7058,6 +7406,7 @@ msgstr "Moderation"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:90
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
 msgid "Prêt"
 msgstr "Loan"
 
@@ -7070,6 +7419,7 @@ msgstr "Loan"
 #: ../../application/modules/opac/controllers/AbonneController.php:335
 #: ../../application/modules/opac/controllers/AbonneController.php:340
 #: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:398
 msgid "Prêt prolongé"
 msgstr "Extended loan"
 
@@ -7095,6 +7445,7 @@ msgstr "Loans and bookings :"
 #: ../../application/modules/opac/controllers/AbonneController.php:392
 #: ../../application/modules/opac/controllers/AbonneController.php:368
 #: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:440
 msgid "Pseudo"
 msgstr "Nickname"
 
@@ -7111,6 +7462,8 @@ msgstr "Nickname"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:29
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:18
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:81
+#: ../../library/ZendAfi/Form/Admin/News.php:54
+#: ../../library/ZendAfi/Form/Admin/News.php:102
 msgid "Publication"
 msgstr "Publication"
 
@@ -7144,18 +7497,21 @@ msgstr "What sector?"
 #: ../../application/modules/opac/controllers/AbonneController.php:559
 #: ../../application/modules/opac/controllers/AbonneController.php:591
 #: ../../application/modules/opac/controllers/AbonneController.php:651
+#: ../../application/modules/opac/controllers/AbonneController.php:656
 msgid "Quota déjà atteint ce jour, choisissez un autre jour."
 msgstr "Quota already reached this day, choose another day."
 
 #: ../../application/modules/opac/controllers/AbonneController.php:565
 #: ../../application/modules/opac/controllers/AbonneController.php:597
 #: ../../application/modules/opac/controllers/AbonneController.php:657
+#: ../../application/modules/opac/controllers/AbonneController.php:662
 msgid "Quota déjà atteint ce mois, choisissez un autre mois."
 msgstr "Quota already met this month, select another month."
 
 #: ../../application/modules/opac/controllers/AbonneController.php:562
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:654
+#: ../../application/modules/opac/controllers/AbonneController.php:659
 msgid "Quota déjà atteint cette semaine, choisissez une autre semaine."
 msgstr "Quota already reached this week, choose another week."
 
@@ -7218,6 +7574,7 @@ msgstr "Index article in catalog ?"
 #: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:2
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 msgid "Recherche"
 msgstr "Search"
 
@@ -7491,6 +7848,8 @@ msgstr "Remove from basket"
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
 #: ../../application/modules/admin/views/scripts/custom-fields-report/edit.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:36
 msgid "Retour"
 msgstr "Return"
 
@@ -7622,6 +7981,7 @@ msgstr "Social networks and contacts"
 #: ../../application/modules/opac/controllers/RechercheController.php:546
 #: ../../application/modules/opac/controllers/RechercheController.php:505
 #: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:517
 #, fuzzy
 msgid "Réservation"
 msgstr "Moderation"
@@ -7769,6 +8129,12 @@ msgstr "Following results"
 msgid "Résumé"
 msgstr "Summary"
 
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:39
+#: ../../library/ZendAfi/Form/Admin/News.php:108
+#, fuzzy
+msgid "Résumé pour l'affichage dans les boîtes"
+msgstr "Home page summary"
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:128
 #: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:47
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:133
@@ -7825,6 +8191,8 @@ msgstr "Sign up"
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:36
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:35
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:47
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:65
 msgid "S'inscrire"
 msgstr "Register"
 
@@ -7851,6 +8219,8 @@ msgstr "Loading in progress"
 #: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
 #: ../../application/modules/telephone/controllers/AuthController.php:85
 #: ../../application/modules/telephone/controllers/AuthController.php:90
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:5
+#: ../../application/modules/telephone/controllers/AuthController.php:104
 msgid "Se connecter"
 msgstr "Sign in"
 
@@ -7869,6 +8239,7 @@ msgstr "Logout"
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:41
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:40
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:44
 #, fuzzy
 msgid "Se désinscrire"
 msgstr "Logout"
@@ -7876,6 +8247,7 @@ msgstr "Logout"
 #: ../../application/modules/opac/controllers/AbonneController.php:743
 #: ../../application/modules/opac/controllers/AbonneController.php:775
 #: ../../application/modules/opac/controllers/AbonneController.php:835
+#: ../../application/modules/opac/controllers/AbonneController.php:840
 #, fuzzy
 msgid "Secteur"
 msgstr "Sign in"
@@ -7928,6 +8300,7 @@ msgid "Sections"
 msgstr "Sections"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:43
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:17
 msgid "Sept"
 msgstr "Seven"
 
@@ -7935,6 +8308,11 @@ msgstr "Seven"
 msgid "Sept."
 msgstr "Sept."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:33
+#, fuzzy
+msgid "Septembre"
+msgstr "september"
+
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:30
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:38
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:23
@@ -7975,6 +8353,16 @@ msgstr "Service unavailable"
 msgid "Session"
 msgstr "Version"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:32
+#, fuzzy, php-format
+msgid "Session \"%s\" sauvegardée"
+msgstr " \"%s\" group has been saved"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:34
+#, fuzzy, php-format
+msgid "Session \"%s\" supprimée"
+msgstr "Cart nb %s deleted"
+
 msgid "Should be greater than '%fieldToCompare%'"
 msgstr "Should be greater than '%fieldToCompare%'"
 
@@ -7983,6 +8371,8 @@ msgstr "Should be greater than '%fieldToCompare%'"
 #: ../../library/Class/Users.php:452 ../../library/Class/Users.php:598
 #: ../../library/Class/Users.php:665 ../../library/Class/Users.php:753
 #: ../../library/Class/Users.php:876 ../../library/Class/Users.php:888
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:30
+#: ../../library/Class/Users.php:895
 msgid ""
 "Si vous n'êtes pas à l'origine de cette demande d'inscription, merci de ne "
 "pas tenir compte de cet e-mail, et l'inscription ne sera pas activée."
@@ -8190,11 +8580,13 @@ msgstr "Statistics"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../library/ZendAfi/Form/Admin/News.php:146
 msgid "Statut"
 msgstr "Status"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:118
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
 msgid "Statut de la bib"
 msgstr "Library status"
 
@@ -8206,6 +8598,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:82
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:21
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:54
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:55
 #, fuzzy
 msgid "Style de boite"
 msgstr "Search box"
@@ -8230,12 +8623,14 @@ msgid "Suggestion d'achat supprimée"
 msgstr "Purchase suggestion deleted"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:18
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:33
 #, fuzzy
 msgid "Suggestion d'achat:"
 msgstr "Moderation alerts:"
 
 #: ../../library/Class/SuggestionAchat.php:87
 #: ../../library/Class/SuggestionAchat.php:88
+#: ../../library/Class/SuggestionAchat.php:109
 msgid "Suggestion d'achat: "
 msgstr "Purchase requests:"
 
@@ -8280,6 +8675,7 @@ msgstr "Next Page"
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:40
 #: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:31
 #: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../library/ZendAfi/Form/ContactForm.php:80
 msgid "Sujet"
 msgstr "Topic"
 
@@ -8368,11 +8764,13 @@ msgid "Supprimer cette réservation"
 msgstr "Delete a category"
 
 #: ../../application/modules/admin/controllers/CmsController.php:397
+#: ../../application/modules/admin/controllers/CmsController.php:385
 #, fuzzy, php-format
 msgid "Supprimer l'article : %s"
 msgstr "Delete article : %s"
 
 #: ../../application/modules/admin/controllers/BibController.php:256
+#: ../../application/modules/admin/controllers/BibController.php:261
 #, fuzzy, php-format
 msgid "Supprimer la bibliothèque: %s"
 msgstr "Delete library: %s"
@@ -8424,6 +8822,7 @@ msgstr "Sites selection"
 
 #: ../../application/modules/admin/controllers/ModulesController.php:299
 #: ../../application/modules/admin/controllers/ModulesController.php:306
+#: ../../application/modules/admin/controllers/ModulesController.php:310
 msgid "Sélectionnez un panier ou un domaine"
 msgstr "Select a basket or domain"
 
@@ -8461,6 +8860,7 @@ msgstr "Tag (s)"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
 #: ../../library/ZendAfi/Form/Album.php:191
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:186
+#: ../../library/ZendAfi/Form/Admin/News.php:82
 msgid "Tags"
 msgstr "Tags"
 
@@ -8503,6 +8903,7 @@ msgstr "Tel. :"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:66
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:70
 #: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:47
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
 msgid "Territoire"
 msgstr "Territory"
 
@@ -8545,6 +8946,7 @@ msgid "Tester"
 msgstr "Test"
 
 #: ../../application/modules/admin/views/scripts/bib/planacces.phtml:187
+#: ../../library/Class/CustomField/Meta.php:50
 msgid "Texte"
 msgstr "Text"
 
@@ -8627,6 +9029,12 @@ msgstr "Skin"
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:50
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:39
 #: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:11
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:51
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:32
+#: ../../library/ZendAfi/Form/Admin/News.php:40
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/SuggestionAchat.php:94
 msgid "Titre"
 msgstr "Title"
 
@@ -8654,6 +9062,7 @@ msgstr "Title : %s"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:44
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:45
+#: ../../library/ZendAfi/Form/Admin/News.php:44
 msgid "Titre caché"
 msgstr "Hidden title"
 
@@ -8675,6 +9084,7 @@ msgid "Titre et auteur"
 msgstr "Biography"
 
 #: ../../library/Class/SuggestionAchat.php:58
+#: ../../library/Class/SuggestionAchat.php:62
 msgid "Titre ou commentaire requis"
 msgstr "Title or comment required"
 
@@ -8711,6 +9121,7 @@ msgstr "Title"
 #: ../../library/ZendAfi/View/Helper/TreeView.php:36
 #: ../../library/ZendAfi/View/Helper/TreeView.php:65
 #: ../../library/ZendAfi/View/Helper/TreeView.php:71
+#: ../../library/ZendAfi/View/Helper/Calendar/RenderFilters.php:88
 msgid "Tous"
 msgstr "All"
 
@@ -8795,7 +9206,7 @@ msgstr "Latest news portal"
 #: ../../library/Class/Bib.php:165 ../../library/Class/Bib.php:182
 #: ../../library/Class/Bib.php:213 ../../library/Class/Bib.php:241
 #: ../../library/Class/Bib.php:256 ../../library/Class/Bib.php:272
-#: ../../library/Class/Bib.php:292
+#: ../../library/Class/Bib.php:292 ../../library/Class/Bib.php:312
 msgid "Toutes"
 msgstr "All"
 
@@ -8819,6 +9230,11 @@ msgstr "action"
 msgid "Traductions"
 msgstr "action"
 
+#: ../../application/modules/admin/views/scripts/cms/_traduction_navigator.phtml:3
+#, fuzzy
+msgid "Traductions:"
+msgstr "action"
+
 #: ../../library/Class/Upload.php:268
 msgid "Transfert impossible, ce formulaire est mal configuré"
 msgstr "Not transfer this form is misconfigured"
@@ -8889,6 +9305,9 @@ msgstr "Type of doc"
 #: ../../library/ZendAfi/Form/Album.php:163
 #: ../../library/Class/CriteresRecherche.php:108
 #: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/SuggestionAchat.php:96
 msgid "Type de document"
 msgstr "Doc type"
 
@@ -8911,6 +9330,11 @@ msgstr "Doc types updated : %s"
 msgid "Type de document : %s"
 msgstr "Doc types: %s"
 
+#: ../../library/Class/SuggestionAchat.php:75
+#, fuzzy
+msgid "Type de document requis"
+msgstr "Doc types: %s"
+
 #: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:105
 #, fuzzy, php-format
 msgid "Type de document: %s"
@@ -9018,6 +9442,7 @@ msgstr "Download the playlist (VLC, WinAmp)"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:55
 #: ../../application/modules/opac/controllers/AbonneController.php:380
 #: ../../application/modules/opac/controllers/AbonneController.php:440
+#: ../../application/modules/opac/controllers/AbonneController.php:445
 msgid "Téléphone"
 msgstr "Phone number"
 
@@ -9051,6 +9476,10 @@ msgstr "A URL object is required"
 msgid "URL objet B est requis"
 msgstr "URL object B is required"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:7
+msgid "Un compte vous a été créé automatiquement."
+msgstr ""
+
 #: ../../library/Class/FRBR/LinkType.php:56
 msgid "Un libellé de l'objet A vers l'objet B est requis"
 msgstr "A description of the object A to object B is required"
@@ -9073,9 +9502,22 @@ msgstr "An email just sent to you to confirm your registration"
 #: ../../library/Class/Users.php:515 ../../library/Class/Users.php:666
 #: ../../library/Class/Users.php:733 ../../library/Class/Users.php:821
 #: ../../library/Class/Users.php:934 ../../library/Class/Users.php:950
+#: ../../library/Class/Users.php:957
 msgid "Un mail vient de vous être envoyé avec vos paramètres de connexion."
 msgstr "An email has been sent to you with your connection settings."
 
+#: ../../application/modules/opac/controllers/AuthController.php:277
+msgid ""
+"Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le "
+"compte qui utilise cet email."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:305
+msgid ""
+"Une demande de confirmation d'inscription vous a été envoyée à l'adresse "
+"mail renseignée."
+msgstr ""
+
 #: ../../library/Class/CommSigb.php:177
 msgid ""
 "Une erreur de communication avec le serveur a fait échouer la requête. Merci "
@@ -9093,6 +9535,12 @@ msgstr ""
 "The booking was not taken into account due to a communication error with the "
 "server. Thank you to report this problem to the library."
 
+#: ../../application/modules/opac/controllers/AuthController.php:301
+msgid ""
+"Une erreur est survenue à l'envoi du mail de confirmation. Veuillez "
+"réessayer. Si le problème persiste, veuillez contacter votre médiathèque."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:39
 msgid "Une seule suggestion enregistrée."
 msgstr "One suggestion recorded."
@@ -9165,6 +9613,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AuthController.php:221
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:65
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:71
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:35
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:69
 msgid "Valider"
 msgstr "Validate"
 
@@ -9312,6 +9762,8 @@ msgstr "Thumbnails"
 #: ../../application/modules/opac/controllers/IndexController.php:102
 #: ../../application/modules/opac/controllers/IndexController.php:101
 #: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../application/modules/opac/controllers/AbonneController.php:443
+#: ../../library/ZendAfi/Form/ContactForm.php:73
 msgid "Ville"
 msgstr "City"
 
@@ -9443,6 +9895,7 @@ msgstr "Your Name:"
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:128
 #: ../../application/modules/opac/controllers/IndexController.php:127
+#: ../../library/ZendAfi/Form/ContactForm.php:101
 #, fuzzy
 msgid "Vos coordonnées"
 msgstr "Send data"
@@ -9538,6 +9991,11 @@ msgstr ""
 msgid "Votre adresse E-mail :"
 msgstr "Your E-mail:"
 
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:29
+#, fuzzy
+msgid "Votre adresse e-mail"
+msgstr "Your E-mail:"
+
 #: ../../application/modules/opac/controllers/RechercheController.php:432
 #: ../../application/modules/opac/controllers/RechercheController.php:465
 #: ../../application/modules/opac/controllers/RechercheController.php:490
@@ -9578,11 +10036,16 @@ msgstr "Your login :  %s"
 
 #: ../../library/Class/Users.php:657 ../../library/Class/Users.php:724
 #: ../../library/Class/Users.php:812 ../../library/Class/Users.php:925
-#: ../../library/Class/Users.php:941
+#: ../../library/Class/Users.php:941 ../../library/Class/Users.php:948
 #, fuzzy, php-format
 msgid "Votre identifiant : %s\n"
 msgstr "Your login %s\n"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:13
+#, fuzzy
+msgid "Votre identifiant: "
+msgstr "Your login :  %s"
+
 #: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:17
 #: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:31
 msgid "Votre identité s.v.p."
@@ -9592,6 +10055,7 @@ msgstr "Enter your login and password please.."
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:141
 #: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../library/ZendAfi/Form/ContactForm.php:52
 #, fuzzy
 msgid "Votre message"
 msgstr "Your message :"
@@ -9608,7 +10072,7 @@ msgid "Votre mot de passe : %s"
 msgstr "Your password: %s"
 
 #: ../../library/Class/Users.php:813 ../../library/Class/Users.php:926
-#: ../../library/Class/Users.php:942
+#: ../../library/Class/Users.php:942 ../../library/Class/Users.php:949
 #, fuzzy, php-format
 msgid "Votre mot de passe : %s\n"
 msgstr "Your password: %s\n"
@@ -9620,6 +10084,16 @@ msgid ""
 "n"
 msgstr "Your password: %s\n"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:16
+#, fuzzy
+msgid "Votre mot de passe: "
+msgstr "Your password: %s"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+#, fuzzy
+msgid "Votre prêt a bien été prolongé."
+msgstr " has been created."
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:1
 #, fuzzy
 msgid "Votre réservation"
@@ -9636,6 +10110,7 @@ msgid "Votre réservation est enregistrée."
 msgstr "Booking saved"
 
 #: ../../application/modules/opac/controllers/RechercheController.php:542
+#: ../../application/modules/opac/controllers/RechercheController.php:544
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9643,6 +10118,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:542
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9730,11 +10206,17 @@ msgstr "You have %d outstanding booking"
 msgid "Vous avez %d réservations en cours"
 msgstr "You have %d outstanding bookings"
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+#, fuzzy
+msgid "Vous avez bien été abonné à la newsletter: "
+msgstr " has been added to cart"
+
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:596
 #: ../../application/modules/opac/controllers/AbonneController.php:634
 #: ../../application/modules/opac/controllers/AbonneController.php:666
 #: ../../application/modules/opac/controllers/AbonneController.php:726
+#: ../../application/modules/opac/controllers/AbonneController.php:731
 #, fuzzy
 msgid "Vous avez déjà une réservation dans ce créneau horaire"
 msgstr "You already have an outstanding booking for this time slot"
@@ -9747,16 +10229,22 @@ msgstr "You already have an outstanding booking for this time slot"
 msgid "Vous avez fait une demande d'inscription sur le portail."
 msgstr "You made an application for registration on the portal."
 
-#: ../../library/Class/Users.php:886
+#: ../../library/Class/Users.php:886 ../../library/Class/Users.php:893
 #, fuzzy
 msgid "Vous avez fait une demande d'inscription sur le portail:"
 msgstr "You made an application for registration on the portal."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:4
+#, fuzzy
+msgid "Vous avez fait une demande d'inscription à la lettre d'information:"
+msgstr "You made an application for registration on the portal."
+
 #: ../../library/Class/Users.php:313 ../../library/Class/Users.php:327
 #: ../../library/Class/Users.php:402 ../../library/Class/Users.php:478
 #: ../../library/Class/Users.php:507 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:723 ../../library/Class/Users.php:811
 #: ../../library/Class/Users.php:924 ../../library/Class/Users.php:940
+#: ../../library/Class/Users.php:947
 msgid "Vous avez fait une demande de mot de passe sur le portail."
 msgstr "You have requested a password on the portal."
 
@@ -9770,6 +10258,7 @@ msgstr "User message offline"
 #: ../../library/Class/Users.php:351 ../../library/Class/Users.php:495
 #: ../../library/Class/Users.php:562 ../../library/Class/Users.php:643
 #: ../../library/Class/Users.php:765 ../../library/Class/Users.php:816
+#: ../../library/Class/Users.php:823
 msgid "Vous devez compléter le champ 'Identifiant'"
 msgstr "You must complete the field 'id'"
 
@@ -9778,6 +10267,7 @@ msgstr "You must complete the field 'id'"
 #: ../../library/Class/Users.php:359 ../../library/Class/Users.php:503
 #: ../../library/Class/Users.php:570 ../../library/Class/Users.php:651
 #: ../../library/Class/Users.php:773 ../../library/Class/Users.php:824
+#: ../../library/Class/Users.php:831
 msgid "Vous devez compléter le champ 'Mot de passe'"
 msgstr "You must complete the field 'Password'"
 
@@ -9790,7 +10280,7 @@ msgstr "You must complete the field 'Category Name'"
 #: ../../library/Class/Bib.php:112 ../../library/Class/Bib.php:130
 #: ../../library/Class/Bib.php:161 ../../library/Class/Bib.php:189
 #: ../../library/Class/Bib.php:204 ../../library/Class/Bib.php:220
-#: ../../library/Class/Bib.php:240
+#: ../../library/Class/Bib.php:240 ../../library/Class/Bib.php:260
 msgid "Vous devez compléter le champ 'Nom'"
 msgstr "You must complete the 'Name' field"
 
@@ -9810,7 +10300,7 @@ msgstr "You must complete the field 'Url'"
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:133
 #: ../../library/Class/Bib.php:164 ../../library/Class/Bib.php:192
 #: ../../library/Class/Bib.php:207 ../../library/Class/Bib.php:223
-#: ../../library/Class/Bib.php:243
+#: ../../library/Class/Bib.php:243 ../../library/Class/Bib.php:263
 msgid "Vous devez compléter le champ 'Ville'"
 msgstr "You must complete the field 'City'"
 
@@ -9822,11 +10312,12 @@ msgstr "You must complete the field 'City'"
 #: ../../application/modules/opac/controllers/AbonneController.php:389
 #: ../../application/modules/opac/controllers/AbonneController.php:408
 #: ../../application/modules/opac/controllers/AbonneController.php:468
+#: ../../application/modules/opac/controllers/AbonneController.php:473
 msgid "Vous devez confirmer le mot de passe"
 msgstr "You must confirm the password"
 
 #: ../../library/Class/Users.php:671 ../../library/Class/Users.php:793
-#: ../../library/Class/Users.php:845
+#: ../../library/Class/Users.php:845 ../../library/Class/Users.php:852
 msgid "Vous devez fournir une adresse mail valide"
 msgstr "You must provide a valid email address"
 
@@ -9838,11 +10329,12 @@ msgstr "You must provide a valid email address"
 #: ../../application/modules/opac/controllers/AbonneController.php:399
 #: ../../application/modules/opac/controllers/AbonneController.php:418
 #: ../../application/modules/opac/controllers/AbonneController.php:478
+#: ../../application/modules/opac/controllers/AbonneController.php:483
 msgid "Vous devez saisir un mot de passe"
 msgstr "You must enter a password"
 
 #: ../../library/Class/Users.php:674 ../../library/Class/Users.php:796
-#: ../../library/Class/Users.php:848
+#: ../../library/Class/Users.php:848 ../../library/Class/Users.php:855
 #, fuzzy
 msgid "Vous devez saisir un numéro de téléphone"
 msgstr "You must enter a title"
@@ -9851,6 +10343,7 @@ msgstr "You must enter a title"
 #: ../../library/Class/AvisNotice.php:278
 #: ../../library/Class/AvisNotice.php:313
 #: ../../library/Class/AvisNotice.php:249
+#: ../../library/Class/AvisNotice.php:248
 msgid "Vous devez saisir un titre"
 msgstr "You must enter a title"
 
@@ -9865,6 +10358,7 @@ msgstr "You must select an image by clicking on the button Browse"
 #: ../../application/modules/admin/controllers/BibController.php:327
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:294
+#: ../../application/modules/admin/controllers/BibController.php:299
 msgid "Vous devez sélectionner une photo en cliquant sur le bouton : parcourir"
 msgstr "You must select a photo, click Browse"
 
@@ -9873,6 +10367,7 @@ msgstr "You must select a photo, click Browse"
 #: ../../library/Class/Users.php:561 ../../library/Class/Users.php:768
 #: ../../library/Class/Users.php:838 ../../library/Class/Users.php:926
 #: ../../library/Class/Users.php:1053 ../../library/Class/Users.php:1069
+#: ../../library/Class/Users.php:1076
 msgid ""
 "Vous devez vous connecter en tant qu'abonné de la bibliothèque pour obtenir "
 "plus d'informations."
@@ -9892,6 +10387,10 @@ msgid ""
 "réservation."
 msgstr "You must login to proceed to booking"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:3
+msgid "Vous devez vous identifier pour vous désinscrire de la newsletter: "
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagCoursToutApprendre.php:28
 msgid ""
 "Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
@@ -9900,6 +10399,15 @@ msgstr ""
 "You must be logged on under an account with valid subscription to access the "
 "online course"
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:28
+#, fuzzy
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au livre numérique"
+msgstr ""
+"You must be logged on under an account with valid subscription to access the "
+"online course"
+
 #: ../../library/ZendAfi/View/Helper/TagNumeriquePremiumBook.php:27
 #, fuzzy
 msgid ""
@@ -9976,13 +10484,13 @@ msgstr "You don't have any basket."
 
 #: ../../library/Class/Users.php:519 ../../library/Class/Users.php:586
 #: ../../library/Class/Users.php:667 ../../library/Class/Users.php:789
-#: ../../library/Class/Users.php:841
+#: ../../library/Class/Users.php:841 ../../library/Class/Users.php:848
 msgid "Vous n'avez pas les droits suffisants pour diriger une formation"
 msgstr "You do not have sufficient rights to conduct training"
 
 #: ../../library/Class/Users.php:516 ../../library/Class/Users.php:583
 #: ../../library/Class/Users.php:664 ../../library/Class/Users.php:786
-#: ../../library/Class/Users.php:838
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:845
 msgid "Vous n'avez pas les droits suffisants pour suivre une formation"
 msgstr "You do not have sufficient privileges for training"
 
@@ -10063,6 +10571,7 @@ msgstr "You are not subscribed to any newsletter"
 #: ../../application/modules/opac/controllers/AbonneController.php:556
 #: ../../application/modules/opac/controllers/AbonneController.php:588
 #: ../../application/modules/opac/controllers/AbonneController.php:648
+#: ../../application/modules/opac/controllers/AbonneController.php:653
 #, fuzzy
 msgid "Vous n'êtes pas autorisé à effectuer une réservation"
 msgstr "You are not subscribed to any newsletter"
@@ -10102,6 +10611,16 @@ msgstr "Web"
 msgid "Zone"
 msgstr ""
 
+#: ../../library/Class/CustomField/Meta.php:52
+#, fuzzy
+msgid "Zone de texte HTML"
+msgstr "Text color"
+
+#: ../../library/Class/CustomField/Meta.php:51
+#, fuzzy
+msgid "Zone de texte simple"
+msgstr "Text color"
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:121
 msgid "Zones de titre(séparées par ;)"
 msgstr "Title fields (separated by ;)"
@@ -10164,6 +10683,7 @@ msgstr "august"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:91
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:113
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:116
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:41
 msgid "au"
 msgstr "to"
 
@@ -10264,6 +10784,7 @@ msgstr "Your baskets"
 #: ../../application/modules/opac/controllers/IndexController.php:178
 #: ../../application/modules/opac/controllers/IndexController.php:170
 #: ../../application/modules/opac/controllers/IndexController.php:149
+#: ../../application/modules/opac/controllers/IndexController.php:92
 msgid ""
 "destinataire non configuré. Vérifiez les paramètres du profil, champ 'E-mail "
 "du webmestre'"
@@ -10298,6 +10819,7 @@ msgstr "found %s records"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:110
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:83
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:105
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:35
 msgid "du"
 msgstr "from"
 
@@ -10494,6 +11016,8 @@ msgstr "until"
 #: ../../application/modules/admin/controllers/BibController.php:531
 #: ../../application/modules/admin/controllers/BibController.php:382
 #: ../../application/modules/admin/controllers/BibController.php:475
+#: ../../application/modules/admin/controllers/BibController.php:387
+#: ../../application/modules/admin/controllers/BibController.php:480
 msgid "le libellé est obligatoire."
 msgstr "the wording is mandatory."
 
@@ -10907,6 +11431,7 @@ msgstr "From"
 #: ../../application/modules/opac/controllers/AbonneController.php:659
 #: ../../application/modules/opac/controllers/AbonneController.php:691
 #: ../../application/modules/opac/controllers/AbonneController.php:751
+#: ../../application/modules/opac/controllers/AbonneController.php:756
 msgid "À partir de quelle heure ?"
 msgstr "At what time?"
 
diff --git a/library/translation/es.mo b/library/translation/es.mo
new file mode 100644
index 0000000000000000000000000000000000000000..65c8f0938f5156cf442d553b5cafe4778c0d77e5
Binary files /dev/null and b/library/translation/es.mo differ
diff --git a/library/translation/es.po b/library/translation/es.po
new file mode 100644
index 0000000000000000000000000000000000000000..d0c95b56485b9944f32cd7132c944c148c90d4c4
--- /dev/null
+++ b/library/translation/es.po
@@ -0,0 +1,10921 @@
+msgid ""
+msgstr ""
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.6.9\n"
+"Project-Id-Version: Opac\n"
+"Language: es\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:264
+msgid " (%d en retard)"
+msgstr " (%d de retraso)"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:7
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:11
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:14
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:16
+msgid " (recherche élargie triée par pertinence)"
+msgstr " (Ordenado por relevancia Búsqueda extendida)"
+
+#: ../../library/ZendAfi/View/Helper/TreeView.php:64
+#: ../../application/modules/admin/controllers/CmsController.php:51
+#: ../../application/modules/admin/controllers/CmsController.php:53
+#: ../../application/modules/admin/controllers/SitoController.php:78
+#: ../../application/modules/admin/controllers/CmsController.php:48
+#: ../../application/modules/admin/controllers/UsergroupController.php:28
+#: ../../application/modules/admin/controllers/UsergroupController.php:48
+#: ../../application/modules/admin/controllers/CmsController.php:64
+msgid " Ajouter une catégorie"
+msgstr " Añadir categoría"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:10
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:8
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:13
+#: ../../library/ZendAfi/View/Helper/Abonne/AccesFiche.php:24
+#: ../../library/ZendAfi/View/Helper/Abonne/AccesFiche.php:25
+#: ../../library/ZendAfi/View/Helper/Abonne/AccesFiche.php:27
+msgid " Modifier ma fiche"
+msgstr " Cambiar mi"
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:6
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:14
+msgid " a bien été ajoutée au panier "
+msgstr " se ha añadido a la cesta"
+
+#: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:6
+msgid " a bien été créé."
+msgstr " se ha creado."
+
+#: ../../application/modules/opac/controllers/PanierController.php:290
+msgid " ajouté au domaine sélectionné."
+msgstr " añadido a la zona seleccionada."
+
+#: ../../application/modules/opac/controllers/PanierController.php:291
+msgid " ajouté aux domaines sélectionnés."
+msgstr " añadido a las áreas seleccionadas."
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax.phtml:9
+msgid " au panier "
+msgstr " a la cesta"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:28
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:34
+#: ../../library/ZendAfi/View/Helper/Abonne/Newsletters.php:32
+msgid " aux lettres d'information: "
+msgstr " a los boletines:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:343
+#: ../../application/modules/opac/controllers/RechercheController.php:363
+#: ../../application/modules/opac/controllers/RechercheController.php:382
+#: ../../application/modules/opac/controllers/RechercheController.php:430
+#: ../../application/modules/opac/controllers/RechercheController.php:486
+msgid " commence par :"
+msgstr " comienza:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:343
+#: ../../application/modules/opac/controllers/RechercheController.php:363
+#: ../../application/modules/opac/controllers/RechercheController.php:382
+#: ../../application/modules/opac/controllers/RechercheController.php:431
+#: ../../application/modules/opac/controllers/RechercheController.php:487
+msgid " contient :"
+msgstr " contiene:"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:51
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:49
+msgid " dont %d retard"
+msgstr " incluyendo %d con retraso"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:52
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:50
+msgid " dont %d retards"
+msgstr " inculyendo %d con retraso"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:342
+#: ../../application/modules/opac/controllers/RechercheController.php:362
+#: ../../application/modules/opac/controllers/RechercheController.php:381
+#: ../../application/modules/opac/controllers/RechercheController.php:425
+#: ../../application/modules/opac/controllers/RechercheController.php:481
+msgid " et "
+msgstr " y"
+
+#: ../../application/modules/opac/controllers/UploadController.php:21
+#: ../../application/modules/opac/controllers/UploadController.php:24
+#: ../../application/modules/opac/controllers/UploadController.php:43
+msgid " et des dimensions se rapprochant de %s x %s pixels"
+msgstr " y las dimensiones que se aproximan %s x %s píxeles"
+
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:20
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:20
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:39
+msgid " et profil"
+msgstr " y el perfil"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:342
+#: ../../application/modules/opac/controllers/RechercheController.php:362
+#: ../../application/modules/opac/controllers/RechercheController.php:381
+#: ../../application/modules/opac/controllers/RechercheController.php:426
+#: ../../application/modules/opac/controllers/RechercheController.php:482
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:40
+msgid " ou "
+msgstr " o"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:451
+#: ../../application/modules/opac/controllers/AbonneController.php:511
+#: ../../application/modules/opac/controllers/AbonneController.php:509
+msgid " par E-Mail"
+msgstr " por E-Mail"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:452
+#: ../../application/modules/opac/controllers/AbonneController.php:512
+#: ../../application/modules/opac/controllers/AbonneController.php:510
+msgid " par SMS"
+msgstr " SMS"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:450
+#: ../../application/modules/opac/controllers/AbonneController.php:510
+#: ../../application/modules/opac/controllers/AbonneController.php:508
+msgid " par courrier postal"
+msgstr " por correo"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:342
+#: ../../application/modules/opac/controllers/RechercheController.php:362
+#: ../../application/modules/opac/controllers/RechercheController.php:381
+#: ../../application/modules/opac/controllers/RechercheController.php:427
+#: ../../application/modules/opac/controllers/RechercheController.php:483
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:41
+msgid " sauf "
+msgstr " excepto"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Navigation.php:52
+#: ../../library/ZendAfi/View/Helper/Notice/Navigation.php:61
+msgid " sur "
+msgstr " en"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:28
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:34
+#: ../../library/ZendAfi/View/Helper/Abonne/Newsletters.php:32
+msgid " à la lettre d'information: "
+msgstr " el boletín de noticias:"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_resultat.phtml:27
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:87
+msgid "Lien \"Suggérer un achat\""
+msgstr "Enlace \"Sugerir una Compra\""
+
+#: ../../application/modules/admin/controllers/LieuController.php:47
+msgid "Modifier le lieu: \"%s\""
+msgstr "Cambiar de ubicación: \"%s\""
+
+#: ../../application/modules/opac/controllers/PanierController.php:137
+#: ../../application/modules/opac/controllers/PanierController.php:173
+msgid "Notice \"%s\" ajoutée au panier \"%s\""
+msgstr "Registro  \"%s\" añadido a la cesta \"%s\""
+
+#: ../../application/modules/opac/controllers/PanierController.php:229
+msgid "Panier \"%s\" renommé vers \"%s\""
+msgstr "Cesta \"%s\" renombrado a \"%s\""
+
+#: ../../application/modules/admin/views/scripts/i18n/index.phtml:18
+msgid "%.2f %%"
+msgstr "%.2f %%"
+
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:29
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:44
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:42
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:28
+msgid "%d prêt en cours"
+msgstr "%d prestamo activo"
+
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:30
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:45
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:43
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:29
+msgid "%d prêts en cours"
+msgstr "%d préstamos activos"
+
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:46
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:64
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:65
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:45
+msgid "%d réservation"
+msgstr "%d reserva"
+
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:47
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:65
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:66
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:46
+msgid "%d réservations"
+msgstr "%d reservas"
+
+#: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:40
+msgid "%d suggestions enregistrées."
+msgstr "%d sugerencias registradas."
+
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:91
+#: ../../library/ZendAfi/View/Helper/Admin/UserGroupMemberShip.php:60
+#: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:50
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:173
+msgid "%d utilisateur"
+msgstr "%d usuario"
+
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:92
+#: ../../library/ZendAfi/View/Helper/Admin/UserGroupMemberShip.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:174
+msgid "%d utilisateurs"
+msgstr "%d usuarios"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/ResumeAvis.php:33
+msgid "%d évaluation"
+msgstr "%d evaluación"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/ResumeAvis.php:34
+msgid "%d évaluations"
+msgstr "%d evaluaciones"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:76
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:77
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:95
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:96
+msgid "%s "
+msgstr "%s"
+
+#: ../../library/ZendAfi/View/Helper/RenderDateRange.php:29
+msgid "%s au %s"
+msgstr "%s %s"
+
+#: ../../library/Class/NoticeHtml.php:469
+#: ../../library/Class/NoticeHtml.php:476
+#: ../../library/Class/NoticeHtml.php:481
+#: ../../library/Class/NoticeHtml.php:472
+#: ../../library/Class/NoticeHtml.php:484
+msgid "%s livre"
+msgstr "Libro%s"
+
+#: ../../library/Class/NoticeHtml.php:467
+#: ../../library/Class/NoticeHtml.php:474
+#: ../../library/Class/NoticeHtml.php:479
+#: ../../library/Class/NoticeHtml.php:470
+#: ../../library/Class/NoticeHtml.php:482
+msgid "%s livres"
+msgstr "Libros%s"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:15
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:27
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:59
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:60
+msgid "%s notices trouvées"
+msgstr "%s registros encontrados"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:64
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:68
+msgid "&nbsp;<small>"
+msgstr "& Nbsp; <small>"
+
+msgid ""
+"'%hostname%' does not appear to have a valid MX record for the email address "
+"'%value%'"
+msgstr ""
+"''%hostname%' no parece-tener un registro MX válido para la dirección de "
+"correo electrónico '%value%'"
+
+msgid "'%hostname%' is not a valid hostname for email address '%value%'"
+msgstr ""
+"'%hostname%' no es un nombre de host válido para la dirección de correo "
+"electrónico '%value%'"
+
+msgid ""
+"'%hostname%' is not in a routable network segment. The email address '%value"
+"%' should not be resolved from public network."
+msgstr ""
+"'%hostname%' no se encuentra en un segmento de red enrutable. La dirección "
+"de correo electrónico '%value%' no deberías ser resueltos desde la red "
+"pública."
+
+msgid "'%localPart%' can not be matched against dot-atom format"
+msgstr "'%localPart%' no puede ser comparada con el tamaño del punto-átomo"
+
+msgid "'%localPart%' can not be matched against quoted-string format"
+msgstr "'%localPart%' no puede ser igualada Contra-citada cadena de tamaño"
+
+msgid "'%localPart%' is no valid local part for email address '%value%'"
+msgstr ""
+"'%localPart%' hay una dirección de correo electrónico válida para parte "
+"local '%value%'"
+
+msgid "'%value%' appears to be a DNS hostname but cannot extract TLD part"
+msgstr ""
+"'%value%' parece ser una meta nombre de host DNS no puede extraer la cuota "
+"TLD"
+
+msgid ""
+"'%value%' appears to be a DNS hostname but cannot match TLD against known "
+"list"
+msgstr ""
+"'%value%' parece ser una meta nombre de host DNS no puede coincidir con TLD "
+"Contra lista conocido"
+
+msgid ""
+"'%value%' appears to be a DNS hostname but cannot match against hostname "
+"schema for TLD '%tld%'"
+msgstr ""
+"'%value%' parece ser una meta nombre de host DNS no puede igualar contra el "
+"esquema de nombre de host para el TLD '%tld%'"
+
+msgid ""
+"'%value%' appears to be a DNS hostname but contains a dash in an invalid "
+"position"
+msgstr ""
+"'%value%' parece ser un nombre de host DNS contiene una meta guión en una "
+"posición no válida"
+
+msgid ""
+"'%value%' appears to be a DNS hostname but the given punycode notation "
+"cannot be decoded"
+msgstr ""
+"'%value%' parece ser una meta nombre de host DNS La notación punycode Dado "
+"que no se puede decodificar"
+
+msgid ""
+"'%value%' appears to be a local network name but local network names are not "
+"allowed"
+msgstr ""
+"'%value%' parece ser una finalidad nombre de la red local de nombres de la "
+"red local no se les permite"
+
+msgid "'%value%' appears to be an IP address, but IP addresses are not allowed"
+msgstr ""
+"'%value%' parece ser una dirección IP, las direcciones IP de propósito no se "
+"les permite"
+
+msgid "'%value%' contains not only digit characters"
+msgstr "'%value%' no sólo contiene caracteres de dígitos"
+
+msgid "'%value%' does not appear to be a valid local network name"
+msgstr "'%value%' no parece ser un nombre de red local válida"
+
+msgid "'%value%' does not appear to be an integer"
+msgstr "'%value%' no parecen ser un número entero"
+
+msgid "'%value%' does not match the expected structure for a DNS hostname"
+msgstr ""
+"'%value%' no se corresponde con la estructura esperada para un nombre de "
+"host DNS"
+
+msgid "'%value%' exceeds the allowed length"
+msgstr "'%value%' supera la longitud permitida"
+
+msgid "'%value%' is greater than %max% characters long"
+msgstr "'%value%' es mayor que los caracteres %max% largo"
+
+msgid "'%value%' is less than %min% characters long"
+msgstr "'%value%' es menor que %min% caracteres"
+
+msgid ""
+"'%value%' is not a valid email address in the basic format local-"
+"part@hostname"
+msgstr ""
+"'%value%' no es una dirección de correo electrónico válida en el tamaño "
+"básico parte-local @ nombre de host"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:265
+#: ../../application/modules/opac/controllers/AbonneController.php:271
+#: ../../application/modules/opac/controllers/AbonneController.php:297
+#: ../../application/modules/opac/controllers/AbonneController.php:294
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:35
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:38
+msgid "(%d en retard)"
+msgstr "(%d de retraso)"
+
+#: ../../library/Class/Blog.php:78 ../../library/Class/Blog.php:97
+msgid "(ce commentaire a été signalé aux modérateurs)"
+msgstr "(Este comentario fue reportado a los moderadores)"
+
+#: ../../application/modules/admin/controllers/BibController.php:529
+#: ../../application/modules/admin/controllers/BibController.php:537
+#: ../../application/modules/admin/controllers/BibController.php:556
+#: ../../application/modules/admin/controllers/BibController.php:553
+#: ../../application/modules/admin/controllers/BibController.php:493
+#: ../../application/modules/admin/controllers/BibController.php:498
+msgid "** nouveau plan **"
+msgstr "Nuevo plan ** **"
+
+#: ../../application/modules/admin/controllers/BibController.php:774
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:782
+#: ../../application/modules/admin/controllers/BibController.php:801
+#: ../../application/modules/admin/controllers/BibController.php:798
+msgid "** nouveau point **"
+msgstr "Nuevo punto ** **"
+
+#: ../../application/modules/admin/controllers/BibController.php:768
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:9
+#: ../../application/modules/admin/controllers/BibController.php:776
+#: ../../application/modules/admin/controllers/BibController.php:795
+#: ../../application/modules/admin/controllers/BibController.php:792
+msgid "** nouvelle couche **"
+msgstr "Nueva capa ** **"
+
+#: ../../application/modules/admin/controllers/BibController.php:784
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:14
+#: ../../application/modules/admin/controllers/BibController.php:792
+#: ../../application/modules/admin/controllers/BibController.php:811
+#: ../../application/modules/admin/controllers/BibController.php:808
+msgid "** nouvelle info **"
+msgstr "Nueva info ** **"
+
+#: ../../application/modules/admin/controllers/BibController.php:418
+#: ../../application/modules/admin/controllers/BibController.php:426
+#: ../../application/modules/admin/controllers/BibController.php:445
+#: ../../application/modules/admin/controllers/BibController.php:442
+#: ../../application/modules/admin/controllers/BibController.php:401
+#: ../../application/modules/admin/controllers/BibController.php:406
+msgid "** nouvelle localisation **"
+msgstr "Nueva ubicación ** **"
+
+#: ../../application/modules/opac/controllers/UploadController.php:19
+#: ../../application/modules/opac/controllers/UploadController.php:38
+msgid ""
+"*NB : l'image doit être de type \"%s\", avoir une taille inférieure à %s ko"
+msgstr ""
+"* Nota: La imagen debe ser \"%s\", debe tener un tamaño inferior a %s KB"
+
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:34
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:35
+#: ../../library/ZendAfi/View/Helper/FicheAbonneLinks.php:33
+msgid ", %d en retard"
+msgstr " %d tarde"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:344
+#: ../../application/modules/opac/controllers/RechercheController.php:364
+#: ../../application/modules/opac/controllers/RechercheController.php:383
+#: ../../application/modules/opac/controllers/RechercheController.php:435
+#: ../../application/modules/opac/controllers/RechercheController.php:490
+msgid ", Titre"
+msgstr ", Título"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:337
+#: ../../application/modules/opac/controllers/RechercheController.php:357
+#: ../../application/modules/opac/controllers/RechercheController.php:370
+#: ../../application/modules/opac/controllers/RechercheController.php:413
+#: ../../application/modules/opac/controllers/RechercheController.php:468
+msgid ", type de document: %s"
+msgstr "Tipo de documento: %s"
+
+#: ../../application/modules/admin/views/scripts/footer.phtml:4
+#: ../../application/modules/opac/views/scripts/footer.phtml:17
+#: ../../application/modules/opac/views/scripts/footer.phtml:16
+#: ../../application/modules/opac/views/scripts/footer.phtml:30
+#: ../../application/modules/opac/views/scripts/footer.phtml:29
+msgid "- Tous droits réservés - Hébergement &amp; Conception graphique"
+msgstr "- Todos los derechos reservados - Hosting & amp; Diseño gráfico"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:114
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:115
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:121
+msgid "1 an"
+msgstr "1 año"
+
+#: ../../library/ZendAfi/View/Helper/ListeCVSNotices.php:48
+msgid "1 document trouvée"
+msgstr "1 resultado"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:111
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:109
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:115
+msgid "1 mois"
+msgstr "1 mes"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:13
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:32
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:26
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:31
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:39
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:40
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:34
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:57
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:57
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:58
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:58
+msgid "1 notice trouvée"
+msgstr "1 resultado"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:112
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:111
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:117
+msgid "3 mois"
+msgstr "3 meses"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:115
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:117
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:123
+msgid "5 ans"
+msgstr "5 años"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:113
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:119
+msgid "6 mois"
+msgstr "6 meses"
+
+#: ../../library/Class/NoticeHtml.php:561
+#: ../../library/Class/NoticeHtml.php:568
+#: ../../library/Class/NoticeHtml.php:573
+#: ../../library/Class/NoticeHtml.php:564
+#: ../../library/Class/NoticeHtml.php:576
+#: ../../library/Class/NoticeHtml.php:448
+msgid "<img src=\"%s\" border=\"0\" style=\"%s\" alt=\"%s\" />"
+msgstr "<Img src =  \"%s\" border = \"0\" style = \"%s\" alt = \"%s\" />"
+
+#: ../../library/ZendAfi/View/Helper/Biographie.php:86
+#: ../../library/ZendAfi/View/Helper/Biographie.php:90
+msgid "<img src=\"%s\" style=\"%s\" alt=\"%s\" />"
+msgstr "<img src=\"%s\" style=\"%s\" alt=\"%s\" />"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:80
+#: ../../application/modules/opac/views/scripts/head.phtml:83
+msgid ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"#\" title=\"%s\" "
+"data-name=\"style_defaut\">"
+msgstr ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"#\" title=\"%s\" "
+"data-name=\"style_defaut\">"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:64
+msgid ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"#\" title=\"%s\">"
+msgstr ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"#\" title=\"%s\">"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:46
+#: ../../application/modules/opac/views/scripts/head.phtml:47
+msgid ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"\" title=\"%s\" /"
+">"
+msgstr ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"\" title=\"%s\" /"
+">"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:47
+#: ../../application/modules/opac/views/scripts/head.phtml:55
+msgid ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"\" title=\"%s\">"
+msgstr ""
+"<link rel=\"alternate stylesheet\" type=\"text/css\" href=\"\" title=\"%s\">"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:54
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:55
+msgid "<small>"
+msgstr "<Small>"
+
+#: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:35
+msgid "A"
+msgstr "A"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:31
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:43
+msgid "A indexer dans les notices"
+msgstr "Un índice en los registros"
+
+#: ../../application/modules/opac/controllers/RssController.php:203
+#: ../../application/modules/opac/controllers/RssController.php:218
+msgid "A la Une"
+msgstr "Titulares"
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:22
+msgid "Abonnement"
+msgstr "Suscripción"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:401
+#: ../../application/modules/opac/controllers/AbonneController.php:409
+#: ../../application/modules/opac/controllers/AbonneController.php:417
+#: ../../application/modules/opac/controllers/AbonneController.php:443
+#: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:410
+#: ../../application/modules/opac/controllers/AbonneController.php:460
+#: ../../application/modules/opac/controllers/AbonneController.php:520
+#: ../../application/modules/opac/controllers/AbonneController.php:518
+msgid "Abonnement aux lettres d'information"
+msgstr "Suscribirse a boletines"
+
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:58
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:56
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:59
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:69
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:85
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:132
+msgid "Abonné sigb"
+msgstr "ILS suscriptor"
+
+#: ../../application/modules/admin/views/scripts/newsletter/edit-subscribers.phtml:1
+msgid "Abonnés de la lettre: "
+msgstr "Los seguidores de la letra:"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuHorizontalAdmin.php:8
+#: ../../library/ZendAfi/View/Helper/BarreNav.php:16
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:46
+#: ../../library/Class/MoteurRecherche.php:311
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:8
+#: ../../library/Class/MoteurRecherche.php:327
+#: ../../library/Class/MoteurRecherche.php:339
+#: ../../library/Class/MoteurRecherche.php:374
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:27
+#: ../../library/ZendAfi/View/Helper/BarreNav.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:29
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:65
+#: ../../library/Class/MoteurRecherche.php:400
+#: ../../library/ZendAfi/View/Helper/BarreNav.php:33
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:112
+#: ../../library/Class/MoteurRecherche.php:421
+#: ../../library/ZendAfi/View/Helper/BarreNav.php:32
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:114
+#: ../../library/Class/MoteurRecherche.php:415
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+msgid "Accueil"
+msgstr "Bienvenido"
+
+#: ../../application/modules/admin/views/scripts/index/index.phtml:33
+#: ../../application/modules/admin/views/scripts/index/index.phtml:27
+#: ../../application/modules/admin/views/scripts/index/index.phtml:29
+msgid "Accès"
+msgstr "Acceso"
+
+#: ../../application/modules/opac/views/scripts/footer.phtml:5
+msgid "Accès pro."
+msgstr "Pro Services."
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:65
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:70
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:118
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:123
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:131
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:215
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:224
+msgid "Accès à Cosmogramme"
+msgstr "Cosmograma Acceso"
+
+#: ../../application/modules/admin/views/scripts/users/index.phtml:19
+#: ../../application/modules/admin/views/scripts/users/index.phtml:21
+msgid "Action"
+msgstr "Acción"
+
+#: ../../library/ZendAfi/View/Helper/TagModelTable.php:35
+#: ../../library/ZendAfi/View/Helper/TagModelTable.php:45
+#: ../../library/ZendAfi/View/Helper/TagModelTable.php:61
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:26
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:37
+#: ../../library/ZendAfi/View/Helper/TagModelTable.php:62
+msgid "Actions"
+msgstr "Stock"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:237
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:246
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:293
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:291
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:313
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:325
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:339
+msgid "Activer les outils d'accessibilité"
+msgstr "Habilitar herramientas de accesibilidad"
+
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:87
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:66
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:89
+#: ../../application/modules/opac/views/scripts/bib/_articles_by_bib.phtml:1
+#: ../../application/modules/opac/views/scripts/bib/_articles_by_bib.phtml:2
+msgid "Actualités :"
+msgstr "Noticias:"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:49
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:49
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:56
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:100
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:105
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:115
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:188
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:197
+msgid "Administration du portail"
+msgstr "Portal Administration"
+
+#: ../../application/modules/admin/views/scripts/multimedia/index.phtml:17
+msgid "Administrer le serveur AFI-Multimedia"
+msgstr "Administrar el servidor de AFI-Multimedia"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:40
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:44
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:128
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:39
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:43
+#: ../../application/modules/opac/controllers/IndexController.php:81
+#: ../../application/modules/opac/controllers/IndexController.php:97
+#: ../../application/modules/opac/controllers/IndexController.php:102
+#: ../../application/modules/opac/controllers/AbonneController.php:376
+#: ../../application/modules/opac/controllers/IndexController.php:94
+#: ../../application/modules/opac/controllers/IndexController.php:93
+#: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../library/ZendAfi/Form/ContactForm.php:67
+msgid "Adresse"
+msgstr "Dirección"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:38
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:40
+msgid "Adresse : "
+msgstr "Dirección:"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:122
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+msgid "Adresse URL"
+msgstr "URL"
+
+#: ../../library/Class/Mail.php:38 ../../library/Class/Mail.php:48
+#: ../../library/Class/Mail.php:79 ../../library/Class/Mail.php:81
+msgid "Adresse du destinataire absente."
+msgstr "Destinatario ausente dirección."
+
+#: ../../application/modules/admin/views/scripts/modules/bib_all.phtml:3
+#: ../../library/ZendAfi/Form/Album.php:75
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:126
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:160
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:222
+msgid "Affichage"
+msgstr "Viendo el"
+
+#: ../../library/ZendAfi/Form/ChangeKiosqueSelection.php:60
+msgid "Afficher "
+msgstr "Fijar"
+
+#: ../../application/modules/opac/controllers/IndexController.php:154
+msgid "Afficher Agenda"
+msgstr "Ver Agenda"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:225
+msgid "Afficher au dessous des facettes"
+msgstr "Vea a continuación las facetas"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:227
+msgid "Afficher au dessous des résultats"
+msgstr "Consulte a continuación los resultados"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:224
+msgid "Afficher au dessus des facettes"
+msgstr "Ver las facetas anteriores"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:226
+msgid "Afficher au dessus des résultats"
+msgstr "Ver resultados anteriores"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:27
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:28
+msgid "Afficher en résultat de recherche"
+msgstr "Mostrar resultados de búsqueda"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:214
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:223
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:270
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:268
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:290
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:302
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:316
+msgid "Afficher la barre de navigation"
+msgstr "Navigation Display"
+
+#: ../../library/Class/NoticeHtml.php:359
+#: ../../library/Class/NoticeHtml.php:360
+#: ../../library/Class/NoticeHtml.php:364
+#: ../../library/Class/NoticeHtml.php:365
+#: ../../library/Class/NoticeHtml.php:366
+#: ../../library/Class/NoticeHtml.php:356
+#: ../../library/Class/NoticeHtml.php:357
+#: ../../library/Class/NoticeHtml.php:398
+#: ../../library/Class/NoticeHtml.php:399
+#: ../../library/Class/NoticeHtml.php:268
+#: ../../library/Class/NoticeHtml.php:269
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:116
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:117
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:121
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:122
+msgid "Afficher la carte"
+msgstr "Ver mapa"
+
+#: ../../library/Class/NoticeHtml.php:402
+#: ../../library/Class/NoticeHtml.php:403
+#: ../../library/Class/NoticeHtml.php:407
+#: ../../library/Class/NoticeHtml.php:408
+#: ../../library/Class/NoticeHtml.php:412
+#: ../../library/Class/NoticeHtml.php:413
+#: ../../library/Class/NoticeHtml.php:414
+#: ../../library/Class/NoticeHtml.php:404
+#: ../../library/Class/NoticeHtml.php:405
+#: ../../library/Class/NoticeHtml.php:417
+#: ../../library/Class/NoticeHtml.php:418
+#: ../../library/Class/NoticeHtml.php:287
+#: ../../library/Class/NoticeHtml.php:288
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:134
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:135
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:142
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:143
+msgid "Afficher la notice"
+msgstr "Ver registro"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:203
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:212
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:259
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:257
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:279
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:291
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:305
+msgid "Afficher le menu horizontal"
+msgstr "Mostrar menú horizontal"
+
+#: ../../application/modules/opac/views/scripts/portail.phtml:10
+msgid "Afficher le site en mode mobile"
+msgstr "Véase el sitio Web en modo móvil"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:128
+msgid "Afficher les facettes"
+msgstr "Ver facetas"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:41
+#: ../../application/modules/opac/views/scripts/head.phtml:42
+#: ../../application/modules/opac/views/scripts/head.phtml:43
+msgid "Afficher les outils d\\'administration"
+msgstr "Administración Mostrar herramientas \\"
+
+#: ../../library/ZendAfi/View/Helper/Facettes.php:73
+#: ../../library/ZendAfi/View/Helper/Facettes.php:80
+msgid "Afficher plus de facettes..."
+msgstr "Ver más facetas ..."
+
+#: ../../library/Class/NoticeHtml.php:520
+#: ../../library/Class/NoticeHtml.php:527
+#: ../../library/Class/NoticeHtml.php:532
+#: ../../library/Class/NoticeHtml.php:523
+#: ../../library/Class/NoticeHtml.php:533
+#: ../../library/Class/NoticeHtml.php:405
+#: ../../library/Class/NoticeHtml.php:161
+#: ../../library/Class/NoticeHtml.php:160
+#: ../../library/Class/NoticeHtml.php:152
+msgid "Afficher plus de notices..."
+msgstr "Ver más registros ..."
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:16
+msgid "Afficher toutes les réponses"
+msgstr "Mostrar todas las respuestas"
+
+#: ../../library/Class/NoticeHtml.php:418
+#: ../../library/Class/NoticeHtml.php:423
+#: ../../library/Class/NoticeHtml.php:428
+#: ../../library/Class/NoticeHtml.php:429
+#: ../../library/Class/NoticeHtml.php:420
+#: ../../library/Class/NoticeHtml.php:433
+#: ../../library/Class/NoticeHtml.php:303
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:150
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:158
+msgid "Afficher toutes les éditions de ce document"
+msgstr "Ver todas las ediciones de este documento"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:94
+msgid "Afficher un nouveau domaine"
+msgstr "Pruebe con un nuevo dominio"
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:9
+msgid "Afficher uniquement les réponses à valider"
+msgstr "Mostrar sólo respuestas para validar"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:87
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:92
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:118
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:112
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:108
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:103
+#: ../../library/ZendAfi/Form/Admin/News.php:62
+msgid "Agenda"
+msgstr "Diario"
+
+#: ../../library/Class/NoticeHtml.php:658
+#: ../../library/Class/NoticeHtml.php:660
+#: ../../library/Class/NoticeHtml.php:665
+#: ../../library/Class/NoticeHtml.php:667
+#: ../../library/Class/NoticeHtml.php:676
+#: ../../library/Class/NoticeHtml.php:678
+#: ../../library/Class/NoticeHtml.php:669
+#: ../../library/Class/NoticeHtml.php:679
+#: ../../library/Class/NoticeHtml.php:681
+#: ../../library/Class/NoticeHtml.php:551
+#: ../../library/Class/NoticeHtml.php:553
+#: ../../library/Class/NoticeHtml.php:245
+#: ../../library/Class/NoticeHtml.php:247
+#: ../../library/Class/NoticeHtml.php:244
+#: ../../library/Class/NoticeHtml.php:246
+#: ../../library/Class/NoticeHtml.php:228
+#: ../../library/Class/NoticeHtml.php:230
+msgid "Agrandir l'image"
+msgstr "Ampliar Imagen"
+
+#: ../../application/modules/opac/controllers/PanierController.php:155
+#: ../../application/modules/opac/controllers/PanierController.php:197
+msgid "Ajout d'une notice à un panier"
+msgstr "Agregar un  registro a una cesta"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:84
+#: ../../application/modules/admin/controllers/CatalogueController.php:102
+msgid "Ajout de domaine"
+msgstr "Adición de campo"
+
+#: ../../application/modules/opac/controllers/PanierController.php:148
+#: ../../application/modules/opac/controllers/PanierController.php:185
+msgid "Ajout panier"
+msgstr "Añadir a la cesta"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:30
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:49
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:67
+msgid "Ajouter"
+msgstr "Añadir"
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax.phtml:7
+msgid "Ajouter "
+msgstr "Añadir"
+
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:21
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:25
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:24
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:26
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:29
+msgid "Ajouter au Panier"
+msgstr "Añadir a la cesta"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Mur.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Mur.php:98
+#: ../../library/ZendAfi/View/Helper/TagAddToCart.php:37
+msgid "Ajouter au panier"
+msgstr "Añadir a la cesta"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:214
+#: ../../application/modules/admin/controllers/CatalogueController.php:239
+msgid "Ajouter ce panier"
+msgstr "Añadir esta canasta"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:18
+msgid "Ajouter des medias"
+msgstr "Añadir medios"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:4
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:9
+msgid "Ajouter des medias par lot"
+msgstr "Añadir lotes Medios"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:5
+msgid "Ajouter des ressources"
+msgstr "Añadir recursos"
+
+#: ../../library/ZendAfi/Form/AjoutNoticePanier.php:34
+msgid "Ajouter la notice au panier"
+msgstr "Añadir registro a la"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:12
+msgid "Ajouter la notice au panier :"
+msgstr "Añadir registro a la cesta de la compra:"
+
+#: ../../application/modules/admin/views/scripts/opds/index.phtml:4
+#: ../../application/modules/admin/views/scripts/opds/index.phtml:5
+msgid "Ajouter un catalogue"
+msgstr "Añadir Catálogo"
+
+#: ../../application/modules/admin/views/scripts/catalogue/index.phtml:2
+#: ../../application/modules/admin/views/scripts/catalogue/index.phtml:3
+msgid "Ajouter un domaine"
+msgstr "Agregar dominio"
+
+#: ../../application/modules/admin/views/scripts/oai/index.phtml:4
+msgid "Ajouter un entrepôt"
+msgstr "Añadir una tienda"
+
+#: ../../application/modules/admin/views/scripts/usergroup/index.phtml:4
+msgid "Ajouter un groupe"
+msgstr "Agregar grupo"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:9
+msgid "Ajouter un media"
+msgstr "Añadir medios"
+
+#: ../../application/modules/admin/views/scripts/profil/menusindex.phtml:11
+msgid "Ajouter un menu"
+msgstr "Añadir menú"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:76
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:81
+msgid "Ajouter un nouvel article"
+msgstr "Añadir un nuevo comentario"
+
+#: ../../application/modules/admin/views/scripts/bib/plans.phtml:6
+msgid "Ajouter un plan"
+msgstr "Añadir un plan"
+
+#: ../../application/modules/admin/controllers/BibController.php:539
+#: ../../application/modules/admin/controllers/BibController.php:547
+#: ../../application/modules/admin/controllers/BibController.php:566
+#: ../../application/modules/admin/controllers/BibController.php:563
+#: ../../application/modules/admin/controllers/BibController.php:504
+#: ../../application/modules/admin/controllers/BibController.php:509
+msgid "Ajouter un plan de la bibliothèque: %s"
+msgstr "Añadir un mapa de la biblioteca: %s"
+
+#: ../../application/modules/admin/views/scripts/profil/index.phtml:9
+msgid "Ajouter un profil"
+msgstr "Añadir perfil"
+
+#: ../../application/modules/admin/views/scripts/zone/index.phtml:6
+msgid "Ajouter un territoire"
+msgstr "Añadir un territorio"
+
+#: ../../application/modules/admin/views/scripts/frbr-linktype/index.phtml:11
+msgid "Ajouter un type de relation"
+msgstr "Agregar un tipo de relación"
+
+#: ../../application/modules/admin/views/scripts/users/index.phtml:3
+#: ../../application/modules/admin/views/scripts/users/index.phtml:5
+msgid "Ajouter un utilisateur"
+msgstr "Añadir usuario"
+
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:3
+#: ../../application/modules/admin/controllers/BibController.php:44
+#: ../../application/modules/admin/controllers/BibController.php:49
+#: ../../application/modules/admin/controllers/BibController.php:68
+#: ../../application/modules/admin/controllers/BibController.php:65
+#: ../../application/modules/admin/controllers/BibController.php:56
+msgid "Ajouter une bibliothèque"
+msgstr "Añadir una biblioteca"
+
+#: ../../application/modules/admin/views/scripts/album/index.phtml:4
+#: ../../application/modules/admin/views/scripts/cms/index.phtml:6
+#: ../../application/modules/admin/views/scripts/rss/index.phtml:9
+msgid "Ajouter une catégorie"
+msgstr "Añadir categoría"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:292
+#: ../../application/modules/admin/controllers/UsergroupController.php:163
+msgid "Ajouter une catégorie d'utilisateurs"
+msgstr "Agregar una categoría de usuarios"
+
+#: ../../application/modules/admin/views/scripts/album/index.phtml:4
+#: ../../application/modules/admin/views/scripts/album/index.phtml:5
+msgid "Ajouter une collection"
+msgstr "Añadir Collection"
+
+#: ../../application/modules/admin/views/scripts/formation/index.phtml:5
+#: ../../application/modules/admin/controllers/FormationController.php:37
+msgid "Ajouter une formation"
+msgstr "Añadir el entrenamiento"
+
+#: ../../application/modules/admin/views/scripts/bib/localisations.phtml:6
+msgid "Ajouter une localisation"
+msgstr "Agregar una ubicación"
+
+#: ../../application/modules/opac/controllers/PanierController.php:214
+msgid "Ajouter une notice au panier"
+msgstr "Agregar una registro a la cesta"
+
+#: ../../application/modules/admin/views/scripts/ouvertures/index.phtml:4
+msgid "Ajouter une plage d'ouverture"
+msgstr "Añadir una playa abierta"
+
+#: ../../application/modules/admin/views/scripts/frbr-link/index.phtml:11
+msgid "Ajouter une relation"
+msgstr "Añadir la relación"
+
+#: ../../application/modules/admin/views/scripts/batch/index.phtml:4
+msgid "Ajouter une tâche"
+msgstr "Agregar tarea"
+
+#: ../../library/ZendAfi/Form/Album.php:42
+#: ../../library/ZendAfi/Form/Album.php:40
+#: ../../library/ZendAfi/Form/Album.php:48
+msgid "Album"
+msgstr "Album"
+
+#: ../../application/modules/opac/views/scripts/bib-numerique/view-categorie.phtml:19
+msgid "Album(s)"
+msgstr "Album (s)"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:28
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:28
+msgid "Albums multimédia"
+msgstr "Álbumes multimedia"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:19
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:38
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:200
+msgid "All copies are on loan to a customer whose loans are not reserved"
+msgstr ""
+"Todas las copias son en calidad de préstamo a un cliente cuyos préstamos no "
+"están reservados"
+
+#: ../../library/Class/Users.php:260 ../../library/Class/Users.php:274
+#: ../../library/Class/Users.php:349 ../../library/Class/Users.php:425
+#: ../../library/Class/Users.php:454 ../../library/Class/Users.php:600
+#: ../../library/Class/Users.php:667 ../../library/Class/Users.php:755
+#: ../../library/Class/Users.php:879
+msgid "Aller sur le portail"
+msgstr "Ir a portal"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:73
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:71
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:147
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:146
+msgid "Aller sur le site"
+msgstr "Ir al sitio web"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:23
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:42
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:204
+msgid ""
+"Already exists at least one reservation for this customer for this notice"
+msgstr "Ya existe al menos una reserva para este cliente de este registro"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:122
+msgid "Animation"
+msgstr "Animación"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:102
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:141
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+msgid "Annexe"
+msgstr "Horario"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:84
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:86
+msgid "Annexe :"
+msgstr "Apéndice:"
+
+#: ../../application/modules/admin/views/scripts/bib/planaccesicone.phtml:26
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:48
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:35
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:55
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:59
+#: ../../application/modules/telephone/views/scripts/abonne/cancel-hold.phtml:21
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:121
+msgid "Annuler"
+msgstr "Cancelar"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:12
+msgid "Annuler cette réservation"
+msgstr "Cancelar su reserva"
+
+#: ../../library/Class/Codification.php:108
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/Codification.php:111
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:21
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:31
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:11
+#: ../../library/Class/Codification.php:116
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:12
+#: ../../library/Class/Codification.php:136
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:16
+msgid "Année"
+msgstr "Año"
+
+#: ../../library/ZendAfi/Form/Album.php:147
+msgid "Année d'édition"
+msgstr "Fecha de publicación"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:51
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:47
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:44
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:60
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:73
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:85
+msgid "Année de parution - depuis"
+msgstr "La publicación de años - desde"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:93
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:73
+#: ../../library/Class/CriteresRecherche.php:83
+#: ../../library/Class/CriteresRecherche.php:107
+#: ../../library/Class/CriteresRecherche.php:108
+msgid "Année de publication"
+msgstr "Fecha de publicación"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:42
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:61
+msgid "Année début"
+msgstr "Año de inicio"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:43
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:62
+msgid "Année fin"
+msgstr "Fin de año"
+
+#: ../../application/modules/opac/views/scripts/recherche/readnotice.phtml:5
+msgid "Année: %s"
+msgstr "Año: %s"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:13
+msgid "Aout"
+msgstr "Agosto"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:42
+msgid "Août"
+msgstr "Agosto"
+
+#: ../../application/modules/admin/views/scripts/newsletter/preview.phtml:1
+msgid "Aperçu de la lettre: "
+msgstr "Descripción general de la carta:"
+
+#: ../../application/modules/admin/views/scripts/upload/vignette-notice.phtml:14
+msgid "Aperçu:"
+msgstr "Vista previa:"
+
+#: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:27
+msgid ""
+"Après reconnaissance de votre identifiant, un mail vous sera envoyé avec vos "
+"paramètres de connexion."
+msgstr ""
+"Tras el reconocimiento de su nombre de usuario, un correo electrónico será "
+"enviado con su nombre de usuario."
+
+#: ../../application/modules/admin/views/scripts/ouvertures/index.phtml:15
+msgid "Après-midi"
+msgstr "Tarde"
+
+#: ../../library/Class/Codification.php:142
+#: ../../library/Class/Codification.php:145
+#: ../../library/Class/Codification.php:147
+#: ../../library/Class/Codification.php:155
+#: ../../library/Class/Codification.php:220
+#: ../../library/Class/Codification.php:221
+#: ../../library/Class/Codification.php:216
+msgid "Archives vidéo"
+msgstr "Archivo de Video"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:75
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:76
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:77
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:110
+msgid "Arte VOD"
+msgstr "Arte VOD"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:115
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:36
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:120
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:146
+#: ../../application/modules/opac/views/scripts/cms/article_partial.phtml:6
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:140
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:31
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:136
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:145
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:155
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:152
+#: ../../library/Class/CustomFieldsCategory.php:85
+#: ../../library/Class/CustomField/ModelConfiguration/Article.php:26
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:35
+#: ../../library/ZendAfi/Form/Admin/News.php:105
+msgid "Article"
+msgstr "Artículo"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:24
+#: ../../library/Class/NoticeHtml.php:222
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:24
+#: ../../library/Class/NoticeHtml.php:227
+#: ../../library/Class/NoticeHtml.php:218
+#: ../../application/modules/telephone/views/scripts/cms/articleviewbydate.phtml:2
+#: ../../library/Class/NoticeHtml.php:258
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:55
+#: ../../library/Class/NoticeHtml.php:128
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:59
+#: ../../library/Class/NoticeHtml.php:76
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
+#: ../../library/Class/NoticeHtml.php:66
+msgid "Articles"
+msgstr "Productos"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:132
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:188
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:187
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:201
+msgid "Aspect du site"
+msgstr "Aspecto del sitio"
+
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:16
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:35
+msgid "Attention..."
+msgstr "Advertencia ..."
+
+#: ../../application/modules/admin/controllers/CmsController.php:215
+#: ../../application/modules/admin/controllers/CmsController.php:221
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:76
+#: ../../application/modules/admin/controllers/CmsController.php:259
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:77
+#: ../../application/modules/admin/controllers/CmsController.php:247
+#: ../../library/ZendAfi/Form/Admin/News.php:185
+msgid "Aucun"
+msgstr "No"
+
+#: ../../library/Class/NoticeHtml.php:223
+#: ../../library/Class/NoticeHtml.php:228
+#: ../../library/Class/NoticeHtml.php:219
+#: ../../library/Class/NoticeHtml.php:259
+#: ../../library/Class/NoticeHtml.php:129
+#: ../../library/Class/NoticeHtml.php:77 ../../library/Class/NoticeHtml.php:69
+msgid "Aucun article n'a été trouvé"
+msgstr "El producto no ha sido encontrado"
+
+#: ../../application/modules/opac/views/scripts/cms/articlesview.phtml:5
+msgid "Aucun article trouvé"
+msgstr "No se han encontrado artículos"
+
+#: ../../library/ZendAfi/View/Helper/AvisBloc.php:35
+msgid "Aucun avis "
+msgstr "No hay comentarios"
+
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:10
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:14
+msgid "Aucun avis pour %s"
+msgstr "Ningun comentario para %s"
+
+#: ../../library/Class/NoticeHtml.php:846
+#: ../../library/Class/NoticeHtml.php:853
+#: ../../library/Class/NoticeHtml.php:864
+#: ../../library/Class/NoticeHtml.php:855
+#: ../../library/Class/NoticeHtml.php:870
+#: ../../library/Class/NoticeHtml.php:742
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:90
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:86
+msgid "Aucun avis pour le moment"
+msgstr "Ninguna opinión de momento"
+
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:23
+msgid "Aucun commentaires..."
+msgstr "No hay comentarios ..."
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:75
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:73
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:59
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:35
+#: ../../application/modules/telephone/views/scripts/cms/articleviewbydate.phtml:36
+msgid "Aucun contenu"
+msgstr "Ningún contenido"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:832
+#: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/admin/controllers/ModoController.php:679
+#: ../../application/modules/admin/controllers/ModoController.php:747
+#: ../../application/modules/opac/controllers/AbonneController.php:896
+#: ../../application/modules/opac/controllers/AbonneController.php:894
+msgid "Aucun courriel envoyé, erreur: "
+msgstr "No e-mail enviado, error:"
+
+#: ../../application/modules/admin/controllers/ModoController.php:683
+#: ../../application/modules/admin/controllers/ModoController.php:751
+msgid "Aucun courriel envoyé, erreur: le formulaire n'existe plus"
+msgstr "No e-mail enviado, error: La forma ya no existe"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:800
+msgid "Aucun courriel envoyé: le profil n'est pas configuré"
+msgstr "No e-mail enviado: el perfil no se ajusta"
+
+#: ../../application/modules/opac/views/scripts/java/mycarousel_vertical.phtml:20
+#: ../../application/modules/opac/views/scripts/java/protoflow.phtml:20
+#: ../../application/modules/opac/views/scripts/java/slide_show.phtml:11
+#: ../../application/modules/opac/views/scripts/java/slide_show.phtml:12
+msgid "Aucun document n'a été trouvé"
+msgstr "No se encontraron documentos"
+
+#: ../../library/ZendAfi/View/Helper/ListeCVSNotices.php:47
+#: ../../library/ZendAfi/View/Helper/ListeCVSNotices.php:30
+msgid "Aucun document trouvé"
+msgstr "No se encontraron registros"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:30
+#: ../../application/modules/admin/controllers/CatalogueController.php:44
+msgid "Aucun domaine n'a été trouvé"
+msgstr "No se encontraron áreas"
+
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:9
+msgid "Aucun exemplaire."
+msgstr "No se copia."
+
+#: ../../library/ZendAfi/View/Helper/admin/ComboMenus.php:19
+#: ../../library/ZendAfi/View/Helper/Admin/ComboMenus.php:19
+#: ../../library/ZendAfi/View/Helper/Admin/ComboMenus.php:18
+#: ../../library/ZendAfi/View/Helper/Admin/ComboMenus.php:37
+msgid "Aucun menu n'est paramétré pour ce profil"
+msgstr "No hay menú se establece para este perfil"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:23
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:22
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:36
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:55
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:62
+msgid "Aucun menu n'est paramétré pour ce profil."
+msgstr "No hay menú se establece para este perfil."
+
+#: ../../application/modules/admin/views/scripts/multimedia/browse.phtml:3
+msgid "Aucun poste dans ce groupe"
+msgstr "No hay puestos en este grupo"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:43
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:41
+msgid "Aucun prêt en cours"
+msgstr "No hay préstamos pendientes"
+
+#: ../../library/Class/MoteurRecherche.php:89
+#: ../../library/Class/MoteurRecherche.php:182
+#: ../../library/Class/MoteurRecherche.php:256
+#: ../../library/Class/NoticeOAI.php:208
+#: ../../library/Class/MoteurRecherche.php:104
+#: ../../library/Class/MoteurRecherche.php:198
+#: ../../library/Class/MoteurRecherche.php:272
+#: ../../library/Class/MoteurRecherche.php:112
+#: ../../library/Class/MoteurRecherche.php:206
+#: ../../library/Class/MoteurRecherche.php:280
+#: ../../library/Class/NoticeOAI.php:248
+#: ../../library/Class/MoteurRecherche.php:143
+#: ../../library/Class/MoteurRecherche.php:241
+#: ../../library/Class/MoteurRecherche.php:315
+#: ../../library/Class/MoteurRecherche.php:146
+#: ../../library/Class/MoteurRecherche.php:259
+#: ../../library/Class/MoteurRecherche.php:340
+#: ../../library/Class/MoteurRecherche.php:287
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:27
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:44
+msgid "Aucun résultat trouvé"
+msgstr "No hay resultados"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:29
+msgid "Aucun résultat trouvé pour :"
+msgstr "No se han encontrado resultados para:"
+
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:213
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:224
+msgid "Aucun résumé"
+msgstr "No hay sumario"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:29
+#: ../../library/ZendAfi/View/Helper/GetSendProgressJsonFor.php:29
+msgid "Aucune"
+msgstr "No"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Critiques.php:36
+#: ../../library/ZendAfi/View/Helper/Accueil/Critiques.php:35
+#: ../../library/ZendAfi/View/Helper/Accueil/Critiques.php:54
+msgid "Aucune critique récente"
+msgstr "Ninguna crítica reciente"
+
+#: ../../library/Class/Localisation.php:112
+#: ../../library/Class/Localisation.php:131
+msgid "Aucune donnée de localisation trouvée pour cet exemplaire"
+msgstr "No se han encontrado para esta copia de ubicación de datos"
+
+#: ../../application/modules/opac/controllers/RssController.php:255
+#: ../../application/modules/opac/controllers/RssController.php:231
+#: ../../application/modules/opac/controllers/RssController.php:233
+#: ../../application/modules/opac/controllers/RssController.php:252
+#: ../../application/modules/opac/controllers/RssController.php:248
+#: ../../application/modules/opac/controllers/RssController.php:249
+msgid "Aucune donnée à modérer"
+msgstr "No hay datos para moderar"
+
+#: ../../library/Class/NoticeHtml.php:199
+#: ../../library/Class/NoticeHtml.php:204
+#: ../../library/Class/NoticeHtml.php:195
+#: ../../library/Class/NoticeHtml.php:235
+#: ../../library/Class/NoticeHtml.php:105
+#: ../../library/Class/NoticeHtml.php:61
+#: ../../library/ZendAfi/View/Helper/Biographie.php:59
+#: ../../library/Class/NoticeHtml.php:50
+msgid "Aucune information n'a été trouvée"
+msgstr "No se encontró información"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Catalogue.php:33
+#: ../../library/ZendAfi/View/Helper/Accueil/Catalogue.php:52
+msgid "Aucune notice n'a été trouvée"
+msgstr "Se ha encontrado ningún registro"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:31
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:25
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:30
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:38
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:39
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:33
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:51
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:56
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:57
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:52
+msgid "Aucune notice trouvée"
+msgstr "No se encontraron registros"
+
+#: ../../library/Class/NoticeHtml.php:650
+#: ../../library/Class/NoticeHtml.php:657
+#: ../../library/Class/NoticeHtml.php:661
+#: ../../library/Class/NoticeHtml.php:652
+#: ../../library/Class/NoticeHtml.php:664
+#: ../../library/Class/NoticeHtml.php:536
+#: ../../library/Class/NoticeHtml.php:230
+#: ../../library/Class/NoticeHtml.php:229
+#: ../../library/Class/NoticeHtml.php:213
+msgid "Aucune photo n'a été trouvée"
+msgstr "No se encontraron imágenes"
+
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:343
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:286
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:249
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:289
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:296
+msgid "Aucune ressource correspondante"
+msgstr "Ningún recurso correspondiente"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:63
+#: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:64
+msgid "Aucune réservation"
+msgstr "Sin reservas"
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:4
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:6
+msgid "Aucune suggestion à modérer"
+msgstr "No se sugiere a moderada"
+
+#: ../../library/Class/NoticeHtml.php:609
+#: ../../library/Class/NoticeHtml.php:616
+#: ../../library/Class/NoticeHtml.php:621
+#: ../../library/Class/NoticeHtml.php:612
+#: ../../library/Class/NoticeHtml.php:624
+#: ../../library/Class/NoticeHtml.php:496
+#: ../../library/Class/NoticeHtml.php:190
+#: ../../library/Class/NoticeHtml.php:189
+#: ../../library/Class/NoticeHtml.php:179
+msgid "Aucune vidéo n'a été trouvée."
+msgstr "Ningún vídeo encontrado."
+
+#: ../../application/modules/telephone/views/scripts/recherche/videos.phtml:8
+#: ../../application/modules/telephone/views/scripts/recherche/videos.phtml:12
+msgid "Aucune vidéo trouvée"
+msgstr "No se encontraron videos"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:9
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:83
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:35
+#: ../../library/Class/Codification.php:97
+#: ../../library/Class/MoteurRecherche.php:344
+#: ../../library/Class/NoticeHtml.php:243
+#: ../../library/Class/Codification.php:99
+#: ../../library/Class/NoticeHtml.php:248
+#: ../../library/Class/Codification.php:100
+#: ../../library/Class/MoteurRecherche.php:360
+#: ../../library/Class/MoteurRecherche.php:372
+#: ../../library/Class/NoticeHtml.php:239
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:9
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:12
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:85
+#: ../../library/Class/NoticeHtml.php:279
+#: ../../library/Class/MoteurRecherche.php:406
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:54
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/MoteurRecherche.php:432
+#: ../../library/Class/NoticeHtml.php:149
+#: ../../library/Class/SuggestionAchat.php:75
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:34
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:74
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:14
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:10
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:44
+#: ../../library/Class/Codification.php:124
+#: ../../library/Class/CriteresRecherche.php:82
+#: ../../library/Class/NoticeHtml.php:97
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:41
+#: ../../library/ZendAfi/View/Helper/ListeNotices/TableauPanier.php:39
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:22
+#: ../../library/ZendAfi/Form/Admin/EditCms.php:48
+#: ../../library/Class/CriteresRecherche.php:107
+#: ../../library/Class/NoticeHtml.php:88
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:12
+#: ../../library/ZendAfi/Form/Admin/News.php:46
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/Class/SuggestionAchat.php:95
+msgid "Auteur"
+msgstr "Autor"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:23
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:24
+msgid "Auteur :"
+msgstr "Autor:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:455
+#: ../../application/modules/opac/controllers/RechercheController.php:488
+#: ../../application/modules/opac/controllers/RechercheController.php:513
+#: ../../application/modules/opac/controllers/RechercheController.php:571
+#: ../../application/modules/opac/controllers/RechercheController.php:626
+#: ../../application/modules/opac/controllers/RechercheController.php:414
+#: ../../application/modules/opac/controllers/RechercheController.php:410
+msgid "Auteur : %s"
+msgstr "Autor: %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:92
+msgid "Auteur et titre"
+msgstr "Autor y Título"
+
+#: ../../library/Class/Codification.php:97
+#: ../../library/Class/Codification.php:99
+#: ../../library/Class/Codification.php:100
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:27
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/Codification.php:124
+msgid "Auteur(s)"
+msgstr "Autor (s)"
+
+#: ../../application/modules/opac/views/scripts/recherche/readnotice.phtml:3
+msgid "Auteur: %s"
+msgstr "Autor: %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:30
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:104
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:101
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:124
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:137
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:36
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:149
+#: ../../library/ZendAfi/Form/Album.php:195
+#: ../../library/ZendAfi/Form/Album/Ressource.php:49
+msgid "Auteurs"
+msgstr "Autores"
+
+#: ../../application/modules/opac/controllers/AuthController.php:137
+#: ../../application/modules/opac/controllers/AuthController.php:124
+#: ../../application/modules/opac/controllers/AuthController.php:127
+msgid "Authentification"
+msgstr "Autenticación"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:160
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:165
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:191
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:185
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:181
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:190
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:199
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:177
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:193
+#: ../../library/ZendAfi/Form/Admin/News.php:87
+msgid "Autoriser les commentaires d'internautes (Mode blog) ?"
+msgstr "Permitir a los usuarios comentar (Modo blog)?"
+
+#: ../../application/modules/opac/views/scripts/bib-numerique/view-album.phtml:39
+msgid "Autre(s) fichier(s)"
+msgstr "Otro(s) archivo(s) "
+
+#: ../../library/Class/Codification.php:132
+#: ../../library/Class/Codification.php:135
+#: ../../library/Class/Codification.php:137
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:2
+msgid "Avis"
+msgstr "Comentarios"
+
+#: ../../application/modules/admin/controllers/ModoController.php:66
+#: ../../application/modules/admin/controllers/ModoController.php:61
+#: ../../application/modules/admin/controllers/ModoController.php:121
+#: ../../application/modules/admin/controllers/ModoController.php:68
+#: ../../application/modules/admin/controllers/ModoController.php:128
+#: ../../application/modules/admin/controllers/ModoController.php:103
+#: ../../application/modules/admin/controllers/ModoController.php:165
+msgid "Avis %s supprimé"
+msgstr "Comentarios %s removido"
+
+#: ../../application/modules/admin/controllers/ModoController.php:131
+#: ../../application/modules/admin/controllers/ModoController.php:138
+#: ../../application/modules/admin/controllers/ModoController.php:175
+msgid "Avis %s validé"
+msgstr "%s comentario validado"
+
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:21
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:18
+msgid "Avis des bibliothécaires"
+msgstr "Comentarios profesioniales"
+
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:30
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:28
+msgid "Avis des lecteurs"
+msgstr "Comentarios de lectores"
+
+#: ../../application/modules/opac/controllers/BlogController.php:76
+msgid "Avis supprimé"
+msgstr "Revisiones eliminados"
+
+#: ../../application/modules/opac/views/scripts/blog/readavis.phtml:2
+msgid "Avis sur la notice: %s"
+msgstr "Críticas registro: %s"
+
+#: ../../library/Class/Moderer.php:114 ../../library/Class/Moderer.php:105
+#: ../../library/Class/Moderer.php:123 ../../library/Class/Moderer.php:89
+msgid "Avis sur les articles"
+msgstr "Críticas Artículos"
+
+#: ../../library/Class/Moderer.php:110 ../../library/Class/Moderer.php:101
+#: ../../library/Class/Moderer.php:119 ../../library/Class/Moderer.php:102
+#: ../../library/Class/Moderer.php:86
+msgid "Avis sur les notices"
+msgstr "Críticas registros"
+
+#: ../../application/modules/admin/views/scripts/modo/aviscms.phtml:52
+#: ../../library/ZendAfi/View/Helper/Avis.php:216
+msgid "Avis:"
+msgstr "Opinión:"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:9
+msgid "Avr."
+msgstr "Abril"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:38
+msgid "Avril"
+msgstr "Abril"
+
+#: ../../library/Class/Codification.php:149
+#: ../../library/Class/Codification.php:157
+#: ../../library/Class/Codification.php:222
+#: ../../library/Class/Codification.php:223
+#: ../../library/Class/Codification.php:218
+msgid "Babelthèque"
+msgstr "Babelthèque"
+
+#: ../../library/Class/Codification.php:140
+#: ../../library/Class/Codification.php:143
+#: ../../library/Class/Codification.php:145
+#: ../../application/modules/telephone/controllers/RechercheController.php:42
+#: ../../application/modules/telephone/controllers/RechercheController.php:45
+#: ../../library/Class/Codification.php:153
+#: ../../application/modules/telephone/controllers/RechercheController.php:49
+#: ../../library/Class/Codification.php:218
+#: ../../library/Class/Codification.php:219
+#: ../../library/Class/Codification.php:214
+msgid "Bande-annonce"
+msgstr "Remolque"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:75
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:72
+#: ../../application/modules/telephone/views/scripts/banniere.phtml:5
+#: ../../application/modules/telephone/views/scripts/banniere.phtml:6
+msgid "Bannière"
+msgstr "Banner"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:132
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:218
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:227
+msgid "Batchs"
+msgstr "Lotes"
+
+#: ../../application/modules/telephone/views/scripts/recherche/bibliotheque.phtml:1
+msgid "Bib"
+msgstr "Babero"
+
+#: ../../library/Class/Codification.php:138
+#: ../../library/Class/Codification.php:141
+#: ../../library/Class/Codification.php:143
+msgid "Bibliographies"
+msgstr "Bibliografías"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:15
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:282
+#: ../../application/modules/admin/views/scripts/users/index.phtml:18
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:10
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:23
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:37
+#: ../../library/Class/Codification.php:98
+#: ../../library/Class/MoteurRecherche.php:343
+#: ../../library/Class/NoticeHtml.php:292
+#: ../../library/Class/NoticeHtml.php:293
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:37
+#: ../../library/Class/Codification.php:100
+#: ../../library/Class/NoticeHtml.php:297
+#: ../../library/Class/NoticeHtml.php:298
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:14
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:291
+#: ../../library/Class/Codification.php:101
+#: ../../library/Class/MoteurRecherche.php:359
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:338
+#: ../../library/Class/MoteurRecherche.php:371
+#: ../../library/Class/NoticeHtml.php:288
+#: ../../library/Class/NoticeHtml.php:289
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:335
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:10
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:13
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:20
+#: ../../library/Class/NoticeHtml.php:330
+#: ../../library/Class/NoticeHtml.php:331
+#: ../../library/Class/MoteurRecherche.php:405
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:56
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:20
+#: ../../application/modules/admin/views/scripts/multimedia/index.phtml:6
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:357
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../library/Class/Codification.php:106
+#: ../../library/Class/MoteurRecherche.php:431
+#: ../../library/Class/NoticeHtml.php:200
+#: ../../library/Class/NoticeHtml.php:201
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:369
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:24
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:25
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:30
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:15
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:11
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:42
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:43
+#: ../../library/Class/Codification.php:125
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:383
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:35
+#: ../../application/modules/admin/views/scripts/users/index.phtml:20
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:86
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:23
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:14
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+msgid "Bibliothèque"
+msgstr "Biblioteca"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:17
+msgid "Bibliothèque : "
+msgstr "Biblioteca:"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:29
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:71
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:104
+msgid "Bibliothèque numérique"
+msgstr "Biblioteca Digital"
+
+#: ../../library/Class/Codification.php:98
+#: ../../library/Class/Codification.php:100
+#: ../../library/Class/Codification.php:101
+#: ../../library/Class/Codification.php:106
+#: ../../library/Class/Codification.php:125
+msgid "Bibliothèque(s)"
+msgstr "Biblioteca (s)"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:51
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:50
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:94
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:93
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:102
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:69
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:113
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:107
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:106
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:117
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:118
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:192
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:201
+msgid "Bibliothèques"
+msgstr "Bibliotecas"
+
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:12
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:13
+msgid "Bibliothécaires"
+msgstr "Bibliotecarios"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:6
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:7
+msgid "Bienvenue"
+msgstr "Bienvenido"
+
+#: ../../application/modules/telephone/views/scripts/auth/boitelogin.phtml:7
+msgid "Bienvenue "
+msgstr "Bienvenido"
+
+#: ../../application/modules/telephone/views/scripts/recherche/biographie.phtml:2
+msgid "Biographie"
+msgstr "Biografía"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:33
+#: ../../library/Class/Codification.php:141
+#: ../../application/modules/telephone/controllers/RechercheController.php:35
+#: ../../library/Class/Codification.php:149
+#: ../../application/modules/telephone/controllers/RechercheController.php:38
+#: ../../library/Class/Codification.php:212
+#: ../../library/Class/Codification.php:213
+#: ../../library/Class/Codification.php:208
+msgid "Biographie de l'auteur"
+msgstr "Biografía del autor"
+
+#: ../../library/Class/Codification.php:136
+#: ../../library/Class/Codification.php:139
+#: ../../library/Class/Codification.php:141
+msgid "Biographies"
+msgstr "Biografías"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:41
+#: ../../application/modules/opac/views/scripts/head.phtml:42
+#: ../../application/modules/opac/views/scripts/head.phtml:50
+#: ../../application/modules/opac/views/scripts/head.phtml:59
+#: ../../application/modules/opac/views/scripts/head.phtml:72
+#: ../../application/modules/opac/views/scripts/head.phtml:75
+msgid "Blanc sur noir"
+msgstr "Blanco sobre Negro"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:45
+#: ../../application/modules/opac/views/scripts/head.phtml:46
+#: ../../application/modules/opac/views/scripts/head.phtml:54
+#: ../../application/modules/opac/views/scripts/head.phtml:63
+#: ../../application/modules/opac/views/scripts/head.phtml:78
+#: ../../application/modules/opac/views/scripts/head.phtml:81
+msgid "Bleu sur jaune"
+msgstr "Azul en amarillo"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:117
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:126
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:173
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:176
+msgid "Boite de connexion"
+msgstr "Caja de conexión"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:106
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:115
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:162
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:165
+msgid "Boite de recherche"
+msgstr "Cuadro de búsqueda"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:42
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:75
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:85
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:113
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:111
+#: ../../library/Class/Profil/Templates.php:48
+msgid "Boite par défaut de la division"
+msgstr "División por defecto Transmisión"
+
+#: ../../library/Class/Users.php:252 ../../library/Class/Users.php:266
+#: ../../library/Class/Users.php:341 ../../library/Class/Users.php:417
+#: ../../library/Class/Users.php:446 ../../library/Class/Users.php:592
+#: ../../library/Class/Users.php:659 ../../library/Class/Users.php:747
+#: ../../library/Class/Users.php:870 ../../library/Class/Users.php:885
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:1
+#: ../../library/Class/Users.php:892
+msgid "Bonjour,"
+msgstr "Hola,"
+
+#: ../../library/Class/Users.php:316 ../../library/Class/Users.php:330
+#: ../../library/Class/Users.php:405 ../../library/Class/Users.php:481
+#: ../../library/Class/Users.php:510 ../../library/Class/Users.php:659
+#: ../../library/Class/Users.php:726 ../../library/Class/Users.php:814
+#: ../../library/Class/Users.php:927 ../../library/Class/Users.php:943
+#: ../../library/Class/Users.php:950
+msgid "Bonne navigation sur le portail"
+msgstr "Buena navegación en el portal"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:147
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:156
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:203
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:202
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:216
+msgid "CSS"
+msgstr "CSS"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:68
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:123
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:128
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:137
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:233
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:242
+msgid "Cache des images"
+msgstr "Caché de imagen"
+
+#: ../../application/modules/admin/views/scripts/modules/bib_all.phtml:6
+msgid "Cacher les articles"
+msgstr "Ocultar elementos"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:2
+msgid "Calendrier"
+msgstr "Calendario"
+
+msgid "Captcha value is wrong"
+msgstr "Valor Captcha es incorrecto"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:62
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:64
+msgid "Carte"
+msgstr "Mapa"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/CarteZones.php:24
+#: ../../library/ZendAfi/View/Helper/Accueil/CarteZones.php:43
+msgid "Carte des zones"
+msgstr "Mapa Zona"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:9
+#: ../../application/modules/opac/views/scripts/catalogue/index.phtml:1
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:6
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:256
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:274
+msgid "Catalogue"
+msgstr "Catálogo"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:78
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:88
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:126
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:135
+msgid "Catalogues OPDS"
+msgstr "Catálogos OPDS"
+
+#: ../../application/modules/opac/views/scripts/etagere/appelmenu.phtml:1
+msgid "Catalogues jeunesse"
+msgstr "Catálogos de la Juventud"
+
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:7
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:56
+#: ../../application/modules/admin/views/scripts/rss/catform.phtml:5
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:14
+#: ../../application/modules/admin/views/scripts/sito/catform.phtml:6
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:10
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:8
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:65
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:59
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:55
+#: ../../library/Class/Calendar.php:182 ../../library/Class/Calendar.php:202
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:57
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:12
+#: ../../application/modules/admin/views/scripts/sito/catform.phtml:7
+#: ../../library/Class/Calendar.php:200
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:46
+#: ../../library/ZendAfi/Form/Album.php:140
+#: ../../library/ZendAfi/Form/UserGroupCategorie.php:36
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:94
+#: ../../library/Class/Calendar.php:176
+#: ../../application/modules/admin/views/scripts/rss/catform.phtml:12
+#: ../../library/ZendAfi/Form/Admin/EditCms.php:51
+#: ../../library/ZendAfi/Form/Admin/News.php:49
+msgid "Catégorie"
+msgstr "Categoría"
+
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:18
+msgid "Catégorie parente"
+msgstr "Categoría Superior"
+
+#: ../../application/modules/opac/views/scripts/bib-numerique/view-categorie.phtml:7
+msgid "Catégorie(s)"
+msgstr "Categoría (s)"
+
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:38
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:57
+msgid "Cause"
+msgstr "Causa"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:639
+#: ../../application/modules/opac/controllers/AbonneController.php:671
+#: ../../application/modules/opac/controllers/AbonneController.php:731
+#: ../../application/modules/opac/controllers/AbonneController.php:729
+msgid "Ce créneau n'est pas dans les heures d'ouverture."
+msgstr "Este nicho no es en horas."
+
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:28
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:46
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:27
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:45
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:49
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:68
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:64
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:71
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:75
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:51
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:50
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:63
+msgid "Ce menu ne contient aucune entrée."
+msgstr "Este menú no contiene ninguna entrada."
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:104
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:106
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:92
+#: ../../library/ZendAfi/View/Helper/ListeNotices/TableauPanier.php:25
+msgid "Ce panier est vide"
+msgstr "La cesta está vacía"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:257
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:266
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:313
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:310
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:332
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:344
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:358
+msgid "Ceci apparaîtra sous le nom de votre site dans les moteurs de recherche"
+msgstr ""
+"Esto aparecerá bajo el nombre de su sitio web en los motores de búsqueda"
+
+#: ../../library/Class/Codification.php:102
+#: ../../library/Class/Codification.php:104
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/MoteurRecherche.php:362
+#: ../../library/Class/MoteurRecherche.php:374
+#: ../../library/Class/MoteurRecherche.php:408
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/MoteurRecherche.php:434
+#: ../../library/Class/Codification.php:129
+msgid "Centre d'intérêt"
+msgstr "Interés"
+
+#: ../../library/Class/Codification.php:102
+#: ../../library/Class/Codification.php:104
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/Codification.php:129
+msgid "Centre(s) d'intérêt"
+msgstr "Centro (s) de interés"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:97
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:101
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:124
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:52
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:121
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:144
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:166
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:58
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:178
+msgid "Centres d'intérêt"
+msgstr "Intereses"
+
+#: ../../library/ZendAfi/View/Helper/Article/RenderAbstract.php:54
+#: ../../library/ZendAfi/View/Helper/Article/RenderAbstract.php:59
+msgid "Cet article est un brouillon"
+msgstr "Este artículo es un borrador"
+
+#: ../../library/Class/Users.php:215 ../../library/Class/Users.php:229
+#: ../../library/Class/Users.php:304 ../../library/Class/Users.php:380
+#: ../../library/Class/Users.php:409 ../../library/Class/Users.php:556
+#: ../../library/Class/Users.php:623 ../../library/Class/Users.php:711
+#: ../../library/Class/Users.php:833 ../../library/Class/Users.php:868
+#: ../../library/Class/Users.php:875
+msgid "Cet identifiant existe déjà."
+msgstr "Este identificador ya existe."
+
+#: ../../application/modules/opac/controllers/PanierController.php:119
+#: ../../application/modules/opac/controllers/PanierController.php:138
+msgid "Cette notice figure déjà dans le panier sélectionné."
+msgstr "Este registro está ya en el cesto seleccionado."
+
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:262
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:270
+#: ../../library/ZendAfi/View/Helper/Biographie.php:27
+#: ../../library/ZendAfi/View/Helper/Biographie.php:29
+msgid "Cette notice n'a pas d'auteur"
+msgstr "Este manual no tiene autor"
+
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:408
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:416
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:437
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:360
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:311
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:370
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:377
+msgid "Cette notice n'a pas d'auteur."
+msgstr "Este manual no tiene autor."
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:5
+msgid "Cette réservation convient-elle ?"
+msgstr "Este libro es apropiado?"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagSelectionChamps.php:42
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:42
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:74
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:83
+msgid "Champs disponibles"
+msgstr "Los campos disponibles"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagSelectionChamps.php:34
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:34
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:53
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:62
+#: ../../library/ZendAfi/View/Helper/Admin/TagSelectionChamps.php:71
+msgid "Champs sélectionnés"
+msgstr "Los campos seleccionados"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:109
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:31
+msgid "Champs à afficher"
+msgstr "Campos para mostrar"
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax.phtml:33
+#: ../../application/modules/opac/controllers/PanierController.php:107
+#: ../../application/modules/opac/controllers/PanierController.php:133
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:81
+msgid "Changer de panier"
+msgstr "Cambiar Basket"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:33
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:40
+msgid "Changer la disposition"
+msgstr "Cambiar diseño"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:131
+#: ../../library/Class/NoticeHtml.php:81
+#: ../../library/Class/NoticeHtml.php:122
+#: ../../library/Class/NoticeHtml.php:176
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:159
+#: ../../library/Class/NoticeHtml.php:181
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:167
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:183
+#: ../../library/Class/NoticeHtml.php:172
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:182
+#: ../../library/Class/NoticeHtml.php:87
+#: ../../library/Class/NoticeHtml.php:158
+#: ../../library/Class/NoticeHtml.php:211
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:199
+#: ../../library/ZendAfi/View/Helper/Notice/Blocs.php:63
+#: ../../library/ZendAfi/View/Helper/Notice/Onglets.php:41
+#: ../../library/ZendAfi/View/Helper/Notice/Blocs.php:66
+#: ../../library/ZendAfi/View/Helper/Notice/Onglets.php:44
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:175
+#: ../../library/Class/NoticeHtml.php:48
+#: ../../library/ZendAfi/View/Helper/ListeNotices/Accordeon.php:56
+#: ../../library/Class/NoticeHtml.php:42
+msgid "Chargement en cours"
+msgstr "Cargando"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:121
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:122
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:140
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:139
+msgid "Chargement en cours..."
+msgstr "Loading ..."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:664
+#: ../../application/modules/opac/controllers/AbonneController.php:696
+#: ../../application/modules/opac/controllers/AbonneController.php:756
+#: ../../application/modules/opac/controllers/AbonneController.php:754
+msgid "Choisir"
+msgstr "Elegir"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:7
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:12
+msgid "Choisir des medias"
+msgstr "Elegir los medios de comunicación"
+
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:63
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:61
+msgid "Choisissez le domaine de départ"
+msgstr "Seleccione la partida campo"
+
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:3
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:26
+msgid "Clef"
+msgstr "Clave"
+
+#: ../../library/Class/NoticeHtml.php:703
+#: ../../library/Class/NoticeHtml.php:721
+#: ../../library/Class/NoticeHtml.php:710
+#: ../../library/Class/NoticeHtml.php:728
+#: ../../library/Class/NoticeHtml.php:739
+#: ../../library/Class/NoticeHtml.php:712
+#: ../../library/Class/NoticeHtml.php:730
+#: ../../library/Class/NoticeHtml.php:724
+#: ../../library/Class/NoticeHtml.php:742
+#: ../../library/Class/NoticeHtml.php:596
+#: ../../library/Class/NoticeHtml.php:614
+#: ../../library/Class/NoticeHtml.php:290
+#: ../../library/Class/NoticeHtml.php:304
+#: ../../library/Class/NoticeHtml.php:289
+#: ../../library/Class/NoticeHtml.php:303
+#: ../../library/Class/NoticeHtml.php:271
+#: ../../library/Class/NoticeHtml.php:285
+msgid "Clip vidéo"
+msgstr "Película"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:130
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:135
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:161
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:155
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:151
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:160
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
+msgid "Cliquez ici pour modifier"
+msgstr "Haga clic aquí para cambiar"
+
+#: ../../library/Class/Etagere.php:47
+msgid "Cliquez sur l'image"
+msgstr "Haga clic en la imagen"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:36
+msgid "Code Anti-spam :"
+msgstr "Código anti-spam:"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:48
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:47
+#: ../../application/modules/opac/controllers/IndexController.php:84
+#: ../../application/modules/opac/controllers/IndexController.php:100
+#: ../../application/modules/opac/controllers/IndexController.php:105
+#: ../../application/modules/opac/controllers/AbonneController.php:377
+#: ../../application/modules/opac/controllers/IndexController.php:97
+#: ../../application/modules/opac/controllers/IndexController.php:96
+#: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../library/ZendAfi/Form/ContactForm.php:69
+msgid "Code postal"
+msgstr "Código Postal"
+
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:42
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:44
+msgid "Code-barres / ISBN"
+msgstr "Código de barras / ISBN"
+
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/Codification.php:107
+#: ../../library/Class/Codification.php:108
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:29
+#: ../../library/Class/Codification.php:113
+#: ../../library/Class/Codification.php:133
+msgid "Collation"
+msgstr "Colación"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:39
+#: ../../library/Class/Codification.php:99
+#: ../../library/Class/Codification.php:101
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:74
+#: ../../library/Class/Codification.php:102
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:58
+#: ../../library/Class/Codification.php:107
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:48
+#: ../../library/Class/Codification.php:126
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:80
+msgid "Collection"
+msgstr "Colección"
+
+#: ../../library/Class/Codification.php:99
+#: ../../library/Class/Codification.php:101
+#: ../../library/Class/Codification.php:102
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:30
+#: ../../library/Class/Codification.php:107
+#: ../../library/Class/Codification.php:126
+msgid "Collection(s)"
+msgstr "Collection (s)"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:72
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:75
+#: ../../library/ZendAfi/Form/Album.php:209
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:105
+msgid "Collections"
+msgstr "Colecciones"
+
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:52
+msgid "Commence le"
+msgstr "Empieza"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:85
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:91
+msgid "Commence par"
+msgstr "Empieza con"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:98
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+msgid "Comment se procurer ce document "
+msgstr "Cómo obtener el documento"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:255
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:27
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:22
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:264
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:311
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:308
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:330
+#: ../../library/Class/SuggestionAchat.php:80
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:342
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:24
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:356
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:81
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:34
+#: ../../library/Class/SuggestionAchat.php:102
+msgid "Commentaire"
+msgstr "Comentario"
+
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:22
+msgid "Commentaires :"
+msgstr "Comentarios:"
+
+#: ../../library/Class/CommSigb.php:172 ../../library/Class/CommSigb.php:174
+msgid "Communication SIGB indisponible"
+msgstr "Comunicación ILS disponible"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:42
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:45
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:48
+msgid "Complet"
+msgstr "No hay vacantes"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:41
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:44
+msgid "Compte"
+msgstr "Cuenta"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:72
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:74
+msgid "Conditions inscription :"
+msgstr "Condiciones de inscripción:"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:114
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:113
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+msgid "Configuration"
+msgstr "Configuración"
+
+#: ../../application/modules/admin/controllers/ProfilController.php:539
+#: ../../application/modules/admin/controllers/ProfilController.php:550
+#: ../../application/modules/admin/controllers/ProfilController.php:552
+msgid "Configuration des pages appliquée à tous les autres profils."
+msgstr "Página de configuración aplica a todos los otros perfiles."
+
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:38
+msgid "Configurer le plan d'accès"
+msgstr "Configurar el acceso mapa"
+
+#: ../../application/modules/telephone/views/scripts/abonne/cancel-hold.phtml:2
+#: ../../application/modules/opac/controllers/AbonneController.php:745
+#: ../../application/modules/opac/controllers/AbonneController.php:777
+#: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../application/modules/opac/controllers/AbonneController.php:835
+msgid "Confirmation"
+msgstr "Confirmación"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:45
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:13
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:64
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:70
+msgid "Confirmer"
+msgstr "Confirmar"
+
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:19
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:19
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:15
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:17
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:21
+msgid "Confirmer votre mot de passe"
+msgstr "Confirmar Contraseña"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:386
+#: ../../application/modules/opac/controllers/AbonneController.php:394
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+#: ../../application/modules/opac/controllers/AbonneController.php:428
+#: ../../application/modules/opac/controllers/AbonneController.php:419
+#: ../../application/modules/opac/controllers/AbonneController.php:395
+#: ../../application/modules/opac/controllers/AbonneController.php:414
+#: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:472
+msgid "Confirmez le mot de passe"
+msgstr "Confirmar Contraseña"
+
+#: ../../application/modules/opac/controllers/AuthController.php:86
+#: ../../application/modules/opac/controllers/AuthController.php:89
+#: ../../application/modules/telephone/controllers/AuthController.php:43
+msgid "Connexion"
+msgstr "Iniciar sesión"
+
+#: ../../application/modules/admin/controllers/BibController.php:566
+#: ../../application/modules/admin/controllers/BibController.php:574
+#: ../../application/modules/admin/controllers/BibController.php:593
+#: ../../application/modules/admin/controllers/BibController.php:590
+msgid "Constitution du plan d'accès"
+msgstr "Constitución del plan de acceso"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/viewnotice.phtml:12
+#: ../../library/Class/CriteresRecherche.php:86
+#: ../../library/Class/CriteresRecherche.php:110
+#: ../../library/Class/CriteresRecherche.php:111
+msgid "Consultation"
+msgstr "Consulta"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:45
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:107
+msgid "Contenu"
+msgstr "Contenido"
+
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:1
+msgid "Contenus liés à l'article"
+msgstr "Contenidos relacionados artículo"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:79
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:116
+msgid "Coord."
+msgstr "Coord."
+
+#: ../../application/modules/telephone/views/scripts/recherche/bibliotheque.phtml:4
+msgid "Coordonnées"
+msgstr "Información del contacto"
+
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:28
+msgid "Coordonnées carte"
+msgstr "Coordenadas Mapa"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:103
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:107
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:119
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:118
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:146
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:222
+msgid "Copier le code suivant sur le site où vous voulez afficher le kiosque"
+msgstr "Copie el código siguiente en el sitio en el que desea mostrar kiosco"
+
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:29
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:29
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:23
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:25
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:31
+msgid "Copiez le code anti-spam"
+msgstr "Copie el código anti-spam"
+
+#: ../../library/Class/NoticeHtml.php:297
+#: ../../library/Class/NoticeHtml.php:302
+#: ../../library/Class/NoticeHtml.php:293
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:25
+#: ../../library/Class/NoticeHtml.php:335
+#: ../../library/Class/NoticeHtml.php:205
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:36
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:47
+#: ../../library/ZendAfi/Form/Album.php:151
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:40
+msgid "Cote"
+msgstr "Probabilidades"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:61
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:57
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:54
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:70
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:83
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:95
+msgid "Cote - depuis"
+msgstr "Cote - desde"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:457
+#: ../../application/modules/opac/controllers/RechercheController.php:490
+#: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:573
+#: ../../application/modules/opac/controllers/RechercheController.php:628
+#: ../../application/modules/opac/controllers/RechercheController.php:416
+#: ../../application/modules/opac/controllers/RechercheController.php:412
+msgid "Cote : %s"
+msgstr "Cote: %s"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:156
+msgid "Cotes - depuis"
+msgstr "Cotizaciones - desde"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:57
+msgid "Couche"
+msgstr "Capa"
+
+msgid "Could not open socket"
+msgstr "No se pudo abrir socket"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:99
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:108
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:155
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:158
+msgid "Couleur des liens"
+msgstr "Color de los vínculos"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:92
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:101
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:148
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:151
+msgid "Couleur du texte"
+msgstr "Color del texto"
+
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:22
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:24
+msgid "Couleur légende"
+msgstr "Leyenda en color"
+
+#: ../../application/modules/admin/controllers/ModoController.php:676
+#: ../../application/modules/admin/controllers/ModoController.php:744
+msgid "Courriel envoyé à: "
+msgstr "Correo electrónico enviado a:"
+
+#: ../../library/ZendAfi/Form/CreerPanier.php:35
+msgid "Creer le panier"
+msgstr "Explore la canasta"
+
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:6
+msgid "Critique"
+msgstr "Críticos"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:29
+#: ../../application/modules/telephone/views/scripts/blog/viewcritiques.phtml:2
+#: ../../library/Class/Codification.php:137
+#: ../../application/modules/telephone/controllers/RechercheController.php:31
+#: ../../library/Class/Codification.php:145
+#: ../../application/modules/telephone/controllers/RechercheController.php:34
+#: ../../library/Class/Codification.php:208
+#: ../../library/Class/Codification.php:209
+#: ../../library/Class/Codification.php:204
+msgid "Critiques"
+msgstr "Comentarios"
+
+#: ../../application/modules/telephone/views/scripts/blog/viewauteur.phtml:2
+msgid "Critiques de %s"
+msgstr "Críticas de %s"
+
+#: ../../application/modules/opac/controllers/RssController.php:321
+#: ../../application/modules/opac/controllers/RssController.php:259
+#: ../../application/modules/opac/controllers/RssController.php:256
+#: ../../application/modules/opac/controllers/RssController.php:258
+#: ../../application/modules/opac/controllers/RssController.php:277
+#: ../../application/modules/opac/controllers/RssController.php:266
+#: ../../application/modules/opac/controllers/RssController.php:268
+msgid "Critiques de la sélection: %s"
+msgstr "Críticas de selección: %s"
+
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:2
+msgid "Critiques rédigées par "
+msgstr "Críticas escrito por"
+
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:2
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:6
+msgid "Critiques rédigées par %s"
+msgstr "Opiniones escritas por %s"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:74
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:78
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:96
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:93
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:116
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:129
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:141
+msgid "Critères d'indexation"
+msgstr "Criterios de indexación"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:132
+msgid "Critères de reconnaissance"
+msgstr "Criterios de reconocimiento"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:13
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:32
+msgid "Critères de sélection"
+msgstr "Criterios de selección"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:28
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:25
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:41
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:54
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:66
+msgid "Critères généraux"
+msgstr "Criterios generales"
+
+#: ../../application/modules/opac/controllers/PanierController.php:299
+#: ../../application/modules/opac/controllers/PanierController.php:371
+msgid "Création d'un nouveau panier"
+msgstr "Creación de una nueva cesta"
+
+#: ../../application/modules/opac/controllers/PanierController.php:320
+#: ../../application/modules/opac/controllers/PanierController.php:421
+msgid "Création panier"
+msgstr "Creación carrito"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:6
+msgid "Créer un nouveau panier"
+msgstr "Crear una nueva caja de luz"
+
+#: ../../application/modules/admin/views/scripts/newsletter/index.phtml:4
+msgid "Créer une lettre d'information"
+msgstr "Crear un boletín de noticias"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:26
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:45
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:207
+msgid "Customer has no valid subscription"
+msgstr "Cliente no tiene suscripción válida"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:21
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:40
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:202
+msgid "Customer has overdue loans"
+msgstr "Cliente tiene préstamos vencidos"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:27
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:46
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:208
+msgid "Customer has overdue payments"
+msgstr "Cliente tiene pagos atrasados"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:22
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:41
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:203
+msgid "Customer has reached maximum number of reservations"
+msgstr "Cliente ha alcanzado el número máximo de reservas"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:10
+msgid "Dans ce territoire."
+msgstr "En este territorio."
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:15
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:17
+msgid "Dans cette bibliothèque."
+msgstr "En esta biblioteca."
+
+#: ../../library/Class/Notice.php:1789 ../../library/Class/Notice.php:1620
+msgid "Dans le panier %s"
+msgstr "%s en el carrito"
+
+#: ../../library/Class/Notice.php:1790 ../../library/Class/Notice.php:1621
+msgid "Dans les paniers %s"
+msgstr "En cestas %s"
+
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:13
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:15
+msgid "Dans tous les territoires."
+msgstr "En todas las jurisdicciones."
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:20
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:22
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:24
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:25
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:33
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:66
+msgid "Date"
+msgstr "Fecha"
+
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:28
+msgid "Date de création"
+msgstr "Fecha de creación"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:95
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:75
+#: ../../library/Class/CriteresRecherche.php:85
+#: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/Class/CriteresRecherche.php:110
+msgid "Date de nouveauté"
+msgstr "Fecha de novedad"
+
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:47
+msgid "Date de retour"
+msgstr "Fecha de regreso"
+
+#: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:30
+msgid "De"
+msgstr "De"
+
+#: ../../application/modules/admin/views/scripts/frbr-linktype/index.phtml:18
+msgid "De A à B"
+msgstr "De A a B"
+
+#: ../../application/modules/admin/views/scripts/frbr-linktype/index.phtml:18
+msgid "De B à A"
+msgstr "de B a A"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:5
+msgid "Demande de réservation d'un document du réseau:"
+msgstr "Solicitud de reserva de un documento de la red:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:466
+#: ../../application/modules/opac/controllers/RechercheController.php:469
+#: ../../application/modules/opac/controllers/RechercheController.php:499
+#: ../../application/modules/opac/controllers/RechercheController.php:502
+#: ../../application/modules/opac/controllers/RechercheController.php:524
+#: ../../application/modules/opac/controllers/RechercheController.php:527
+#: ../../application/modules/opac/controllers/RechercheController.php:582
+#: ../../application/modules/opac/controllers/RechercheController.php:592
+#: ../../application/modules/opac/controllers/RechercheController.php:637
+#: ../../application/modules/opac/controllers/RechercheController.php:647
+#: ../../application/modules/opac/controllers/RechercheController.php:425
+#: ../../application/modules/opac/controllers/RechercheController.php:435
+#: ../../application/modules/opac/controllers/RechercheController.php:421
+#: ../../application/modules/opac/controllers/RechercheController.php:431
+msgid "Demande de réservation de document"
+msgstr "Documento de solicitud de reserva"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:30
+#: ../../library/Class/Moderer.php:124
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:30
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:32
+#: ../../library/Class/Moderer.php:115 ../../library/Class/Moderer.php:133
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:60
+#: ../../library/Class/Moderer.php:111
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:64
+#: ../../library/Class/Moderer.php:95
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:83
+msgid "Demandes d'inscription"
+msgstr "Las solicitudes de inscripción"
+
+#: ../../library/Class/SuggestionAchat.php:78
+#: ../../library/Class/SuggestionAchat.php:99
+msgid "Demandeur"
+msgstr "Solicitante"
+
+#: ../../application/modules/opac/controllers/CmsController.php:145
+#: ../../application/modules/opac/controllers/CmsController.php:129
+#: ../../application/modules/opac/controllers/CmsController.php:128
+#: ../../application/modules/opac/controllers/CmsController.php:154
+#: ../../application/modules/opac/controllers/CmsController.php:170
+#: ../../application/modules/opac/controllers/CmsController.php:171
+#: ../../application/modules/opac/controllers/CmsController.php:172
+msgid "Derniers Articles"
+msgstr "Últimas Noticias"
+
+#: ../../application/modules/opac/controllers/RssController.php:94
+#: ../../application/modules/opac/controllers/RssController.php:99
+#: ../../application/modules/opac/controllers/RssController.php:118
+#: ../../application/modules/opac/controllers/RssController.php:113
+msgid "Derniers Fils RSS"
+msgstr "Últimas RSS Feeds"
+
+#: ../../application/modules/opac/controllers/SitoController.php:48
+#: ../../application/modules/opac/controllers/SitoController.php:67
+#: ../../application/modules/opac/controllers/SitoController.php:62
+#: ../../application/modules/opac/controllers/SitoController.php:59
+msgid "Derniers Sites"
+msgstr "Nuevos Enlaces"
+
+#: ../../application/modules/opac/controllers/RssController.php:273
+#: ../../application/modules/opac/controllers/RssController.php:288
+msgid "Derniers articles"
+msgstr "Últimas Noticias"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:35
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:33
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:34
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:53
+msgid "Derniers fils RSS ajoutés"
+msgstr "RSS agregado último hijo"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:37
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:62
+msgid "Derniers sites ajoutés"
+msgstr "Sitios añadidos recientemente"
+
+#: ../../application/modules/admin/views/scripts/batch/index.phtml:10
+#: ../../application/modules/admin/views/scripts/batch/index.phtml:11
+msgid "Dernière exécution"
+msgstr "Última ejecución"
+
+#: ../../application/modules/admin/views/scripts/cms/_newsform_head.phtml:30
+#: ../../application/modules/admin/views/scripts/cms/_newsform_head.phtml:29
+#: ../../application/modules/admin/views/scripts/cms/_newsform_head.phtml:17
+#: ../../application/modules/admin/views/scripts/cms/_newsform_head.phtml:19
+msgid "Dernière modification"
+msgstr "Última modificación"
+
+#: ../../application/modules/opac/controllers/BlogController.php:59
+#: ../../application/modules/opac/controllers/RssController.php:333
+#: ../../application/modules/opac/controllers/BlogController.php:63
+#: ../../application/modules/opac/controllers/RssController.php:271
+#: ../../application/modules/opac/controllers/BlogController.php:62
+#: ../../application/modules/opac/controllers/BlogController.php:81
+#: ../../application/modules/opac/controllers/BlogController.php:91
+#: ../../application/modules/opac/controllers/BlogController.php:95
+msgid "Dernières critiques"
+msgstr "Reseñas más recientes"
+
+#: ../../application/modules/opac/controllers/RssController.php:334
+#: ../../application/modules/opac/controllers/RssController.php:272
+msgid "Dernières critiques dans le catalogue du portail"
+msgstr "Últimos comentarios en el catálogo del portal"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/plansmaj.phtml:21
+#: ../../application/modules/admin/views/scripts/profil/menusmaj.phtml:21
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:21
+#: ../../library/ZendAfi/Form/Album.php:46
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:26
+#: ../../library/ZendAfi/Form/Album.php:44
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:38
+#: ../../library/ZendAfi/Form/Album.php:52
+#: ../../library/ZendAfi/Form/Admin/Formation.php:35
+msgid "Description"
+msgstr "Descripción"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:27
+#: ../../library/Class/Codification.php:136
+#: ../../application/modules/telephone/controllers/RechercheController.php:29
+#: ../../library/Class/Codification.php:144
+#: ../../application/modules/telephone/controllers/RechercheController.php:32
+#: ../../library/Class/Codification.php:207
+#: ../../library/Class/Codification.php:208
+#: ../../library/Class/Codification.php:203
+msgid "Description du document"
+msgstr "Descripción del Documento"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:30
+msgid "Destinataire"
+msgstr "Destinatario"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:46
+msgid "Deway / pcdm4"
+msgstr "Tardanza / pcdm4"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:37
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:40
+#: ../../library/Class/Codification.php:100
+#: ../../library/Class/MoteurRecherche.php:345
+#: ../../library/Class/Codification.php:102
+#: ../../library/Class/Codification.php:103
+#: ../../library/Class/MoteurRecherche.php:361
+#: ../../library/Class/MoteurRecherche.php:373
+#: ../../library/Class/MoteurRecherche.php:407
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:56
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:59
+#: ../../library/Class/Codification.php:108
+#: ../../library/Class/MoteurRecherche.php:433
+msgid "Dewey"
+msgstr "Dewey"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:52
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:46
+msgid "Dewey / pcdm4"
+msgstr "Dewey / pcdm4"
+
+#: ../../library/Class/Codification.php:143
+#: ../../library/Class/Codification.php:151
+#: ../../library/Class/Codification.php:216
+#: ../../library/Class/Codification.php:217
+#: ../../library/Class/Codification.php:212
+msgid "Discographie"
+msgstr "Discografía"
+
+#: ../../library/Class/NoticeHtml.php:751
+#: ../../library/Class/NoticeHtml.php:758
+#: ../../library/Class/NoticeHtml.php:769
+#: ../../library/Class/NoticeHtml.php:760
+#: ../../library/Class/NoticeHtml.php:772
+#: ../../library/Class/NoticeHtml.php:644
+#: ../../library/Class/NoticeHtml.php:338
+#: ../../library/Class/NoticeHtml.php:337
+#: ../../library/Class/NoticeHtml.php:319
+msgid "Discographie complète de"
+msgstr "Discografía completa"
+
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:41
+msgid "Disponibilite"
+msgstr "Disponibilidad"
+
+#: ../../library/Class/NoticeHtml.php:298
+#: ../../library/Class/NoticeHtml.php:303
+#: ../../library/Class/NoticeHtml.php:294
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:30
+#: ../../library/Class/NoticeHtml.php:336
+#: ../../library/Class/NoticeHtml.php:206
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:48
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:51
+msgid "Disponibilité"
+msgstr "Disponibilidad"
+
+#: ../../library/Class/WebService/SIGB/Dynix/LookupMyAccountInfoResponseReader.php:97
+msgid "Disponible"
+msgstr "Disponible"
+
+#: ../../library/ZendAfi/Form/Album.php:170
+msgid "Distributeur"
+msgstr "Distribuidor"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Navigation.php:33
+#: ../../library/ZendAfi/View/Helper/Notice/Navigation.php:32
+msgid "Document précédent"
+msgstr "Registro anterior"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Navigation.php:43
+msgid "Document suivant"
+msgstr "Próximo registro"
+
+#: ../../library/Class/Codification.php:213
+#: ../../library/Class/Codification.php:214
+#: ../../library/Class/Codification.php:209
+msgid "Documents de la même série"
+msgstr "Los documentos en la misma serie"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:353
+#: ../../application/modules/opac/controllers/RechercheController.php:373
+#: ../../application/modules/opac/controllers/RechercheController.php:398
+#: ../../application/modules/opac/controllers/RechercheController.php:457
+#: ../../application/modules/opac/controllers/RechercheController.php:512
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:113
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:126
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:115
+msgid "Documents parus "
+msgstr "Documentos emitidos"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:34
+#: ../../library/Class/Codification.php:142
+#: ../../application/modules/telephone/controllers/RechercheController.php:36
+#: ../../library/Class/Codification.php:150
+#: ../../application/modules/telephone/controllers/RechercheController.php:39
+#: ../../library/Class/Codification.php:215
+#: ../../library/Class/Codification.php:216
+#: ../../library/Class/Codification.php:211
+msgid "Documents similaires"
+msgstr "Documentos similares"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:6
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:10
+msgid "Domaine"
+msgstr "Campo"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:78
+#: ../../application/modules/admin/controllers/CatalogueController.php:96
+msgid "Domaine %s ajouté"
+msgstr "Dominio %s añadido"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:99
+#: ../../application/modules/admin/controllers/CatalogueController.php:123
+#: ../../application/modules/admin/controllers/CatalogueController.php:128
+#: ../../application/modules/admin/controllers/CatalogueController.php:154
+msgid "Domaine %s sauvegardé"
+msgstr "Dominio %s salvos"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:21
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:33
+msgid "Domaine parent"
+msgstr "Dominio primario"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:25
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:25
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:56
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:60
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:70
+#: ../../library/Class/Catalogue.php:1084
+#: ../../library/Class/Catalogue.php:1101
+#: ../../library/Class/Catalogue.php:1093
+#: ../../library/Class/Catalogue.php:1110
+msgid "Domaines"
+msgstr "Dominios"
+
+#: ../../library/Class/NoticeHtml.php:798
+#: ../../library/Class/NoticeHtml.php:805
+#: ../../library/Class/NoticeHtml.php:816
+#: ../../library/Class/NoticeHtml.php:807
+#: ../../library/Class/NoticeHtml.php:819
+#: ../../library/Class/NoticeHtml.php:691
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:40
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:114
+msgid "Donnez ou modifiez votre avis"
+msgstr "Añadir o editar comentario"
+
+#: ../../application/modules/admin/views/scripts/index/index.phtml:44
+#: ../../application/modules/opac/controllers/RssController.php:240
+#: ../../application/modules/opac/controllers/RssController.php:216
+#: ../../application/modules/opac/controllers/RssController.php:218
+#: ../../application/modules/admin/views/scripts/index/index.phtml:38
+#: ../../application/modules/opac/controllers/RssController.php:237
+#: ../../application/modules/admin/views/scripts/index/index.phtml:40
+#: ../../application/modules/opac/controllers/RssController.php:233
+msgid "Données en attente de modération"
+msgstr "Datos moderación en espera"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:146
+#: ../../application/modules/admin/controllers/UsergroupController.php:169
+#: ../../application/modules/admin/controllers/UsergroupController.php:198
+#: ../../library/ZendAfi/Form/Admin/UserGroup.php:59
+msgid "Droits"
+msgstr "Derechos"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:67
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:65
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:30
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:32
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:51
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:73
+msgid "Du %s au %s"
+msgstr "Desde %s para %s"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:128
+#: ../../application/modules/admin/controllers/CatalogueController.php:159
+msgid "Duplication du domaine: %s"
+msgstr "La duplicación del dominio: %s"
+
+#: ../../application/modules/admin/controllers/CmsController.php:159
+#: ../../application/modules/admin/controllers/CmsController.php:160
+msgid "Dupliquer l'article: "
+msgstr "Duplicar el artículo:"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:6
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:9
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:10
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:7
+msgid "Durée"
+msgstr "Duración"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:41
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:92
+msgid "Durée de la session"
+msgstr "Duración de la sesión"
+
+#: ../../library/ZendAfi/Form/Album.php:157
+msgid "Durée totale"
+msgstr "Duración total"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:124
+msgid "Dynamique"
+msgstr "Dinámica"
+
+#: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
+msgid "Début"
+msgstr "Comenzando"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:45
+msgid "Début après-midi"
+msgstr "Temprano en la tarde"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:43
+msgid "Début matinée"
+msgstr "Temprano en la mañana"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:46
+msgid "Déc"
+msgstr "Diciembre"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:17
+msgid "Déc."
+msgstr "Diciembre"
+
+#: ../../application/modules/admin/controllers/LieuController.php:29
+#: ../../application/modules/admin/views/scripts/lieu/index.phtml:4
+msgid "Déclarer un nouveau lieu"
+msgstr "Declarar un nuevo lugar"
+
+#: ../../application/modules/telephone/views/scripts/auth/boitelogin.phtml:10
+#: ../../library/ZendAfi/View/Helper/Abonne/Deconnexion.php:28
+msgid "Déconnexion"
+msgstr "Salir"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:85
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:88
+msgid "Défilement des images"
+msgstr "Imágenes que se desplazan"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:32
+#: ../../application/modules/admin/controllers/CatalogueController.php:46
+msgid "Définition des domaines"
+msgstr "Identificación de áreas"
+
+#: ../../application/modules/opac/views/scripts/error/404.phtml:4
+#: ../../application/modules/opac/controllers/CmsController.php:124
+#: ../../application/modules/opac/controllers/CmsController.php:125
+#: ../../application/modules/opac/controllers/CmsController.php:121
+#: ../../application/modules/opac/controllers/CmsController.php:126
+#: ../../application/modules/telephone/views/scripts/error/404.phtml:4
+msgid "Désolé, cette page n'existe pas"
+msgstr "Lo sentimos, esa página no existe"
+
+#: ../../application/modules/opac/views/scripts/abonne/_session.phtml:10
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:138
+msgid "Détails de la session"
+msgstr "Detalles de la sesión"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:360
+#: ../../application/modules/opac/controllers/AbonneController.php:368
+#: ../../application/modules/opac/controllers/AbonneController.php:376
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+#: ../../application/modules/opac/controllers/AbonneController.php:393
+#: ../../application/modules/opac/controllers/AbonneController.php:369
+#: ../../application/modules/opac/controllers/AbonneController.php:379
+#: ../../library/Class/SuggestionAchat.php:79
+#: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../library/Class/SuggestionAchat.php:100
+msgid "E-Mail"
+msgstr "E-Mail"
+
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:24
+#: ../../application/modules/opac/controllers/IndexController.php:92
+#: ../../application/modules/opac/controllers/IndexController.php:108
+#: ../../application/modules/opac/controllers/IndexController.php:113
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:24
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:19
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:21
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:26
+#: ../../application/modules/opac/controllers/IndexController.php:105
+#: ../../application/modules/opac/controllers/IndexController.php:104
+#: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../library/ZendAfi/Form/ContactForm.php:75
+msgid "E-mail"
+msgstr "E-mail"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:68
+msgid "E-mail de réception des suggestions d'achat"
+msgstr "Un correo electrónico la recepción de sugerencias de compra"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:68
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:65
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:63
+msgid "E-mail du Webmestre"
+msgstr "E-mail Webmaster"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:33
+msgid "Ean"
+msgstr "EAN"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:84
+msgid "Echelle"
+msgstr "Escala"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:54
+msgid "Ecouter l'album"
+msgstr "Escucha el disco"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:38
+#: ../../library/Class/Codification.php:101
+#: ../../library/Class/Codification.php:103
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:63
+#: ../../library/Class/Codification.php:104
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:57
+#: ../../library/Class/Codification.php:109
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:47
+#: ../../library/Class/Codification.php:128
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:69
+msgid "Editeur"
+msgstr "Editorial"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:24
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:27
+msgid "Editeur :"
+msgstr "Editorial:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:456
+#: ../../application/modules/opac/controllers/RechercheController.php:489
+#: ../../application/modules/opac/controllers/RechercheController.php:514
+#: ../../application/modules/opac/controllers/RechercheController.php:572
+#: ../../application/modules/opac/controllers/RechercheController.php:627
+#: ../../application/modules/opac/controllers/RechercheController.php:415
+#: ../../application/modules/opac/controllers/RechercheController.php:411
+msgid "Editeur : %s"
+msgstr "Editorial: %s"
+
+#: ../../library/Class/Codification.php:101
+#: ../../library/Class/Codification.php:103
+#: ../../library/Class/Codification.php:104
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:18
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:28
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:13
+#: ../../library/Class/Codification.php:109
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:14
+#: ../../library/Class/Codification.php:128
+msgid "Editeur(s)"
+msgstr "Publisher (s)"
+
+#: ../../library/ZendAfi/Form/Album.php:203
+msgid "Editeurs"
+msgstr "Editores"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:177
+msgid "Edition"
+msgstr "Edición"
+
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:48
+msgid "Effectif maximum atteint"
+msgstr "Máximo afectados"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:17
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:25
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:43
+#: ../../library/ZendAfi/View/Helper/Telephone/ListeNotices.php:44
+msgid "Elargir la recherche sur tous les mots"
+msgstr "Ampliar su búsqueda a todas las palabras"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:24
+msgid "Email"
+msgstr "E-mail"
+
+#: ../../library/Class/NoticeHtml.php:295
+#: ../../library/Class/NoticeHtml.php:300
+#: ../../library/Class/NoticeHtml.php:291
+#: ../../library/Class/NoticeHtml.php:333
+#: ../../library/Class/NoticeHtml.php:203
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:48
+msgid "Emplacement"
+msgstr "Ubicación"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:151
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:88
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:85
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:108
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:121
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:133
+msgid "Emplacements"
+msgstr "Ubicaciones"
+
+#: ../../library/ZendAfi/View/Helper/Avis.php:103
+#: ../../library/ZendAfi/View/Helper/Avis.php:105
+#: ../../library/ZendAfi/View/Helper/Avis.php:107
+#: ../../library/ZendAfi/View/Helper/Avis.php:123
+#: ../../library/ZendAfi/View/Helper/Avis.php:152
+#: ../../library/ZendAfi/View/Helper/Avis.php:199
+msgid "En attente de modération"
+msgstr "Opinión pendiente"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:419
+#: ../../application/modules/opac/controllers/AbonneController.php:427
+#: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:461
+#: ../../application/modules/opac/controllers/AbonneController.php:452
+#: ../../application/modules/opac/controllers/AbonneController.php:428
+msgid "Enregistrer"
+msgstr "Registro"
+
+#: ../../application/modules/admin/views/scripts/oai/index.phtml:25
+msgid "Entrepot"
+msgstr "Almacén"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:74
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:79
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:89
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:130
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:139
+msgid "Entrepôts OAI"
+msgstr "OAI"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:263
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:272
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:319
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:316
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:338
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:350
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:364
+msgid ""
+"Entrez la liste des mots-clef et expressions qui caractérisent votre site "
+"séparés par des virgules."
+msgstr ""
+"Escriba una lista de palabras clave y frases que caracterizan su sitio "
+"separado por comas."
+
+#: ../../application/modules/opac/controllers/AuthController.php:30
+#: ../../application/modules/opac/controllers/AuthController.php:48
+#: ../../application/modules/opac/controllers/AuthController.php:68
+#: ../../application/modules/opac/controllers/AuthController.php:67
+#: ../../application/modules/opac/controllers/AuthController.php:64
+msgid "Entrez votre identifiant S.V.P."
+msgstr "Introduzca su nombre de usuario S.V.P."
+
+#: ../../application/modules/admin/views/scripts/auth/login.phtml:8
+msgid "Entrez votre identité S.V.P."
+msgstr "Escriba su identidad S.V.P."
+
+#: ../../application/modules/opac/controllers/AuthController.php:33
+#: ../../application/modules/opac/controllers/AuthController.php:51
+#: ../../application/modules/opac/controllers/AuthController.php:71
+#: ../../application/modules/opac/controllers/AuthController.php:70
+#: ../../application/modules/opac/controllers/AuthController.php:67
+msgid "Entrez votre mot de passe S.V.P."
+msgstr "Ingrese su contraseña S.V.P."
+
+#: ../../application/modules/admin/controllers/AuthController.php:39
+#: ../../application/modules/admin/controllers/AuthController.php:49
+msgid "Entrez votre nom d'utilisateur puis validez S.V.P."
+msgstr "Introduzca su nombre de usuario, por favor, confirmar"
+
+#: ../../application/modules/admin/views/scripts/profil/menusmaj.phtml:38
+msgid "Entrées"
+msgstr "Entradas"
+
+#: ../../library/Class/Bib.php:38 ../../library/Class/Bib.php:39
+#: ../../library/Class/Bib.php:46 ../../library/Class/Bib.php:47
+#: ../../library/Class/Bib.php:78 ../../library/Class/Bib.php:97
+#: ../../library/Class/Bib.php:117 ../../library/Class/Bib.php:128
+#: ../../library/Class/Bib.php:148 ../../library/Class/Bib.php:168
+msgid "Envoie des données"
+msgstr "Envía datos"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:46
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:58
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:56
+#: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:72
+msgid "Envoyer"
+msgstr "Enviar"
+
+#: ../../application/modules/admin/controllers/BibController.php:337
+#: ../../application/modules/admin/controllers/BibController.php:345
+#: ../../application/modules/admin/controllers/BibController.php:364
+#: ../../application/modules/admin/controllers/BibController.php:361
+#: ../../application/modules/admin/controllers/BibController.php:332
+msgid "Envoyer la photo sur le serveur"
+msgstr "Enviar la foto al servidor"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:65
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:84
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:74
+msgid "Envoyer par mail"
+msgstr "Email"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:28
+msgid "Envoyé le"
+msgstr "Publicado"
+
+#: ../../application/modules/opac/controllers/RssController.php:40
+#: ../../application/modules/opac/controllers/RssController.php:45
+#: ../../application/modules/opac/controllers/RssController.php:64
+msgid "Erreur"
+msgstr "Error"
+
+#: ../../application/modules/admin/controllers/BibController.php:317
+#: ../../application/modules/opac/controllers/UploadController.php:74
+#: ../../application/modules/opac/controllers/UploadController.php:83
+#: ../../application/modules/admin/controllers/BibController.php:325
+#: ../../application/modules/admin/controllers/BibController.php:344
+#: ../../application/modules/opac/controllers/UploadController.php:104
+#: ../../application/modules/admin/controllers/BibController.php:341
+#: ../../application/modules/admin/controllers/BibController.php:312
+msgid "Erreur au transfert du fichier vers userfiles"
+msgstr "Error transferir el archivo a userfiles"
+
+#: ../../application/modules/admin/controllers/BibController.php:302
+#: ../../application/modules/opac/controllers/UploadController.php:50
+#: ../../application/modules/opac/controllers/UploadController.php:57
+#: ../../application/modules/admin/controllers/BibController.php:310
+#: ../../application/modules/admin/controllers/BibController.php:329
+#: ../../application/modules/opac/controllers/UploadController.php:78
+#: ../../application/modules/admin/controllers/BibController.php:326
+#: ../../application/modules/admin/controllers/BibController.php:298
+#: ../../application/modules/admin/controllers/BibController.php:303
+msgid ""
+"Erreur au téléchargement du fichier : L'image que vous essayez de "
+"télécharger est trop volumineuse ou inaccessible."
+msgstr ""
+"Error archivo de descarga: La imagen que está intentando descargar es "
+"demasiado grande o inaccesible."
+
+#: ../../application/modules/opac/views/scripts/index/formulairecontact.phtml:4
+msgid "Erreur d'envoi: %s"
+msgstr "Enviar error: %s"
+
+#: ../../application/modules/opac/views/scripts/index/formulairecontacterror.phtml:3
+msgid "Erreur d'envoi: problème de configuration"
+msgstr "Error al enviar: problema de configuración"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:94
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:115
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:125
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:153
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:154
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:152
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:144
+msgid "Erreur de configuration"
+msgstr "Error de configuración"
+
+#: ../../library/Class/AlbumRessource.php:271
+#: ../../library/Class/AlbumRessource.php:311
+#: ../../library/Class/AlbumRessource.php:320
+msgid "Erreur lors de l'enregistrement de la vignette"
+msgstr "Miniaturas grabación Error"
+
+#: ../../library/Class/AlbumRessource.php:278
+#: ../../library/Class/AlbumRessource.php:318
+#: ../../library/Class/AlbumRessource.php:327
+msgid "Erreur lors de la création de la vignette %s"
+msgstr "Error al crear miniatura %s"
+
+#: ../../application/modules/opac/controllers/IndexController.php:141
+msgid "Erreur à l'envoi du mail: destinataire non configuré"
+msgstr "Error al enviar el correo electrónico del destinatario: no configurado"
+
+#: ../../application/modules/admin/views/scripts/upload/vignette-notice.phtml:7
+#: ../../application/modules/admin/views/scripts/upload/biographie-notice.phtml:6
+msgid "Erreur: "
+msgstr "Error:"
+
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:9
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:11
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:94
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:12
+msgid "Etat"
+msgstr "Estado"
+
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:55
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:48
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:52
+msgid "Etes vous sûr de vouloir supprimer cette réservation ?"
+msgstr "¿Seguro que quieres eliminar esta reserva?"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:12
+msgid "Etes-vous sur de vouloir supprimer ce point ?"
+msgstr "¿Seguro que quieres borrar esto?"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:16
+msgid "Etes-vous sur de vouloir supprimer cette couche ?"
+msgstr "¿Seguro que quieres eliminar esta capa?"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:43
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:45
+#: ../../application/modules/opac/views/scripts/panier/_panier_row.phtml:31
+#: ../../application/modules/opac/views/scripts/panier/_panier_row.phtml:32
+msgid "Etes-vous sûr de vouloir supprimer ce panier ?"
+msgstr "¿Seguro que quieres borrar este carro?"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:94
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:95
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:97
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:85
+#: ../../library/ZendAfi/View/Helper/ListeNotices/TableauPanier.php:59
+msgid "Etes-vous sûr de vouloir supprimer cette notice du panier ?"
+msgstr "¿Seguro que quieres eliminar esta canasta disco?"
+
+#: ../../library/Class/Codification.php:133
+#: ../../library/Class/NoticeHtml.php:296
+#: ../../library/Class/Codification.php:136
+#: ../../library/Class/NoticeHtml.php:301
+#: ../../library/Class/Codification.php:138
+#: ../../library/Class/NoticeHtml.php:292
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:2
+#: ../../library/Class/NoticeHtml.php:334
+#: ../../library/Class/Codification.php:146
+#: ../../library/Class/NoticeHtml.php:204
+#: ../../library/ZendAfi/View/Helper/Notice/LienReserver.php:51
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
+#: ../../library/Class/Codification.php:209
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:49
+#: ../../library/Class/Codification.php:210
+#: ../../library/Class/Codification.php:205
+msgid "Exemplaires"
+msgstr "Copias"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:147
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:243
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:252
+msgid "Explorateur de fichiers"
+msgstr "Explorador de archivos"
+
+#: ../../library/ZendAfi/View/Helper/CoreFiveFileInput.php:26
+#: ../../library/ZendAfi/View/Helper/CoreFiveFileInput.php:32
+#: ../../library/ZendAfi/View/Helper/CoreFiveFileInput.php:51
+msgid "Explorer le serveur"
+msgstr "Explorador de servidores"
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:10
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:23
+msgid "Export CSV"
+msgstr "CSV Exportación"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:1
+msgid "Export de panier"
+msgstr "Canasta de exportación"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:72
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:76
+msgid "Exporter ce panier"
+msgstr "Exportar esta canasta"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:62
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:43
+msgid "Exporter ce panier: "
+msgstr "Exportar esta cesta:"
+
+#: ../../application/modules/admin/views/scripts/album/import-ead.phtml:3
+msgid "Exporter en EAD"
+msgstr "Exportación EAD"
+
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:47
+msgid "Exporter en UNIMARC"
+msgstr "Exportar en UNIMARC"
+
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:52
+msgid "Exporter en liste"
+msgstr "Exportación a la lista"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:12
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:31
+msgid "Expression recherchée"
+msgstr "Buscar término"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/index.phtml:9
+#: ../../application/modules/opac/views/scripts/rechercheoai/index.phtml:11
+msgid "Expression à rechercher"
+msgstr "Frase de búsqueda"
+
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:6
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:5
+msgid "Exprimez votre avis."
+msgstr "Exprese su opinión."
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:29
+msgid "Expéditeur"
+msgstr "Remitente"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:53
+msgid "Facettes"
+msgstr "Facetas"
+
+#: ../../application/modules/opac/controllers/EtagereController.php:130
+#: ../../application/modules/opac/controllers/RechercheController.php:322
+#: ../../application/modules/opac/controllers/RechercheController.php:342
+#: ../../application/modules/opac/controllers/EtagereController.php:107
+#: ../../application/modules/opac/controllers/RechercheController.php:355
+#: ../../application/modules/opac/controllers/EtagereController.php:126
+#: ../../application/modules/opac/controllers/RechercheController.php:396
+#: ../../application/modules/opac/controllers/RechercheController.php:451
+msgid "Facettes : %s"
+msgstr "Facetas: %s"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:145
+msgid "Facettes à afficher"
+msgstr "Facetas para mostrar"
+
+#: ../../application/modules/opac/controllers/CatalogueController.php:103
+#: ../../application/modules/opac/controllers/CatalogueController.php:114
+#: ../../application/modules/opac/controllers/CatalogueController.php:108
+#: ../../application/modules/opac/controllers/CatalogueController.php:127
+#: ../../application/modules/opac/controllers/CatalogueController.php:128
+#: ../../application/modules/opac/controllers/CatalogueController.php:95
+msgid "Facettes: %s"
+msgstr "Facetas: %s"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:268
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:277
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:324
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:321
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:343
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:355
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:369
+msgid "Facilite l'indexation de votre site dans les moteurs de recherche"
+msgstr "Facilita la indexación de su sitio en los motores de búsqueda"
+
+#: ../../application/modules/admin/views/scripts/type-docs/index.phtml:4
+msgid "Famille"
+msgstr "Familia"
+
+#: ../../library/ZendAfi/Form/TypeDocs/Edit.php:64
+msgid "Famille du document"
+msgstr "Documento Familia"
+
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:59
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:78
+#: ../../application/modules/admin/views/scripts/upload/vignette-uploaded.phtml:8
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:80
+#: ../../application/modules/admin/views/scripts/upload/biographie-uploaded.phtml:8
+#: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:7
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:8
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:45
+msgid "Fermer"
+msgstr "De cerca"
+
+#: ../../library/Class/NoticeHtml.php:188
+#: ../../library/Class/NoticeHtml.php:193
+#: ../../library/Class/NoticeHtml.php:184
+#: ../../library/Class/NoticeHtml.php:224
+#: ../../library/Class/NoticeHtml.php:94
+msgid "Fermer les onglets"
+msgstr "Cerrar pestañas"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:38
+#: ../../application/modules/telephone/controllers/RechercheController.php:41
+#: ../../application/modules/telephone/controllers/RechercheController.php:44
+msgid "Feuilleter le livre"
+msgstr "Explorar el libro"
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:1
+msgid "Fiche abonné"
+msgstr "Registro de abonado"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:28
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:30
+msgid "Fiche de la bibliothèque :"
+msgstr "Enchufe de la biblioteca:"
+
+#: ../../application/modules/opac/views/scripts/upload/upload.phtml:6
+msgid "Fichier"
+msgstr "Archivo"
+
+#: ../../application/modules/admin/controllers/BibController.php:297
+#: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../application/modules/admin/controllers/BibController.php:321
+#: ../../application/modules/admin/controllers/BibController.php:291
+#: ../../application/modules/admin/controllers/BibController.php:296
+msgid "Fichier photo : %s"
+msgstr "Foto de archivo: %s"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:26
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:26
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:57
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
+msgid "Fils RSS"
+msgstr "Hijo RSS"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:278
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:287
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:334
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:331
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:353
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:365
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:379
+msgid "Filtrage des données"
+msgstr "Filtrado de datos"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:136
+#: ../../application/modules/admin/controllers/UsergroupController.php:163
+#: ../../library/ZendAfi/Form/Admin/UserGroup.php:49
+msgid "Filtre"
+msgstr "Filtro"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:178
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:174
+msgid "Filtre "
+msgstr "Filtro"
+
+#: ../../application/modules/admin/views/scripts/i18n/index.phtml:26
+msgid "Filtrer"
+msgstr "Filtro"
+
+#: ../../library/ZendAfi/View/Helper/TreeView.php:34
+#: ../../library/ZendAfi/View/Helper/TreeView.php:63
+#: ../../library/ZendAfi/View/Helper/TreeView.php:69
+msgid "Filtrer par statut : "
+msgstr "Filtrar por estado:"
+
+#: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
+msgid "Fin"
+msgstr "Fin"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:46
+msgid "Fin après-midi"
+msgstr "Final de la tarde"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:44
+msgid "Fin matinée"
+msgstr "Tarde en la mañana"
+
+#: ../../library/ZendAfi/Form/Album.php:197
+msgid "Fonction"
+msgstr "Función"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:94
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+msgid "Fonds"
+msgstr "Fondos"
+
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:67
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:91
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:64
+msgid "Format"
+msgstr "Formato"
+
+#: ../../application/modules/opac/views/scripts/abonne/formations.phtml:2
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
+#: ../../application/modules/admin/controllers/FormationController.php:38
+#: ../../application/modules/admin/controllers/FormationController.php:60
+msgid "Formations"
+msgstr "Formaciones"
+
+#: ../../application/modules/opac/views/scripts/index/formulairecontact.phtml:2
+#: ../../application/modules/opac/views/scripts/index/formulairecontacterror.phtml:2
+#: ../../application/modules/opac/views/scripts/index/formulairecontactsent.phtml:2
+msgid "Formulaire de contact"
+msgstr "Formulario de contacto"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/HistoriqueRecherches.php:30
+msgid "Formulaire de recherche"
+msgstr "Formulario de búsqueda"
+
+#: ../../application/modules/admin/controllers/ModoController.php:976
+#: ../../application/modules/admin/controllers/ModoController.php:608
+#: ../../application/modules/admin/controllers/ModoController.php:629
+#: ../../application/modules/admin/controllers/ModoController.php:697
+msgid "Formulaire supprimé"
+msgstr "Forma Suprimido"
+
+#: ../../application/modules/admin/controllers/ModoController.php:984
+#: ../../application/modules/admin/controllers/ModoController.php:616
+#: ../../application/modules/admin/controllers/ModoController.php:637
+#: ../../application/modules/admin/controllers/ModoController.php:705
+msgid "Formulaire validé"
+msgstr "Forma Validado"
+
+#: ../../library/Class/Moderer.php:119 ../../library/Class/Moderer.php:103
+msgid "Formulaires"
+msgstr "Formas"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:36
+msgid "Fév"
+msgstr "Febrero"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:7
+msgid "Fév."
+msgstr "Febrero"
+
+#: ../../library/Class/Codification.php:103
+#: ../../library/Class/MoteurRecherche.php:349
+#: ../../library/Class/Codification.php:105
+#: ../../library/Class/Codification.php:106
+#: ../../library/Class/MoteurRecherche.php:366
+#: ../../library/Class/MoteurRecherche.php:378
+#: ../../library/Class/MoteurRecherche.php:412
+#: ../../library/Class/Codification.php:111
+#: ../../library/Class/MoteurRecherche.php:438
+#: ../../library/Class/Codification.php:130
+msgid "Genre"
+msgstr "Kind"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:41
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:37
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:34
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:50
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:63
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:146
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:75
+#: ../../library/ZendAfi/Form/Album.php:187
+msgid "Genres"
+msgstr "Géneros"
+
+#: ../../application/modules/admin/controllers/BibController.php:29
+#: ../../application/modules/admin/controllers/BibController.php:48
+#: ../../application/modules/admin/controllers/BibController.php:47
+#: ../../application/modules/admin/controllers/BibController.php:37
+msgid "Gestion des bibliothèques"
+msgstr "Gestión de Bibliotecas"
+
+#: ../../application/modules/admin/views/scripts/users/delete.phtml:1
+msgid "Gestion des utilisateurs"
+msgstr "Gestión de usuarios"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:23
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:23
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:54
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:66
+msgid "Gestionnaire de contenu"
+msgstr "Content Manager"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:132
+#: ../../application/modules/admin/controllers/UsergroupController.php:159
+#: ../../library/ZendAfi/Form/Admin/UserGroup.php:45
+msgid "Groupe"
+msgstr "Grupo"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:106
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:111
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:120
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:65
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:198
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:207
+msgid "Groupes"
+msgstr "Grupos"
+
+#: ../../application/modules/opac/views/scripts/panier/creer-panier-ajax.phtml:12
+#: ../../application/modules/opac/views/scripts/panier/edit.phtml:13
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:35
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:41
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:18
+#: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:32
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:33
+msgid "Généralités"
+msgstr "General"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:140
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:239
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:248
+msgid "Génération du site"
+msgstr "Generación del Sitio"
+
+#: ../../application/modules/admin/views/scripts/album/generate-thumbnails.phtml:27
+msgid "Génération en cours"
+msgstr "La generación actual"
+
+#: ../../application/modules/admin/views/scripts/album/preview-album.phtml:8
+msgid "Générer toutes les vignettes"
+msgstr "Generar todas las miniaturas"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:15
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:20
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:29
+msgid "Gérer les medias"
+msgstr "Gestionar los medios de comunicación"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:10
+msgid "Gérer les ressources"
+msgstr "La gestión de los recursos"
+
+#: ../../application/modules/admin/views/scripts/frbr-link/index.phtml:4
+msgid "Gérer les types de relation"
+msgstr "Gestionar los tipos de relaciones"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:57
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:15
+msgid "HAUT"
+msgstr "UP"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:83
+msgid "HTML"
+msgstr "HTML"
+
+#: ../../application/modules/opac/views/scripts/bib/mapview.phtml:51
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:18
+#: ../../application/modules/opac/views/scripts/cms/articleview.phtml:8
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:85
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:83
+#: ../../application/modules/opac/views/scripts/cms/articleview.phtml:9
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:70
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:22
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:46
+msgid "Haut"
+msgstr "Top"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:85
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:94
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:31
+msgid "Hauteur"
+msgstr "Altura"
+
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:67
+msgid "Hierarchie contient"
+msgstr "Jerarquía contiene"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:106
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:109
+msgid "Horaire"
+msgstr "Horario"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:14
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:45
+#: ../../application/modules/telephone/views/scripts/recherche/bibliotheque.phtml:21
+#: ../../application/modules/opac/controllers/AbonneController.php:742
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:61
+#: ../../application/modules/opac/controllers/AbonneController.php:774
+#: ../../application/modules/opac/controllers/AbonneController.php:834
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:89
+#: ../../application/modules/opac/controllers/AbonneController.php:832
+msgid "Horaires"
+msgstr "Horario"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:66
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:68
+msgid "Horaires :"
+msgstr "Horario:"
+
+#: ../../library/Class/SuggestionAchat.php:76
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:97
+msgid "ISBN"
+msgstr "ISBN"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:122
+msgid "Icone"
+msgstr "Icono"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:86
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:101
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:104
+msgid "Icône du navigateur"
+msgstr "Icono del explorador"
+
+#: ../../application/modules/admin/views/scripts/auth/login.phtml:11
+#: ../../application/modules/admin/views/scripts/users/index.phtml:14
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:21
+#: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:35
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:20
+#: ../../application/modules/opac/views/scripts/auth/lostpass.phtml:21
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:9
+#: ../../library/Class/Codification.php:104
+#: ../../library/Class/Codification.php:106
+#: ../../application/modules/opac/views/scripts/auth/lostpass.phtml:19
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:18
+#: ../../library/Class/Codification.php:107
+#: ../../library/Class/Codification.php:112
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:9
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:7
+#: ../../application/modules/opac/views/scripts/auth/lostpass.phtml:12
+#: ../../library/Class/Codification.php:131
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:11
+#: ../../application/modules/admin/views/scripts/users/index.phtml:16
+#: ../../application/modules/opac/controllers/AuthController.php:184
+msgid "Identifiant"
+msgstr "Iniciar sesión"
+
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:63
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:63
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:82
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:85
+msgid "Identifiant commence par"
+msgstr "ID comienza con"
+
+#: ../../application/modules/opac/controllers/AuthController.php:50
+#: ../../application/modules/opac/controllers/AuthController.php:68
+#: ../../application/modules/opac/controllers/AuthController.php:55
+#: ../../application/modules/opac/controllers/AuthController.php:75
+#: ../../application/modules/opac/controllers/AuthController.php:73
+#: ../../application/modules/opac/controllers/AuthController.php:70
+msgid "Identifiant ou mot de passe incorrect."
+msgstr "Nombre de usuario o contraseña incorrecta."
+
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:11
+#: ../../application/modules/telephone/views/scripts/auth/login-reservation.phtml:1
+msgid "Identification"
+msgstr "Identificación"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:72
+#: ../../application/modules/opac/controllers/AbonneController.php:76
+#: ../../application/modules/opac/controllers/AbonneController.php:101
+#: ../../application/modules/opac/controllers/AbonneController.php:140
+#: ../../application/modules/opac/controllers/AbonneController.php:180
+#: ../../application/modules/opac/controllers/AbonneController.php:183
+#: ../../application/modules/opac/controllers/AbonneController.php:184
+#: ../../application/modules/opac/controllers/AbonneController.php:182
+msgid "Il faut compléter tous les champs."
+msgstr "Debe completar todos los campos."
+
+#: ../../application/modules/opac/views/scripts/recherche/guidee.phtml:15
+#: ../../application/modules/opac/views/scripts/recherche/guidee.phtml:21
+msgid "Il n'y a plus de sous-niveau"
+msgstr "Hay más de subnivel"
+
+#: ../../library/Class/MoteurRecherche.php:62
+#: ../../library/Class/MoteurRecherche.php:151
+#: ../../library/Class/NoticeOAI.php:190
+#: ../../library/Class/MoteurRecherche.php:166
+#: ../../library/Class/MoteurRecherche.php:70
+#: ../../library/Class/MoteurRecherche.php:174
+#: ../../library/Class/NoticeOAI.php:230
+#: ../../library/Class/MoteurRecherche.php:93
+#: ../../library/Class/MoteurRecherche.php:95
+msgid "Il n'y aucun mot assez significatif pour la recherche"
+msgstr "No hay palabra lo suficientemente importantes como para buscar"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:33
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:39
+msgid "Il y a"
+msgstr "Ahi esta"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:28
+msgid "Il y a <span class='nombre-recherche'>&nbsp;%d&nbsp;</span> résultat"
+msgstr "Hay <span class = 'número-búsqueda'> &nbsp;%d&nbsp </ span> resultado"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:29
+msgid "Il y a <span class='nombre-recherche'>&nbsp;%d&nbsp;</span> résultats"
+msgstr "Hay <span class = 'número-búsqueda'> &nbsp;%d&nbsp </ span> Resultados"
+
+#: ../../application/modules/opac/controllers/RssController.php:179
+#: ../../application/modules/opac/controllers/RssController.php:195
+#: ../../application/modules/opac/views/scripts/rss/view-raw-rss.phtml:5
+#: ../../application/modules/opac/controllers/RssController.php:197
+#: ../../application/modules/opac/controllers/RssController.php:216
+#: ../../application/modules/opac/controllers/RssController.php:212
+msgid "Il y a un problème avec l'adresse du flux RSS"
+msgstr "Hay un problema con la dirección del feed RSS"
+
+#: ../../application/modules/admin/views/scripts/bib/plansmaj.phtml:28
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:29
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:35
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:24
+msgid "Image"
+msgstr "Imagen"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:78
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:75
+msgid "Image de fond"
+msgstr "Clutter"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:76
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:80
+msgid "Import EAD"
+msgstr "Importar EAD"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:141
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:261
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:279
+msgid "Import Thesaurus"
+msgstr "Importación Thesaurus"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:124
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:129
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:138
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:236
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:245
+msgid "Import avis opac2"
+msgstr "Importación de comentarios opac2"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:134
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:143
+msgid "Import/Export EAD"
+msgstr "Importar / Exportar EAD"
+
+#: ../../application/modules/admin/controllers/BibController.php:755
+#: ../../application/modules/opac/controllers/IndexController.php:26
+#: ../../application/modules/opac/controllers/IndexController.php:86
+#: ../../application/modules/admin/controllers/BibController.php:763
+#: ../../application/modules/admin/controllers/BibController.php:782
+#: ../../application/modules/admin/controllers/BibController.php:779
+msgid "Impossible d'afficher la carte"
+msgstr "No se puede mostrar el mapa"
+
+#: ../../library/Class/UploadMover/HttpPost.php:32
+#: ../../library/Class/UploadMover/LocalFile.php:32
+#: ../../library/Class/UploadMover/LocalFile.php:33
+msgid "Impossible d'écrire le fichier sur le serveur au chemin [%s]"
+msgstr "No se puede escribir el archivo en la ruta del servidor [ %s]"
+
+#: ../../application/modules/opac/controllers/RssController.php:34
+#: ../../application/modules/opac/controllers/RssController.php:39
+#: ../../application/modules/opac/controllers/RssController.php:58
+msgid "Impossible de lire le flux rss"
+msgstr "No se puede leer los canales RSS"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:15
+msgid "Impossible de trouver cette adresse"
+msgstr "No se puede encontrar esta dirección"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:224
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:43
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:218
+#: ../../library/ZendAfi/Form/Admin/News.php:222
+msgid "Indexation"
+msgstr "Indexación"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:171
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:176
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:195
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:191
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:200
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:209
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:187
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:203
+#: ../../library/ZendAfi/Form/Admin/News.php:89
+msgid "Indexer l'article dans le catalogue ?"
+msgstr "Índice del artículo en el catálogo?"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:87
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:91
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:114
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:111
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:134
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:147
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:159
+msgid "Indices Dewey"
+msgstr "Dewey"
+
+#: ../../library/ZendAfi/Form/Album.php:179
+msgid "Indices dewey"
+msgstr "Índices Dewey"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:196
+msgid "Indiquez au moins 1 type de tag à afficher"
+msgstr "Identificar al menos un tipo de etiqueta para mostrar"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:176
+msgid "Info"
+msgstr "Info"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:82
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:81
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
+msgid "Information"
+msgstr "Información"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:17
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:25
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:69
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:70
+msgid "Informations"
+msgstr "Información"
+
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:50
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:66
+msgid "Informations sur le document"
+msgstr "Información del documento"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:122
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:127
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:136
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:230
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:239
+msgid "Informations système"
+msgstr "Información del sistema"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:155
+msgid "Infos"
+msgstr "Info"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:86
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:69
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+msgid "Inscription"
+msgstr "Registro"
+
+#: ../../application/modules/admin/controllers/FormationController.php:333
+#: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:62
+msgid "Inscrire les stagiaires sélectionnés"
+msgstr "Introduzca los becarios seleccionados"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:225
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:234
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:281
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:279
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:301
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:313
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:327
+msgid "Interdire les liens sortants"
+msgstr "Bloquee enlaces salientes"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:126
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:129
+msgid "Interdire les réservations"
+msgstr "Prohibir reservas"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:31
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:104
+msgid "Intervenants"
+msgstr "Altavoces"
+
+msgid "Invalid type given, value should be a string"
+msgstr "Dada tipo no válido, el valor debe ser una cadena"
+
+#: ../../library/Class/Bib.php:36 ../../library/Class/Bib.php:37
+#: ../../library/Class/Bib.php:44 ../../library/Class/Bib.php:45
+#: ../../library/Class/Bib.php:76 ../../library/Class/Bib.php:95
+#: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:126
+#: ../../library/Class/Bib.php:146 ../../library/Class/Bib.php:166
+msgid "Invisible"
+msgstr "Invisible"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:32
+msgid "Isbn"
+msgstr "Isbn"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:35
+msgid "Jan"
+msgstr "Enero"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:6
+msgid "Janv."
+msgstr "Enero"
+
+#: ../../application/modules/telephone/views/scripts/recherche/grandeimage.phtml:2
+msgid "Jaquette"
+msgstr "Chaqueta"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:224
+msgid "Javascript"
+msgstr "Javascript"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:4
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:7
+#: ../../application/modules/admin/controllers/OuverturesController.php:41
+#: ../../application/modules/admin/views/scripts/ouvertures/index.phtml:12
+#: ../../application/modules/opac/controllers/AbonneController.php:741
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:8
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
+#: ../../application/modules/opac/controllers/AbonneController.php:773
+#: ../../application/modules/opac/controllers/AbonneController.php:833
+#: ../../application/modules/opac/controllers/AbonneController.php:831
+msgid "Jour"
+msgstr "Día"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:12
+msgid "Juil."
+msgstr "Julio"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:41
+msgid "Juillet"
+msgstr "Julio"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:11
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:40
+msgid "Juin"
+msgstr "Junio"
+
+#: ../../application/modules/opac/controllers/JavaController.php:48
+#: ../../application/modules/opac/controllers/JavaController.php:47
+#: ../../application/modules/opac/controllers/JavaController.php:71
+#: ../../application/modules/opac/controllers/JavaController.php:80
+#: ../../application/modules/opac/controllers/JavaController.php:66
+#: ../../application/modules/opac/controllers/JavaController.php:67
+msgid "Kiosque de notices"
+msgstr "Avisos Booth"
+
+#: ../../application/modules/opac/controllers/FlashController.php:316
+#: ../../application/modules/opac/controllers/FlashController.php:318
+msgid "Kiosque de notices, carousel horizontal"
+msgstr "Avisos Booth, carrusel horizontal"
+
+#: ../../application/modules/opac/views/scripts/index/sitedown.phtml:7
+msgid ""
+"L'accès au site est momentanément bloqué.<br><br> Veuillez essayez plus tard."
+msgstr ""
+"El acceso al sitio es bloqueado temporalmente. <br> Por favor, inténtelo de "
+"nuevo más tarde."
+
+#: ../../application/modules/opac/controllers/RssController.php:128
+#: ../../application/modules/opac/controllers/RssController.php:144
+#: ../../application/modules/opac/views/scripts/rss/view-raw-rss.phtml:3
+#: ../../application/modules/opac/controllers/RssController.php:146
+#: ../../application/modules/opac/controllers/RssController.php:165
+#: ../../application/modules/opac/controllers/RssController.php:161
+msgid "L'adresse du flux RSS n'est plus valide."
+msgstr "La dirección del feed RSS ya no es válido."
+
+#: ../../library/Class/Users.php:225 ../../library/Class/Users.php:239
+#: ../../library/Class/Users.php:314 ../../library/Class/Users.php:390
+#: ../../library/Class/Users.php:419 ../../library/Class/Users.php:566
+#: ../../library/Class/Users.php:633 ../../library/Class/Users.php:721
+#: ../../library/Class/Users.php:843
+msgid "L'adresse e-mail est invalide ou est déjà utilisée."
+msgstr "La dirección de correo electrónico no es válida o ya en uso."
+
+#: ../../application/modules/admin/controllers/OaiController.php:146
+msgid "L'album \"%s\" a été créé"
+msgstr "El álbum \"%s\" se ha creado"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:70
+#: ../../application/modules/opac/controllers/AbonneController.php:74
+#: ../../application/modules/opac/controllers/AbonneController.php:99
+#: ../../application/modules/opac/controllers/AbonneController.php:138
+#: ../../application/modules/opac/controllers/AbonneController.php:178
+#: ../../application/modules/opac/controllers/AbonneController.php:181
+#: ../../application/modules/opac/controllers/AbonneController.php:182
+#: ../../application/modules/opac/controllers/AbonneController.php:180
+msgid "L'avis doit avoir une longueur comprise entre %d et %d caractères"
+msgstr "El aviso debe tener una longitud entre %d y %d caracteres"
+
+#: ../../library/Class/AvisNotice.php:238
+#: ../../library/Class/AvisNotice.php:276
+#: ../../library/Class/AvisNotice.php:311
+#: ../../library/Class/AvisNotice.php:245
+#: ../../library/Class/AvisNotice.php:244
+msgid "L'avis doit avoir une longueur comprise entre %s et %s caractères"
+msgstr "El comentario debe tener una longitud entre %s y %s caracteres"
+
+#: ../../library/Class/Users.php:162 ../../library/Class/Users.php:176
+#: ../../library/Class/Users.php:251 ../../library/Class/Users.php:327
+#: ../../library/Class/Users.php:356 ../../library/Class/Users.php:500
+#: ../../library/Class/Users.php:567 ../../library/Class/Users.php:648
+#: ../../library/Class/Users.php:770 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:828
+msgid "L'identifiant que vous avez choisi existe déjà."
+msgstr "El nombre de usuario que eligió ya existe."
+
+#: ../../application/modules/admin/controllers/BibController.php:508
+#: ../../application/modules/admin/controllers/BibController.php:516
+#: ../../application/modules/admin/controllers/BibController.php:535
+#: ../../application/modules/admin/controllers/BibController.php:532
+#: ../../application/modules/admin/controllers/BibController.php:477
+#: ../../application/modules/admin/controllers/BibController.php:482
+msgid "L'image du plan est obligatoire."
+msgstr "La imagen del plan es obligatorio."
+
+#: ../../application/modules/opac/controllers/UploadController.php:60
+#: ../../application/modules/opac/controllers/UploadController.php:69
+#: ../../application/modules/opac/controllers/UploadController.php:90
+msgid ""
+"L'image que vous avez sélectionnée est trop volumiseuse. Taille maximum : %d "
+"ko"
+msgstr "La imagen seleccionada es demasiado volumiseuse. Tamaño máximo: %d KB"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaire.php:63
+msgid "L'utilisateur n'a pas renseigné son adresse e-mail."
+msgstr "El usuario no ha actualizado su dirección de correo electrónico."
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:13
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:15
+msgid "La bibliothèque contient %s notices."
+msgstr "La biblioteca contiene los registros %s."
+
+#: ../../library/Class/Users.php:170 ../../library/Class/Users.php:184
+#: ../../library/Class/Users.php:259 ../../library/Class/Users.php:335
+#: ../../library/Class/Users.php:364 ../../library/Class/Users.php:508
+#: ../../library/Class/Users.php:575 ../../library/Class/Users.php:656
+#: ../../library/Class/Users.php:778 ../../library/Class/Users.php:830
+#: ../../library/Class/Users.php:837
+msgid "La bibliothèque est obligatoire pour le rôle : %s"
+msgstr "Se requiere que la biblioteca de la función: %s"
+
+#: ../../application/modules/admin/controllers/SitoController.php:248
+#: ../../application/modules/admin/controllers/UsergroupController.php:306
+#: ../../application/modules/admin/controllers/UsergroupController.php:177
+msgid "La categorie \"%s\" a été supprimée"
+msgstr "La categoría \"%s\" se ha eliminado"
+
+#: ../../application/modules/admin/controllers/SitoController.php:190
+#: ../../application/modules/admin/controllers/UsergroupController.php:286
+#: ../../application/modules/admin/controllers/UsergroupController.php:157
+msgid "La catégorie \"%s\" a été ajoutée"
+msgstr "Se añadió el \"%s\""
+
+#: ../../application/modules/admin/controllers/SitoController.php:208
+#: ../../application/modules/admin/controllers/UsergroupController.php:321
+#: ../../application/modules/admin/controllers/UsergroupController.php:192
+msgid "La catégorie \"%s\" a été sauvegardée"
+msgstr "El \"%s\" se ha guardado"
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:6
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:14
+msgid "La notice "
+msgstr "Record"
+
+#: ../../application/modules/admin/views/scripts/upload/biographie-uploaded.phtml:3
+msgid "La nouvelle URL a bien été enregistrée"
+msgstr "El nuevo sitio de Internet ha sido registrada"
+
+#: ../../application/modules/admin/controllers/BibController.php:309
+#: ../../application/modules/admin/controllers/BibController.php:317
+#: ../../application/modules/admin/controllers/BibController.php:336
+#: ../../application/modules/admin/controllers/BibController.php:333
+#: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:310
+msgid ""
+"La photo que vous avez sélectionnée doit être de type : 'image/jpg' et pas "
+"de type : %s"
+msgstr ""
+"La foto que ha seleccionado debe ser de tipo: image / jpg \"y no de tipo: %s"
+
+#: ../../application/modules/admin/controllers/BibController.php:310
+#: ../../application/modules/admin/controllers/BibController.php:318
+#: ../../application/modules/admin/controllers/BibController.php:337
+#: ../../application/modules/admin/controllers/BibController.php:334
+#: ../../application/modules/admin/controllers/BibController.php:307
+#: ../../application/modules/admin/controllers/BibController.php:312
+msgid "La photo que vous avez sélectionnée est trop volumiseuse : %d ko"
+msgstr "La foto que ha seleccionado es demasiado volumiseuse: %d KB"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:15
+msgid "La prolongation a échoué"
+msgstr "La extensión no"
+
+#: ../../library/Class/CriteresRecherche.php:268
+#: ../../library/Class/CriteresRecherche.php:301
+#: ../../library/Class/CriteresRecherche.php:312
+msgid "La sélection ne contient aucune notice"
+msgstr "La selección no contiene ningún registro"
+
+#: ../../application/modules/admin/views/scripts/upload/vignette-uploaded.phtml:3
+msgid "La vignette a bien été transférée"
+msgstr "La etiqueta ha sido transferida"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:22
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:21
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:29
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:28
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:45
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:46
+msgid "Lancement de la recherche élargie à tous les mots en cours..."
+msgstr ""
+"Lanzamiento extendido a todas las palabras en la actualidad en busca de ..."
+
+#: ../../application/modules/admin/views/scripts/album/generate-thumbnails.phtml:23
+msgid "Lancer la génération"
+msgstr "Iniciar generación"
+
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:76
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:76
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:136
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:146
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:95
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:148
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:159
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:98
+msgid "Lancer la recherche"
+msgstr "Iniciar la búsqueda"
+
+#: ../../application/modules/admin/views/scripts/harvest/arte-vod-browse.phtml:2
+#: ../../application/modules/admin/views/scripts/harvest/numilog-browse.phtml:2
+#: ../../application/modules/admin/views/scripts/harvest/toutapprendre-browse.phtml:2
+#: ../../application/modules/admin/views/scripts/harvest/vodeclic-browse.phtml:2
+#: ../../application/modules/admin/views/scripts/harvest/browse.phtml:2
+msgid "Lancer le moissonnage"
+msgstr "Comienza la cosecha"
+
+#: ../../library/Class/Codification.php:106
+#: ../../library/Class/MoteurRecherche.php:348
+#: ../../library/Class/Codification.php:108
+#: ../../library/Class/Codification.php:109
+#: ../../library/Class/MoteurRecherche.php:365
+#: ../../library/Class/MoteurRecherche.php:377
+#: ../../library/Class/MoteurRecherche.php:411
+#: ../../library/Class/Codification.php:114
+#: ../../library/Class/MoteurRecherche.php:437
+#: ../../library/Class/Codification.php:134
+#: ../../library/ZendAfi/Form/Album.php:160
+msgid "Langue"
+msgstr "Idioma"
+
+#: ../../library/Class/Codification.php:106
+#: ../../library/Class/Codification.php:108
+#: ../../library/Class/Codification.php:109
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:34
+#: ../../library/Class/Codification.php:114
+#: ../../library/Class/Codification.php:134
+msgid "Langue(s)"
+msgstr "Idioma (s)"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:46
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:42
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:39
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:55
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:68
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:80
+msgid "Langues"
+msgstr "Idiomas"
+
+#: ../../library/ZendAfi/Form/Album/DisplayThumbnails.php:30
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:70
+msgid "Largeur"
+msgstr "Ancho"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:156
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:165
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:212
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:210
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:232
+msgid "Largeur totale du site"
+msgstr "El ancho total de la página"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:25
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:27
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:46
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:47
+msgid "Le %s"
+msgstr " %s"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Compteurs.php:16
+#: ../../library/ZendAfi/View/Helper/Accueil/Compteurs.php:17
+#: ../../library/ZendAfi/View/Helper/Accueil/Compteurs.php:36
+msgid "Le catalogue contient %s notices."
+msgstr "El catálogo contiene registros %s."
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:4
+msgid "Le catalogue de cette bibliothèque n'est pas encore intégré au portail"
+msgstr "El catálogo de esta biblioteca aún no está integrada en el portal"
+
+#: ../../library/Class/Users.php:158 ../../library/Class/Users.php:172
+#: ../../library/Class/Users.php:247 ../../library/Class/Users.php:323
+#: ../../library/Class/Users.php:352 ../../library/Class/Users.php:496
+#: ../../library/Class/Users.php:563 ../../library/Class/Users.php:644
+#: ../../library/Class/Users.php:766 ../../library/Class/Users.php:817
+#: ../../library/Class/Users.php:824
+msgid "Le champ 'Identifiant' doit être inférieur à 50 caractères"
+msgstr "El campo 'id' debe ser menor de 50 caracteres"
+
+#: ../../library/Class/Users.php:166 ../../library/Class/Users.php:180
+#: ../../library/Class/Users.php:255 ../../library/Class/Users.php:331
+#: ../../library/Class/Users.php:360 ../../library/Class/Users.php:504
+#: ../../library/Class/Users.php:571 ../../library/Class/Users.php:652
+#: ../../library/Class/Users.php:774
+msgid "Le champ 'Mot de passe' doit être inférieur à 50 caractères"
+msgstr "El campo 'Contraseña' debe ser menor de 50 caracteres"
+
+#: ../../library/Class/SitothequeCategorie.php:112
+#: ../../library/Class/RssCategorie.php:76
+msgid "Le champ 'Nom de la catégorie' doit être inférieur à 50 caractères"
+msgstr "El campo 'Nombre de la categoría' debe ser menor de 50 caracteres"
+
+#: ../../library/Class/Sitotheque.php:225
+#: ../../library/Class/Sitotheque.php:219
+#: ../../library/Class/Sitotheque.php:229
+msgid "Le champ 'Titre' doit être inférieur à 100 caractères"
+msgstr "El campo 'Título' debe ser inferior a 100 caracteres"
+
+#: ../../library/Class/Sitotheque.php:231
+#: ../../library/Class/Sitotheque.php:225
+#: ../../library/Class/Sitotheque.php:235
+msgid "Le champ 'Url' doit être inférieur à 250 caractères"
+msgstr "'Url' El campo debe ser inferior a 250 caracteres"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:434
+#: ../../application/modules/opac/controllers/RechercheController.php:467
+#: ../../application/modules/opac/controllers/RechercheController.php:492
+#: ../../application/modules/opac/controllers/RechercheController.php:551
+#: ../../application/modules/opac/controllers/RechercheController.php:606
+#: ../../application/modules/opac/controllers/RechercheController.php:394
+#: ../../application/modules/opac/controllers/RechercheController.php:390
+msgid "Le code anti-spam est incorrect."
+msgstr "El código anti-spam es incorrecta."
+
+#: ../../library/Class/Users.php:232 ../../library/Class/Users.php:246
+#: ../../library/Class/Users.php:321 ../../library/Class/Users.php:397
+#: ../../library/Class/Users.php:426 ../../library/Class/Users.php:573
+#: ../../library/Class/Users.php:640 ../../library/Class/Users.php:728
+#: ../../library/Class/Users.php:850
+msgid "Le code anti-spam est invalide."
+msgstr "El código anti-spam no es válido."
+
+#: ../../library/Class/Upload.php:293
+msgid "Le fichier n'est pas de type %s"
+msgstr "El archivo no es de tipo %s"
+
+#: ../../application/modules/admin/controllers/BibController.php:301
+#: ../../application/modules/opac/controllers/UploadController.php:49
+#: ../../application/modules/opac/controllers/UploadController.php:56
+#: ../../application/modules/admin/controllers/BibController.php:309
+#: ../../application/modules/admin/controllers/BibController.php:328
+#: ../../application/modules/opac/controllers/UploadController.php:77
+#: ../../application/modules/admin/controllers/BibController.php:325
+#: ../../application/modules/admin/controllers/BibController.php:296
+msgid "Le fichier que vous avez sélectionné est vide."
+msgstr "El archivo seleccionado está vacía."
+
+#: ../../library/Class/Upload.php:278
+msgid "Le fichier était vide ou un problème réseau est survenu"
+msgstr "El archivo estaba vacío o se ha producido un problema en la red"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:124
+#: ../../application/modules/admin/controllers/UsergroupController.php:33
+msgid "Le groupe \"%s\" a été sauvegardé"
+msgstr "El grupo \"%s\" se ha guardado"
+
+#: ../../application/modules/opac/views/scripts/index/formulairecontactsent.phtml:3
+msgid "Le message a bien été envoyé"
+msgstr "El mensaje ha sido enviado"
+
+#: ../../library/Class/Users.php:222 ../../library/Class/Users.php:236
+#: ../../library/Class/Users.php:311 ../../library/Class/Users.php:387
+#: ../../library/Class/Users.php:416 ../../library/Class/Users.php:563
+#: ../../library/Class/Users.php:630 ../../library/Class/Users.php:718
+#: ../../library/Class/Users.php:840
+msgid "Le mot de passe est obligatoire."
+msgstr "La contraseña es necesaria."
+
+#: ../../library/Class/Users.php:175 ../../library/Class/Users.php:189
+#: ../../library/Class/Users.php:264 ../../library/Class/Users.php:340
+#: ../../library/Class/Users.php:369 ../../library/Class/Users.php:513
+#: ../../library/Class/Users.php:580 ../../library/Class/Users.php:661
+#: ../../library/Class/Users.php:783 ../../library/Class/Users.php:835
+#: ../../library/Class/Users.php:842
+msgid ""
+"Le numéro de carte est obligatoire pour les abonnés identifiés dans un sigb."
+msgstr ""
+"Se requiere el número de la tarjeta para los suscriptores identificados en "
+"un ILS."
+
+#: ../../application/modules/opac/controllers/RssController.php:36
+#: ../../application/modules/opac/controllers/RssController.php:41
+#: ../../application/modules/opac/controllers/RssController.php:60
+msgid "Le ou les flux demandés ne sont plus valides"
+msgstr "Los flujos o solicitado ya no son válidas"
+
+#: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:6
+msgid "Le panier "
+msgstr "Cesta"
+
+#: ../../application/modules/opac/views/scripts/album/index.phtml:2
+msgid "Le patrimoine en images"
+msgstr "Patrimonio en imágenes"
+
+#: ../../application/modules/admin/controllers/SitoController.php:291
+#: ../../application/modules/admin/controllers/SitoController.php:293
+msgid "Le site \"%s\" a été sauvegardé"
+msgstr "El sitio \"%s\" se ha guardado"
+
+#: ../../application/modules/admin/controllers/SitoController.php:309
+#: ../../application/modules/admin/controllers/SitoController.php:311
+msgid "Le site \"%s\" a été supprimé"
+msgstr "El sitio \"%s\" se ha eliminado"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:8
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:10
+msgid "Le territoire contient %s notices"
+msgstr "El territorio contiene referencias %s"
+
+#: ../../application/modules/telephone/views/scripts/recherche/avis.phtml:14
+msgid "Lecteurs du portail"
+msgstr "Lectores Portal"
+
+#: ../../library/ZendAfi/Form/ChangeKiosqueSelection.php:123
+msgid "Les derniers paniers du domaine "
+msgstr "Las últimas canastas de campo"
+
+#: ../../library/ZendAfi/Form/ChangeKiosqueSelection.php:142
+msgid "Les derniers sous domaines de "
+msgstr "Los últimos subdominios"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:381
+#: ../../application/modules/opac/controllers/AbonneController.php:391
+#: ../../application/modules/opac/controllers/AbonneController.php:389
+#: ../../application/modules/opac/controllers/AbonneController.php:399
+#: ../../application/modules/opac/controllers/AbonneController.php:397
+#: ../../application/modules/opac/controllers/AbonneController.php:407
+#: ../../application/modules/opac/controllers/AbonneController.php:423
+#: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:414
+#: ../../application/modules/opac/controllers/AbonneController.php:424
+#: ../../application/modules/opac/controllers/AbonneController.php:390
+#: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:409
+#: ../../application/modules/opac/controllers/AbonneController.php:419
+#: ../../application/modules/opac/controllers/AbonneController.php:469
+#: ../../application/modules/opac/controllers/AbonneController.php:479
+#: ../../application/modules/opac/controllers/AbonneController.php:467
+#: ../../application/modules/opac/controllers/AbonneController.php:477
+msgid "Les mots de passe ne correspondent pas"
+msgstr "Las contraseñas no coinciden"
+
+#: ../../application/modules/opac/controllers/CmsController.php:46
+msgid "Les rendez-vous"
+msgstr "Nombramientos"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:33
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:61
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:65
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:87
+msgid "Lettres d'information"
+msgstr "Boletines"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:20
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:45
+#: ../../application/modules/admin/views/scripts/profil/accueil.phtml:19
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:17
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:42
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:16
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:40
+#: ../../application/modules/admin/views/scripts/batch/index.phtml:10
+#: ../../application/modules/admin/views/scripts/batch/index.phtml:11
+msgid "Libelle"
+msgstr "La difamación"
+
+#: ../../application/modules/admin/views/scripts/profil/menusmaj.phtml:26
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:28
+#: ../../application/modules/admin/views/scripts/opds/index.phtml:10
+#: ../../application/modules/admin/views/scripts/multimedia/index.phtml:3
+#: ../../application/modules/admin/views/scripts/oai/index.phtml:10
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:30
+#: ../../application/modules/admin/views/scripts/multimedia/browse.phtml:7
+#: ../../application/modules/admin/views/scripts/multimedia/index.phtml:4
+#: ../../application/modules/admin/views/scripts/frbr-linktype/index.phtml:18
+#: ../../application/modules/admin/views/scripts/multimedia/index.phtml:6
+#: ../../application/modules/opac/views/scripts/panier/creer-panier-ajax.phtml:13
+#: ../../application/modules/opac/views/scripts/panier/edit.phtml:14
+#: ../../application/modules/admin/views/scripts/type-docs/index.phtml:4
+#: ../../application/modules/admin/views/scripts/opds/index.phtml:11
+#: ../../library/ZendAfi/Form/TypeDocs/Edit.php:63
+#: ../../application/modules/admin/views/scripts/custom-fields-report/index.phtml:12
+#: ../../application/modules/admin/views/scripts/custom-fields-meta/index.phtml:18
+#: ../../application/modules/admin/views/scripts/custom-fields/add.phtml:4
+msgid "Libellé"
+msgstr "Redacción"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:110
+msgid "Libellé *"
+msgstr "Redacción *"
+
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:68
+msgid "Libellé commence par"
+msgstr "Etiqueta comienza con"
+
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:69
+msgid "Libellé contient"
+msgstr "Contiene texto"
+
+#: ../../library/ZendAfi/Form/FRBR/LinkType.php:32
+msgid "Libellé de l'objet A vers l'objet B"
+msgstr "La redacción de un objeto a objeto B"
+
+#: ../../library/ZendAfi/Form/FRBR/LinkType.php:34
+msgid "Libellé de l'objet B vers l'objet A"
+msgstr "La redacción del objeto B al objeto A"
+
+#: ../../library/ZendAfi/Form/UserGroupCategorie.php:29
+msgid "Libellé de la catégorie"
+msgstr "Etiqueta Categoría"
+
+#: ../../library/Class/SuggestionAchat.php:77
+#: ../../library/Class/SuggestionAchat.php:98
+msgid "Lien"
+msgstr "Enlace"
+
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+msgid "Lien Internet vers une description"
+msgstr "Enlace web con una descripción"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:75
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:78
+msgid "Lien cartographique"
+msgstr "Enlace Mapping"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:61
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:63
+msgid "Lien cartographique :"
+msgstr "Enlace Mapping:"
+
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/Codification.php:118
+#: ../../library/Class/Codification.php:120
+#: ../../library/Class/Codification.php:125
+#: ../../library/Class/Codification.php:144
+msgid "Lien internet"
+msgstr "Enlace de Internet"
+
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:38
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+msgid "Lien internet vers une description"
+msgstr "Enlace web con una descripción"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:133
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:136
+msgid "Lien logo droite"
+msgstr "Enlace logo derecho"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:117
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:120
+msgid "Lien logo gauche"
+msgstr "Enlace logo dejó"
+
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:49
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:54
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:51
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:56
+#: ../../library/ZendAfi/View/Helper/Permalink.php:13
+#: ../../library/ZendAfi/View/Helper/Permalink.php:15
+#: ../../library/ZendAfi/View/Helper/Permalink.php:18
+#: ../../library/ZendAfi/View/Helper/Permalink.php:32
+#: ../../library/ZendAfi/View/Helper/Permalink.php:34
+#: ../../library/ZendAfi/View/Helper/Permalink.php:37
+#: ../../library/ZendAfi/View/Helper/Permalink.php:30
+#: ../../library/ZendAfi/View/Helper/Permalink.php:38
+#: ../../library/ZendAfi/View/Helper/Permalink.php:29
+msgid "Lien permanent"
+msgstr "Permalink"
+
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/Codification.php:118
+#: ../../library/Class/Codification.php:120
+#: ../../library/Class/Codification.php:125
+#: ../../library/Class/Codification.php:144
+msgid "Liens internet"
+msgstr "Enlaces Web"
+
+#: ../../application/modules/admin/controllers/LieuController.php:114
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:3
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:6
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:10
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:134
+#: ../../application/modules/opac/controllers/AbonneController.php:740
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:7
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:4
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:144
+#: ../../application/modules/admin/controllers/LieuController.php:138
+#: ../../application/modules/opac/controllers/AbonneController.php:772
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:125
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:101
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:141
+#: ../../application/modules/opac/controllers/AbonneController.php:832
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:77
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:67
+#: ../../application/modules/opac/controllers/AbonneController.php:830
+#: ../../library/ZendAfi/Form/Admin/News.php:76
+msgid "Lieu"
+msgstr "Lugar"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:589
+#: ../../application/modules/opac/controllers/RechercheController.php:591
+msgid "Lieu de mise à disposition demandé"
+msgstr "En lugar de proporcionar solicitado"
+
+#: ../../application/modules/admin/controllers/LieuController.php:23
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:69
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:93
+msgid "Lieux"
+msgstr "Lugares"
+
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:62
+msgid "Limite"
+msgstr "Límite"
+
+#: ../../application/modules/opac/views/scripts/cms/article_partial.phtml:21
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:86
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:73
+#: ../../application/modules/opac/views/scripts/cms/article_partial.phtml:32
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:75
+#: ../../application/modules/opac/views/scripts/cms/article_partial.phtml:35
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:107
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:108
+#: ../../library/ZendAfi/View/Helper/Article/RenderAbstract.php:92
+#: ../../library/ZendAfi/View/Helper/Article/RenderAbstract.php:109
+msgid "Lire l'article complet"
+msgstr "Leer el artículo completo"
+
+#: ../../library/ZendAfi/View/Helper/Avis.php:69
+#: ../../library/ZendAfi/View/Helper/Avis.php:71
+#: ../../library/ZendAfi/View/Helper/Avis.php:73
+#: ../../library/ZendAfi/View/Helper/Avis.php:89
+#: ../../library/ZendAfi/View/Helper/Avis.php:98
+#: ../../library/ZendAfi/View/Helper/Avis.php:131
+msgid "Lire la suite"
+msgstr "Leer más"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:47
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:51
+msgid "Liste"
+msgstr "Lista"
+
+#: ../../library/ZendAfi/Form/UserGroupCategorie.php:32
+msgid "Liste des catégories"
+msgstr "Lista de categorías"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:37
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:38
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:57
+msgid "Liste des derniers fils RSS ajoutés"
+msgstr "Lista último hijo añadió RSS"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:43
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:66
+msgid "Liste des derniers sites ajoutés"
+msgstr "Lista de los últimos sitios añadió"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:195
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:198
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:226
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:234
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:269
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:267
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:285
+#: ../../library/ZendAfi/Form/Album/DisplayBookletAbstract.php:28
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:268
+#: ../../library/ZendAfi/Form/Album/DisplayBookletAbstract.php:27
+msgid "Livre"
+msgstr "Libro"
+
+#: ../../application/modules/telephone/views/scripts/recherche/ressourcesnumeriques.phtml:2
+msgid "Livre numérisé"
+msgstr "Libro digitalizado"
+
+#: ../../library/Class/Codification.php:96
+#: ../../library/Class/Codification.php:127
+msgid "Livres et Vidéos"
+msgstr "Libros y Videos"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:85
+#: ../../library/ZendAfi/View/Helper/admin/BarreLocalisation.php:15
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:19
+#: ../../library/Class/NoticeHtml.php:428
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:19
+#: ../../library/ZendAfi/View/Helper/Admin/BarreLocalisation.php:15
+#: ../../library/Class/NoticeHtml.php:433
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:1
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:22
+#: ../../library/Class/NoticeHtml.php:438
+#: ../../application/modules/admin/views/scripts/cms/_newsform_head.phtml:1
+#: ../../library/Class/NoticeHtml.php:439
+#: ../../library/Class/NoticeHtml.php:430
+#: ../../library/Class/NoticeHtml.php:443
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:38
+#: ../../library/ZendAfi/View/Helper/Admin/BarreLocalisation.php:34
+#: ../../library/Class/NoticeHtml.php:313
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:2
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:160
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:168
+msgid "Localisation"
+msgstr "Ubicación"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:74
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:71
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:90
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:103
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:115
+msgid "Localisations"
+msgstr "Ubicaciones"
+
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:50
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:44
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:41
+msgid "Localisations de la bibliothèque"
+msgstr "Ubicaciones Biblioteca"
+
+#: ../../application/modules/admin/controllers/BibController.php:378
+#: ../../application/modules/admin/controllers/BibController.php:386
+#: ../../application/modules/admin/controllers/BibController.php:405
+#: ../../application/modules/admin/controllers/BibController.php:402
+#: ../../application/modules/admin/controllers/BibController.php:369
+#: ../../application/modules/admin/controllers/BibController.php:374
+msgid "Localisations de la bibliothèque: %s"
+msgstr "Ubicaciones de la biblioteca: %s"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:125
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:128
+msgid "Logo droite"
+msgstr "Derecha Logo"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:109
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:112
+msgid "Logo gauche"
+msgstr "Logo izquierda"
+
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:22
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:24
+msgid "Légende"
+msgstr "Leyenda"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:4
+msgid "Ma réservation"
+msgstr "Mi reserva"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:10
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:39
+msgid "Mai"
+msgstr "Mayo"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:60
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:52
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:59
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:54
+msgid "Mail"
+msgstr "Correo"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:51
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:53
+msgid "Mail : "
+msgstr "Mail:"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:123
+msgid "Manuel"
+msgstr "Manual"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:37
+msgid "Mars"
+msgstr "Marzo"
+
+#: ../../application/modules/admin/views/scripts/ouvertures/index.phtml:13
+msgid "Matin"
+msgstr "Mañana"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:82
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:86
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:109
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:106
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:129
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:142
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:154
+#: ../../library/ZendAfi/Form/Album.php:175
+msgid "Matières / sujets"
+msgstr "Temas / temas"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:15
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:34
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:196
+msgid "Maximum amount of reservation for this document"
+msgstr "Importe máximo de reserva para este artículo"
+
+#: ../../application/modules/admin/controllers/ProfilController.php:532
+#: ../../application/modules/admin/controllers/ProfilController.php:543
+#: ../../application/modules/admin/controllers/ProfilController.php:545
+msgid "Menu horizontal dupliqué sur tous les autres profils."
+msgstr "Menú horizontal duplicado en todos los otros perfiles."
+
+#: ../../application/modules/opac/controllers/RssController.php:37
+#: ../../application/modules/opac/controllers/RssController.php:42
+#: ../../application/modules/opac/controllers/RssController.php:61
+msgid "Merci de le signaler à un responsable de la bibliothèque."
+msgstr "¡Gracias a informar de ello a un gestor de bibliotecas."
+
+#: ../../application/modules/opac/views/scripts/formulaire/add.phtml:4
+#: ../../application/modules/telephone/views/scripts/formulaire/add.phtml:3
+msgid "Merci. Le formulaire a bien été enregistré :"
+msgstr "Gracias. El formulario se ha guardado:"
+
+#: ../../library/ZendAfi/Form/ChangeKiosqueSelection.php:50
+msgid "Mes derniers paniers"
+msgstr "Mis últimos cestas"
+
+#: ../../library/Class/Users.php:1304 ../../library/Class/Users.php:1320
+#: ../../library/Class/Users.php:1328
+msgid "Mes paniers"
+msgstr "Mi Carrito de Compras"
+
+#: ../../library/Class/Users.php:1337 ../../library/Class/Users.php:1353
+#: ../../library/Class/Users.php:1361
+msgid "Mes paniers rattachés à un domaine"
+msgstr "Mis cestas unidos a un dominio"
+
+#: ../../library/storm/zf/tests/Zend/Translate/XmlTmTest.php:136
+msgid "Mess1"
+msgstr "Mess1"
+
+#: ../../application/modules/opac/controllers/IndexController.php:103
+#: ../../application/modules/opac/controllers/IndexController.php:119
+#: ../../application/modules/opac/controllers/IndexController.php:124
+#: ../../application/modules/opac/controllers/IndexController.php:116
+#: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../library/ZendAfi/Form/ContactForm.php:84
+msgid "Message"
+msgstr "Mensaje"
+
+#: ../../library/storm/zf/tests/Zend/Translate/QtTest.php:51
+#: ../../library/storm/zf/tests/Zend/Translate/QtTest.php:129
+#: ../../library/storm/zf/tests/Zend/Translate/XmlTmTest.php:56
+#: ../../library/storm/zf/tests/Zend/Translate/CsvTest.php:51
+#: ../../library/storm/zf/tests/Zend/Translate/TmxTest.php:56
+#: ../../library/storm/zf/tests/Zend/Translate/TmxTest.php:135
+#: ../../library/storm/zf/tests/Zend/Translate/GettextTest.php:57
+#: ../../library/storm/zf/tests/Zend/Translate/TbxTest.php:55
+#: ../../library/storm/zf/tests/Zend/Translate/XliffTest.php:55
+#: ../../library/storm/zf/tests/Zend/Translate/XliffTest.php:135
+msgid "Message 1"
+msgstr "Mensaje 1"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:156
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:201
+msgid "Message au dessus de la boite"
+msgstr "Cuadro de mensaje por encima de la"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:459
+#: ../../application/modules/opac/controllers/RechercheController.php:492
+#: ../../application/modules/opac/controllers/RechercheController.php:517
+#: ../../application/modules/opac/controllers/RechercheController.php:575
+#: ../../application/modules/opac/controllers/RechercheController.php:630
+#: ../../application/modules/opac/controllers/RechercheController.php:418
+#: ../../application/modules/opac/controllers/RechercheController.php:414
+msgid "Message du demandeur :"
+msgstr "Mensaje del solicitante:"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:242
+msgid "Message utilisateur déconnecté"
+msgstr "Mensaje offline Usuario"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:246
+msgid "Message utilisateur sans droit d'accès"
+msgstr "Mensaje del usuario sin acceso"
+
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:19
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:38
+msgid "Message..."
+msgstr "Mensaje ..."
+
+#: ../../library/storm/zf/tests/Zend/Translate/IniTest.php:60
+msgid "Message_1"
+msgstr "Message_1"
+
+#: ../../library/ZendAfi/Form/Album.php:62
+#: ../../library/ZendAfi/Form/Album.php:61
+#: ../../library/ZendAfi/Form/Album.php:69
+msgid "Metadonnées"
+msgstr "Metadatos"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:34
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:34
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:81
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:86
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:96
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:151
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:160
+msgid "Mise en page"
+msgstr "Layout"
+
+#: ../../application/modules/admin/controllers/BibController.php:443
+#: ../../application/modules/admin/controllers/BibController.php:451
+#: ../../application/modules/admin/controllers/BibController.php:470
+#: ../../application/modules/admin/controllers/BibController.php:467
+#: ../../application/modules/admin/controllers/BibController.php:425
+#: ../../application/modules/admin/controllers/BibController.php:430
+msgid "Mise à jour de la localisation"
+msgstr "Actualización de la ubicación"
+
+#: ../../application/modules/admin/controllers/CmsController.php:71
+#: ../../application/modules/admin/controllers/CmsController.php:87
+msgid "Mise à jour des articles"
+msgstr "Artículos actualizados"
+
+#: ../../application/modules/admin/controllers/RssController.php:70
+msgid "Mise à jour des flux RSS"
+msgstr "Alimenta Actualización RSS"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:170
+msgid "Mode de calcul des tranches"
+msgstr "Método de cálculo de las rebanadas"
+
+#: ../../application/modules/admin/views/scripts/usergroup/_usergroup.phtml:12
+msgid "Mode de sélection "
+msgstr "Modo de selección"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:122
+#: ../../application/modules/admin/controllers/UsergroupController.php:149
+#: ../../library/ZendAfi/Form/Admin/UserGroup.php:35
+msgid "Mode de sélection des utilisateurs"
+msgstr "Método de selección de los usuarios"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:94
+msgid "Modifer les informations du panier"
+msgstr "O cambiar su información de carrito de la compra"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:142
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:264
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:282
+msgid "Modification Thesaurus"
+msgstr "Cambiar Thesaurus"
+
+#: ../../application/modules/opac/views/scripts/abonne/edit.phtml:1
+msgid "Modification de votre fiche"
+msgstr "Modificar la Inmigración Record"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:104
+#: ../../application/modules/admin/controllers/CatalogueController.php:133
+msgid "Modification du domaine: %s"
+msgstr "Cambiar el campo: %s"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:35
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:54
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:68
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:55
+msgid "Modifier"
+msgstr "Cambiar"
+
+#: ../../application/modules/admin/controllers/BibController.php:243
+#: ../../application/modules/admin/controllers/BibController.php:249
+#: ../../application/modules/admin/controllers/BibController.php:268
+#: ../../application/modules/admin/controllers/BibController.php:265
+#: ../../application/modules/admin/controllers/BibController.php:247
+#: ../../application/modules/admin/controllers/BibController.php:252
+msgid "Modifier la bibliothèque: %s"
+msgstr "Modificar la biblioteca: %s"
+
+#: ../../application/modules/admin/views/scripts/upload/biographie-notice.phtml:1
+#: ../../library/ZendAfi/View/Helper/Biographie.php:51
+#: ../../library/ZendAfi/View/Helper/Biographie.php:53
+msgid "Modifier la biographie"
+msgstr "Edite la biografía"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:193
+msgid "Modifier la configuration du tableau des exemplaires"
+msgstr "Cambie la configuración de las copias de mesa"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:124
+msgid "Modifier la source de données du kiosque"
+msgstr "Edite el kiosco fuente de datos"
+
+#: ../../application/modules/admin/views/scripts/upload/vignette-notice.phtml:1
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:78
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:63
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:70
+msgid "Modifier la vignette"
+msgstr "Editar miniaturas"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:26
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:27
+msgid "Modifier le contenu"
+msgstr "Editar contenido"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:83
+msgid "Modifier le domaine affiché"
+msgstr "Edite el dominio mostrado"
+
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:64
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:91
+msgid "Modifier le panier"
+msgstr "Editar la Cesta"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:70
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:74
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:60
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:64
+msgid "Modifier le titre du panier"
+msgstr "Cambiar el título de la canasta"
+
+#: ../../application/modules/opac/controllers/PanierController.php:95
+msgid "Modifier les informations du panier"
+msgstr "Editar cesta de la compra información"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:34
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:40
+#: ../../library/ZendAfi/View/Helper/Abonne/Newsletters.php:40
+msgid "Modifier mes abonnements"
+msgstr "Cambiar mi suscripción"
+
+#: ../../application/modules/admin/controllers/BibController.php:541
+#: ../../application/modules/admin/controllers/BibController.php:549
+#: ../../application/modules/admin/controllers/BibController.php:568
+#: ../../application/modules/admin/controllers/BibController.php:565
+#: ../../application/modules/admin/controllers/BibController.php:505
+#: ../../application/modules/admin/controllers/BibController.php:510
+msgid "Modifier un plan de la bibliothèque: %s"
+msgstr "Modificar la biblioteca del plan: %s"
+
+#: ../../application/modules/admin/controllers/FrbrLinktypeController.php:34
+msgid "Modifier un type de relation"
+msgstr "Cambiar un tipo de relación"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:331
+#: ../../application/modules/admin/controllers/UsergroupController.php:202
+msgid "Modifier une catégorie d'utilisateurs"
+msgstr "Editar la categoría de usuarios"
+
+#: ../../application/modules/admin/controllers/FrbrLinkController.php:35
+msgid "Modifier une relation"
+msgstr "Editar relación"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:29
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:29
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:59
+#: ../../application/modules/admin/controllers/ModoController.php:27
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:79
+msgid "Modération"
+msgstr "Moderación"
+
+#: ../../application/modules/admin/views/scripts/modo/alert.phtml:1
+msgid "Modération des alertes"
+msgstr "Alertas de moderación"
+
+#: ../../application/modules/admin/views/scripts/modo/aviscms.phtml:1
+#: ../../application/modules/admin/views/scripts/modo/aviscms.phtml:2
+msgid "Modération des avis sur les articles"
+msgstr "Moderación de los artículos de revisión"
+
+#: ../../application/modules/admin/views/scripts/modo/avisnotice.phtml:3
+msgid "Modération des avis sur les notices"
+msgstr "Moderación de revisar los registros"
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:12
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:1
+msgid "Modération des formulaires: "
+msgstr "Formas de moderación:"
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:1
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:2
+msgid "Modération des suggestions d'achat"
+msgstr "Moderación de sugerencias de compra"
+
+#: ../../application/modules/admin/views/scripts/modo/tagnotice.phtml:1
+msgid "Modération des tags sur les notices"
+msgstr "Etiquetas de moderación en los registros"
+
+#: ../../application/modules/opac/controllers/RssController.php:239
+#: ../../application/modules/opac/controllers/RssController.php:215
+#: ../../application/modules/opac/controllers/RssController.php:217
+#: ../../application/modules/opac/controllers/RssController.php:236
+#: ../../application/modules/opac/controllers/RssController.php:232
+msgid "Modérations"
+msgstr "Moderaciones"
+
+#: ../../application/modules/admin/controllers/HarvestController.php:43
+#: ../../application/modules/admin/controllers/HarvestController.php:44
+#: ../../application/modules/admin/controllers/HarvestController.php:26
+#: ../../application/modules/admin/controllers/HarvestController.php:33
+#: ../../application/modules/admin/controllers/HarvestController.php:89
+msgid "Moissonnage ArteVOD"
+msgstr "ArteVOD cosecha"
+
+#: ../../application/modules/admin/controllers/HarvestController.php:119
+#: ../../application/modules/admin/controllers/HarvestController.php:62
+#: ../../application/modules/admin/controllers/HarvestController.php:68
+msgid "Moissonnage Numilog"
+msgstr "Cosechar Numilog"
+
+#: ../../application/modules/admin/controllers/HarvestController.php:75
+#: ../../application/modules/admin/controllers/HarvestController.php:95
+#: ../../application/modules/admin/controllers/HarvestController.php:46
+#: ../../application/modules/admin/controllers/HarvestController.php:56
+msgid "Moissonnage Tout Apprendre"
+msgstr "Aprenda todo la cosecha"
+
+#: ../../application/modules/admin/controllers/HarvestController.php:52
+#: ../../application/modules/admin/controllers/HarvestController.php:91
+#: ../../application/modules/admin/controllers/HarvestController.php:39
+msgid "Moissonnage Vodeclic"
+msgstr "Cosechar Vodeclic"
+
+#: ../../application/modules/admin/views/scripts/harvest/arte-vod-browse.phtml:6
+msgid "Moissonnage en cours"
+msgstr "La cosecha en curso"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:8
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:7
+msgid "Mon compte"
+msgstr "Mi cuenta"
+
+#: ../../library/ZendAfi/Form/Album/DisplayBookletAbstract.php:32
+#: ../../library/ZendAfi/Form/Album/DisplayBookletAbstract.php:31
+msgid "Monopage"
+msgstr "Una sola página"
+
+#: ../../library/Class/Codification.php:139
+#: ../../library/Class/Codification.php:142
+#: ../../library/Class/Codification.php:144
+#: ../../library/Class/Codification.php:152
+#: ../../library/Class/Codification.php:217
+#: ../../library/Class/Codification.php:218
+#: ../../library/Class/Codification.php:213
+msgid "Morceaux"
+msgstr "Piezas"
+
+#: ../../application/modules/admin/views/scripts/auth/login.phtml:15
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:26
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:25
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:14
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:23
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:14
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:11
+#: ../../application/modules/opac/views/scripts/auth/register.phtml:13
+#: ../../application/modules/opac/views/scripts/auth/ajaxregister.phtml:16
+#: ../../application/modules/opac/controllers/AuthController.php:189
+msgid "Mot de passe"
+msgstr "Contraseña"
+
+#: ../../application/modules/telephone/controllers/AuthController.php:81
+#: ../../application/modules/telephone/controllers/AuthController.php:75
+#: ../../application/modules/telephone/controllers/AuthController.php:89
+msgid "Mot de passe ou date de naissance"
+msgstr "Contraseña o fecha de nacimiento"
+
+#: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:11
+msgid "Mot de passe oublié"
+msgstr "Olvidé mi contraseña"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:32
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:32
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:30
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:30
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:31
+msgid "Mot de passe oublié ?"
+msgstr "¿Olvidaste tu contraseña?"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:266
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:275
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:322
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:319
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:341
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:353
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:367
+msgid "Mots-clef"
+msgstr "Use palabras clave"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:110
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:115
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:123
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:201
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:210
+msgid "Multimedia"
+msgstr "Multimedia"
+
+#: ../../library/Class/Codification.php:96
+#: ../../library/Class/Codification.php:138
+msgid "Musique"
+msgstr "Música"
+
+#: ../../library/Class/Bib.php:37 ../../library/Class/Bib.php:38
+#: ../../library/Class/Bib.php:45 ../../library/Class/Bib.php:46
+#: ../../library/Class/Bib.php:77 ../../library/Class/Bib.php:96
+#: ../../library/Class/Bib.php:116 ../../library/Class/Bib.php:127
+#: ../../library/Class/Bib.php:147 ../../library/Class/Bib.php:167
+msgid "N'envoie pas de données"
+msgstr "No envíe datos"
+
+#: ../../library/Class/FRBR/Link.php:88 ../../library/Class/FRBR/Link.php:90
+msgid "N'est pas une url valide"
+msgstr "¿No es una URL válida"
+
+#: ../../application/modules/admin/controllers/BibController.php:335
+#: ../../application/modules/admin/controllers/BibController.php:343
+#: ../../application/modules/admin/controllers/BibController.php:362
+#: ../../application/modules/admin/controllers/BibController.php:359
+#: ../../application/modules/admin/controllers/BibController.php:330
+msgid ""
+"NB : l'image doit être de type \".jpg\", avoir une taille inférieure à 100 "
+"ko et des dimensions se rapprochant de 180 / 140 pixels"
+msgstr ""
+"NB: La imagen debe ser \"jpg\", debe tener menos de 100 KB de tamaño y "
+"dimensiones que se aproximan 180/140 píxeles"
+
+#: ../../library/storm/zf/tests/Zend/Translate/TbxTest.php:137
+msgid "Nachricht 1"
+msgstr "Nachricht 1"
+
+#: ../../library/ZendAfi/Form/Album.php:166
+msgid "Nature de document"
+msgstr "Tipo de Documento"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:25
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:26
+msgid "Nb de notices"
+msgstr "Número de registros"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:88
+msgid "Nb résa: %s "
+msgstr "Número de RESA: %s"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:88
+msgid "Nb résas: %s "
+msgstr "Résarvations Número: %s"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:127
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:223
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:88
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:78
+msgid "Ne pas afficher"
+msgstr "No se repite"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:60
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:57
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:55
+msgid "Niveau d'accès requis"
+msgstr "Nivel de acceso requerido"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:14
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:33
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:195
+msgid "No copies allowed for this document"
+msgstr "No se permite para este papel copias"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:20
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:39
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:201
+msgid "No copies available to reserve because of the availability of copies"
+msgstr ""
+"No hay copias disponibles para reservar Debido a la disponibilidad de copias"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:16
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:35
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:197
+msgid "No copy or copy cannot be reserved, none on order"
+msgstr "No copia o copia no se pueden reservar, ninguno en orden"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:18
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:37
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:199
+msgid "No copy, on order but cannot be reserved"
+msgstr "No copia, usted puede ordenar el fin de no reservarse"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:32
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:51
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:213
+msgid "No valid customer subscription or payments overdue"
+msgstr "Sin suscripción de cliente válido o pagos atrasados"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:25
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:44
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:206
+msgid ""
+"No withdrawal possible : subscription problem, no available copy to reserve"
+msgstr ""
+"No retiro puede: problema de suscripción, ninguna copia disponible para "
+"reservar"
+
+#: ../../application/modules/opac/views/scripts/head.phtml:43
+#: ../../application/modules/opac/views/scripts/head.phtml:44
+#: ../../application/modules/opac/views/scripts/head.phtml:52
+#: ../../application/modules/opac/views/scripts/head.phtml:61
+#: ../../application/modules/opac/views/scripts/head.phtml:75
+#: ../../application/modules/opac/views/scripts/head.phtml:78
+msgid "Noir sur blanc"
+msgstr "Negro sobre blanco"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:19
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:12
+#: ../../application/modules/admin/views/scripts/rss/catform.phtml:10
+#: ../../application/modules/admin/views/scripts/sito/catform.phtml:11
+#: ../../application/modules/admin/views/scripts/users/index.phtml:15
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:18
+#: ../../application/modules/opac/controllers/AbonneController.php:357
+#: ../../application/modules/opac/controllers/AbonneController.php:365
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:20
+#: ../../application/modules/admin/views/scripts/cms/catform.phtml:11
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:18
+#: ../../application/modules/opac/controllers/AbonneController.php:373
+#: ../../application/modules/opac/controllers/AbonneController.php:399
+#: ../../application/modules/opac/controllers/IndexController.php:71
+#: ../../application/modules/opac/controllers/AbonneController.php:390
+#: ../../application/modules/opac/controllers/IndexController.php:87
+#: ../../application/modules/opac/controllers/AbonneController.php:366
+#: ../../application/modules/opac/controllers/IndexController.php:92
+#: ../../library/ZendAfi/Form/FRBR/LinkType.php:31
+#: ../../application/modules/admin/views/scripts/sito/catform.phtml:12
+#: ../../application/modules/opac/controllers/IndexController.php:84
+#: ../../application/modules/admin/views/scripts/users/index.phtml:17
+#: ../../library/ZendAfi/Form/Album.php:196
+#: ../../library/ZendAfi/Form/Album.php:204
+#: ../../library/ZendAfi/Form/Album.php:210
+#: ../../application/modules/admin/views/scripts/rss/catform.phtml:16
+#: ../../application/modules/opac/controllers/IndexController.php:83
+#: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:431
+#: ../../library/ZendAfi/Form/ContactForm.php:59
+msgid "Nom"
+msgstr "Nombre"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:31
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:33
+msgid "Nom :"
+msgstr "Nombre:"
+
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:67
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:67
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:86
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:89
+msgid "Nom commence par"
+msgstr "Nombre comienza con"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:73
+msgid "Nom de la notice"
+msgstr "Nombre del Propietario"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:23
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:24
+msgid "Nom du panier"
+msgstr "Cesta Nombre"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:23
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:22
+msgid "Nom du responsable"
+msgstr "Nombre del responsable"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:451
+#: ../../application/modules/opac/controllers/RechercheController.php:484
+#: ../../application/modules/opac/controllers/RechercheController.php:509
+#: ../../application/modules/opac/controllers/RechercheController.php:567
+#: ../../application/modules/opac/controllers/RechercheController.php:622
+#: ../../application/modules/opac/controllers/RechercheController.php:410
+#: ../../application/modules/opac/controllers/RechercheController.php:406
+msgid "Nom et prénom : %s"
+msgstr "Nombre: %s"
+
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:3
+msgid "Nombre d'avis abonnés : %s"
+msgstr "Avisos de suscriptores: %s"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:131
+msgid "Nombre d'éléments par facette"
+msgstr "Productos en la faceta"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:18
+msgid "Nombre de Participants"
+msgstr "Número de participantes"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:163
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:172
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:219
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:217
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:239
+msgid "Nombre de divisons"
+msgstr "Número de divisiones"
+
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:9
+msgid "Nombre de formulaires : %s"
+msgstr "Número de formas: %s"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:95
+msgid "Nombre de notices par page"
+msgstr "Número de registros por página"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:238
+msgid "Nombre de résultats à afficher"
+msgstr "Número de resultados para mostrar"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:176
+msgid "Nombre de tags à afficher"
+msgstr "Número de etiquetas para visualizar"
+
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:5
+msgid "Nombre de traductions : %s"
+msgstr "Número de traducciones: %s"
+
+#: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
+msgid "Non"
+msgstr "No"
+
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:23
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:22
+msgid "Note"
+msgstr "Nota"
+
+#: ../../library/Class/Codification.php:109
+#: ../../library/Class/Codification.php:111
+#: ../../library/Class/Codification.php:112
+#: ../../library/Class/Codification.php:117
+#: ../../library/Class/Codification.php:137
+msgid "Notes"
+msgstr "Notas"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:35
+msgid "Notes(s)"
+msgstr "Nota (s)"
+
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:2
+msgid "Notice"
+msgstr "Aviso"
+
+#: ../../application/modules/opac/controllers/PanierController.php:209
+#: ../../application/modules/opac/controllers/PanierController.php:254
+msgid "Notice \"%s\" retirée du panier"
+msgstr "Note \"%s\" eliminado del carrito"
+
+#: ../../library/Class/Codification.php:131
+#: ../../library/Class/Codification.php:134
+#: ../../library/Class/Codification.php:136
+#: ../../application/modules/telephone/views/scripts/recherche/detail.phtml:2
+msgid "Notice détaillée"
+msgstr "Registro completo"
+
+#: ../../application/modules/telephone/views/scripts/recherche/frbr.phtml:2
+msgid "Notice liées"
+msgstr "Instrucciones relacionadas"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:453
+#: ../../application/modules/opac/controllers/RechercheController.php:486
+#: ../../application/modules/opac/controllers/RechercheController.php:511
+#: ../../application/modules/opac/controllers/RechercheController.php:569
+#: ../../application/modules/opac/controllers/RechercheController.php:624
+#: ../../application/modules/opac/controllers/RechercheController.php:412
+#: ../../application/modules/opac/controllers/RechercheController.php:408
+msgid "Notice réservée : "
+msgstr "Registro Reservado:"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:33
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:52
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:214
+msgid "Notice's document family cannot be reserved"
+msgstr "Observe la familia del documento no se pueden reservar"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:29
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:31
+msgid "Notices"
+msgstr "Avisos"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:10
+msgid "Notices :"
+msgstr "Registros:"
+
+#: ../../application/modules/admin/controllers/FrbrLinkController.php:36
+#: ../../application/modules/telephone/controllers/RechercheController.php:37
+#: ../../library/Class/Codification.php:158
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:83
+#: ../../application/modules/telephone/controllers/RechercheController.php:40
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:93
+#: ../../library/Class/Codification.php:223
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:138
+#: ../../library/Class/Codification.php:224
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:147
+#: ../../library/Class/Codification.php:219
+msgid "Notices liées"
+msgstr "Registros vinculados"
+
+#: ../../library/Class/Codification.php:137
+#: ../../library/Class/Codification.php:140
+#: ../../library/Class/Codification.php:142
+#: ../../application/modules/telephone/views/scripts/recherche/similaires.phtml:2
+msgid "Notices similaires"
+msgstr "Registros similares"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:376
+#: ../../application/modules/opac/controllers/AbonneController.php:384
+#: ../../application/modules/opac/controllers/AbonneController.php:392
+#: ../../application/modules/opac/controllers/AbonneController.php:418
+#: ../../application/modules/opac/controllers/AbonneController.php:409
+#: ../../application/modules/opac/controllers/AbonneController.php:385
+#: ../../application/modules/opac/controllers/AbonneController.php:404
+#: ../../application/modules/opac/controllers/AbonneController.php:464
+#: ../../application/modules/opac/controllers/AbonneController.php:462
+msgid "Nouveau mot de passe"
+msgstr "Nueva contraseña"
+
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax.phtml:26
+#: ../../application/modules/opac/controllers/PanierController.php:387
+msgid "Nouveau panier"
+msgstr "Nueva cesta"
+
+#: ../../application/modules/opac/controllers/PanierController.php:387
+msgid "Nouveau panier de notices"
+msgstr "Nueva canasta de registros"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:68
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:72
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:58
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:72
+msgid "Nouveau titre"
+msgstr "Nuevo título"
+
+#: ../../application/modules/admin/controllers/FrbrLinktypeController.php:33
+msgid "Nouveau type de relation"
+msgstr "Nueva relación"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Mur.php:36
+#: ../../library/Class/Codification.php:145
+msgid "Nouveauté"
+msgstr "Novelty"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:44
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:63
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:106
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:108
+msgid "Nouveautés"
+msgstr "Noticias"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:107
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:104
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:110
+msgid "Nouveautés de moins de"
+msgstr "Nuevo bajo"
+
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:107
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:77
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:109
+msgid "Nouveautés de moins de: "
+msgstr "Nuevo en:"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:70
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:66
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:63
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:79
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:92
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:104
+msgid "Nouveautés uniquement"
+msgstr "Nuevo sólo"
+
+#: ../../application/modules/admin/controllers/BatchController.php:34
+msgid "Nouvelle Tâche"
+msgstr "Nueva tarea"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:16
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:24
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:38
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:37
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:49
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:54
+msgid "Nouvelle recherche"
+msgstr "Nueva búsqueda"
+
+#: ../../application/modules/admin/controllers/FrbrLinkController.php:34
+msgid "Nouvelle relation"
+msgstr "Nueva relación"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:45
+msgid "Nov"
+msgstr "Noviembre"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:16
+msgid "Nov."
+msgstr "Noviembre"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:61
+msgid "Nuage de tags"
+msgstr "Nube de etiquetas"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:82
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:118
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:121
+msgid "Numilog"
+msgstr "Numilog"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:68
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:105
+msgid "Numéro"
+msgstr "Número"
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:13
+msgid "N° abonné"
+msgstr "No de carné"
+
+#: ../../library/Class/SuggestionAchat.php:79
+#: ../../library/Class/SuggestionAchat.php:80
+#: ../../library/Class/SuggestionAchat.php:101
+msgid "N° carte abonné"
+msgstr "No de carné"
+
+#: ../../application/modules/telephone/controllers/AuthController.php:77
+#: ../../application/modules/telephone/controllers/AuthController.php:74
+#: ../../application/modules/telephone/controllers/AuthController.php:88
+msgid "N° de carte"
+msgstr "No de carné"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:33
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:46
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:58
+msgid "OAI spec"
+msgstr "OAI spec"
+
+#: ../../library/ZendAfi/Form/ChangeKiosqueSelection.php:43
+msgid "OK"
+msgstr "Okay"
+
+#: ../../application/modules/admin/views/scripts/frbr-link/index.phtml:30
+msgid "Objet A"
+msgstr "Objeto"
+
+#: ../../application/modules/admin/views/scripts/frbr-link/index.phtml:30
+msgid "Objet B"
+msgstr "Objeto B"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:76
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:48
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:53
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:72
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:78
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:62
+msgid "Objets flash"
+msgstr "Objetos Flash"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:69
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:46
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:49
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:70
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:62
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:60
+msgid "Objets java-script"
+msgstr "Objetos java-script"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:73
+msgid "Objets javascript"
+msgstr "Objetos JavaScript"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:44
+msgid "Oct"
+msgstr "Octubre"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:15
+msgid "Oct."
+msgstr "Octubre"
+
+#: ../../library/ZendAfi/View/Helper/Avis.php:26
+#: ../../library/ZendAfi/View/Helper/Avis.php:28
+#: ../../library/ZendAfi/View/Helper/Avis.php:47
+#: ../../library/ZendAfi/View/Helper/Avis.php:55
+#: ../../library/ZendAfi/View/Helper/Avis.php:88
+msgid "Oeuvre non trouvée"
+msgstr "Obra que no se encuentra"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:140
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:145
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:171
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:165
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:161
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:181
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:159
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:175
+#: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php:31
+#: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php:29
+#: ../../library/ZendAfi/Form/Admin/News.php:114
+msgid "Options"
+msgstr "Opciones"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:79
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:85
+msgid "Options de la recherche :"
+msgstr "Opciones de búsqueda:"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:250
+msgid "Ordre des divisons"
+msgstr "Colegio de división"
+
+#: ../../application/modules/admin/views/scripts/i18n/index.phtml:38
+msgid "Original"
+msgstr "Original"
+
+#: ../../application/modules/admin/views/scripts/multimedia/browse.phtml:7
+msgid "Os"
+msgstr "Hueso"
+
+#: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
+msgid "Oui"
+msgstr "Sí"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:28
+#: ../../application/modules/telephone/controllers/RechercheController.php:30
+#: ../../application/modules/telephone/controllers/RechercheController.php:33
+msgid "Où le trouver ?"
+msgstr "Dónde está?"
+
+#: ../../application/modules/admin/views/scripts/profil/accueil.phtml:32
+msgid "Page css:"
+msgstr "Página Css:"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:51
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:46
+msgid "Page précédente"
+msgstr "Anterior"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:56
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:51
+msgid "Page suivante"
+msgstr "Página siguiente"
+
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:78
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:80
+msgid "Page: "
+msgstr "Página:"
+
+#: ../../library/Class/NoticeHtml.php:237
+#: ../../library/Class/NoticeHtml.php:242
+#: ../../library/Class/NoticeHtml.php:233
+#: ../../library/Class/NoticeHtml.php:273
+#: ../../library/Class/NoticeHtml.php:143
+#: ../../library/Class/NoticeHtml.php:91 ../../library/Class/NoticeHtml.php:82
+msgid "Pagination"
+msgstr "Paginación"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:45
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:45
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:52
+msgid "Palmarès des réservations"
+msgstr "Premios reservas"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:43
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:43
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:50
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:55
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:94
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:99
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:109
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:176
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:185
+msgid "Palmarès des visualisations"
+msgstr "Premios visualizaciones"
+
+#: ../../application/modules/opac/controllers/PanierController.php:115
+#: ../../application/modules/opac/controllers/PanierController.php:151
+msgid "Panier %s supprimé"
+msgstr "Cesta eliminado %s"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:5
+msgid "Panier :"
+msgstr "Carro de la compra:"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:183
+#: ../../application/modules/admin/controllers/CatalogueController.php:208
+msgid "Panier \"%s\" ajouté"
+msgstr "Cesta \"%s\", agregó"
+
+#: ../../application/modules/opac/controllers/PanierController.php:305
+msgid "Panier \"%s\" renommé vers \"%s\". "
+msgstr "Cesta \"%s\" renombrado a  \"%s\"."
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:193
+#: ../../application/modules/admin/controllers/CatalogueController.php:218
+msgid "Panier \"%s\" retiré"
+msgstr "Cesta \"%s\" eliminado"
+
+#: ../../application/modules/opac/controllers/PanierController.php:312
+#: ../../library/Class/PanierNotice.php:103
+msgid "Panier no %d"
+msgstr "Cesta %d"
+
+#: ../../application/modules/opac/controllers/PanierController.php:290
+#: ../../application/modules/opac/controllers/PanierController.php:291
+msgid "Panier: "
+msgstr "Cesta:"
+
+#: ../../application/modules/admin/controllers/CatalogueController.php:201
+#: ../../application/modules/admin/controllers/CatalogueController.php:226
+msgid "Paniers du domaine: %s"
+msgstr "Repleto de dominio: %s"
+
+#: ../../library/Class/PanierNotice.php:363
+msgid "Paniers sans domaine, rattachés à leur créateur"
+msgstr "Canastas sin dominio apegados a su creador"
+
+#: ../../application/modules/admin/views/scripts/index/index.phtml:15
+#: ../../application/modules/admin/views/scripts/index/index.phtml:4
+#: ../../application/modules/admin/views/scripts/index/index.phtml:6
+msgid "Paramètres du site"
+msgstr "Configuración del sitio"
+
+#: ../../application/modules/opac/views/scripts/footer.phtml:19
+#: ../../application/modules/opac/views/scripts/footer.phtml:20
+#: ../../application/modules/opac/views/scripts/footer.phtml:18
+msgid "Paramétrer cette page"
+msgstr "Establezca esta página"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:138
+msgid "Pays"
+msgstr "País"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:92
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/MoteurRecherche.php:346
+#: ../../library/Class/Codification.php:112
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:96
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:119
+#: ../../library/Class/Codification.php:113
+#: ../../library/Class/MoteurRecherche.php:363
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:116
+#: ../../library/Class/MoteurRecherche.php:375
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:139
+#: ../../library/Class/MoteurRecherche.php:409
+#: ../../library/Class/Codification.php:118
+#: ../../library/Class/MoteurRecherche.php:435
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:152
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:164
+#: ../../library/ZendAfi/Form/Album.php:183
+msgid "Pcdm4"
+msgstr "Pcdm4"
+
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:50
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:52
+msgid "Permalink"
+msgstr "Permalink"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:71
+#: ../../library/Class/CriteresRecherche.php:80
+#: ../../library/Class/CriteresRecherche.php:104
+#: ../../library/Class/CriteresRecherche.php:105
+msgid "Pertinence"
+msgstr "Relevancia"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:30
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:169
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:168
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:29
+msgid "Photo"
+msgstr "Foto"
+
+#: ../../library/Class/Codification.php:141
+#: ../../library/Class/Codification.php:144
+#: ../../library/Class/Codification.php:146
+#: ../../library/Class/Codification.php:154
+#: ../../library/Class/Codification.php:219
+#: ../../library/Class/Codification.php:220
+#: ../../library/Class/Codification.php:215
+msgid "Photos"
+msgstr "Pics"
+
+#: ../../application/modules/admin/views/scripts/profil/menusmaj.phtml:30
+msgid "Pictogramme"
+msgstr "Pictograma"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:36
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:38
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:43
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:83
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:88
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:98
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:156
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:165
+msgid "Pictogrammes des genres"
+msgstr "Géneros Pictogramas"
+
+#: ../../application/modules/admin/views/scripts/zone/placerbibs.phtml:95
+msgid "Placement des bibliothèques sur la carte"
+msgstr "Bibliotecas de Colocación en el mapa"
+
+#: ../../application/modules/admin/views/scripts/bib/plansmaj.phtml:6
+#: ../../library/Class/NoticeHtml.php:301
+#: ../../library/Class/NoticeHtml.php:306
+#: ../../library/Class/NoticeHtml.php:297
+#: ../../library/Class/NoticeHtml.php:339
+#: ../../library/Class/NoticeHtml.php:209
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:51
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:54
+msgid "Plan"
+msgstr "Plan de"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:106
+msgid "Plan associé"
+msgstr "Plan asociado"
+
+#: ../../application/modules/opac/controllers/IndexController.php:20
+#: ../../application/modules/opac/views/scripts/bib/mapview.phtml:22
+#: ../../application/modules/opac/views/scripts/index/planaccess.phtml:28
+msgid "Plan d'accès"
+msgstr "Plano de acceso"
+
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:58
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:52
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:49
+msgid "Planification des ouvertures"
+msgstr "Aberturas Planificación"
+
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:44
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:38
+#: ../../application/modules/admin/views/scripts/bib/index.phtml:35
+msgid "Plans de la bibliothèque"
+msgstr "Planes Biblioteca"
+
+#: ../../application/modules/admin/controllers/BibController.php:491
+#: ../../application/modules/admin/controllers/BibController.php:499
+#: ../../application/modules/admin/controllers/BibController.php:518
+#: ../../application/modules/admin/controllers/BibController.php:515
+#: ../../application/modules/admin/controllers/BibController.php:463
+#: ../../application/modules/admin/controllers/BibController.php:468
+msgid "Plans de la bibliothèque: %s"
+msgstr "Los planes para la biblioteca: %s"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/TagAlbumMediaList.php:48
+#: ../../library/ZendAfi/View/Helper/Telephone/TagAlbumMediaList.php:46
+msgid "Playlist"
+msgstr "Playlist"
+
+#: ../../library/ZendAfi/View/Helper/MonocleReader.php:79
+#: ../../library/ZendAfi/View/Helper/MonocleReaderServerSide.php:108
+msgid "Plein écran"
+msgstr "Pantalla completa"
+
+#: ../../library/ZendAfi/View/Helper/Album/OsmPlayer.php:44
+#: ../../library/ZendAfi/View/Helper/Album/Download.php:35
+msgid "Podcastez l'album (iTunes, Lecteur RSS)"
+msgstr "Álbum Podcastez (iTunes, RSS Reader)"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:95
+msgid "Point"
+msgstr "Punto"
+
+#: ../../library/ZendAfi/View/Helper/admin/BarreLocalisation.php:16
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:151
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:24
+#: ../../library/Class/Cms.php:538
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:151
+#: ../../library/ZendAfi/View/Helper/Admin/BarreLocalisation.php:16
+#: ../../library/Class/Cms.php:448
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
+#: ../../library/ZendAfi/View/Helper/Admin/BarreLocalisation.php:17
+#: ../../application/modules/telephone/views/scripts/cms/articleviewbydate.phtml:10
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:170
+#: ../../library/ZendAfi/View/Helper/Admin/BarreLocalisation.php:36
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:43
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:91
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:173
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:93
+#: ../../library/ZendAfi/View/Helper/ComboProfils.php:92
+msgid "Portail"
+msgstr "Portal"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:165
+msgid "Position"
+msgstr "Posición"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:7
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:10
+#: ../../application/modules/opac/controllers/AbonneController.php:744
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:8
+#: ../../application/modules/opac/controllers/AbonneController.php:776
+#: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/opac/controllers/AbonneController.php:834
+msgid "Poste"
+msgstr "Mensaje"
+
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:20
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:23
+#: ../../application/modules/admin/views/scripts/modo/formulaires.phtml:34
+msgid "Posté par"
+msgstr "Publicado por"
+
+#: ../../library/Class/Users.php:254 ../../library/Class/Users.php:268
+#: ../../library/Class/Users.php:343 ../../library/Class/Users.php:419
+#: ../../library/Class/Users.php:448 ../../library/Class/Users.php:594
+#: ../../library/Class/Users.php:661 ../../library/Class/Users.php:749
+#: ../../library/Class/Users.php:872
+msgid "Pour activer votre compte, merci de cliquer sur le lien suivant :"
+msgstr "Para activar su cuenta, gracias a hacer clic en el siguiente enlace:"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-day.phtml:4
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-day.phtml:5
+msgid "Pour quel jour ?"
+msgstr "¿Qué día?"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:661
+#: ../../application/modules/opac/controllers/AbonneController.php:693
+#: ../../application/modules/opac/controllers/AbonneController.php:753
+#: ../../application/modules/opac/controllers/AbonneController.php:751
+msgid "Pour quelle durée ?"
+msgstr "Por cuánto tiempo?"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:8
+msgid ""
+"Pour réserver un ou des document(s), veuillez remplir le formulaire ci-"
+"dessous."
+msgstr ""
+"Para reservar o documento (s), por favor complete el siguiente formulario."
+
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:56
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:70
+msgid "Pourquoi suggérez-vous ce document ?"
+msgstr "¿Por qué le sugeriría este documento?"
+
+#: ../../library/Class/Calendar.php:351 ../../library/Class/Calendar.php:368
+#: ../../library/Class/Calendar.php:379 ../../library/Class/Calendar.php:399
+#: ../../library/Class/Calendar.php:397
+msgid "Prochains rendez-vous"
+msgstr "Próximos eventos"
+
+#: ../../library/ZendAfi/View/Helper/CalendarContent.php:84
+msgid "Prochains évènements"
+msgstr "Próximos eventos"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:34
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:46
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:46
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:31
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:65
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:29
+msgid "Profil"
+msgstr "Perfil"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:35
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:35
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:37
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:42
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:82
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:87
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:97
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:153
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:162
+msgid "Profils"
+msgstr "Perfiles"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:29
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:33
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:73
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:38
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:40
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:54
+msgid "Prolonger"
+msgstr "Extender"
+
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:2
+#: ../../library/Class/NoticeHtml.php:870
+#: ../../library/Class/NoticeHtml.php:877
+#: ../../library/Class/NoticeHtml.php:888
+#: ../../library/Class/NoticeHtml.php:879
+#: ../../library/Class/NoticeHtml.php:893
+#: ../../library/Class/NoticeHtml.php:765
+#: ../../library/Class/NoticeHtml.php:381
+#: ../../library/Class/NoticeHtml.php:380
+#: ../../library/Class/NoticeHtml.php:357
+msgid "Proposer des tags pour cette notice"
+msgstr "Indican las etiquetas de este manual"
+
+#: ../../application/modules/admin/controllers/ModulesnoticeController.php:68
+msgid "Propriété du bloc des exemplaires"
+msgstr "Copias de bloques de la propiedad"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:55
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:115
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:118
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:120
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:139
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:60
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:131
+#: ../../library/ZendAfi/View/Helper/Admin/PropertiesReader.php:45
+msgid "Propriétés de l'objet"
+msgstr "Propiedades del objeto"
+
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:34
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:35
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:52
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:53
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:50
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:51
+#: ../../library/ZendAfi/View/Helper/FonctionsAdmin.php:37
+msgid "Propriétés du module"
+msgstr "Características del módulo"
+
+#: ../../library/ZendAfi/Form/Album.php:154
+msgid "Provenance"
+msgstr "Procedencia"
+
+#: ../../application/modules/admin/views/scripts/upload/vignette-notice.phtml:13
+msgid ""
+"Préférez une image de résolution comprise entre 320x240 et 800x600 au format "
+"jpg, png ou gif."
+msgstr ""
+"Elija una resolución de imagen entre 320x240 y 800x600 en formato jpg, png o "
+"gif."
+
+#: ../../application/modules/admin/views/scripts/users/index.phtml:16
+#: ../../application/modules/opac/controllers/AbonneController.php:358
+#: ../../application/modules/opac/controllers/AbonneController.php:366
+#: ../../application/modules/opac/controllers/AbonneController.php:374
+#: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/IndexController.php:76
+#: ../../application/modules/opac/controllers/AbonneController.php:391
+#: ../../application/modules/opac/controllers/IndexController.php:92
+#: ../../application/modules/opac/controllers/AbonneController.php:367
+#: ../../application/modules/opac/controllers/IndexController.php:97
+#: ../../application/modules/opac/controllers/IndexController.php:89
+#: ../../application/modules/admin/views/scripts/users/index.phtml:18
+#: ../../application/modules/opac/controllers/IndexController.php:88
+#: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:432
+#: ../../library/ZendAfi/Form/ContactForm.php:63
+msgid "Prénom"
+msgstr "Nombre de pila"
+
+#: ../../application/modules/admin/controllers/OpdsController.php:109
+msgid "Prévisualisation"
+msgstr "Prevista"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:90
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+msgid "Prêt"
+msgstr "Préstamo"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:323
+#: ../../application/modules/opac/controllers/AbonneController.php:331
+#: ../../application/modules/opac/controllers/AbonneController.php:338
+#: ../../application/modules/opac/controllers/AbonneController.php:364
+#: ../../application/modules/opac/controllers/AbonneController.php:359
+#: ../../application/modules/telephone/controllers/AbonneController.php:65
+#: ../../application/modules/opac/controllers/AbonneController.php:335
+#: ../../application/modules/opac/controllers/AbonneController.php:340
+#: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:398
+msgid "Prêt prolongé"
+msgstr "Préstamo a largo plazo"
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:55
+#: ../../application/modules/telephone/views/scripts/abonne/prets.phtml:1
+msgid "Prêts"
+msgstr "Préstamos"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:1
+msgid "Prêts en cours"
+msgstr "Préstamos por cobrar"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:78
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:80
+msgid "Prêts et réservations :"
+msgstr "Préstamos y reservas:"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:359
+#: ../../application/modules/opac/controllers/AbonneController.php:367
+#: ../../application/modules/opac/controllers/AbonneController.php:375
+#: ../../application/modules/opac/controllers/AbonneController.php:401
+#: ../../application/modules/opac/controllers/AbonneController.php:392
+#: ../../application/modules/opac/controllers/AbonneController.php:368
+#: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:433
+msgid "Pseudo"
+msgstr "Apodo"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:31
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:36
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:66
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:40
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:92
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:34
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:86
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:30
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:82
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:29
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:18
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:81
+#: ../../library/ZendAfi/Form/Admin/News.php:54
+#: ../../library/ZendAfi/Form/Admin/News.php:102
+msgid "Publication"
+msgstr "Publicación"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:25
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:30
+msgid "Publié en :"
+msgstr "Publicado en:"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:101
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:98
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:104
+msgid "Publié entre (Année sous forme 1980)"
+msgstr "Publicado entre (como el año 1980)"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-hours.phtml:5
+msgid "Quand ?"
+msgstr "¿Cuándo?"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-device.phtml:6
+msgid "Quel poste ?"
+msgstr "¿En qué posición?"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-group.phtml:5
+msgid "Quel secteur ?"
+msgstr "¿Qué sector?"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-group.phtml:5
+msgid "Quelle secteur ?"
+msgstr "¿Qué sector?"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:559
+#: ../../application/modules/opac/controllers/AbonneController.php:591
+#: ../../application/modules/opac/controllers/AbonneController.php:651
+#: ../../application/modules/opac/controllers/AbonneController.php:649
+msgid "Quota déjà atteint ce jour, choisissez un autre jour."
+msgstr "Quota ya alcanza este día, elegir otro día."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:565
+#: ../../application/modules/opac/controllers/AbonneController.php:597
+#: ../../application/modules/opac/controllers/AbonneController.php:657
+#: ../../application/modules/opac/controllers/AbonneController.php:655
+msgid "Quota déjà atteint ce mois, choisissez un autre mois."
+msgstr "Quota ya se reunió este mes, seleccionar otro mes."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:562
+#: ../../application/modules/opac/controllers/AbonneController.php:594
+#: ../../application/modules/opac/controllers/AbonneController.php:654
+#: ../../application/modules/opac/controllers/AbonneController.php:652
+msgid "Quota déjà atteint cette semaine, choisissez une autre semaine."
+msgstr "Quota ya alcanzó esta semana, elija otra semana."
+
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:10
+#: ../../library/ZendAfi/View/Helper/Telephone/TagAlbumMediaList.php:53
+#: ../../library/ZendAfi/View/Helper/Telephone/TagAlbumMediaList.php:51
+msgid "RSS"
+msgstr "RSS"
+
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:10
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:12
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:95
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:13
+msgid "Rang"
+msgstr "Rango"
+
+#: ../../application/modules/opac/views/scripts/panier/creer-panier-ajax.phtml:7
+#: ../../application/modules/opac/views/scripts/panier/edit.phtml:8
+msgid "Ranger le panier dans des domaines"
+msgstr "Guarde el carro en áreas"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:32
+#: ../../library/Class/Codification.php:140
+#: ../../application/modules/telephone/controllers/RechercheController.php:34
+#: ../../library/Class/Codification.php:148
+#: ../../application/modules/telephone/controllers/RechercheController.php:37
+#: ../../library/Class/Codification.php:211
+#: ../../library/Class/Codification.php:212
+#: ../../library/Class/Codification.php:207
+msgid "Rebondir dans le catalogue"
+msgstr "Rebotando en el catálogo"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/RechSimple.php:17
+#: ../../library/ZendAfi/View/Helper/Telephone/RechSimple.php:18
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:2
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
+msgid "Recherche"
+msgstr "Investigación"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/index.phtml:2
+msgid "Recherche OAI"
+msgstr "Buscar OAI"
+
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:52
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:53
+msgid "Recherche avancée"
+msgstr "Búsqueda Avanzada"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:134
+msgid "Recherche guidée"
+msgstr "Búsqueda guiada"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:84
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:90
+msgid "Recherche par mots contenus"
+msgstr "Buscar palabras contenían"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:120
+msgid "Recherche élargie à: %s"
+msgstr "búsqueda ampliadada con : \"%s\""
+
+#: ../../library/ZendAfi/View/Helper/TreeView.php:29
+#: ../../library/ZendAfi/View/Helper/TreeView.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:134
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:148
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:152
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:163
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:153
+msgid "Rechercher"
+msgstr "Buscar"
+
+#: ../../application/modules/admin/controllers/FormationController.php:332
+#: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:57
+msgid "Rechercher des stagiaires"
+msgstr "Buscar Precios"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:2
+#: ../../application/modules/opac/views/scripts/bib/index.phtml:7
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:3
+msgid "Rechercher un livre, un disque, une vidéo"
+msgstr "Encontrar un libro, disco, vídeo"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:3
+msgid "Rechercher un livre, un disque, une vidéo dans ce territoire"
+msgstr "Buscar un libro, un disco, un video en el territorio"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:48
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:53
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:92
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:97
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:107
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:170
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:179
+msgid "Recherches infructueuses"
+msgstr "Búsquedas fallidas"
+
+#: ../../application/modules/opac/controllers/IndexController.php:126
+#: ../../application/modules/opac/controllers/IndexController.php:143
+#: ../../application/modules/opac/controllers/IndexController.php:148
+#: ../../application/modules/opac/controllers/IndexController.php:140
+#: ../../application/modules/opac/controllers/IndexController.php:136
+#: ../../application/modules/opac/controllers/AuthController.php:213
+msgid "Recopiez le code"
+msgstr "Ingrese el código"
+
+#: ../../library/Class/NoticeHtml.php:189
+#: ../../library/Class/NoticeHtml.php:194
+#: ../../library/Class/NoticeHtml.php:185
+#: ../../library/Class/NoticeHtml.php:225
+#: ../../library/Class/NoticeHtml.php:95
+msgid "Refermer"
+msgstr "Cerrar"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:55
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:56
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:74
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:75
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:34
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:35
+msgid "Relancer cette recherche"
+msgstr "Revive esta búsqueda"
+
+#: ../../application/modules/admin/views/scripts/frbr-link/index.phtml:30
+msgid "Relation"
+msgstr "Relación"
+
+#: ../../application/modules/admin/controllers/FrbrLinkController.php:32
+msgid "Relation ajoutée"
+msgstr "Relación Alta"
+
+#: ../../application/modules/admin/controllers/FrbrLinkController.php:31
+msgid "Relation sauvegardée"
+msgstr "Relación salvó"
+
+#: ../../application/modules/opac/views/scripts/cms/articleview.phtml:7
+msgid "Reload"
+msgstr "Actualizar"
+
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:44
+#: ../../library/ZendAfi/View/Helper/AjaxMessage.php:63
+msgid "Reméde"
+msgstr "Remedio"
+
+#: ../../library/Class/NoticeHtml.php:708
+#: ../../library/Class/NoticeHtml.php:709
+#: ../../library/Class/NoticeHtml.php:726
+#: ../../library/Class/NoticeHtml.php:727
+#: ../../library/Class/NoticeHtml.php:715
+#: ../../library/Class/NoticeHtml.php:716
+#: ../../library/Class/NoticeHtml.php:733
+#: ../../library/Class/NoticeHtml.php:734
+#: ../../library/Class/NoticeHtml.php:744
+#: ../../library/Class/NoticeHtml.php:745
+#: ../../library/Class/NoticeHtml.php:717
+#: ../../library/Class/NoticeHtml.php:718
+#: ../../library/Class/NoticeHtml.php:735
+#: ../../library/Class/NoticeHtml.php:736
+#: ../../library/Class/NoticeHtml.php:729
+#: ../../library/Class/NoticeHtml.php:730
+#: ../../library/Class/NoticeHtml.php:747
+#: ../../library/Class/NoticeHtml.php:748
+#: ../../library/Class/NoticeHtml.php:601
+#: ../../library/Class/NoticeHtml.php:602
+#: ../../library/Class/NoticeHtml.php:619
+#: ../../library/Class/NoticeHtml.php:620
+#: ../../library/Class/NoticeHtml.php:295
+#: ../../library/Class/NoticeHtml.php:296
+#: ../../library/Class/NoticeHtml.php:309
+#: ../../library/Class/NoticeHtml.php:310
+#: ../../library/Class/NoticeHtml.php:294
+#: ../../library/Class/NoticeHtml.php:308
+#: ../../library/Class/NoticeHtml.php:276
+#: ../../library/Class/NoticeHtml.php:277
+#: ../../library/Class/NoticeHtml.php:290
+#: ../../library/Class/NoticeHtml.php:291
+msgid "Replier"
+msgstr "Doble hacia arriba"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:29
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:48
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:210
+msgid "Reservation limit reached"
+msgstr "Límite de Reserva alcanzó"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:211
+msgid "Reservation limit reached for $this->is document type"
+msgstr "Límite de reserva alcanzado por $ this> es el documento estándar"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:31
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:50
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:212
+msgid "Reservation limit reached for this annexe"
+msgstr "Límite de Reserva alcanzó para este anexo"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:30
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:49
+msgid "Reservation limit reached for this document type"
+msgstr "Límite de Reserva alcanzó para este tipo de documento"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:13
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:32
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:194
+msgid "Reservation not allowed to public"
+msgstr "La reserva no permitido pública"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:62
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:62
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:69
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:74
+msgid "Ressources OAI"
+msgstr "Recursos OAI"
+
+#: ../../library/Class/Codification.php:148
+#: ../../library/Class/Codification.php:156
+#: ../../library/Class/Codification.php:221
+#: ../../library/Class/Codification.php:222
+#: ../../library/Class/Codification.php:217
+msgid "Ressources numériques"
+msgstr "Recursos digitales"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:171
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:167
+msgid "Restreint à :"
+msgstr "Limitado a:"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:149
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:146
+msgid "Retirer"
+msgstr "Retire"
+
+#: ../../library/ZendAfi/View/Helper/Facettes.php:108
+msgid "Retirer "
+msgstr "Retire"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:125
+msgid "Retirer la notice du panier"
+msgstr "Retire la cesta de referencia"
+
+#: ../../application/modules/admin/controllers/BibController.php:323
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:54
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:50
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:116
+#: ../../application/modules/opac/views/scripts/bib/mapview.phtml:50
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:14
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:84
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:19
+#: ../../application/modules/opac/views/scripts/upload/upload.phtml:17
+#: ../../library/ZendAfi/View/Helper/Bouton.php:59
+#: ../../library/Class/Etagere.php:46 ../../library/Class/NoticeHtml.php:299
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:82
+#: ../../application/modules/opac/views/scripts/cms/articleview.phtml:7
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:51
+#: ../../application/modules/admin/controllers/BibController.php:331
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:73
+#: ../../application/modules/opac/views/scripts/cms/articleview.phtml:8
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:69
+#: ../../library/Class/NoticeHtml.php:304
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:45
+#: ../../library/Class/NoticeHtml.php:295
+#: ../../application/modules/admin/controllers/BibController.php:350
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:58
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:10
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:43
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:59
+#: ../../library/Class/NoticeHtml.php:337
+#: ../../library/ZendAfi/View/Helper/Bouton.php:78
+#: ../../application/modules/admin/controllers/BibController.php:347
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:11
+#: ../../library/Class/NoticeHtml.php:207
+#: ../../library/ZendAfi/View/Helper/Abonne/RetourFiche.php:25
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:126
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:14
+#: ../../application/modules/opac/views/scripts/blog/viewavis.phtml:12
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:49
+#: ../../library/ZendAfi/View/Helper/RenderForm.php:133
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:121
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:15
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:29
+#: ../../application/modules/admin/views/scripts/usergroup/editmembers.phtml:6
+#: ../../application/modules/admin/views/scripts/bib/delete.phtml:22
+#: ../../application/modules/admin/controllers/BibController.php:319
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:29
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
+#: ../../application/modules/admin/views/scripts/custom-fields-report/edit.phtml:6
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:36
+msgid "Retour"
+msgstr "Volver"
+
+#: ../../library/Class/Etagere.php:69
+msgid "Retour au niveau superieur"
+msgstr "Volver al nivel superior"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuHorizontalAdmin.php:11
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:11
+#: ../../application/modules/telephone/views/scripts/iphone.phtml:9
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:30
+#: ../../application/modules/admin/views/scripts/sansMenuGauche.phtml:12
+msgid "Retour au site"
+msgstr "Volver al sitio"
+
+#: ../../application/modules/admin/views/scripts/frbr-linktype/index.phtml:4
+msgid "Retour aux liens"
+msgstr "Volver a los enlaces"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:25
+msgid "Retour aux paniers"
+msgstr "Volver a las cestas"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:14
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:68
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:16
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:24
+msgid "Retour prévu"
+msgstr "Rendimiento esperado"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/RetourFiche.php:25
+msgid "Retour à la fiche utilisateur"
+msgstr "Volver al perfil de usuario"
+
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:20
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:24
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:23
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:25
+#: ../../application/modules/admin/views/scripts/custom-fields-meta/index.phtml:4
+msgid "Retour à la liste"
+msgstr "Volver a la lista"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:15
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:22
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:31
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:44
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:49
+msgid "Retour à la notice"
+msgstr "Volver al registro"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:14
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:20
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:24
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:37
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:42
+msgid "Retour à la recherche initiale"
+msgstr "Volver a la investigación original,"
+
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:49
+msgid "Rubrique: "
+msgstr "Sección:"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaire.php:86
+msgid "Rédiger une réponse."
+msgstr "Escribe una respuesta."
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:252
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:261
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:308
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:305
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:327
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:339
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:353
+msgid "Référencement"
+msgstr "SEO"
+
+#: ../../library/Class/AlbumRessource.php:262
+#: ../../library/Class/AlbumRessource.php:302
+#: ../../library/Class/AlbumRessource.php:311
+msgid "Répertoire des vignettes non éditable"
+msgstr "Directorio de miniaturas no editables"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:32
+msgid "Réponse"
+msgstr "Respuesta"
+
+#: ../../application/modules/admin/controllers/ModoController.php:620
+#: ../../application/modules/admin/controllers/ModoController.php:688
+msgid "Réponse au formulaire: "
+msgstr "Respuesta a la forma:"
+
+#: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:45
+msgid "Réponse: "
+msgstr "Respuesta:"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:28
+msgid "Répétition"
+msgstr "Repetición"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:187
+msgid "Réseaux sociaux et contact"
+msgstr "Las redes sociales y los contactos"
+
+#: ../../application/modules/telephone/views/scripts/recherche/reservation.phtml:2
+#: ../../application/modules/opac/controllers/RechercheController.php:511
+#: ../../application/modules/opac/controllers/RechercheController.php:546
+#: ../../application/modules/opac/controllers/RechercheController.php:505
+#: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:517
+msgid "Réservation"
+msgstr "Reserva"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:105
+#: ../../application/modules/telephone/controllers/RechercheController.php:108
+#: ../../application/modules/telephone/controllers/RechercheController.php:119
+#: ../../application/modules/telephone/controllers/RechercheController.php:125
+msgid "Réservation en ligne non supportée pour cette bibliothèque."
+msgstr "Reservación en línea no se admite para esta biblioteca."
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:7
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:26
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:183
+msgid "Réservation impossible"
+msgstr "Reservas imposible"
+
+#: ../../application/modules/admin/controllers/MultimediaController.php:182
+msgid "Réservation supprimée"
+msgstr "Reserva retira"
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:83
+#: ../../application/modules/telephone/views/scripts/abonne/reservations.phtml:1
+msgid "Réservations"
+msgstr "Reservas"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:44
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:44
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:51
+msgid "Réservations de notices"
+msgstr "Reservas avisos"
+
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:1
+msgid "Réservations en cours"
+msgstr "Las reservas actuales"
+
+#: ../../library/Class/NoticeHtml.php:302
+#: ../../library/Class/NoticeHtml.php:376
+#: ../../library/Class/NoticeHtml.php:377
+#: ../../library/Class/NoticeHtml.php:385
+#: ../../library/Class/NoticeHtml.php:386
+#: ../../library/Class/NoticeHtml.php:381
+#: ../../library/Class/NoticeHtml.php:382
+#: ../../library/Class/NoticeHtml.php:390
+#: ../../library/Class/NoticeHtml.php:391
+#: ../../library/Class/NoticeHtml.php:307
+#: ../../library/Class/NoticeHtml.php:387
+#: ../../library/Class/NoticeHtml.php:395
+#: ../../library/Class/NoticeHtml.php:396
+#: ../../library/Class/NoticeHtml.php:388
+#: ../../library/Class/NoticeHtml.php:397
+#: ../../library/Class/NoticeHtml.php:298
+#: ../../library/Class/NoticeHtml.php:378
+#: ../../library/Class/NoticeHtml.php:379
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:61
+#: ../../library/Class/NoticeHtml.php:340
+#: ../../library/Class/NoticeHtml.php:406
+#: ../../library/Class/NoticeHtml.php:210
+#: ../../library/Class/NoticeHtml.php:276
+#: ../../library/ZendAfi/View/Helper/Notice/LienReserver.php:76
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:77
+#: ../../library/ZendAfi/View/Helper/Notice/LienReserver.php:29
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
+#: ../../library/ZendAfi/View/Helper/Notice/ReservationLink.php:31
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:55
+msgid "Réserver"
+msgstr "Libro"
+
+#: ../../library/ZendAfi/View/Helper/Notice/LienReserver.php:28
+msgid "Réserver "
+msgstr "Libro"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Multimedia.php:54
+msgid "Réserver un poste Webkiosk"
+msgstr "Reserve un mensaje Webkiosk"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Multimedia.php:36
+msgid "Réserver un poste multimedia"
+msgstr "Reserve una estación multimedia"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-device.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:79
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-day.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-hours.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-location.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-group.phtml:1
+#: ../../library/ZendAfi/View/Helper/Abonne/Multimedia.php:31
+#: ../../library/ZendAfi/View/Helper/Abonne/Multimedia.php:28
+msgid "Réserver un poste multimédia"
+msgstr "Reserve una estación multimedia"
+
+#: ../../library/Class/WebService/SIGB/Dynix/LookupMyAccountInfoResponseReader.php:97
+msgid "Réservé"
+msgstr "Reservado"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:6
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:8
+#: ../../application/modules/opac/controllers/RechercheController.php:112
+#: ../../application/modules/opac/controllers/RechercheController.php:142
+#: ../../library/ZendAfi/View/Helper/MoteurRecherche/Resultat/TimelineJsonVisitor.php:41
+msgid "Résultat de la recherche"
+msgstr "Resultado de la búsqueda"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:262
+msgid "Résultats CVS"
+msgstr "Resultados CVS"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:31
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:30
+msgid "Résultats précédents"
+msgstr "Resultados anteriores"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:36
+#: ../../library/ZendAfi/View/Helper/Telephone/Pager.php:35
+msgid "Résultats suivants"
+msgstr "Resultados siguientes"
+
+#: ../../library/Class/Codification.php:111
+#: ../../library/Class/NoticeHtml.php:249
+#: ../../library/Class/Codification.php:113
+#: ../../library/Class/NoticeHtml.php:254
+#: ../../library/Class/Codification.php:114
+#: ../../library/Class/NoticeHtml.php:245
+#: ../../application/modules/telephone/controllers/RechercheController.php:30
+#: ../../library/Class/NoticeHtml.php:285
+#: ../../application/modules/telephone/controllers/RechercheController.php:32
+#: ../../library/Class/Codification.php:119
+#: ../../library/Class/NoticeHtml.php:155
+#: ../../application/modules/telephone/controllers/RechercheController.php:35
+#: ../../library/Class/Codification.php:139
+#: ../../library/Class/NoticeHtml.php:103
+#: ../../library/Class/NoticeHtml.php:94
+msgid "Résumé"
+msgstr "Resumen"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:128
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:47
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:133
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:159
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:153
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:42
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:149
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:158
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:168
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:165
+msgid "Résumé pour la page d'accueil"
+msgstr "Resumen de la página"
+
+#: ../../application/modules/telephone/views/scripts/recherche/resume.phtml:2
+#: ../../library/Class/Codification.php:139
+#: ../../library/Class/Codification.php:147
+#: ../../library/Class/Codification.php:210
+#: ../../library/Class/Codification.php:211
+#: ../../library/Class/Codification.php:206
+msgid "Résumés"
+msgstr "Resúmenes"
+
+#: ../../library/Class/Codification.php:134
+#: ../../library/Class/Codification.php:137
+#: ../../library/Class/Codification.php:139
+msgid "Résumés, analyses"
+msgstr "Resúmenes, análisis"
+
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:29
+#: ../../application/modules/admin/views/scripts/users/index.phtml:17
+#: ../../application/modules/admin/controllers/UsergroupController.php:127
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:37
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:52
+#: ../../application/modules/admin/views/scripts/users/index.phtml:19
+#: ../../application/modules/admin/controllers/UsergroupController.php:154
+#: ../../library/ZendAfi/Form/Admin/UserGroup.php:40
+msgid "Rôle"
+msgstr "Papel"
+
+#: ../../application/modules/opac/views/scripts/blog/viewauteur.phtml:5
+msgid "S'abonner au flux RSS"
+msgstr "Suscribete al feed RSS"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:32
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:33
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:33
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:34
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:31
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:34
+msgid "S'enregistrer"
+msgstr "Registro"
+
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:55
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:36
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:35
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:47
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:65
+msgid "S'inscrire"
+msgstr "Registro"
+
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:34
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:32
+msgid "S'inscrire sur le portail"
+msgstr "Registrarse en el portal"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:51
+#: ../../library/ZendAfi/View/Helper/Abonne/Formations.php:32
+msgid "S'inscrire à une formation"
+msgstr "Registrarse para la formación"
+
+#: ../../library/ZendAfi/Controller/Action.php:69
+msgid "Sauvegarde en cours"
+msgstr "Ahorro"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:27
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:14
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:28
+#: ../../application/modules/opac/views/scripts/auth/login.phtml:12
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
+#: ../../application/modules/telephone/controllers/AuthController.php:85
+#: ../../application/modules/telephone/controllers/AuthController.php:90
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:5
+#: ../../application/modules/telephone/controllers/AuthController.php:104
+msgid "Se connecter"
+msgstr "Registrarse"
+
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:7
+#: ../../library/ZendAfi/View/Helper/admin/MenuHorizontalAdmin.php:14
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:14
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:8
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:9
+#: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:10
+#: ../../application/modules/telephone/views/scripts/abonne/identity.phtml:5
+#: ../../library/ZendAfi/View/Helper/Admin/MenuHorizontalAdmin.php:33
+msgid "Se déconnecter"
+msgstr "Desconectar"
+
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:44
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:40
+#: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:44
+msgid "Se désinscrire"
+msgstr "Darse de baja"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:743
+#: ../../application/modules/opac/controllers/AbonneController.php:775
+#: ../../application/modules/opac/controllers/AbonneController.php:835
+#: ../../application/modules/opac/controllers/AbonneController.php:833
+msgid "Secteur"
+msgstr "Sector"
+
+#: ../../library/Class/Codification.php:112
+#: ../../library/Class/MoteurRecherche.php:350
+#: ../../library/Class/NoticeHtml.php:294
+#: ../../library/Class/Codification.php:114
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:124
+#: ../../library/Class/NoticeHtml.php:299
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:134
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/MoteurRecherche.php:367
+#: ../../library/Class/MoteurRecherche.php:379
+#: ../../library/Class/NoticeHtml.php:290
+#: ../../library/Class/NoticeHtml.php:332
+#: ../../library/Class/MoteurRecherche.php:413
+#: ../../library/Class/Codification.php:120
+#: ../../library/Class/MoteurRecherche.php:439
+#: ../../library/Class/NoticeHtml.php:202
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:136
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:44
+#: ../../library/Class/Codification.php:140
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:142
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:47
+msgid "Section"
+msgstr "Sección"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:190
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:186
+msgid "Section: %s"
+msgstr "Sección: %s"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:146
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:31
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:299
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:78
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:308
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:75
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:355
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:357
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:98
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:379
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:391
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:111
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:405
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:123
+msgid "Sections"
+msgstr "Secciones"
+
+#: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:43
+msgid "Sept"
+msgstr "Siete"
+
+#: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:14
+msgid "Sept."
+msgstr "Siete."
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:30
+#: ../../application/modules/admin/views/scripts/catalogue/index.phtml:38
+#: ../../application/modules/admin/views/scripts/catalogue/index.phtml:23
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:43
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:55
+#: ../../application/modules/admin/views/scripts/catalogue/index.phtml:24
+msgid "Serveur OAI"
+msgstr "Servidor OAI"
+
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:269
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:289
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:374
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:418
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:277
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:297
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:382
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:426
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:403
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:447
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:245
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:332
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:370
+#: ../../library/ZendAfi/View/Helper/Biographie.php:30
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:215
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:321
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:253
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:344
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:390
+#: ../../library/ZendAfi/View/Helper/Biographie.php:32
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:264
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:351
+#: ../../application/modules/opac/controllers/NoticeajaxController.php:397
+msgid "Service non disponible"
+msgstr "Servicio No Disponible"
+
+msgid "Should be greater than '%fieldToCompare%'"
+msgstr "Debe ser mayor que 'fieldToCompare %%'"
+
+#: ../../library/Class/Users.php:258 ../../library/Class/Users.php:272
+#: ../../library/Class/Users.php:347 ../../library/Class/Users.php:423
+#: ../../library/Class/Users.php:452 ../../library/Class/Users.php:598
+#: ../../library/Class/Users.php:665 ../../library/Class/Users.php:753
+#: ../../library/Class/Users.php:876 ../../library/Class/Users.php:888
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:30
+#: ../../library/Class/Users.php:895
+msgid ""
+"Si vous n'êtes pas à l'origine de cette demande d'inscription, merci de ne "
+"pas tenir compte de cet e-mail, et l'inscription ne sera pas activée."
+msgstr ""
+"Si no está en la raíz de esta solicitud, gracias a ignorar este e-mail, y el "
+"registro no se activará."
+
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:17
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:16
+msgid "Signature"
+msgstr "Firma"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:57
+#: ../../library/Class/MoteurRecherche.php:351
+#: ../../library/Class/Codification.php:116
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:128
+#: ../../library/Class/Codification.php:118
+#: ../../library/Class/MoteurRecherche.php:368
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:38
+#: ../../library/Class/MoteurRecherche.php:380
+#: ../../library/Class/MoteurRecherche.php:414
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:57
+#: ../../library/Class/Codification.php:123
+#: ../../library/Class/MoteurRecherche.php:440
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:130
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:87
+#: ../../library/Class/Codification.php:142
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:136
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:59
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:163
+msgid "Site"
+msgstr "Sitio"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:374
+#: ../../application/modules/opac/controllers/RechercheController.php:393
+#: ../../application/modules/opac/controllers/RechercheController.php:417
+#: ../../application/modules/opac/controllers/RechercheController.php:452
+#: ../../application/modules/opac/controllers/RechercheController.php:472
+#: ../../application/modules/opac/controllers/RechercheController.php:507
+msgid "Site : %s"
+msgstr "Sitio: %s"
+
+#: ../../application/modules/telephone/views/scripts/recherche/pickup-location.phtml:2
+msgid "Site de retrait"
+msgstr "Up sitio"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:56
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:58
+msgid "Site internet :"
+msgstr "Sitio web:"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:98
+msgid "Site: "
+msgstr "Sitio:"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:83
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:80
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:103
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:116
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:128
+msgid "Sites"
+msgstr "Sitios"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:352
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:374
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:386
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:400
+msgid "Sites (annexes)"
+msgstr "Sitios (anexos)"
+
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:6
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:27
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:27
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:62
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:8
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:76
+msgid "Sitothèque"
+msgstr "El Día Mundial del Agua"
+
+#: ../../library/Class/NoticeHtml.php:344
+#: ../../library/Class/NoticeHtml.php:349
+#: ../../library/Class/NoticeHtml.php:350
+#: ../../library/Class/NoticeHtml.php:341
+#: ../../library/Class/NoticeHtml.php:383
+#: ../../library/Class/NoticeHtml.php:253
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:101
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:106
+msgid "Situer cet exemplaire dans la bibliothèque"
+msgstr "Coloque este ejemplar en la biblioteca"
+
+#: ../../library/Class/NoticeHtml.php:346
+#: ../../library/Class/NoticeHtml.php:351
+#: ../../library/Class/NoticeHtml.php:352
+#: ../../library/Class/NoticeHtml.php:343
+#: ../../library/Class/NoticeHtml.php:385
+#: ../../library/Class/NoticeHtml.php:255
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:103
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:108
+msgid "Situer en exemplaire"
+msgstr "Localice ejemplar"
+
+#: ../../library/Class/NoticeHtml.php:300
+#: ../../library/Class/NoticeHtml.php:305
+#: ../../library/Class/NoticeHtml.php:296
+#: ../../library/Class/NoticeHtml.php:338
+#: ../../library/Class/NoticeHtml.php:208
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:50
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:53
+msgid "Situer."
+msgstr "Localice."
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/index.phtml:14
+#: ../../library/Class/NoticeHtml.php:446
+#: ../../library/Class/NoticeHtml.php:539
+#: ../../library/Class/NoticeHtml.php:594
+#: ../../library/Class/NoticeHtml.php:632
+#: ../../library/Class/NoticeHtml.php:679
+#: ../../library/Class/NoticeHtml.php:451
+#: ../../library/Class/NoticeHtml.php:546
+#: ../../library/Class/NoticeHtml.php:601
+#: ../../library/Class/NoticeHtml.php:639
+#: ../../library/Class/NoticeHtml.php:686
+#: ../../library/Class/NoticeHtml.php:456
+#: ../../library/Class/NoticeHtml.php:551
+#: ../../library/Class/NoticeHtml.php:606
+#: ../../library/Class/NoticeHtml.php:644
+#: ../../library/Class/NoticeHtml.php:697
+#: ../../library/Class/NoticeHtml.php:457
+#: ../../library/Class/NoticeHtml.php:448
+#: ../../library/Class/NoticeHtml.php:542
+#: ../../library/Class/NoticeHtml.php:597
+#: ../../library/Class/NoticeHtml.php:635
+#: ../../library/Class/NoticeHtml.php:688
+#: ../../library/Class/NoticeHtml.php:461
+#: ../../library/Class/NoticeHtml.php:554
+#: ../../library/Class/NoticeHtml.php:609
+#: ../../library/Class/NoticeHtml.php:647
+#: ../../library/Class/NoticeHtml.php:700
+#: ../../library/Class/NoticeHtml.php:331
+#: ../../library/Class/NoticeHtml.php:426
+#: ../../library/Class/NoticeHtml.php:481
+#: ../../library/Class/NoticeHtml.php:519
+#: ../../library/Class/NoticeHtml.php:572
+#: ../../library/ZendAfi/View/Helper/Biographie.php:64
+#: ../../library/Class/NoticeHtml.php:140
+#: ../../library/Class/NoticeHtml.php:176
+#: ../../library/Class/NoticeHtml.php:213
+#: ../../library/Class/NoticeHtml.php:268
+#: ../../application/modules/opac/views/scripts/rechercheoai/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Biographie.php:68
+#: ../../library/Class/NoticeHtml.php:175
+#: ../../library/Class/NoticeHtml.php:212
+#: ../../library/Class/NoticeHtml.php:267
+#: ../../library/Class/NoticeHtml.php:132
+#: ../../library/Class/NoticeHtml.php:167
+#: ../../library/Class/NoticeHtml.php:198
+#: ../../library/Class/NoticeHtml.php:249
+msgid "Source"
+msgstr "Fuente"
+
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:28
+#: ../../application/modules/opac/views/scripts/rechercheoai/resultat.phtml:32
+msgid "Source :"
+msgstr "Fuente:"
+
+#: ../../application/modules/telephone/views/scripts/recherche/resume.phtml:15
+msgid "Source : "
+msgstr "Fuente:"
+
+#: ../../library/ZendAfi/Form/Album.php:137
+msgid "Sous-titre"
+msgstr "Subtítulo"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:40
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:40
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:47
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:52
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:91
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:96
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:106
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:169
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:178
+msgid "Statistiques"
+msgstr "Estadísticas"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:71
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:65
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../library/ZendAfi/Form/Admin/News.php:146
+msgid "Statut"
+msgstr "Estado"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:118
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+msgid "Statut de la bib"
+msgstr "Estatuto de la bib"
+
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:57
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:82
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:21
+#: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:54
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:55
+msgid "Style de boite"
+msgstr "Cuadro de estilo"
+
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat-ok.phtml:1
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat.phtml:2
+msgid "Suggestion d'achat"
+msgstr "Compra"
+
+#: ../../application/modules/admin/controllers/ModoController.php:198
+#: ../../application/modules/admin/controllers/ModoController.php:183
+#: ../../application/modules/admin/controllers/ModoController.php:190
+#: ../../application/modules/admin/controllers/ModoController.php:258
+msgid "Suggestion d'achat sauvegardée"
+msgstr "Compra guardado"
+
+#: ../../application/modules/admin/controllers/ModoController.php:217
+#: ../../application/modules/admin/controllers/ModoController.php:202
+#: ../../application/modules/admin/controllers/ModoController.php:209
+#: ../../application/modules/admin/controllers/ModoController.php:277
+msgid "Suggestion d'achat supprimée"
+msgstr "Compra borrado"
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:18
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:33
+msgid "Suggestion d'achat:"
+msgstr "Compra:"
+
+#: ../../library/Class/SuggestionAchat.php:87
+#: ../../library/Class/SuggestionAchat.php:88
+#: ../../library/Class/SuggestionAchat.php:109
+msgid "Suggestion d'achat: "
+msgstr "Compra:"
+
+#: ../../library/Class/Moderer.php:114 ../../library/Class/Moderer.php:98
+msgid "Suggestions d'achat"
+msgstr "Compra Sugerencias"
+
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:44
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:56
+#: ../../library/ZendAfi/View/Helper/Abonne/SuggestionAchat.php:28
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat.phtml:7
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat.phtml:8
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat.phtml:9
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat-add.phtml:2
+#: ../../application/modules/opac/views/scripts/recherche/resultatRecherche.phtml:61
+msgid "Suggérer un achat"
+msgstr "Sugiera una Compra"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:36
+#: ../../library/Class/Codification.php:107
+#: ../../library/Class/MoteurRecherche.php:347
+#: ../../library/Class/Codification.php:109
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/MoteurRecherche.php:364
+#: ../../application/modules/opac/controllers/IndexController.php:98
+#: ../../library/Class/MoteurRecherche.php:376
+#: ../../application/modules/opac/controllers/IndexController.php:114
+#: ../../library/Class/MoteurRecherche.php:410
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:55
+#: ../../application/modules/opac/controllers/IndexController.php:119
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/MoteurRecherche.php:436
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:45
+#: ../../library/Class/Codification.php:135
+#: ../../application/modules/opac/controllers/IndexController.php:111
+#: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:40
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:31
+#: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../library/ZendAfi/Form/ContactForm.php:80
+msgid "Sujet"
+msgstr "Tema"
+
+#: ../../library/Class/Codification.php:107
+#: ../../library/Class/NoticeHtml.php:260
+#: ../../library/Class/Codification.php:109
+#: ../../library/Class/NoticeHtml.php:265
+#: ../../library/Class/Codification.php:110
+#: ../../library/Class/NoticeHtml.php:256
+#: ../../library/Class/NoticeHtml.php:296
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/NoticeHtml.php:166
+#: ../../library/Class/Codification.php:135
+#: ../../library/Class/NoticeHtml.php:114
+#: ../../library/Class/NoticeHtml.php:105
+msgid "Sujet(s)"
+msgstr "Tema (s)"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:41
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:47
+msgid "Sujets"
+msgstr "Temas"
+
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:33
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:169
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:172
+#: ../../library/Class/NoticeHtml.php:500
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:200
+#: ../../library/Class/NoticeHtml.php:507
+#: ../../library/Class/NoticeHtml.php:512
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:208
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:37
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:242
+#: ../../library/Class/NoticeHtml.php:503
+#: ../../library/ZendAfi/View/Helper/IconeSupport.php:19
+#: ../../library/ZendAfi/View/Helper/IconeSupport.php:43
+#: ../../library/ZendAfi/View/Helper/IconeSupport.php:44
+#: ../../library/ZendAfi/View/Helper/IconeSupport.php:45
+msgid "Support"
+msgstr "Apoyo"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:84
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:13
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:86
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:14
+msgid "Suppr."
+msgstr "Claro."
+
+#: ../../library/Class/Cms.php:612 ../../library/Class/Cms.php:540
+msgid ""
+"Suppression non autorisée : cette catégorie contient encore des articles"
+msgstr "La extracción no autorizada: Esta categoría también contiene artículos"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:40
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:44
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:96
+#: ../../library/ZendAfi/Form/Decorator/DeleteButton.php:15
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:46
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:98
+#: ../../application/modules/telephone/views/scripts/abonne/cancel-hold.phtml:18
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:59
+#: ../../library/ZendAfi/Form/Decorator/DeleteButton.php:34
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:28
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:75
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:29
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:20
+#: ../../application/modules/admin/views/scripts/bib/delete.phtml:17
+#: ../../library/ZendAfi/View/Helper/ListeNotices/TableauPanier.php:40
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:69
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:61
+msgid "Supprimer"
+msgstr "Retire"
+
+#: ../../library/Class/Cms.php:613 ../../library/Class/Cms.php:614
+#: ../../library/Class/Cms.php:541 ../../library/Class/Cms.php:542
+msgid "Supprimer catégorie"
+msgstr "Eliminar Categoría"
+
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:56
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:49
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:100
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:53
+msgid "Supprimer cette réservation"
+msgstr "Eliminar esta reserva"
+
+#: ../../application/modules/admin/controllers/CmsController.php:397
+#: ../../application/modules/admin/controllers/CmsController.php:385
+msgid "Supprimer l'article : %s"
+msgstr "Eliminar artículo: %s"
+
+#: ../../application/modules/admin/controllers/BibController.php:256
+#: ../../application/modules/admin/controllers/BibController.php:261
+msgid "Supprimer la bibliothèque: %s"
+msgstr "Retire Biblioteca: %s"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:111
+msgid "Supprimer les médias sélectionnés"
+msgstr "Retire los medios de comunicación seleccionados"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:57
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:57
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:69
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:117
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:122
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:130
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:213
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:222
+msgid "Système"
+msgstr "Sistema"
+
+#: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../application/modules/opac/controllers/IndexController.php:150
+#: ../../application/modules/opac/controllers/IndexController.php:155
+#: ../../application/modules/opac/controllers/IndexController.php:147
+#: ../../application/modules/opac/controllers/IndexController.php:143
+#: ../../application/modules/opac/controllers/AuthController.php:219
+msgid "Sécurité"
+msgstr "Seguridad"
+
+#: ../../application/modules/opac/views/scripts/bib/selection.phtml:2
+msgid "Sélection de bibliothèques"
+msgstr "Selección de bibliotecas"
+
+#: ../../application/modules/opac/controllers/SitoController.php:63
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:28
+#: ../../application/modules/opac/controllers/SitoController.php:64
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:26
+#: ../../application/modules/opac/controllers/SitoController.php:83
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:52
+#: ../../application/modules/opac/controllers/SitoController.php:47
+#: ../../application/modules/opac/controllers/SitoController.php:78
+#: ../../application/modules/opac/controllers/SitoController.php:44
+#: ../../application/modules/opac/controllers/SitoController.php:73
+#: ../../application/modules/opac/controllers/SitoController.php:45
+#: ../../application/modules/opac/controllers/SitoController.php:74
+msgid "Sélection de sites"
+msgstr "Selección del Sitio"
+
+#: ../../application/modules/admin/controllers/ModulesController.php:299
+#: ../../application/modules/admin/controllers/ModulesController.php:306
+#: ../../application/modules/admin/controllers/ModulesController.php:310
+msgid "Sélectionnez un panier ou un domaine"
+msgstr "Seleccionar una cesta o dominio"
+
+#: ../../library/Class/Codification.php:114
+#: ../../library/Class/Codification.php:117
+#: ../../library/Class/Codification.php:119
+#: ../../library/Class/Codification.php:124
+#: ../../library/Class/Codification.php:143
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:111
+msgid "Tag"
+msgstr "Tag"
+
+#: ../../library/Class/Codification.php:114
+#: ../../library/Class/Codification.php:117
+#: ../../library/Class/Codification.php:119
+#: ../../library/Class/Codification.php:124
+#: ../../library/Class/Codification.php:143
+msgid "Tag(s)"
+msgstr "Tag (s)"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:151
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:35
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:30
+#: ../../library/Class/Codification.php:135
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:156
+#: ../../library/Class/Codification.php:138
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:182
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:176
+#: ../../library/Class/Codification.php:140
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:172
+#: ../../application/modules/telephone/views/scripts/recherche/tags.phtml:2
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:181
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:192
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:32
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
+#: ../../library/ZendAfi/Form/Album.php:191
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:186
+#: ../../library/ZendAfi/Form/Admin/News.php:82
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: ../../library/Class/Moderer.php:119 ../../library/Class/Moderer.php:110
+#: ../../library/Class/Moderer.php:128 ../../library/Class/Moderer.php:108
+#: ../../library/Class/Moderer.php:92
+msgid "Tags sur les notices"
+msgstr "Etiquetas en registros"
+
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:102
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:106
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:129
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:126
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:149
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:171
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:183
+msgid "Tags utilisateur"
+msgstr "Etiquetas de usurarios"
+
+#: ../../application/modules/opac/views/scripts/upload/upload.phtml:10
+msgid "Taille :"
+msgstr "Tamaño:"
+
+#: ../../library/Class/MoteurRecherche.php:33
+#: ../../library/Class/MoteurRecherche.php:61
+#: ../../library/Class/MoteurRecherche.php:63
+msgid "Tapez une expression &agrave; rechercher"
+msgstr "Escriba una expresión y agrave; buscar"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:46
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:48
+msgid "Tel. :"
+msgstr "Tel. :"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:67
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:71
+#: ../../application/modules/admin/views/scripts/zone/_form.phtml:14
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:28
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:28
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:66
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:70
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:47
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+msgid "Territoire"
+msgstr "Territorio"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:50
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:50
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:57
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:62
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:101
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:106
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:116
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:189
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:198
+msgid "Territoires"
+msgstr "Territorios"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:60
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:60
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:72
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:120
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:125
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:134
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:224
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:233
+msgid "Test des web-services"
+msgstr "Servicios de pruebas web"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:121
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:126
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:135
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:227
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:236
+msgid "Test envoi mails"
+msgstr "Prueba de envío de mails"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:55
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:74
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:72
+msgid "Tester"
+msgstr "Prueba"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:187
+msgid "Texte"
+msgstr "Texto"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:28
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:47
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:209
+msgid ""
+"The notice's document type for reservation does not belong to any document "
+"family"
+msgstr ""
+"Documento estándar del manual para la reserva no pertenece a ninguna familia "
+"de papel"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:17
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:36
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:198
+msgid "This document does not belong to any document family"
+msgstr "Este artículo no pertenece a ninguna familia de papel"
+
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:24
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:43
+#: ../../library/Class/WebService/SIGB/Carthame/Service.php:205
+msgid "This notice is already on loan to this customer"
+msgstr "Este registro está prestado a este cliente"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:135
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:191
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:190
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:204
+msgid "Thème"
+msgstr "Tema"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:111
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:182
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:34
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:18
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:14
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:27
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:8
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:82
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:34
+#: ../../library/Class/Codification.php:113
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:21
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:39
+#: ../../library/Class/Codification.php:115
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:43
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:8
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:91
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:37
+#: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:16
+#: ../../library/Class/Codification.php:116
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
+#: ../../application/modules/admin/views/scripts/oai/index.phtml:25
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:11
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:84
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:53
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../library/Class/Codification.php:121
+#: ../../library/Class/SuggestionAchat.php:74
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:30
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:32
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:16
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:13
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:26
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:9
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:28
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:43
+#: ../../library/Class/Codification.php:132
+#: ../../library/Class/CriteresRecherche.php:81
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:21
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:53
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:78
+#: ../../library/ZendAfi/View/Helper/ListeNotices/TableauPanier.php:38
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/CriteresRecherche.php:105
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:69
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:21
+#: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:50
+#: ../../library/ZendAfi/Form/Admin/EditCms.php:39
+#: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:11
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:51
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:32
+#: ../../library/ZendAfi/Form/Admin/News.php:40
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/SuggestionAchat.php:94
+msgid "Titre"
+msgstr "Título"
+
+#: ../../library/ZendAfi/Form/Album.php:132
+msgid "Titre *"
+msgstr "Título *"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:454
+#: ../../application/modules/opac/controllers/RechercheController.php:487
+#: ../../application/modules/opac/controllers/RechercheController.php:512
+#: ../../application/modules/opac/controllers/RechercheController.php:570
+#: ../../application/modules/opac/controllers/RechercheController.php:625
+#: ../../application/modules/opac/controllers/RechercheController.php:413
+#: ../../application/modules/opac/controllers/RechercheController.php:409
+msgid "Titre : %s"
+msgstr "Título: %s"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:47
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:56
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:50
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:46
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:44
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
+#: ../../library/ZendAfi/Form/Admin/EditCms.php:45
+#: ../../library/ZendAfi/Form/Admin/News.php:44
+msgid "Titre caché"
+msgstr "Pista oculta"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:230
+msgid "Titre de la boîte"
+msgstr "Título Caja"
+
+#: ../../library/ZendAfi/Form/CreerPanier.php:30
+#: ../../application/modules/opac/views/scripts/panier/edit.phtml:14
+#: ../../application/modules/opac/views/scripts/panier/creer-panier-ajax.phtml:13
+msgid "Titre du panier"
+msgstr "Título cesta"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:72
+msgid "Titre et auteur"
+msgstr "Título y autor"
+
+#: ../../library/Class/SuggestionAchat.php:58
+#: ../../library/Class/SuggestionAchat.php:62
+msgid "Titre ou commentaire requis"
+msgstr "Título o comentario requerida"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:234
+msgid "Titre résultat recherche"
+msgstr "Resultados de la búsqueda Título"
+
+#: ../../library/Class/Codification.php:113
+#: ../../library/Class/Codification.php:115
+#: ../../library/Class/Codification.php:116
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/NoticeDetaillee.php:26
+#: ../../library/Class/Codification.php:121
+#: ../../library/Class/Codification.php:132
+msgid "Titre(s)"
+msgstr "Título (s)"
+
+#: ../../application/modules/opac/views/scripts/recherche/readnotice.phtml:1
+msgid "Titre: %s"
+msgstr "Título: %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:19
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:25
+msgid "Titres"
+msgstr "Valores"
+
+#: ../../library/ZendAfi/View/Helper/TreeView.php:36
+#: ../../library/ZendAfi/View/Helper/TreeView.php:65
+#: ../../library/ZendAfi/View/Helper/TreeView.php:71
+msgid "Tous"
+msgstr "Todos"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:36
+msgid "Tous les dimanches"
+msgstr "Todos los domingos"
+
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:29
+msgid "Tous les documents"
+msgstr "Todos los documentos"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:33
+msgid "Tous les jeudis"
+msgstr "Todos los jueves"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:30
+msgid "Tous les lundis"
+msgstr "Todos los lunes"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:31
+msgid "Tous les mardis"
+msgstr "Todos los martes"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:32
+msgid "Tous les mercredis"
+msgstr "Todos los miércoles"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:35
+msgid "Tous les samedis"
+msgstr "Todos los sábados"
+
+#: ../../application/modules/admin/controllers/OuverturesController.php:34
+msgid "Tous les vendredis"
+msgstr "Todos los viernes"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:85
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:122
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:131
+msgid "Tout Apprendre"
+msgstr "Aprenda todo"
+
+#: ../../application/modules/opac/views/scripts/bib/selection.phtml:7
+#: ../../library/ZendAfi/View/Helper/TagListeCoches.php:96
+#: ../../library/ZendAfi/View/Helper/TagListeCoches.php:98
+msgid "Tout cocher"
+msgstr "Marque todas las"
+
+#: ../../application/modules/opac/views/scripts/bib/selection.phtml:8
+#: ../../library/ZendAfi/View/Helper/TagListeCoches.php:97
+#: ../../library/ZendAfi/View/Helper/TagListeCoches.php:99
+msgid "Tout décocher"
+msgstr "Desmarcar todos"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:70
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:72
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:91
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:110
+msgid "Tout effacer"
+msgstr "Borrar todos"
+
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:137
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:148
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:139
+msgid "Tout sélectionner"
+msgstr "Seleccione todos"
+
+#: ../../application/modules/opac/controllers/RssController.php:289
+msgid "Toute l'actualité de votre portail"
+msgstr "Cualquier noticia acerca de su portal"
+
+#: ../../application/modules/opac/controllers/RssController.php:204
+#: ../../application/modules/opac/controllers/RssController.php:219
+#: ../../application/modules/opac/controllers/RssController.php:274
+msgid "Toute l'actualité du portail"
+msgstr "Últimas portal de noticias"
+
+#: ../../library/Class/Bib.php:157 ../../library/Class/Bib.php:158
+#: ../../library/Class/Bib.php:165 ../../library/Class/Bib.php:182
+#: ../../library/Class/Bib.php:213 ../../library/Class/Bib.php:241
+#: ../../library/Class/Bib.php:256 ../../library/Class/Bib.php:272
+#: ../../library/Class/Bib.php:292 ../../library/Class/Bib.php:312
+msgid "Toutes"
+msgstr "Todos"
+
+#: ../../application/modules/admin/views/scripts/cms/delete.phtml:14
+msgid "Toutes les données de l'article seront effacées !"
+msgstr "Se borrarán todos los datos en el artículo!"
+
+#: ../../application/modules/admin/views/scripts/i18n/index.phtml:39
+msgid "Traduction"
+msgstr "Traducción"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:46
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:86
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:91
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:101
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:159
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:168
+msgid "Traductions"
+msgstr "Traducciones"
+
+#: ../../library/Class/Upload.php:268
+msgid "Transfert impossible, ce formulaire est mal configuré"
+msgstr "No se puede transferir esta forma está mal configurado"
+
+#: ../../library/Class/Upload.php:273
+msgid "Transfert impossible, champ de fichier introuvable"
+msgstr "No se pueden transferir campo archivo encontrado"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:89
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:95
+msgid "Trier par"
+msgstr "Ordenar por"
+
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:83
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:85
+msgid "Trié par: "
+msgstr "Ordenar por:"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:11
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:30
+#: ../../library/ZendAfi/Form/FRBR/Link.php:31
+#: ../../application/modules/admin/views/scripts/custom-fields-meta/index.phtml:18
+#: ../../application/modules/admin/views/scripts/custom-fields/add.phtml:4
+msgid "Type"
+msgstr "Tipo"
+
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:50
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:47
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:45
+msgid "Type d'interface"
+msgstr "Interfaz"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:49
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:89
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:68
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:108
+msgid "Type de doc."
+msgstr "Tipo de doc."
+
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:28
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:35
+#: ../../library/Class/MoteurRecherche.php:342
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:94
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:120
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:121
+#: ../../library/Class/Codification.php:117
+#: ../../library/Class/MoteurRecherche.php:358
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:27
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:34
+#: ../../library/Class/MoteurRecherche.php:370
+#: ../../library/Class/MoteurRecherche.php:404
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:46
+#: ../../library/ZendAfi/View/Helper/Accueil/RechSimple.php:53
+#: ../../library/Class/Codification.php:122
+#: ../../library/Class/MoteurRecherche.php:430
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:74
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:123
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:76
+#: ../../library/ZendAfi/View/Helper/TagRechercheSimple.php:83
+#: ../../library/Class/Codification.php:141
+#: ../../library/Class/CriteresRecherche.php:84
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:129
+#: ../../library/ZendAfi/Form/Album.php:163
+#: ../../library/Class/CriteresRecherche.php:108
+#: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/SuggestionAchat.php:96
+msgid "Type de document"
+msgstr "Tipo de documento"
+
+#: ../../application/modules/admin/controllers/TypeDocsController.php:31
+msgid "Type de document %s modifié"
+msgstr "Tipo de documento %s cambiado"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:330
+#: ../../application/modules/opac/controllers/RechercheController.php:350
+#: ../../application/modules/opac/controllers/RechercheController.php:370
+#: ../../application/modules/opac/controllers/RechercheController.php:363
+#: ../../application/modules/opac/controllers/RechercheController.php:389
+#: ../../application/modules/opac/controllers/RechercheController.php:404
+#: ../../application/modules/opac/controllers/RechercheController.php:447
+#: ../../application/modules/opac/controllers/RechercheController.php:459
+#: ../../application/modules/opac/controllers/RechercheController.php:502
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:12
+msgid "Type de document : %s"
+msgstr "Tipo de documento: %s"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:105
+msgid "Type de document: %s"
+msgstr "Tipo de documento: %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:82
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:88
+msgid "Type de recherche"
+msgstr "Búsqueda Tipo"
+
+#: ../../application/modules/admin/controllers/FrbrLinktypeController.php:31
+msgid "Type de relation \"%s\" sauvegardé"
+msgstr "Tipo de relación \"%s\" guardada"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:136
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:36
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:304
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:32
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:313
+#: ../../library/Class/Codification.php:117
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:29
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:360
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:362
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:45
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:384
+#: ../../library/Class/Codification.php:122
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:396
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:58
+#: ../../library/Class/Codification.php:141
+#: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:410
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:70
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:258
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:276
+msgid "Types de documents"
+msgstr "Tipos de documentos"
+
+#: ../../application/modules/admin/controllers/FrbrLinktypeController.php:35
+msgid "Types de relation"
+msgstr "Tipos de relación"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:189
+msgid "Types de tags"
+msgstr "Tipos de Etiquetas"
+
+#: ../../application/modules/admin/controllers/BatchController.php:31
+msgid "Tâche ajoutée"
+msgstr "Tarea Alta"
+
+#: ../../application/modules/admin/controllers/BatchController.php:48
+msgid "Tâche executée"
+msgstr "Tarea ejecutada"
+
+#: ../../application/modules/admin/controllers/BatchController.php:32
+msgid "Tâche supprimée"
+msgstr "Tarea eliminados"
+
+#: ../../application/modules/admin/controllers/BatchController.php:35
+msgid "Tâches"
+msgstr "Tareas"
+
+#: ../../library/ZendAfi/View/Helper/MonocleReader.php:69
+#: ../../library/ZendAfi/View/Helper/MonocleReaderServerSide.php:98
+msgid "Télécharger"
+msgstr "Descargar"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:20
+msgid "Télécharger au format liste (clic droit puis enregistrer sous)"
+msgstr "Descargar archivo de lista (haga clic derecho y guardar como)"
+
+#: ../../application/modules/opac/views/scripts/panier/export.phtml:21
+msgid "Télécharger au format unimarc (clic droit puis enregistrer sous)"
+msgstr "Descargar archivo UNIMARC (haga clic derecho y guardar como)"
+
+#: ../../application/modules/admin/views/scripts/album/preview-ressource.phtml:17
+msgid "Télécharger l'image basse-résolution"
+msgstr "Descargar imagen de baja resolución"
+
+#: ../../application/modules/admin/views/scripts/album/preview-ressource.phtml:8
+msgid "Télécharger l'image haute-résolution"
+msgstr "Descarga la imagen en alta resolución"
+
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:58
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:77
+#: ../../library/ZendAfi/View/Helper/TagUploadMultiple.php:79
+msgid "Télécharger plusieurs fichiers"
+msgstr "Subir varios archivos"
+
+#: ../../library/ZendAfi/View/Helper/Album/OsmPlayer.php:41
+#: ../../library/ZendAfi/View/Helper/Album/Download.php:32
+msgid "Téléchargez la playlist (VLC, WinAmp)"
+msgstr "Descargue la lista de reproducción (VLC, Winamp)"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:56
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:25
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:55
+#: ../../application/modules/opac/controllers/AbonneController.php:380
+#: ../../application/modules/opac/controllers/AbonneController.php:440
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+msgid "Téléphone"
+msgstr "Teléfono"
+
+#: ../../library/ZendAfi/View/Helper/Panier/Edit.php:46
+msgid "UNIMARC"
+msgstr "UNIMARC"
+
+#: ../../library/ZendAfi/Form/FRBR/Link.php:32
+msgid "URL Objet A"
+msgstr "URL Objeto"
+
+#: ../../library/ZendAfi/Form/FRBR/Link.php:33
+msgid "URL Objet B"
+msgstr "URL Objeto B"
+
+#: ../../library/ZendAfi/Form/BiographieNotice.php:28
+msgid "URL Wikipedia de l'auteur"
+msgstr "Wikipedia URL del autor"
+
+#: ../../library/ZendAfi/Form/VignetteNotice.php:30
+#: ../../library/ZendAfi/Form/VignetteNotice.php:28
+msgid "URL de la vignette"
+msgstr "URL Miniatura"
+
+#: ../../library/Class/FRBR/Link.php:87
+msgid "URL objet A est requis"
+msgstr "Se requiere un objeto URL"
+
+#: ../../library/Class/FRBR/Link.php:89
+msgid "URL objet B est requis"
+msgstr "Se requiere URL objeto B"
+
+#: ../../library/Class/FRBR/LinkType.php:56
+msgid "Un libellé de l'objet A vers l'objet B est requis"
+msgstr "Se requiere Idioma del objeto A al objeto B"
+
+#: ../../library/Class/FRBR/LinkType.php:57
+msgid "Un libellé de l'objet B vers l'objet A est requis"
+msgstr "Se requiere la redacción del objeto B al objeto A"
+
+#: ../../library/Class/FRBR/LinkType.php:55
+msgid "Un libellé est requis"
+msgstr "Se requiere una etiqueta"
+
+#: ../../library/Class/Users.php:608 ../../library/Class/Users.php:675
+#: ../../library/Class/Users.php:763 ../../library/Class/Users.php:887
+msgid "Un mail viens de vous être envoyé pour confirmer votre inscription"
+msgstr ""
+"Un correo electrónico acaba de enviar a usted para confirmar su registro"
+
+#: ../../library/Class/Users.php:321 ../../library/Class/Users.php:335
+#: ../../library/Class/Users.php:410 ../../library/Class/Users.php:486
+#: ../../library/Class/Users.php:515 ../../library/Class/Users.php:666
+#: ../../library/Class/Users.php:733 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:934 ../../library/Class/Users.php:950
+#: ../../library/Class/Users.php:957
+msgid "Un mail vient de vous être envoyé avec vos paramètres de connexion."
+msgstr ""
+"Un correo electrónico ha sido enviado a usted con su nombre de usuario."
+
+#: ../../library/Class/CommSigb.php:177
+msgid ""
+"Une erreur de communication avec le serveur a fait échouer la requête. Merci "
+"de signaler ce problème à la bibliothèque."
+msgstr ""
+"Un error de comunicación con el servidor falla la petición. ¡Gracias a "
+"informar de este problema a la biblioteca."
+
+#: ../../library/Class/CommSigb.php:23 ../../library/Class/CommSigb.php:25
+#: ../../library/Class/CommSigb.php:71 ../../library/Class/CommSigb.php:175
+msgid ""
+"Une erreur de communication avec le serveur a fait échouer la réservation. "
+"Merci de signaler ce problème à la bibliothèque."
+msgstr ""
+"Un error de comunicación con el servidor falla la reserva. ¡Gracias a "
+"informar de este problema a la biblioteca."
+
+#: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:39
+msgid "Une seule suggestion enregistrée."
+msgstr "Una sugerencia registró."
+
+#: ../../application/modules/admin/views/scripts/rss/rssform.phtml:22
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:18
+#: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:20
+msgid "Url"
+msgstr "Url"
+
+#: ../../library/Class/Users.php:255 ../../library/Class/Users.php:269
+#: ../../library/Class/Users.php:344 ../../library/Class/Users.php:420
+#: ../../library/Class/Users.php:449 ../../library/Class/Users.php:595
+#: ../../library/Class/Users.php:662 ../../library/Class/Users.php:750
+#: ../../library/Class/Users.php:873
+msgid "Url d'activation : %s"
+msgstr "Url Activación: %s"
+
+#: ../../application/modules/admin/views/scripts/index/index.phtml:34
+#: ../../application/modules/admin/views/scripts/users/_form.phtml:9
+#: ../../application/modules/admin/views/scripts/index/index.phtml:30
+#: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
+#: ../../application/modules/admin/views/scripts/index/index.phtml:32
+msgid "Utilisateur"
+msgstr "Usuario"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaire.php:64
+msgid "Utilisateur introuvable"
+msgstr "Usuario no encontrado"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:52
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:52
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:59
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:64
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:103
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:108
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:118
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:195
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:204
+msgid "Utilisateurs"
+msgstr "Usuarios"
+
+#: ../../application/modules/admin/views/scripts/profil/accueil.phtml:23
+msgid "Utiliser le css du profil"
+msgstr "Utilice el Perfil CSS"
+
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:4
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:27
+msgid "Valeur"
+msgstr "Valor"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:50
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:27
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:37
+#: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:42
+#: ../../library/ZendAfi/View/Helper/Bouton.php:52
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:39
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:69
+#: ../../library/ZendAfi/View/Helper/Bouton.php:71
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:30
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:72
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:206
+#: ../../library/ZendAfi/View/Helper/Bouton.php:72
+#: ../../application/modules/opac/controllers/AuthController.php:221
+#: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:65
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:71
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:35
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:69
+msgid "Valider"
+msgstr "Validar"
+
+#: ../../application/modules/opac/views/scripts/bib/selection.phtml:6
+msgid "Valider la sélection"
+msgstr "Confirmar la selección"
+
+#: ../../library/Class/Users.php:257 ../../library/Class/Users.php:271
+#: ../../library/Class/Users.php:346 ../../library/Class/Users.php:422
+#: ../../library/Class/Users.php:451 ../../library/Class/Users.php:597
+#: ../../library/Class/Users.php:664 ../../library/Class/Users.php:752
+#: ../../library/Class/Users.php:875
+msgid "Valider mon inscription"
+msgstr "Validar mi registro"
+
+msgid "Value is empty, but a non-empty value is required"
+msgstr "Se requiere valor puerta vacía, no vacío Valor"
+
+#: ../../application/modules/admin/views/scripts/index/adminvaredit.phtml:5
+msgid "Variable"
+msgstr "Variable"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:59
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:59
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:66
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:71
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:119
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:124
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:133
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:221
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:230
+msgid "Variables"
+msgstr "Variables"
+
+#: ../../application/modules/admin/views/scripts/index/index.phtml:11
+#: ../../application/modules/admin/views/scripts/index/index.phtml:1
+msgid "Version"
+msgstr "Version"
+
+#: ../../application/modules/opac/controllers/PanierController.php:156
+#: ../../application/modules/opac/controllers/PanierController.php:198
+msgid "Veuillez choisir une notice"
+msgstr "Por favor, seleccione un registro"
+
+#: ../../library/Class/NoticeHtml.php:82
+#: ../../library/Class/NoticeHtml.php:123
+#: ../../library/Class/NoticeHtml.php:177
+#: ../../library/Class/NoticeHtml.php:182
+#: ../../library/Class/NoticeHtml.php:173
+#: ../../library/Class/NoticeHtml.php:88
+#: ../../library/Class/NoticeHtml.php:159
+#: ../../library/Class/NoticeHtml.php:212
+#: ../../library/ZendAfi/View/Helper/Notice/Blocs.php:64
+#: ../../library/ZendAfi/View/Helper/Notice/Onglets.php:42
+#: ../../library/ZendAfi/View/Helper/Notice/Blocs.php:67
+#: ../../library/ZendAfi/View/Helper/Notice/Onglets.php:45
+#: ../../library/Class/NoticeHtml.php:49 ../../library/Class/NoticeHtml.php:43
+msgid "Veuillez patienter : lecture en cours..."
+msgstr "Por favor espere que juego ..."
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:132
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:160
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:168
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:184
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:183
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:200
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:176
+#: ../../library/ZendAfi/View/Helper/ListeNotices/Accordeon.php:57
+msgid "Veuillez patienter : traitement en cours"
+msgstr "Por favor, espere: tratamiento actual"
+
+#: ../../library/ZendAfi/Controller/Action.php:72
+msgid "Veuillez patienter..."
+msgstr "Por favor espera ..."
+
+#: ../../application/modules/telephone/views/scripts/recherche/videos.phtml:2
+#: ../../application/modules/telephone/views/scripts/recherche/videos.phtml:4
+msgid "Vidéos"
+msgstr "Videos"
+
+#: ../../application/modules/telephone/controllers/RechercheController.php:31
+#: ../../application/modules/telephone/controllers/RechercheController.php:33
+#: ../../application/modules/telephone/controllers/RechercheController.php:36
+msgid "Vidéos associées"
+msgstr "Videos Relacionados"
+
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:50
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:54
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:158
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:160
+#: ../../library/Class/NoticeHtml.php:492
+#: ../../library/Class/NoticeHtml.php:564
+#: ../../library/Class/NoticeHtml.php:762
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:55
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:188
+#: ../../library/Class/NoticeHtml.php:499
+#: ../../library/Class/NoticeHtml.php:571
+#: ../../library/Class/NoticeHtml.php:769
+#: ../../library/Class/NoticeHtml.php:504
+#: ../../library/Class/NoticeHtml.php:576
+#: ../../library/Class/NoticeHtml.php:780
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:196
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:59
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:228
+#: ../../library/Class/NoticeHtml.php:495
+#: ../../library/Class/NoticeHtml.php:567
+#: ../../library/Class/NoticeHtml.php:771
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:227
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:51
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:56
+#: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:13
+#: ../../library/Class/NoticeHtml.php:507
+#: ../../library/Class/NoticeHtml.php:579
+#: ../../library/Class/NoticeHtml.php:783
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:245
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:62
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:70
+#: ../../library/Class/NoticeHtml.php:379
+#: ../../library/Class/NoticeHtml.php:451
+#: ../../library/Class/NoticeHtml.php:655
+#: ../../application/modules/opac/views/scripts/recherche/viewnotice.phtml:49
+#: ../../library/ZendAfi/View/Helper/Biographie.php:89
+#: ../../library/ZendAfi/View/Helper/Notice/Vignette.php:55
+#: ../../library/Class/NoticeHtml.php:349
+#: ../../library/ZendAfi/View/Helper/Biographie.php:93
+#: ../../library/Class/NoticeHtml.php:348
+#: ../../library/ZendAfi/View/Helper/Notice/Vignette.php:61
+#: ../../library/Class/NoticeHtml.php:330
+msgid "Vignette"
+msgstr "Vignette"
+
+#: ../../library/ZendAfi/Form/Album/DisplayThumbnails.php:26
+msgid "Vignettes"
+msgstr "Miniaturas"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:52
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:133
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:51
+#: ../../application/modules/opac/controllers/IndexController.php:89
+#: ../../application/modules/opac/controllers/IndexController.php:105
+#: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../application/modules/opac/controllers/AbonneController.php:378
+#: ../../application/modules/opac/controllers/IndexController.php:102
+#: ../../application/modules/opac/controllers/IndexController.php:101
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../library/ZendAfi/Form/ContactForm.php:73
+msgid "Ville"
+msgstr "Ciudad"
+
+#: ../../library/ZendAfi/Form/Album.php:143
+msgid "Visible"
+msgstr "Visible"
+
+#: ../../library/ZendAfi/View/Helper/TagVideo.php:55
+#: ../../library/ZendAfi/View/Helper/TagVideo.php:59
+msgid "Visionner le film dans son intégralité"
+msgstr "Ver la película en su totalidad"
+
+#: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:42
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:42
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:49
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:54
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:93
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:98
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:108
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:173
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:182
+msgid "Visualisations de notices"
+msgstr "Vistas de registros"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:60
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:79
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:73
+msgid "Visualiser"
+msgstr "Visualice"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:79
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:114
+msgid "Vodeclic"
+msgstr "Vodeclic"
+
+#: ../../library/Class/NoticeHtml.php:303
+#: ../../library/Class/NoticeHtml.php:308
+#: ../../library/Class/NoticeHtml.php:299
+#: ../../library/Class/NoticeHtml.php:341
+#: ../../library/Class/NoticeHtml.php:211
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:53
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:56
+msgid "Voir"
+msgstr "Ver"
+
+#: ../../library/ZendAfi/View/Helper/Avis.php:51
+#: ../../library/ZendAfi/View/Helper/Avis.php:53
+#: ../../library/ZendAfi/View/Helper/Avis.php:55
+#: ../../library/ZendAfi/View/Helper/Avis.php:74
+#: ../../library/ZendAfi/View/Helper/Avis.php:82
+#: ../../library/ZendAfi/View/Helper/Avis.php:115
+msgid "Voir la notice"
+msgstr "Consultar el prospecto"
+
+#: ../../library/ZendAfi/View/Helper/ReponseFormulaire.php:80
+msgid "Voir la réponse."
+msgstr "Ver respuesta."
+
+#: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:8
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:7
+#: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:15
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:130
+msgid "Voir le panier"
+msgstr "Ver Cesta"
+
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:104
+#: ../../application/modules/opac/views/scripts/bib/bibview.phtml:109
+msgid "Voir le plan"
+msgstr "Ver mapa"
+
+#: ../../application/modules/opac/views/scripts/sito/viewsitos.phtml:13
+#: ../../application/modules/opac/views/scripts/sito/viewselection.phtml:14
+msgid "Voir le site"
+msgstr "Visite el sitio web"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Mur.php:83
+#: ../../library/ZendAfi/View/Helper/Notice/Mur.php:89
+msgid "Voir les "
+msgstr "Ver"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:24
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:22
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:20
+#: ../../library/ZendAfi/View/Helper/Accueil/Rss.php:39
+msgid "Voir les fils RSS sélectionnés"
+msgstr "Consulte hijo seleccionado RSS"
+
+#: ../../library/Class/NoticeHtml.php:704
+#: ../../library/Class/NoticeHtml.php:722
+#: ../../library/Class/NoticeHtml.php:711
+#: ../../library/Class/NoticeHtml.php:729
+#: ../../library/Class/NoticeHtml.php:740
+#: ../../library/Class/NoticeHtml.php:713
+#: ../../library/Class/NoticeHtml.php:731
+#: ../../library/Class/NoticeHtml.php:725
+#: ../../library/Class/NoticeHtml.php:743
+#: ../../library/Class/NoticeHtml.php:597
+#: ../../library/Class/NoticeHtml.php:615
+#: ../../library/Class/NoticeHtml.php:291
+#: ../../library/Class/NoticeHtml.php:305
+#: ../../library/Class/NoticeHtml.php:290
+#: ../../library/Class/NoticeHtml.php:304
+#: ../../library/Class/NoticeHtml.php:272
+#: ../../library/Class/NoticeHtml.php:286
+msgid "Voir vidéo"
+msgstr "Ver vídeo"
+
+#: ../../library/Class/NoticeHtml.php:695
+#: ../../library/Class/NoticeHtml.php:706
+#: ../../library/Class/NoticeHtml.php:697
+#: ../../library/Class/NoticeHtml.php:709
+#: ../../library/Class/NoticeHtml.php:581
+#: ../../library/Class/NoticeHtml.php:276
+#: ../../library/Class/NoticeHtml.php:275
+#: ../../library/Class/NoticeHtml.php:257
+msgid "Volume n° %s"
+msgstr "Volumen No. %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:24
+msgid "Vos Nom et Prénom : "
+msgstr "Su nombre:"
+
+#: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../application/modules/opac/controllers/IndexController.php:131
+#: ../../application/modules/opac/controllers/IndexController.php:136
+#: ../../application/modules/opac/controllers/IndexController.php:128
+#: ../../application/modules/opac/controllers/IndexController.php:127
+#: ../../library/ZendAfi/Form/ContactForm.php:101
+msgid "Vos coordonnées"
+msgstr "Sus detalles"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:7
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:26
+#: ../../application/modules/opac/views/scripts/recherche/saisie.phtml:13
+msgid "Vos dernières recherches"
+msgstr "Tus búsquedas recientes"
+
+#: ../../application/modules/opac/controllers/PanierController.php:49
+#: ../../application/modules/opac/controllers/PanierController.php:68
+#: ../../application/modules/opac/controllers/PanierController.php:76
+#: ../../application/modules/opac/controllers/PanierController.php:50
+msgid "Vos paniers"
+msgstr "Sus cestas"
+
+#: ../../application/modules/opac/views/scripts/panier/index.phtml:3
+msgid "Vos paniers de documents"
+msgstr "Su cesta de documentos"
+
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:7
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:10
+msgid "Vos propositions"
+msgstr "Sus propuestas"
+
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:17
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:21
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:14
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:20
+#: ../../application/modules/opac/views/scripts/abonne/tagnotice.phtml:24
+msgid "Votre Tag"
+msgstr "Su Tag"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:255
+#: ../../application/modules/opac/controllers/AbonneController.php:257
+#: ../../application/modules/opac/controllers/AbonneController.php:263
+#: ../../application/modules/opac/controllers/AbonneController.php:290
+#: ../../application/modules/opac/controllers/AbonneController.php:287
+#: ../../library/ZendAfi/View/Helper/Abonne/Abonnement.php:31
+msgid "Votre abonnement est terminé depuis le %s."
+msgstr "Su suscripción finalizó el %s."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:257
+#: ../../application/modules/opac/controllers/AbonneController.php:259
+#: ../../application/modules/opac/controllers/AbonneController.php:265
+#: ../../application/modules/opac/controllers/AbonneController.php:288
+#: ../../application/modules/opac/controllers/AbonneController.php:285
+#: ../../library/ZendAfi/View/Helper/Abonne/Abonnement.php:30
+msgid "Votre abonnement est valide jusqu'au %s."
+msgstr "La suscripción es válida hasta %s."
+
+#: ../../library/Class/Systeme/ModulesMenu/ArteVod.php:39
+#: ../../library/Class/Systeme/ModulesMenu/ArteVod.php:42
+msgid ""
+"Votre abonnement ne permet pas d'accéder aux ressources ArteVod. Merci de "
+"contacter la médiathèque"
+msgstr ""
+"Su suscripción no incluye el acceso a los recursos ArteVod. Gracias al "
+"contacto con la biblioteca"
+
+#: ../../library/Class/Systeme/ModulesMenu/CVS.php:42
+msgid ""
+"Votre abonnement ne permet pas d'accéder aux ressources CVS. Merci de "
+"contacter la médiathèque"
+msgstr ""
+"Su suscripción no incluye el acceso a los recursos CVS. Gracias al contacto "
+"con la biblioteca"
+
+#: ../../library/Class/Systeme/ModulesMenu/MusicMe.php:39
+#: ../../library/Class/Systeme/ModulesMenu/MusicMe.php:43
+#: ../../library/Class/Systeme/ModulesMenu/MusicMe.php:46
+msgid ""
+"Votre abonnement ne permet pas d'accéder aux ressources MusicMe. Merci de "
+"contacter la médiathèque"
+msgstr ""
+"Su suscripción no incluye el acceso a los recursos Musicme. Gracias al "
+"contacto con la biblioteca"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:32
+msgid "Votre adresse E-mail :"
+msgstr "Su dirección de correo electrónico:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:432
+#: ../../application/modules/opac/controllers/RechercheController.php:465
+#: ../../application/modules/opac/controllers/RechercheController.php:490
+#: ../../application/modules/opac/controllers/RechercheController.php:549
+#: ../../application/modules/opac/controllers/RechercheController.php:604
+#: ../../application/modules/opac/controllers/RechercheController.php:392
+#: ../../application/modules/opac/controllers/RechercheController.php:388
+msgid "Votre adresse e-mail est incorrecte."
+msgstr "Su dirección de correo electrónico no es válida."
+
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:31
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:12
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:11
+#: ../../application/modules/opac/views/scripts/abonne/avis_partial.phtml:30
+msgid "Votre avis"
+msgstr "Revisión"
+
+#: ../../application/modules/opac/controllers/AuthController.php:196
+#: ../../application/modules/opac/views/scripts/auth/activeuser.phtml:2
+#: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../application/modules/opac/controllers/AuthController.php:214
+#: ../../application/modules/opac/controllers/AuthController.php:194
+#: ../../application/modules/opac/controllers/AuthController.php:206
+#: ../../application/modules/opac/controllers/AuthController.php:243
+msgid "Votre demande d'inscription"
+msgstr "Su solicitud"
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:2
+msgid "Votre fiche"
+msgstr "Su archivo"
+
+#: ../../library/Class/Users.php:314 ../../library/Class/Users.php:328
+#: ../../library/Class/Users.php:403 ../../library/Class/Users.php:479
+#: ../../library/Class/Users.php:508
+msgid "Votre identifiant : %s"
+msgstr "Su nombre de usuario: %s"
+
+#: ../../library/Class/Users.php:657 ../../library/Class/Users.php:724
+#: ../../library/Class/Users.php:812 ../../library/Class/Users.php:925
+#: ../../library/Class/Users.php:941 ../../library/Class/Users.php:948
+msgid "Votre identifiant : %s\n"
+msgstr "Su nombre de usuario: %s\n"
+
+#: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:17
+#: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:31
+msgid "Votre identité s.v.p."
+msgstr "Su s.v.p. identidad"
+
+#: ../../application/modules/opac/controllers/IndexController.php:120
+#: ../../application/modules/opac/controllers/IndexController.php:136
+#: ../../application/modules/opac/controllers/IndexController.php:141
+#: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../library/ZendAfi/Form/ContactForm.php:52
+msgid "Votre message"
+msgstr "Tu mensaje"
+
+#: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:28
+msgid "Votre message :"
+msgstr "Tu mensaje:"
+
+#: ../../library/Class/Users.php:315 ../../library/Class/Users.php:329
+#: ../../library/Class/Users.php:404 ../../library/Class/Users.php:480
+#: ../../library/Class/Users.php:509
+msgid "Votre mot de passe : %s"
+msgstr "Contraseña:  %s"
+
+#: ../../library/Class/Users.php:813 ../../library/Class/Users.php:926
+#: ../../library/Class/Users.php:942 ../../library/Class/Users.php:949
+msgid "Votre mot de passe : %s\n"
+msgstr "Contraseña: %s\n"
+
+#: ../../library/Class/Users.php:658 ../../library/Class/Users.php:725
+msgid ""
+"Votre mot de passe : %s\n"
+"n"
+msgstr ""
+"Contraseña :%s\n"
+"n"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:1
+msgid "Votre réservation"
+msgstr "Su reserva"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:528
+#: ../../application/modules/opac/controllers/RechercheController.php:565
+#: ../../application/modules/opac/controllers/RechercheController.php:587
+#: ../../application/modules/opac/controllers/RechercheController.php:665
+#: ../../application/modules/opac/controllers/RechercheController.php:720
+#: ../../application/modules/opac/controllers/RechercheController.php:508
+#: ../../application/modules/opac/controllers/RechercheController.php:503
+msgid "Votre réservation est enregistrée."
+msgstr "Se registra la reserva."
+
+#: ../../application/modules/opac/views/scripts/abonne/suggestion-achat-ok.phtml:3
+msgid "Votre suggestion d'achat a bien été envoyée."
+msgstr "Tu sugerencia compra ha sido enviado."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:287
+#: ../../application/modules/opac/controllers/AbonneController.php:294
+#: ../../application/modules/opac/controllers/AbonneController.php:300
+#: ../../application/modules/opac/controllers/AbonneController.php:326
+#: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:27
+msgid "Vous avez %d panier de notices"
+msgstr "Tienes %d cesta de registros"
+
+#: ../../application/modules/opac/controllers/PanierController.php:55
+#: ../../application/modules/opac/controllers/PanierController.php:74
+#: ../../application/modules/opac/controllers/PanierController.php:83
+#: ../../application/modules/opac/controllers/PanierController.php:57
+msgid "Vous avez %d panier(s)"
+msgstr "Tienes %d canasta (s)"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:288
+#: ../../application/modules/opac/controllers/AbonneController.php:295
+#: ../../application/modules/opac/controllers/AbonneController.php:301
+#: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:328
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:28
+msgid "Vous avez %d paniers de notices"
+msgstr "Tienes %d cestas de registros"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:269
+#: ../../application/modules/opac/controllers/AbonneController.php:270
+#: ../../application/modules/opac/controllers/AbonneController.php:276
+#: ../../application/modules/opac/controllers/AbonneController.php:302
+#: ../../application/modules/opac/controllers/AbonneController.php:299
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:30
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:33
+msgid "Vous avez %d prêt en cours"
+msgstr "Tienes %d préstamo activos"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:270
+#: ../../application/modules/opac/controllers/AbonneController.php:271
+#: ../../application/modules/opac/controllers/AbonneController.php:277
+#: ../../application/modules/opac/controllers/AbonneController.php:303
+#: ../../application/modules/opac/controllers/AbonneController.php:300
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:31
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:34
+msgid "Vous avez %d prêts en cours"
+msgstr "Tienes %de los préstamos pendientes"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:277
+#: ../../application/modules/opac/controllers/AbonneController.php:278
+#: ../../application/modules/opac/controllers/AbonneController.php:284
+#: ../../application/modules/opac/controllers/AbonneController.php:310
+#: ../../application/modules/opac/controllers/AbonneController.php:307
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:30
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:33
+msgid "Vous avez %d réservation en cours"
+msgstr "Tienes %d reserva activa"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:278
+#: ../../application/modules/opac/controllers/AbonneController.php:279
+#: ../../application/modules/opac/controllers/AbonneController.php:285
+#: ../../application/modules/opac/controllers/AbonneController.php:311
+#: ../../application/modules/opac/controllers/AbonneController.php:308
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:31
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:34
+msgid "Vous avez %d réservations en cours"
+msgstr "Tienes %de las reservas actuales"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:594
+#: ../../application/modules/opac/controllers/AbonneController.php:596
+#: ../../application/modules/opac/controllers/AbonneController.php:634
+#: ../../application/modules/opac/controllers/AbonneController.php:666
+#: ../../application/modules/opac/controllers/AbonneController.php:726
+#: ../../application/modules/opac/controllers/AbonneController.php:724
+msgid "Vous avez déjà une réservation dans ce créneau horaire"
+msgstr "Usted ya tiene una reserva en este intervalo de tiempo"
+
+#: ../../library/Class/Users.php:253 ../../library/Class/Users.php:267
+#: ../../library/Class/Users.php:342 ../../library/Class/Users.php:418
+#: ../../library/Class/Users.php:447 ../../library/Class/Users.php:593
+#: ../../library/Class/Users.php:660 ../../library/Class/Users.php:748
+#: ../../library/Class/Users.php:871
+msgid "Vous avez fait une demande d'inscription sur le portail."
+msgstr "Usted ha hecho una solicitud de registro en el portal."
+
+#: ../../library/Class/Users.php:313 ../../library/Class/Users.php:327
+#: ../../library/Class/Users.php:402 ../../library/Class/Users.php:478
+#: ../../library/Class/Users.php:507 ../../library/Class/Users.php:656
+#: ../../library/Class/Users.php:723 ../../library/Class/Users.php:811
+#: ../../library/Class/Users.php:924 ../../library/Class/Users.php:940
+#: ../../library/Class/Users.php:947
+msgid "Vous avez fait une demande de mot de passe sur le portail."
+msgstr "Ha solicitado una contraseña en el portal."
+
+#: ../../library/Class/Users.php:157 ../../library/Class/Users.php:171
+#: ../../library/Class/Users.php:246 ../../library/Class/Users.php:322
+#: ../../library/Class/Users.php:351 ../../library/Class/Users.php:495
+#: ../../library/Class/Users.php:562 ../../library/Class/Users.php:643
+#: ../../library/Class/Users.php:765 ../../library/Class/Users.php:816
+#: ../../library/Class/Users.php:823
+msgid "Vous devez compléter le champ 'Identifiant'"
+msgstr "Debe completar el campo 'id'"
+
+#: ../../library/Class/Users.php:165 ../../library/Class/Users.php:179
+#: ../../library/Class/Users.php:254 ../../library/Class/Users.php:330
+#: ../../library/Class/Users.php:359 ../../library/Class/Users.php:503
+#: ../../library/Class/Users.php:570 ../../library/Class/Users.php:651
+#: ../../library/Class/Users.php:773 ../../library/Class/Users.php:824
+#: ../../library/Class/Users.php:831
+msgid "Vous devez compléter le champ 'Mot de passe'"
+msgstr "Debe completar el campo 'Contraseña'"
+
+#: ../../library/Class/SitothequeCategorie.php:110
+#: ../../library/Class/RssCategorie.php:73
+msgid "Vous devez compléter le champ 'Nom de la catégorie'"
+msgstr "Usted debe completar el \"Nombre de la clase '"
+
+#: ../../library/Class/Bib.php:104 ../../library/Class/Bib.php:105
+#: ../../library/Class/Bib.php:112 ../../library/Class/Bib.php:130
+#: ../../library/Class/Bib.php:161 ../../library/Class/Bib.php:189
+#: ../../library/Class/Bib.php:204 ../../library/Class/Bib.php:220
+#: ../../library/Class/Bib.php:240 ../../library/Class/Bib.php:260
+msgid "Vous devez compléter le champ 'Nom'"
+msgstr "Debe completar el 'Nombre'"
+
+#: ../../library/Class/Sitotheque.php:222
+#: ../../library/Class/Sitotheque.php:216
+#: ../../library/Class/Sitotheque.php:226
+msgid "Vous devez compléter le champ 'Titre'"
+msgstr "Debe completar el campo 'Título'"
+
+#: ../../library/Class/Sitotheque.php:228
+#: ../../library/Class/Sitotheque.php:222
+#: ../../library/Class/Sitotheque.php:232
+msgid "Vous devez compléter le champ 'Url'"
+msgstr "Debe completar 'url' del Campo"
+
+#: ../../library/Class/Bib.php:107 ../../library/Class/Bib.php:108
+#: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:133
+#: ../../library/Class/Bib.php:164 ../../library/Class/Bib.php:192
+#: ../../library/Class/Bib.php:207 ../../library/Class/Bib.php:223
+#: ../../library/Class/Bib.php:243 ../../library/Class/Bib.php:263
+msgid "Vous devez compléter le champ 'Ville'"
+msgstr "Debe completar el campo 'Ciudad'"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:380
+#: ../../application/modules/opac/controllers/AbonneController.php:388
+#: ../../application/modules/opac/controllers/AbonneController.php:396
+#: ../../application/modules/opac/controllers/AbonneController.php:422
+#: ../../application/modules/opac/controllers/AbonneController.php:413
+#: ../../application/modules/opac/controllers/AbonneController.php:389
+#: ../../application/modules/opac/controllers/AbonneController.php:408
+#: ../../application/modules/opac/controllers/AbonneController.php:468
+#: ../../application/modules/opac/controllers/AbonneController.php:466
+msgid "Vous devez confirmer le mot de passe"
+msgstr "Debe confirmar la contraseña"
+
+#: ../../library/Class/Users.php:671 ../../library/Class/Users.php:793
+#: ../../library/Class/Users.php:845 ../../library/Class/Users.php:852
+msgid "Vous devez fournir une adresse mail valide"
+msgstr "Usted debe proporcionar una dirección de correo electrónico válida"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:390
+#: ../../application/modules/opac/controllers/AbonneController.php:398
+#: ../../application/modules/opac/controllers/AbonneController.php:406
+#: ../../application/modules/opac/controllers/AbonneController.php:432
+#: ../../application/modules/opac/controllers/AbonneController.php:423
+#: ../../application/modules/opac/controllers/AbonneController.php:399
+#: ../../application/modules/opac/controllers/AbonneController.php:418
+#: ../../application/modules/opac/controllers/AbonneController.php:478
+#: ../../application/modules/opac/controllers/AbonneController.php:476
+msgid "Vous devez saisir un mot de passe"
+msgstr "Debe introducir una contraseña"
+
+#: ../../library/Class/Users.php:674 ../../library/Class/Users.php:796
+#: ../../library/Class/Users.php:848 ../../library/Class/Users.php:855
+msgid "Vous devez saisir un numéro de téléphone"
+msgstr "Debe ingresar un número de teléfono"
+
+#: ../../library/Class/AvisNotice.php:240
+#: ../../library/Class/AvisNotice.php:278
+#: ../../library/Class/AvisNotice.php:313
+#: ../../library/Class/AvisNotice.php:249
+#: ../../library/Class/AvisNotice.php:248
+msgid "Vous devez saisir un titre"
+msgstr "Debe introducir un título"
+
+#: ../../application/modules/opac/controllers/UploadController.php:48
+#: ../../application/modules/opac/controllers/UploadController.php:55
+#: ../../application/modules/opac/controllers/UploadController.php:76
+msgid "Vous devez sélectionner une image en cliquant sur le bouton : parcourir"
+msgstr "Debe seleccionar una imagen haciendo clic en Examinar"
+
+#: ../../application/modules/admin/controllers/BibController.php:300
+#: ../../application/modules/admin/controllers/BibController.php:308
+#: ../../application/modules/admin/controllers/BibController.php:327
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../application/modules/admin/controllers/BibController.php:294
+#: ../../application/modules/admin/controllers/BibController.php:299
+msgid "Vous devez sélectionner une photo en cliquant sur le bouton : parcourir"
+msgstr "Debe seleccionar una foto haciendo clic en el botón Examinar"
+
+#: ../../library/Class/Users.php:365 ../../library/Class/Users.php:379
+#: ../../library/Class/Users.php:454 ../../library/Class/Users.php:532
+#: ../../library/Class/Users.php:561 ../../library/Class/Users.php:768
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:926
+#: ../../library/Class/Users.php:1053 ../../library/Class/Users.php:1069
+#: ../../library/Class/Users.php:1076
+msgid ""
+"Vous devez vous connecter en tant qu'abonné de la bibliothèque pour obtenir "
+"plus d'informations."
+msgstr ""
+"Usted debe iniciar la sesión como un abonado a la biblioteca para obtener "
+"más información."
+
+#: ../../library/Class/CommSigb.php:111 ../../library/Class/CommSigb.php:115
+#: ../../library/Class/CommSigb.php:121 ../../library/Class/CommSigb.php:132
+#: ../../library/Class/CommSigb.php:123 ../../library/Class/CommSigb.php:125
+msgid "Vous devez vous connecter pour réserver un document."
+msgstr "Debes iniciar sesión para hacer una petición."
+
+#: ../../library/Class/CommSigb.php:113 ../../library/Class/CommSigb.php:117
+#: ../../library/Class/CommSigb.php:123 ../../library/Class/CommSigb.php:159
+#: ../../library/Class/CommSigb.php:127 ../../library/Class/CommSigb.php:129
+msgid ""
+"Vous devez vous connecter sous votre numéro de carte pour effectuer une "
+"réservation."
+msgstr ""
+"Usted debe iniciar sesión con su número de tarjeta para hacer una reserva."
+
+#: ../../library/ZendAfi/View/Helper/TagCoursToutApprendre.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au cours en ligne"
+msgstr ""
+"Debe iniciar sesión en una cuenta con una suscripción válida para acceder al "
+"curso en línea"
+
+#: ../../library/ZendAfi/View/Helper/TagFormationVodeclic.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder à la formation"
+msgstr ""
+"Debe iniciar sesión en una cuenta con una suscripción válida para acceder a "
+"la formación"
+
+#: ../../library/ZendAfi/View/Helper/TagVideo.php:51
+#: ../../library/ZendAfi/View/Helper/TagVideo.php:55
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"visionner le film dans son intégralité"
+msgstr ""
+"Debe iniciar sesión en una cuenta con una suscripción válida para poder ver "
+"la película en su totalidad"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:286
+#: ../../application/modules/opac/controllers/AbonneController.php:293
+#: ../../application/modules/opac/controllers/AbonneController.php:299
+#: ../../application/modules/opac/controllers/AbonneController.php:325
+#: ../../application/modules/opac/controllers/AbonneController.php:326
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:26
+msgid "Vous n'avez aucun panier de notices."
+msgstr "No tiene ninguna cesta de registros."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:286
+#: ../../application/modules/opac/controllers/AbonneController.php:293
+#: ../../application/modules/opac/controllers/AbonneController.php:299
+#: ../../application/modules/opac/controllers/AbonneController.php:325
+#: ../../application/modules/opac/controllers/AbonneController.php:326
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:26
+#: ../../application/modules/opac/controllers/PanierController.php:53
+#: ../../application/modules/opac/controllers/PanierController.php:72
+#: ../../application/modules/opac/controllers/PanierController.php:81
+#: ../../application/modules/opac/controllers/PanierController.php:55
+msgid "Vous n'avez aucun panier."
+msgstr "Usted no tiene ninguna canasta."
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:78
+msgid "Vous n'avez aucun prêt en cours"
+msgstr "Usted no tiene préstamos pendientes"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:268
+#: ../../application/modules/opac/controllers/AbonneController.php:269
+#: ../../application/modules/opac/controllers/AbonneController.php:275
+#: ../../application/modules/opac/controllers/AbonneController.php:301
+#: ../../application/modules/opac/controllers/AbonneController.php:298
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:29
+#: ../../library/ZendAfi/View/Helper/Abonne/Prets.php:32
+msgid "Vous n'avez aucun prêt en cours."
+msgstr "Usted no tiene préstamos pendientes."
+
+#: ../../application/modules/telephone/views/scripts/abonne/fiche.phtml:104
+msgid "Vous n'avez aucune réservation en cours"
+msgstr "Usted no tiene ninguna reserva actual"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:276
+#: ../../application/modules/opac/controllers/AbonneController.php:277
+#: ../../application/modules/opac/controllers/AbonneController.php:283
+#: ../../application/modules/opac/controllers/AbonneController.php:309
+#: ../../application/modules/opac/controllers/AbonneController.php:306
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:29
+#: ../../library/ZendAfi/View/Helper/Abonne/Reservations.php:32
+msgid "Vous n'avez aucune réservation en cours."
+msgstr "Usted no tiene ninguna reserva en curso."
+
+#: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:38
+msgid "Vous n'avez pas encore fait de suggestion."
+msgstr "Usted todavía no lo ha hecho a la sugestión."
+
+#: ../../library/Class/Users.php:519 ../../library/Class/Users.php:586
+#: ../../library/Class/Users.php:667 ../../library/Class/Users.php:789
+#: ../../library/Class/Users.php:841 ../../library/Class/Users.php:848
+msgid "Vous n'avez pas les droits suffisants pour diriger une formation"
+msgstr "Usted no tiene permiso para realizar la capacitación"
+
+#: ../../library/Class/Users.php:516 ../../library/Class/Users.php:583
+#: ../../library/Class/Users.php:664 ../../library/Class/Users.php:786
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:845
+msgid "Vous n'avez pas les droits suffisants pour suivre une formation"
+msgstr "Usted no tiene permiso para asistir a la capacitación"
+
+#: ../../application/modules/opac/views/scripts/abonne/formations.phtml:6
+msgid ""
+"Vous n'avez pas les droits suffisants pour vous inscrire à une formation"
+msgstr "Usted no tiene permiso para inscribirse para el entrenamiento"
+
+#: ../../library/Class/Users.php:227 ../../library/Class/Users.php:241
+#: ../../library/Class/Users.php:316 ../../library/Class/Users.php:392
+#: ../../library/Class/Users.php:421 ../../library/Class/Users.php:568
+#: ../../library/Class/Users.php:635 ../../library/Class/Users.php:723
+#: ../../library/Class/Users.php:845
+msgid "Vous n'avez pas saisi d'E-mail."
+msgstr "No ha introducido e-mail."
+
+#: ../../application/modules/opac/controllers/RechercheController.php:430
+#: ../../application/modules/opac/controllers/RechercheController.php:463
+#: ../../application/modules/opac/controllers/RechercheController.php:488
+#: ../../application/modules/opac/controllers/RechercheController.php:547
+#: ../../application/modules/opac/controllers/RechercheController.php:602
+#: ../../application/modules/opac/controllers/RechercheController.php:390
+#: ../../application/modules/opac/controllers/RechercheController.php:386
+msgid "Vous n'avez pas saisi de demande :"
+msgstr "Usted no ha entrado en la aplicación:"
+
+#: ../../library/Class/Users.php:217 ../../library/Class/Users.php:231
+#: ../../library/Class/Users.php:306 ../../library/Class/Users.php:382
+#: ../../library/Class/Users.php:411 ../../library/Class/Users.php:558
+#: ../../library/Class/Users.php:625 ../../library/Class/Users.php:713
+#: ../../library/Class/Users.php:835
+msgid "Vous n'avez pas saisi de login."
+msgstr "No ha ingresado login."
+
+#: ../../library/Class/Users.php:230 ../../library/Class/Users.php:244
+#: ../../library/Class/Users.php:319 ../../library/Class/Users.php:395
+#: ../../library/Class/Users.php:424 ../../library/Class/Users.php:571
+#: ../../library/Class/Users.php:638 ../../library/Class/Users.php:726
+#: ../../library/Class/Users.php:848
+msgid "Vous n'avez pas saisi le code anti-spam."
+msgstr "Usted no ha entrado en el correo no deseado código."
+
+#: ../../library/Class/Users.php:220 ../../library/Class/Users.php:234
+#: ../../library/Class/Users.php:309 ../../library/Class/Users.php:385
+#: ../../library/Class/Users.php:414 ../../library/Class/Users.php:561
+#: ../../library/Class/Users.php:628 ../../library/Class/Users.php:716
+#: ../../library/Class/Users.php:838
+msgid "Vous n'avez pas saisi les mêmes mots de passe."
+msgstr "Usted no ha entrado en las mismas contraseñas."
+
+#: ../../application/modules/opac/controllers/RechercheController.php:428
+#: ../../application/modules/opac/controllers/RechercheController.php:461
+#: ../../application/modules/opac/controllers/RechercheController.php:486
+#: ../../application/modules/opac/controllers/RechercheController.php:545
+#: ../../application/modules/opac/controllers/RechercheController.php:600
+#: ../../application/modules/opac/controllers/RechercheController.php:388
+#: ../../application/modules/opac/controllers/RechercheController.php:384
+msgid "Vous n'avez pas saisi vos Nom et Prénom :"
+msgstr "No ha ingresado su nombre y apellidos:"
+
+#: ../../application/modules/admin/controllers/BibController.php:757
+#: ../../application/modules/admin/controllers/BibController.php:765
+#: ../../application/modules/admin/controllers/BibController.php:784
+#: ../../application/modules/admin/controllers/BibController.php:781
+msgid "Vous n'avez saisi aucune clef."
+msgstr "No ha introducido una clave."
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:22
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:28
+#: ../../library/ZendAfi/View/Helper/Abonne/Newsletters.php:26
+msgid "Vous n'êtes abonné à aucune lettre d'information"
+msgstr "Usted no está suscrito a ningún boletín"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:556
+#: ../../application/modules/opac/controllers/AbonneController.php:588
+#: ../../application/modules/opac/controllers/AbonneController.php:648
+#: ../../application/modules/opac/controllers/AbonneController.php:646
+msgid "Vous n'êtes pas autorisé à effectuer une réservation"
+msgstr "No se le permite hacer una reserva"
+
+#: ../../application/modules/opac/views/scripts/bib/selection.phtml:4
+msgid ""
+"Vous pouvez sélectionner une ou plusieurs bibliothèques pour effectuer une "
+"recherche "
+msgstr "Puede seleccionar una o varias bibliotecas para buscar"
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:13
+msgid ""
+"Vous venez de supprimer de dernier point de cette couche. Un nouveau point "
+"va être créé au centre de la couche."
+msgstr ""
+"Usted acaba de quitar el último punto de esta capa. Un nuevo elemento se "
+"creará en el centro de la capa."
+
+#: ../../application/modules/admin/views/scripts/bib/planacces.phtml:10
+msgid ""
+"Vous venez de supprimer la dernière couche de la carte. Une nouvelle couche "
+"va être créée."
+msgstr ""
+"Usted acaba de quitar la capa superior de la tarjeta. Se creará una nueva "
+"capa."
+
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:27
+#: ../../application/modules/opac/views/scripts/abonne/fiche.phtml:33
+#: ../../library/ZendAfi/View/Helper/Abonne/Newsletters.php:31
+msgid "Vous êtes abonné"
+msgstr "Estas abonado"
+
+#: ../../application/modules/opac/views/scripts/bib/zoneview.phtml:26
+msgid "Web"
+msgstr "Web"
+
+#: ../../library/ZendAfi/Form/Configuration/SearchResult.php:121
+msgid "Zones de titre(séparées par ;)"
+msgstr "Campos Título (separados por;)"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:113
+msgid "[%s]"
+msgstr "[%s]"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:111
+msgid "[0]"
+msgstr "[0]"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Panier.php:112
+msgid "[1]"
+msgstr "[1]"
+
+#: ../../library/ZendAfi/View/Helper/MoteurRecherche/Resultat/TimelineJsonVisitor.php:72
+msgid "[Voir la notice]"
+msgstr "[Abrir el registro]"
+
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:5
+#: ../../application/modules/admin/views/scripts/index/adminvar.phtml:28
+msgid "action"
+msgstr "acción"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:26
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:101
+msgid "actuel"
+msgstr "actual"
+
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:45
+#: ../../library/ZendAfi/View/Helper/HistoriqueRecherche.php:64
+msgid "année début"
+msgstr "año inicio"
+
+#: ../../application/modules/opac/views/scripts/recherche/readnotice.phtml:5
+msgid "année: %s"
+msgstr "año: %s"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:42
+#: ../../library/Class/Calendar.php:42 ../../library/Class/Calendar.php:43
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:47
+#: ../../library/Class/Calendar.php:62 ../../library/Class/Calendar.php:65
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:52
+msgid "août"
+msgstr "Agosto"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:73
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:99
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:78
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:104
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:130
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:98
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:124
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:94
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:120
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:91
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:113
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:116
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:41
+msgid "au"
+msgstr "la"
+
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:90
+#: ../../library/ZendAfi/View/Helper/Admin/UserGroupMemberShip.php:59
+#: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:49
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:172
+msgid "aucun utilisateur"
+msgstr "ningún usuario"
+
+#: ../../application/modules/opac/controllers/CatalogueController.php:102
+#: ../../application/modules/opac/controllers/EtagereController.php:129
+#: ../../application/modules/opac/controllers/CatalogueController.php:113
+#: ../../application/modules/opac/controllers/CatalogueController.php:107
+#: ../../application/modules/opac/controllers/EtagereController.php:106
+#: ../../application/modules/opac/controllers/EtagereController.php:125
+#: ../../application/modules/opac/controllers/CatalogueController.php:126
+#: ../../application/modules/opac/controllers/CatalogueController.php:127
+#: ../../application/modules/opac/controllers/CatalogueController.php:94
+msgid "aucune"
+msgstr "no"
+
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/ResumeAvis.php:32
+msgid "aucune évaluation"
+msgstr "ninguna evaluación"
+
+#: ../../application/modules/opac/views/scripts/recherche/readnotice.phtml:3
+msgid "auteur: %s"
+msgstr "Autor: %s"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:38
+#: ../../library/Class/Calendar.php:38 ../../library/Class/Calendar.php:39
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:43
+#: ../../library/Class/Calendar.php:58 ../../library/Class/Calendar.php:61
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:48
+msgid "avril"
+msgstr "Abril"
+
+#: ../../application/modules/opac/views/scripts/banniere.phtml:4
+#: ../../library/ZendAfi/View/Helper/TagBanniere.php:43
+#: ../../library/ZendAfi/View/Helper/TagBanniere.php:62
+msgid "banniere du site"
+msgstr "bandera del Sitio"
+
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:63
+msgid "commence"
+msgstr "comienza"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:14
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:14
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:20
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:16
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:22
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:35
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:42
+msgid "commence par"
+msgstr "comienza"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:15
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:15
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:17
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:36
+msgid "contient"
+msgstr "contiene"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:43
+msgid "dans le catalogue:&nbsp;"
+msgstr "Catálogo: &nbsp;"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:44
+msgid "dans le panier:&nbsp;"
+msgstr "en la cesta: &nbsp;"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Flags.php:39
+msgid "dans_panier"
+msgstr "dans_panier"
+
+#: ../../application/modules/opac/controllers/IndexController.php:173
+#: ../../application/modules/opac/controllers/IndexController.php:178
+#: ../../application/modules/opac/controllers/IndexController.php:170
+#: ../../application/modules/opac/controllers/IndexController.php:149
+#: ../../application/modules/opac/controllers/IndexController.php:92
+msgid ""
+"destinataire non configuré. Vérifiez les paramètres du profil, champ 'E-mail "
+"du webmestre'"
+msgstr ""
+"destinatario no configurado. Compruebe la configuración del campo de perfil "
+"'E-mail el Webmaster'"
+
+#: ../../library/Class/Calendar.php:27 ../../library/Class/Calendar.php:28
+#: ../../library/Class/Calendar.php:47 ../../library/Class/Calendar.php:50
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:37
+msgid "dim"
+msgstr "Sun"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:30
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:35
+msgid "dim."
+msgstr "Sun"
+
+#: ../../library/ZendAfi/View/Helper/ListeCVSNotices.php:49
+msgid "documents trouvés"
+msgstr "Archivos encontrados"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:89
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:68
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:94
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:120
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:88
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:114
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:84
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:110
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:83
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:105
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:35
+msgid "du"
+msgstr "de"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:46
+#: ../../library/Class/Calendar.php:46 ../../library/Class/Calendar.php:47
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:51
+#: ../../library/Class/Calendar.php:66 ../../library/Class/Calendar.php:69
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:56
+msgid "décembre"
+msgstr "Diciembre"
+
+#: ../../application/modules/opac/views/scripts/java/slide_show.phtml:25
+msgid "défilement à droite"
+msgstr "recorriendo hacia la derecha"
+
+#: ../../application/modules/opac/views/scripts/java/slide_show.phtml:24
+msgid "défilement à gauche"
+msgstr "desplácese hacia la izquierda"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:119
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:147
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:155
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:171
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:170
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:187
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:163
+#: ../../library/ZendAfi/View/Helper/ListeNotices/Accordeon.php:44
+msgid "déplier"
+msgstr "desarrollarse"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:355
+#: ../../application/modules/opac/controllers/RechercheController.php:375
+#: ../../application/modules/opac/controllers/RechercheController.php:400
+#: ../../application/modules/opac/controllers/RechercheController.php:460
+#: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:116
+#: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:129
+#: ../../library/ZendAfi/View/Helper/TagHistoriqueRecherche.php:118
+msgid "entre %s et %s"
+msgstr "entre %s %s"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:14
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:25
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:36
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:47
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:58
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:69
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:103
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:100
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:20
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:31
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:42
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:53
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:64
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:75
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:106
+msgid "et"
+msgstr "y"
+
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:31
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:29
+msgid "ex: Harry Potter à l'école des sorciers"
+msgstr "ex: Harry Potter y la piedra filosofal"
+
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:56
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:58
+#: ../../library/ZendAfi/View/Helper/Permalink.php:20
+#: ../../library/ZendAfi/View/Helper/Permalink.php:39
+#: ../../library/ZendAfi/View/Helper/Permalink.php:40
+msgid "fermer cette fenêtre"
+msgstr "cerrar esta ventana"
+
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:69
+msgid "finit le"
+msgstr "finaliza el"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:168
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:201
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:208
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:218
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:233
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:261
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:270
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:265
+#: ../../library/ZendAfi/View/Helper/Accueil/Base.php:248
+msgid "flux RSS de la boite %s"
+msgstr "RSS de la caja %s"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:36
+#: ../../library/Class/Calendar.php:36 ../../library/Class/Calendar.php:37
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:41
+#: ../../library/Class/Calendar.php:56 ../../library/Class/Calendar.php:59
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:46
+msgid "février"
+msgstr "Febrero"
+
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:32
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:33
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:39
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:58
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:68
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:75
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:118
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:115
+msgid "icone"
+msgstr "icono"
+
+#: ../../library/ZendAfi/View/Helper/ShareByMail.php:31
+msgid "icone e-mail"
+msgstr "icono de correo electrónico"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:23
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:30
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:23
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:30
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:29
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:36
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:38
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:50
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:57
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:70
+msgid "indice commence par"
+msgstr "comienza índice"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:35
+#: ../../library/Class/Calendar.php:35 ../../library/Class/Calendar.php:36
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:40
+#: ../../library/Class/Calendar.php:55 ../../library/Class/Calendar.php:58
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:45
+msgid "janvier"
+msgstr "Enero"
+
+#: ../../library/Class/Calendar.php:31 ../../library/Class/Calendar.php:32
+#: ../../library/Class/Calendar.php:51 ../../library/Class/Calendar.php:54
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:41
+msgid "jeu"
+msgstr "juego"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:27
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:32
+msgid "jeu."
+msgstr "jugar."
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:41
+#: ../../library/Class/Calendar.php:41 ../../library/Class/Calendar.php:42
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:46
+#: ../../library/Class/Calendar.php:61 ../../library/Class/Calendar.php:64
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:51
+msgid "juillet"
+msgstr "Julio"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:40
+#: ../../library/Class/Calendar.php:40 ../../library/Class/Calendar.php:41
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:45
+#: ../../library/Class/Calendar.php:60 ../../library/Class/Calendar.php:63
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:50
+msgid "juin"
+msgstr "Junio"
+
+#: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:161
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:56
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:66
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:52
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:62
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:49
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:59
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:65
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:75
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:78
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:88
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:90
+#: ../../application/modules/admin/views/scripts/catalogue/form.phtml:100
+msgid "jusqu'à"
+msgstr "a"
+
+#: ../../application/modules/admin/controllers/BibController.php:394
+#: ../../application/modules/admin/controllers/BibController.php:507
+#: ../../application/modules/admin/controllers/BibController.php:402
+#: ../../application/modules/admin/controllers/BibController.php:515
+#: ../../application/modules/admin/controllers/BibController.php:421
+#: ../../application/modules/admin/controllers/BibController.php:534
+#: ../../application/modules/admin/controllers/BibController.php:418
+#: ../../application/modules/admin/controllers/BibController.php:531
+#: ../../application/modules/admin/controllers/BibController.php:382
+#: ../../application/modules/admin/controllers/BibController.php:475
+#: ../../application/modules/admin/controllers/BibController.php:387
+#: ../../application/modules/admin/controllers/BibController.php:480
+msgid "le libellé est obligatoire."
+msgstr "el idioma es obligatorio."
+
+#: ../../application/modules/opac/views/scripts/blog/readavis.phtml:10
+msgid "le: %s"
+msgstr "la: %s"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:24
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:24
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:30
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:37
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:32
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:39
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:51
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:58
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:52
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:59
+msgid "libellé commence par"
+msgstr "comienza con la etiqueta"
+
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:25
+#: ../../library/ZendAfi/View/Helper/admin/TagListeSuggestion.php:32
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:25
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:32
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:38
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:33
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:40
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:52
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:59
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:53
+#: ../../library/ZendAfi/View/Helper/Admin/TagListeSuggestion.php:60
+msgid "libellé contient"
+msgstr "contiene texto"
+
+#: ../../library/Class/Calendar.php:28 ../../library/Class/Calendar.php:29
+#: ../../library/Class/Calendar.php:48 ../../library/Class/Calendar.php:51
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:38
+msgid "lun"
+msgstr "Mon"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:24
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:29
+msgid "lun."
+msgstr "Mon"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:39
+#: ../../library/Class/Calendar.php:39 ../../library/Class/Calendar.php:40
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:44
+#: ../../library/Class/Calendar.php:59 ../../library/Class/Calendar.php:62
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:49
+msgid "mai"
+msgstr "Mayo"
+
+#: ../../library/Class/Calendar.php:29 ../../library/Class/Calendar.php:30
+#: ../../library/Class/Calendar.php:49 ../../library/Class/Calendar.php:52
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:39
+msgid "mar"
+msgstr "Marzo"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:25
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:30
+msgid "mar."
+msgstr "Marzo"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:37
+#: ../../library/Class/Calendar.php:37 ../../library/Class/Calendar.php:38
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:42
+#: ../../library/Class/Calendar.php:57 ../../library/Class/Calendar.php:60
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:47
+msgid "mars"
+msgstr "Marzo"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:24
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:99
+msgid "maximum"
+msgstr "máxima"
+
+#: ../../library/Class/Calendar.php:30 ../../library/Class/Calendar.php:31
+#: ../../library/Class/Calendar.php:50 ../../library/Class/Calendar.php:53
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:40
+msgid "mer"
+msgstr "mar"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:26
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:31
+msgid "mer."
+msgstr "Miér"
+
+#: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:22
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:97
+msgid "minimum"
+msgstr "mínimo"
+
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:170
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:171
+#: ../../library/storm/zf/tests/Zend/Translate/ArrayTest.php:91
+msgid "msg1"
+msgstr "msg1"
+
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:105
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:108
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:112
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:172
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:173
+msgid "msg2"
+msgstr "msg2"
+
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:109
+#: ../../library/storm/zf/tests/Zend/TranslateTest.php:113
+msgid "msg3"
+msgstr "msg3"
+
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:32
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:42
+msgid "non connue"
+msgstr "desconocido"
+
+#: ../../application/modules/opac/views/scripts/blog/readavis.phtml:15
+msgid "note: %s"
+msgstr "Nota: %s"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:33
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:32
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:40
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:41
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:58
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:59
+msgid "notices trouvées"
+msgstr "Elementos encontrados"
+
+#: ../../application/modules/opac/controllers/PanierController.php:62
+#: ../../application/modules/opac/controllers/PanierController.php:81
+#: ../../library/ZendAfi/Form/AjoutNoticePanier.php:45
+#: ../../library/ZendAfi/Form/SelectNoticePanier.php:56
+msgid "nouveau panier"
+msgstr "nueva canasta"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Flags.php:31
+msgid "nouveaute"
+msgstr "novedad"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:45
+#: ../../library/Class/Calendar.php:45 ../../library/Class/Calendar.php:46
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:50
+#: ../../library/Class/Calendar.php:65 ../../library/Class/Calendar.php:68
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:55
+msgid "novembre"
+msgstr "Noviembre"
+
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:7
+#: ../../library/Class/NoticeHtml.php:291
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:7
+#: ../../library/Class/NoticeHtml.php:296
+#: ../../library/Class/NoticeHtml.php:287
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:10
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:18
+#: ../../library/Class/NoticeHtml.php:329
+#: ../../library/Class/NoticeHtml.php:199
+#: ../../application/modules/telephone/views/scripts/recherche/exemplaires.phtml:20
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:12
+#: ../../application/modules/opac/views/scripts/abonne/reservations.phtml:8
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:41
+#: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:44
+#: ../../application/modules/opac/views/scripts/abonne/prets.phtml:20
+msgid "n°"
+msgstr "No."
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:44
+#: ../../library/Class/Calendar.php:44 ../../library/Class/Calendar.php:45
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:49
+#: ../../library/Class/Calendar.php:64 ../../library/Class/Calendar.php:67
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:54
+msgid "octobre"
+msgstr "Octubre"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:15
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:26
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:37
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:48
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:59
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:70
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:21
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:32
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:43
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:54
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:65
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:76
+msgid "ou"
+msgstr "o"
+
+#: ../../library/ZendAfi/View/Helper/TagNombreDePages.php:25
+msgid "page "
+msgstr "página"
+
+#: ../../application/modules/opac/views/scripts/blog/readavis.phtml:6
+msgid "par: %s"
+msgstr "por: %s"
+
+#: ../../library/ZendAfi/View/Helper/ShareByMail.php:32
+msgid "partager par e-mail"
+msgstr "cuota por e-mail"
+
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:33
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:34
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:40
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:59
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:69
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:76
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:119
+#: ../../library/ZendAfi/View/Helper/ReseauxSociaux.php:116
+msgid "partager sur"
+msgstr "Compartiendo"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:146
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:33
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:145
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:159
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:214
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:36
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:246
+#: ../../library/ZendAfi/View/Helper/MenuHorizontal.php:55
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:265
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:274
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:280
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:192
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:296
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:183
+#: ../../library/ZendAfi/View/Helper/Accueil/MenuVertical.php:288
+msgid "pictogramme pour %s"
+msgstr "pictograma para %s"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:42
+msgid "pour:&nbsp;"
+msgstr "a: &nbsp;"
+
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:29
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:109
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:112
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:114
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:133
+#: ../../library/ZendAfi/View/Helper/TagObjetsImgProperties.php:41
+#: ../../library/ZendAfi/View/Helper/Admin/ImageViewersOptions.php:125
+#: ../../library/ZendAfi/View/Helper/Admin/PropertiesReader.php:39
+msgid "propriétés de l'objet"
+msgstr "propiedades de los objetos"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:35
+msgid "résultat pour :"
+msgstr "Resultados para:"
+
+#: ../../library/ZendAfi/View/Helper/TagTitreEtNombreDeResultats.php:41
+msgid "résultats pour :"
+msgstr "Resultados para:"
+
+#: ../../library/Class/Calendar.php:33 ../../library/Class/Calendar.php:34
+#: ../../library/Class/Calendar.php:53 ../../library/Class/Calendar.php:56
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:43
+msgid "sam"
+msgstr "sam"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:29
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:34
+msgid "sam."
+msgstr "Sat"
+
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:16
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:27
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:38
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:49
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:60
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:71
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:22
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:33
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:44
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:55
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:66
+#: ../../application/modules/opac/views/scripts/recherche/avancee.phtml:77
+msgid "sauf"
+msgstr "excepto"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:43
+#: ../../library/Class/Calendar.php:43 ../../library/Class/Calendar.php:44
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:48
+#: ../../library/Class/Calendar.php:63 ../../library/Class/Calendar.php:66
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:53
+msgid "septembre"
+msgstr "Septiembre"
+
+#: ../../library/Class/NoticeHtml.php:753
+#: ../../library/Class/NoticeHtml.php:760
+#: ../../library/Class/NoticeHtml.php:771
+#: ../../library/Class/NoticeHtml.php:762
+#: ../../library/Class/NoticeHtml.php:774
+#: ../../library/Class/NoticeHtml.php:646
+#: ../../library/Class/NoticeHtml.php:340
+#: ../../library/Class/NoticeHtml.php:339
+#: ../../library/Class/NoticeHtml.php:321
+msgid "source"
+msgstr "fuente"
+
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:71
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:123
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:99
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:151
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:107
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:159
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:108
+#: ../../library/ZendAfi/View/Helper/ListeNotices.php:175
+msgid "support"
+msgstr "apoyo"
+
+#: ../../library/ZendAfi/View/Helper/ComboCodification.php:72
+msgid "tous"
+msgstr "todo"
+
+#: ../../library/ZendAfi/View/Helper/admin/ProfileSelect.php:146
+#: ../../library/ZendAfi/View/Helper/ComboCodification.php:40
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:146
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:165
+#: ../../library/ZendAfi/View/Helper/ComboCodification.php:59
+#: ../../library/ZendAfi/View/Helper/ComboCodification.php:43
+#: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:168
+msgid "toutes"
+msgstr "todo"
+
+#: ../../application/modules/admin/views/scripts/cms/_article_country_flag.phtml:5
+msgid "traduction %s"
+msgstr "traducción %s"
+
+#: ../../library/Class/Calendar.php:32 ../../library/Class/Calendar.php:33
+#: ../../library/Class/Calendar.php:52 ../../library/Class/Calendar.php:55
+#: ../../library/ZendAfi/View/Helper/Calendar/Table.php:42
+msgid "ven"
+msgstr "Vie"
+
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:28
+#: ../../library/ZendAfi/View/Helper/DatePicker.php:33
+msgid "ven."
+msgstr "Vie"
+
+#: ../../library/ZendAfi/View/Helper/Avis.php:50
+#: ../../library/ZendAfi/View/Helper/Avis.php:52
+#: ../../library/ZendAfi/View/Helper/Avis.php:54
+#: ../../library/ZendAfi/View/Helper/Avis.php:73
+#: ../../library/ZendAfi/View/Helper/Avis.php:81
+#: ../../library/ZendAfi/View/Helper/Avis.php:114
+msgid "vignette de la notice"
+msgstr "miniatura de registro"
+
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:78
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:76
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:150
+#: ../../library/ZendAfi/View/Helper/Accueil/Sito.php:149
+msgid "vignette du site %s"
+msgstr "El sitio de miniaturas %s"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:8
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:9
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:6
+msgid "À partir de"
+msgstr "Desde"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:659
+#: ../../application/modules/opac/controllers/AbonneController.php:691
+#: ../../application/modules/opac/controllers/AbonneController.php:751
+#: ../../application/modules/opac/controllers/AbonneController.php:749
+msgid "À partir de quelle heure ?"
+msgstr "A qué hora?"
+
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-location.phtml:5
+#: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-location.phtml:6
+msgid "À quel endroit ?"
+msgstr "¿Dónde?"
+
+#: ../../application/modules/admin/views/scripts/profil/menusindex.phtml:53
+msgid ""
+"Êtes vous sûr de vouloir dupliquer la configuration du menu horizontal à "
+"tous les autres profils ? Cela supprimera la configuration existante pour "
+"les autres profils"
+msgstr ""
+"¿Seguro que desea duplicar la configuración del menú horizontal en todos los "
+"otros perfiles? Esto eliminará la configuración existente para los otros "
+"perfiles"
+
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:74
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:93
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:94
+#: ../../library/ZendAfi/View/Helper/BoutonIco.php:55
+msgid "Êtes vous sûr de vouloir supprimer cet élément ?"
+msgstr "¿Seguro que quieres borrar este elemento?"
+
+#: ../../application/modules/telephone/views/scripts/abonne/cancel-hold.phtml:14
+msgid ""
+"Êtes-vous sur de vouloir supprimer votre réservation de <strong>%s</strong> ?"
+msgstr "¿Seguro que quieres eliminar la reserva <strong> %s </ strong>?"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:93
+msgid "Êtes-vous sûr de vouloir supprimer ce media ?"
+msgstr "¿Seguro que quieres borrar este medio?"
+
+#: ../../application/modules/admin/views/scripts/album/edit-images.phtml:92
+msgid "Êtes-vous sûr de vouloir supprimer ces %s medias ?"
+msgstr "¿Seguro que desea eliminar los medios de comunicación estos %s?"
+
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:59
+#: ../../library/ZendAfi/View/Helper/TagArticleInfo.php:77
+msgid "à"
+msgstr "a"
+
+#: ../../library/Class/Cms.php:617 ../../library/Class/Cms.php:545
+msgid "êtes vous sûr de vouloir supprimer cette catégorie ?"
+msgstr "¿Seguro que quieres eliminar esta categoría?"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:132
+msgid " au "
+msgstr " la"
+
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid " avec l'adresse suivante: "
+msgstr " con la siguiente dirección:"
+
+#: ../../library/Class/Autocomplete/IndexTitle.php:32
+msgid " de "
+msgstr " de"
+
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:57
+msgid " de %s à %s"
+msgstr " de %s hasta %s"
+
+#: ../../library/ZendAfi/View/Helper/TagArticleEvent.php:56
+msgid " à %s"
+msgstr "hasta %s"
+
+#: ../../application/modules/opac/views/scripts/auth/boite-login.phtml:9
+msgid "Abonnement expiré - Merci de contacter la médiathèque"
+msgstr ""
+"Suscripción caducado - Por favor, póngase en contacto con la biblioteca"
+
+#: ../../application/modules/admin/views/scripts/newsletter/edit-subscribers.phtml:1
+msgid "Abonnés de la lettre: %s"
+msgstr "Los seguidores de la carta: %s"
+
+#: ../../library/ZendAfi/View/Helper/TagNumeriquePremiumBook.php:31
+msgid "Accéder au document Numérique Premium"
+msgstr "Obtener el documento digital premium"
+
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:33
+msgid "Accéder au livre numérique"
+msgstr "Obtener el eBook"
+
+#: ../../library/ZendAfi/View/Helper/Admin/UserGroupMemberShip.php:72
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:164
+msgid "Ajouter les utilisateurs sélectionnés"
+msgstr "Agregar usuarios seleccionados"
+
+#: ../../application/modules/admin/controllers/CmsController.php:39
+msgid "Ajouter un article"
+msgstr "Añadir un artículo"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:37
+msgid "Ajouter un groupe d'utilisateurs"
+msgstr "Añadir un grupo de usuarios"
+
+#: ../../application/modules/admin/controllers/RssController.php:75
+msgid "Ajouter une catégorie de flux RSS"
+msgstr "Añadir Categoría RSS feed"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:37
+msgid "Ajouter une session"
+msgstr "Añadir una sesión de surf"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:148
+msgid "Annulée"
+msgstr "Cancelado"
+
+#: ../../application/modules/admin/controllers/CmsController.php:35
+msgid "Article \"%s\" sauvegardé"
+msgstr "El artículo \"%s\" salvos"
+
+#: ../../application/modules/admin/controllers/CmsController.php:37
+msgid "Article \"%s\" supprimé"
+msgstr "El artículo \"%s\" suprime"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:125
+msgid "Aucun champ personnalisé n'a été défini"
+msgstr "Sin campo personalizado se ha definido"
+
+#: ../../application/modules/admin/controllers/ModoController.php:81
+msgid "Avis rattaché à la notice \"%s\""
+msgstr "Aviso adjunto al registro \"%s\""
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:15
+msgid "Bibliothèque de destination"
+msgstr "Biblioteca Destino"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:89
+msgid "Bloc déplié"
+msgstr "Bloquear desdobló"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:90
+msgid "Bloc fermé"
+msgstr "Bloquear Cerrado"
+
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:27
+msgid "Boite"
+msgstr "Transmisión"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:106
+msgid "Catégorie de l'article"
+msgstr "Artículo categoría"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:10
+msgid ""
+"Celui-ci vous permet de vous connecter en temps qu'invité et de vous "
+"désincrire de la newsletter."
+msgstr ""
+"Esto le permite conectar como invitado y darse de baja de la newsletter."
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:37
+msgid "Champ personnalisé \"%s\" ajouté"
+msgstr "Campo personalizado \"%s\", agregado"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:36
+msgid "Champ personnalisé \"%s\" sauvegardé"
+msgstr "Campo personalizado \"%s\" guardado"
+
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:33
+msgid "Champ personnalisé %s ajouté"
+msgstr "Campo personalizado %s añadido"
+
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:32
+msgid "Champ personnalisé %s sauvegardé"
+msgstr "Campo personalizado %s salvos"
+
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:34
+msgid "Champ personnalisé %s supprimé"
+msgstr "Campo personalizado %s removido"
+
+#: ../../library/Class/CustomField/Meta.php:58
+msgid "Champ texte"
+msgstr "Campo de texto"
+
+#: ../../library/Class/CustomField/Meta.php:59
+msgid "Champ zone de texte"
+msgstr "Cuadro de texto Campo"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:42
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:38
+#: ../../library/ZendAfi/View/Helper/Admin/TagCustomFields.php:31
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:257
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsValuesUrl.php:43
+#: ../../library/ZendAfi/Form/Admin/News.php:214
+msgid "Champs personnalisés"
+msgstr "Los campos personalizados"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:128
+msgid "Champs personnalisés: %s \"%s\""
+msgstr "Campos personalizados: %s \"%s\""
+
+#: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:60
+msgid "Choisissez les formations à afficher"
+msgstr "Elegir cursos para mostrar"
+
+#: ../../library/ZendAfi/Form/ContactForm.php:40
+msgid "Choisissez votre bibliothèque"
+msgstr "Elige tu biblioteca"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:71
+msgid "Complet "
+msgstr "No hay vacantes"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:159
+msgid "Complet: maximum de personnes inscrites"
+msgstr "Registrantes máximas: Completo"
+
+#: ../../application/modules/opac/controllers/AuthController.php:347
+msgid "Confirmation d'inscription à la newsletter: "
+msgstr "La confirmación de la inscripción al boletín de noticias:"
+
+#: ../../application/modules/opac/controllers/AuthController.php:203
+msgid "Confirmez votre e-mail"
+msgstr "Confirme su dirección de correo electrónico"
+
+#: ../../application/modules/opac/controllers/AuthController.php:193
+msgid "Confirmez votre mot de passe"
+msgstr "Confirme su contraseña"
+
+#: ../../library/ZendAfi/Form/Admin/EditAvis.php:44
+msgid "Contenu de l'avis"
+msgstr "Contenido del aviso"
+
+#: ../../application/modules/admin/controllers/ModoController.php:767
+msgid "Contenu de l'avis modifié"
+msgstr "Contenido del aviso cambiaron"
+
+#: ../../library/ZendAfi/View/Helper/Notice/Analytics.php:71
+msgid "Contient"
+msgstr "Contiene"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:91
+msgid "Dans un onglet"
+msgstr "En una ficha"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:83
+msgid "Date de début"
+msgstr "Fecha de inicio"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:86
+msgid "Date de fin"
+msgstr "Fecha de finalización"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:80
+msgid "Date de limite d'inscription"
+msgstr "Fecha límite de inscripción"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:75
+msgid "Date de limite d'inscription dépassée"
+msgstr "Fecha límite de inscripción excedió"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:151
+msgid "Date de limite d'inscription dépassée: "
+msgstr "Fecha límite excedido en:"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:154
+msgid "Date de limite d'inscription: "
+msgstr "Fecha de la Fecha Límite de Inscripción:"
+
+#: ../../application/modules/opac/controllers/AuthController.php:284
+msgid "Demande d'inscription à la lettre d'information: "
+msgstr "Solicitud de inclusión en el boletín de noticias:"
+
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:49
+msgid "Descendre"
+msgstr "Baja"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:77
+msgid "Diaporama avec navigation"
+msgstr "Con la navegación de diapositivas"
+
+#: ../../application/modules/admin/controllers/CmsController.php:209
+msgid "Dupliquer l'article: %s"
+msgstr "Duplicar elemento: %s"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:44
+msgid "Dépouillements"
+msgstr "Recuentos"
+
+#: ../../application/modules/opac/controllers/AuthController.php:323
+msgid "Désinscription de la lettre d'information: "
+msgstr "Dejar de recibir el boletín de noticias:"
+
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:68
+msgid "Détails"
+msgstr "Detalles"
+
+#: ../../library/Class/WebService/SIGB/Koha/PatronInfoReader.php:37
+msgid "En attente"
+msgstr "En espera"
+
+#: ../../library/ZendAfi/Form/Admin/News.php:83
+msgid ""
+"Entrez la liste des mots-clefs et expressions qui caractérisent votre "
+"article séparés par ;"
+msgstr ""
+"Escriba una lista de palabras clave y frases que caracterizan a una sección "
+"separada;"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:28
+msgid "Entête"
+msgstr "Header"
+
+#: ../../library/ZendAfi/Form/Admin/EditAvis.php:40
+msgid "Entête de l'avis"
+msgstr "Revisión Headline"
+
+#: ../../application/modules/admin/controllers/ModoController.php:772
+msgid "Entête de l'avis modifié"
+msgstr "Titular de la notificación enmendada"
+
+#: ../../library/Class/Batch/SendNewsletters.php:35
+msgid "Envoie des newsletters"
+msgstr "Envía boletines"
+
+#: ../../application/modules/admin/views/scripts/newsletter/index.phtml:35
+msgid "Envoyer la lettre d'information ?"
+msgstr "Newsletter Email?"
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:40
+msgid "Erreur PHP"
+msgstr "Error de PHP"
+
+#: ../../application/modules/opac/controllers/AuthController.php:357
+msgid "Erreur lors de l\\inscription à la newsletter."
+msgstr "Error al \\ boletín de suscripción."
+
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:62
+msgid "Etes-vous sûr de vouloir supprimer ce champs ?"
+msgstr "¿Seguro que desea eliminar este campo?"
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:81
+msgid "Execution patch n° "
+msgstr "Número de parche de Ejecución"
+
+#: ../../library/Class/WebService/SIGB/Koha/PatronInfoReader.php:94
+msgid "Exemplaire mis de côté"
+msgstr "Ejemplar a la espera"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/LoanExport.php:31
+msgid "Export unimarc"
+msgstr "Exportación UNIMARC"
+
+#: ../../application/modules/admin/controllers/BatchController.php:55
+msgid "Exécution du traitement \"%s\""
+msgstr "Ejecute el \"%s\""
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:88
+msgid "Filtre sur les évènements"
+msgstr "Filtro de Eventos"
+
+#: ../../library/Class/CustomFieldsCategory.php:61
+#: ../../library/Class/CustomField/ModelConfiguration/Formation.php:26
+#: ../../library/ZendAfi/Form/Admin/Formation.php:40
+msgid "Formation"
+msgstr "Entrenamiento"
+
+#: ../../application/modules/admin/controllers/FormationController.php:32
+msgid "Formation \"%s\" sauvegardée"
+msgstr "Formación \"%s\" salvos"
+
+#: ../../application/modules/admin/controllers/FormationController.php:34
+msgid "Formation \"%s\" supprimée"
+msgstr "Formación \"%s\" suprimida"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:32
+msgid "Groupe \"%s\" sauvegardé"
+msgstr "Grupo \"%s\" guardado"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:34
+msgid "Groupe \"%s\" supprimé"
+msgstr "Grupo \"%s\" suprimido"
+
+#: ../../library/Class/CustomFieldsCategory.php:73
+#: ../../library/Class/CustomField/ModelConfiguration/UserGroup.php:26
+msgid "Groupe d'utilisateurs"
+msgstr "Grupo de usuarios"
+
+#: ../../application/modules/admin/views/scripts/accueil/menuvertical.phtml:45
+msgid "Html simplifié"
+msgstr "HTML simplificado"
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:44
+msgid "Ignorer l'erreur et continuer"
+msgstr "Ignorar el error y continuar"
+
+#: ../../library/Class/Batch/Typo3.php:25
+msgid "Import des TYPO3 depuis le site SQY"
+msgstr "Importar en el sitio web SQY TYPO3"
+
+#: ../../library/Class/Batch/AutocompleteRecordAuthor.php:25
+msgid "Indexer les auteurs de notice pour l'autocompletion"
+msgstr "Índice de los autores del documento para el autocompletado"
+
+#: ../../library/Class/Batch/IndexRessourcesNumeriques.php:5
+msgid "Indexer les ressources numériques"
+msgstr "Recursos digitales de indexación"
+
+#: ../../library/Class/Batch/AutocompleteRecordTitle.php:25
+msgid "Indexer les titres de notice pour l'autocompletion"
+msgstr "Manual de títulos indexados para autocompletar"
+
+#: ../../application/modules/admin/views/scripts/batch/run-ajax.phtml:2
+msgid "Initialisation du traitement"
+msgstr "El procesamiento de inicialización"
+
+#: ../../application/modules/opac/controllers/AuthController.php:267
+msgid "Inscription à la lettre d'information: "
+msgstr "Suscríbete al boletín:"
+
+#: ../../application/modules/opac/controllers/AuthController.php:350
+msgid "Inscription à la newsletter invalide."
+msgstr "Suscríbete a nuestro boletín deshabilitado."
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register.phtml:8
+msgid "J'ai déjà un compte."
+msgstr "Ya tengo una cuenta."
+
+#: ../../application/modules/admin/controllers/CmsController.php:36
+msgid "L'article \"%s\" a été sauvegardé"
+msgstr "El artículo \"%s\" se ha guardado"
+
+#: ../../library/ZendAfi/Form/Admin/News.php:73
+msgid "L'évenement dure toute la journée"
+msgstr "El evento dura todo el día"
+
+#: ../../application/modules/admin/views/scripts/cms/newsform.phtml:131
+msgid "L'évènement dure toute la journée"
+msgstr "El evento dura todo el día"
+
+#: ../../application/modules/admin/controllers/FormationController.php:33
+msgid "La formation \"%s\" a été sauvegardée"
+msgstr "Formación \"%s\" se ha guardado"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:33
+msgid "La session \"%s\" a été sauvegardée"
+msgstr "La sesión \"%s\" se ha guardado"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:84
+msgid "Le champ \"%s\" a bien été rattaché"
+msgstr "Campo \"%s\" se une con éxito"
+
+#: ../../library/Class/Users.php:826 ../../library/Class/Users.php:833
+msgid "Le champ 'Mot de passe' doit être inférieur à 255 caractères"
+msgstr "El campo 'Contraseña' debe tener menos de 255 caracteres"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:34
+msgid "Libellé du champ"
+msgstr "Etiqueta Campo"
+
+#: ../../library/Class/CustomField/Meta.php:60
+msgid "Liste d'options"
+msgstr "Lista de opciones"
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:63
+msgid "Mail suggestions"
+msgstr "Sugerencias por correo"
+
+#: ../../library/ZendAfi/Form/Admin/News.php:158
+msgid "Message d'explication du refus."
+msgstr "Mensaje que explica la negativa."
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:34
+msgid "Mise à niveau de la base de données"
+msgstr "Actualización de la base de datos"
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:78
+#: ../../library/Class/Migration/ScriptPatchs.php:60
+msgid "Mise à niveau de la base effectuée avec succès"
+msgstr "Actualización de la base completado con éxito"
+
+#: ../../application/modules/admin/controllers/CustomFieldsReportController.php:33
+msgid "Modification du rapport: %s"
+msgstr "Cambio de la relación de aspecto: %s"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:325
+msgid "Modifier l'avis \"%s\""
+msgstr "Modificar el aviso \"%s\""
+
+#: ../../application/modules/admin/controllers/FormationController.php:38
+msgid "Modifier la formation: %s"
+msgstr "Modificar la formación: %s"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:38
+msgid "Modifier la session: %s"
+msgstr "Edite la sesión: %s"
+
+#: ../../application/modules/admin/controllers/UsergroupController.php:38
+msgid "Modifier le groupe d'utilisateurs: %s"
+msgstr "Editar el grupo de usuarios: %s"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:41
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:37
+msgid "Modifier un champ personnalisé"
+msgstr "Edición de un campo personalizado"
+
+#: ../../application/modules/admin/controllers/RssController.php:90
+msgid "Modifier une catégorie de flux RSS"
+msgstr "Editar categoría RSS feed"
+
+#: ../../library/Class/Batch/RessourceNumerique.php:28
+msgid "Moissonner catalogue %s"
+msgstr "Catálogo Harvest %s"
+
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:43
+msgid "Monter"
+msgstr "Subir a"
+
+#: ../../library/ZendAfi/View/Helper/GetSendProgressJsonFor.php:25
+msgid "Newsletter inconnue"
+msgstr "Desconocido Newsletter"
+
+#: ../../library/ZendAfi/View/Helper/TagMigration.php:35
+msgid "Niveau de patch : "
+msgstr "Nivel programa:"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:105
+msgid "Nom de la bibliothèque"
+msgstr "Nombre de biblioteca"
+
+#: ../../library/ZendAfi/View/Helper/RenderSession.php:95
+msgid "Nombre de participants"
+msgstr "Número de participantes"
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:40
+#: ../../application/modules/admin/controllers/CustomFieldsMetaController.php:36
+msgid "Nouveau champ personnalisé"
+msgstr "Nuevo campo personalizado"
+
+#: ../../application/modules/admin/views/scripts/custom-fields-report/index.phtml:5
+#: ../../application/modules/admin/controllers/CustomFieldsReportController.php:32
+msgid "Nouveau rapport"
+msgstr "Nuevo Informe"
+
+#: ../../application/modules/admin/views/scripts/custom-fields-meta/index.phtml:11
+msgid "Nouveau type de champ "
+msgstr "Nuevo tipo de campo"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:118
+msgid "Numérique Premium"
+msgstr "Digitales de suscripción"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:62
+msgid "Onglets et blocs"
+msgstr "Pestañas y bloques"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:46
+msgid "Options pour le type \"liste d'options\""
+msgstr "Las opciones para el tipo \"lista de opciones\""
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:68
+msgid "Ordre"
+msgstr "Orden"
+
+#: ../../library/ZendAfi/View/Helper/RenderSessions.php:57
+msgid "Pas de session programmée"
+msgstr "Ninguna sesión programada"
+
+#: ../../library/ZendAfi/View/Helper/AlbumAudioJsPlayer.php:91
+msgid "Piste précédente"
+msgstr "Pista anterior"
+
+#: ../../library/ZendAfi/View/Helper/AlbumAudioJsPlayer.php:93
+msgid "Piste suivante"
+msgstr "Pista siguiente"
+
+#: ../../library/Class/Users.php:887 ../../library/Class/Users.php:894
+msgid "Pour activer votre compte, merci de cliquer sur le lien suivant:"
+msgstr "Para activar su cuenta, gracias a hacer clic en el siguiente enlace:"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:19
+msgid "Pour valider l'abonnement, merci de cliquer sur le lien suivant:"
+msgstr ""
+"Para validar la suscripción, gracias a hacer clic en el siguiente enlace:"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:33
+msgid ""
+"Pour vous désinscrire de la lettre d'information, merci de cliquer sur le "
+"lien suivant:"
+msgstr ""
+"Para darse de baja del boletín de noticias, gracias a hacer clic en el "
+"siguiente enlace:"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:11
+msgid "Propriétés d'affichage des notices"
+msgstr "Visualizar registros Inmuebles"
+
+#: ../../application/modules/admin/views/scripts/pagination.phtml:6
+#: ../../application/modules/admin/views/scripts/pagination.phtml:8
+msgid "Précédent"
+msgstr "Anterior"
+
+#: ../../application/modules/admin/controllers/CustomFieldsReportController.php:29
+msgid "Rapport %s modifié"
+msgstr "Informe %s cambiado"
+
+#: ../../application/modules/admin/controllers/CustomFieldsReportController.php:34
+msgid "Rapports"
+msgstr "Relaciones"
+
+#: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:261
+msgid "Rapports statistiques"
+msgstr "Informes estadísticos"
+
+#: ../../application/modules/admin/views/scripts/custom-fields/add.phtml:2
+msgid "Rattacher un champ existant"
+msgstr "Adjuntar un campo existente"
+
+#: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsCategories.php:37
+msgid "Rattacher un champ personnalisé"
+msgstr "Adjuntar un campo personalizado"
+
+#: ../../library/Class/Batch/PanierNotice.php:25
+msgid "Recherche les notices perdues des paniers"
+msgstr "Buscar registros perdidos"
+
+#: ../../library/ZendAfi/View/Helper/Admin/SubscribeUsers.php:159
+msgid "Rechercher des utilisateurs"
+msgstr "Encontrar Usuarios"
+
+#: ../../library/ZendAfi/View/Helper/Admin/UserGroupMemberShip.php:67
+msgid "Rechercher des utilisateurs "
+msgstr "Encontrar Usuarios"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/RetourFiche.php:25
+msgid "Retour à mon compte"
+msgstr "Volver a mi cuenta"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:66
+msgid "Rubrique"
+msgstr "Rúbrica"
+
+#: ../../library/Class/Batch/AvisNotice.php:25
+msgid "Réaffecte les avis perdus des abonnés"
+msgstr "Reasigna de opinión perdido suscriptores"
+
+#: ../../library/Class/Batch/PanierUser.php:25
+msgid "Réaffecte les paniers perdus des abonnés"
+msgstr "Reasigna perdido suscriptores cestas"
+
+#: ../../library/ZendAfi/View/Helper/Notice/LienReserver.php:28
+msgid "Réserver %s"
+msgstr "Book %s"
+
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:39
+#: ../../library/ZendAfi/Form/Admin/News.php:108
+msgid "Résumé pour l'affichage dans les boîtes"
+msgstr "Resumen para la exhibición en cajas"
+
+#: ../../library/ZendAfi/Controller/Plugin/CustomFields.php:33
+msgid "Session"
+msgstr "Sesión"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:32
+msgid "Session \"%s\" sauvegardée"
+msgstr "Sesión \"%s\" salvos"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:34
+msgid "Session \"%s\" supprimée"
+msgstr "Sesión \"%s\" suprime"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:51
+msgid "Sous-zone de titre"
+msgstr "Título de la Subárea"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:55
+msgid "Sous-zones d'auteurs<br>(séparées par des \";\")"
+msgstr "Subcampos autores: (separados por \";\")"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:67
+msgid "Style"
+msgstr "Estilo"
+
+#: ../../application/modules/admin/views/scripts/pagination.phtml:22
+#: ../../application/modules/admin/views/scripts/pagination.phtml:24
+msgid "Suivant"
+msgstr "Siguiente"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:107
+msgid "Titre seulement"
+msgstr "Sólo Título"
+
+#: ../../application/modules/admin/views/scripts/cms/_traduction_navigator.phtml:3
+msgid "Traductions:"
+msgstr "Traducciones:"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:40
+msgid "Type de champ"
+msgstr "Tipo de campo"
+
+#: ../../library/Class/SuggestionAchat.php:75
+msgid "Type de document requis"
+msgstr "Tipo de documento requerido"
+
+#: ../../application/modules/admin/views/scripts/custom-fields/index.phtml:4
+msgid "Types de champs personnalisés"
+msgstr "Tipos de campos personalizados"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:7
+msgid "Un compte vous a été créé automatiquement."
+msgstr "Una cuenta se ha creado automáticamente."
+
+#: ../../application/modules/opac/controllers/AuthController.php:277
+msgid ""
+"Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le "
+"compte qui utilise cet email."
+msgstr ""
+"Un usuario ya ha llenado este email. Gracias te identificas con la cuenta "
+"mediante este correo electrónico."
+
+#: ../../application/modules/opac/controllers/AuthController.php:305
+msgid ""
+"Une demande de confirmation d'inscription vous a été envoyée à l'adresse "
+"mail renseignée."
+msgstr ""
+"Una confirmación de la inscripción se enviará a la dirección de correo "
+"electrónico lleno."
+
+#: ../../application/modules/opac/controllers/AuthController.php:301
+msgid ""
+"Une erreur est survenue à l'envoi du mail de confirmation. Veuillez "
+"réessayer. Si le problème persiste, veuillez contacter votre médiathèque."
+msgstr ""
+"Se produjo un error en el envío del correo electrónico de confirmación. Por "
+"favor, inténtelo de nuevo. Si el problema persiste, póngase en contacto con "
+"su biblioteca."
+
+#: ../../application/modules/admin/controllers/CustomFieldsController.php:120
+msgid "Valeurs des champs personnalisés sauvegardées"
+msgstr "Valores de campo personalizado guardado"
+
+#: ../../library/Class/Systeme/ModulesMenu/LeKiosk.php:48
+msgid ""
+"Votre abonnement ne permet pas d'accéder aux ressources LeKiosk. Merci de "
+"contacter la médiathèque"
+msgstr ""
+"Su suscripción no incluye el acceso a los recursos LeKiosk. Gracias al "
+"contacto con la biblioteca"
+
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:29
+msgid "Votre adresse e-mail"
+msgstr "Su dirección de correo electrónico"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:13
+msgid "Votre identifiant: "
+msgstr "Su nombre de usuario:"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:16
+msgid "Votre mot de passe: "
+msgstr "Contraseña:"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:542
+#: ../../application/modules/opac/controllers/RechercheController.php:544
+msgid ""
+"Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
+"%s sera disponible"
+msgstr ""
+"Se registra la reserva. <br> Te avisaremos cuando el documento %s disponible"
+
+#: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:542
+msgid ""
+"Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
+"%s sera disponible pour être retiré à : %s"
+msgstr ""
+"Su reserva se registra <br> Nosotros le notificaremos cuando el documento %s "
+"estará disponible para ser retirado: %s."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:287
+#: ../../application/modules/opac/controllers/AbonneController.php:294
+#: ../../application/modules/opac/controllers/AbonneController.php:300
+#: ../../application/modules/opac/controllers/AbonneController.php:326
+#: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:27
+msgid "Vous avez %d panier"
+msgstr "Tienes %d cesta"
+
+#: ../../library/ZendAfi/View/Helper/Abonne/Paniers.php:28
+msgid "Vous avez %d paniers"
+msgstr "Tienes %d cestas"
+
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid "Vous avez bien été abonné à la newsletter: "
+msgstr "Ha sido suscrito a la newsletter:"
+
+#: ../../library/Class/Users.php:886 ../../library/Class/Users.php:893
+msgid "Vous avez fait une demande d'inscription sur le portail:"
+msgstr "Usted ha hecho una solicitud de registro en el portal:"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:4
+msgid "Vous avez fait une demande d'inscription à la lettre d'information:"
+msgstr "Usted ha hecho una solicitud de inclusión en el boletín de noticias:"
+
+#: ../../application/modules/opac/views/scripts/cas-server-v10/logout.phtml:1
+msgid "Vous avez été déconnecté"
+msgstr "Ha sido desconectado"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:3
+msgid "Vous devez vous identifier pour vous désinscrire de la newsletter: "
+msgstr "Ingresa para darse de baja del boletín de noticias:"
+
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au livre numérique"
+msgstr ""
+"Debe iniciar sesión en una cuenta con una suscripción válida para acceder al "
+"libro electrónico"
+
+#: ../../library/ZendAfi/View/Helper/TagNumeriquePremiumBook.php:27
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder à ce document"
+msgstr ""
+"Debe iniciar sesión en una cuenta con una suscripción válida para acceder a "
+"este documento"
+
+#: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:47
+msgid "Zone"
+msgstr "Area"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:93
+msgid "aucun"
+msgstr "no"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:53
+msgid "champ texte"
+msgstr "campo de texto"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:54
+msgid "champ zone de texte"
+msgstr "cuadro de texto de campo"
+
+#: ../../library/ZendAfi/View/Helper/GetSendProgressJsonFor.php:36
+msgid "en cours"
+msgstr "en curso"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:55
+msgid "liste d'options"
+msgstr "lista de opciones"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:74
+msgid "mode liste simple"
+msgstr "manera simple lista"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:76
+msgid "mode mur"
+msgstr "Moda pared"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:75
+msgid "mode résumé d'article"
+msgstr "artículo de moda resumen"
+
+#: ../../library/ZendAfi/Form/Admin/CustomFields.php:48
+msgid "option 1; option 2; option 3"
+msgstr "opción 1; opción 2; Opción 3"
+
+#: ../../application/modules/admin/views/scripts/custom-fields/add.phtml:9
+msgid "ou créer un nouveau champ"
+msgstr "o crear un nuevo campo"
+
+#: ../../application/modules/admin/views/scripts/accueil/calendrier.phtml:94
+msgid "par mois"
+msgstr "mes"
diff --git a/library/translation/fr.mo b/library/translation/fr.mo
index 0891be398303a66bae6664a4015cc6219cfb4243..0e89b1be99ff3ce0f0ce5199c20c1745f0cef777 100644
Binary files a/library/translation/fr.mo and b/library/translation/fr.mo differ
diff --git a/library/translation/fr.po b/library/translation/fr.po
index e82956d0e0f793ff0287a04756a0400467af975f..5ca1a9c3792e0e282d4cd50ddbec8cfb16ff9c09 100644
--- a/library/translation/fr.po
+++ b/library/translation/fr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-11 14:22+0200\n"
+"POT-Creation-Date: 2014-10-02 16:13+0200\n"
 "PO-Revision-Date: 2011-03-16 10:45+0100\n"
 "Last-Translator: Laurent Laffont <llaffont@afi-sa.fr>\n"
 "Language-Team: French\n"
@@ -36,6 +36,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/CmsController.php:48
 #: ../../application/modules/admin/controllers/UsergroupController.php:28
 #: ../../application/modules/admin/controllers/UsergroupController.php:48
+#: ../../application/modules/admin/controllers/CmsController.php:64
 msgid " Ajouter une catégorie"
 msgstr ""
 
@@ -79,6 +80,10 @@ msgstr ""
 msgid " aux lettres d'information: "
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid " avec l'adresse suivante: "
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:343
 #: ../../application/modules/opac/controllers/RechercheController.php:363
 #: ../../application/modules/opac/controllers/RechercheController.php:382
@@ -148,16 +153,19 @@ msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:451
 #: ../../application/modules/opac/controllers/AbonneController.php:511
+#: ../../application/modules/opac/controllers/AbonneController.php:516
 msgid " par E-Mail"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:452
 #: ../../application/modules/opac/controllers/AbonneController.php:512
+#: ../../application/modules/opac/controllers/AbonneController.php:517
 msgid " par SMS"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:450
 #: ../../application/modules/opac/controllers/AbonneController.php:510
+#: ../../application/modules/opac/controllers/AbonneController.php:515
 msgid " par courrier postal"
 msgstr ""
 
@@ -415,6 +423,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:556
 #: ../../application/modules/admin/controllers/BibController.php:553
 #: ../../application/modules/admin/controllers/BibController.php:493
+#: ../../application/modules/admin/controllers/BibController.php:498
 msgid "** nouveau plan **"
 msgstr ""
 
@@ -447,6 +456,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:445
 #: ../../application/modules/admin/controllers/BibController.php:442
 #: ../../application/modules/admin/controllers/BibController.php:401
+#: ../../application/modules/admin/controllers/BibController.php:406
 msgid "** nouvelle localisation **"
 msgstr ""
 
@@ -612,6 +622,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:410
 #: ../../application/modules/opac/controllers/AbonneController.php:460
 #: ../../application/modules/opac/controllers/AbonneController.php:520
+#: ../../application/modules/opac/controllers/AbonneController.php:525
 msgid "Abonnement aux lettres d'information"
 msgstr ""
 
@@ -658,6 +669,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/ComboProfils.php:114
 #: ../../library/Class/MoteurRecherche.php:415
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
 msgid "Accueil"
 msgstr ""
 
@@ -687,6 +699,10 @@ msgstr ""
 msgid "Accéder au document Numérique Premium"
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:33
+msgid "Accéder au livre numérique"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/users/index.phtml:19
 #: ../../application/modules/admin/views/scripts/users/index.phtml:21
 msgid "Action"
@@ -747,6 +763,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:94
 #: ../../application/modules/opac/controllers/IndexController.php:93
 #: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../application/modules/opac/controllers/AbonneController.php:441
+#: ../../library/ZendAfi/Form/ContactForm.php:67
 msgid "Adresse"
 msgstr ""
 
@@ -757,6 +775,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:122
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
 msgid "Adresse URL"
 msgstr ""
 
@@ -921,6 +940,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:112
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:108
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:103
+#: ../../library/ZendAfi/Form/Admin/News.php:62
 msgid "Agenda"
 msgstr ""
 
@@ -1014,6 +1034,10 @@ msgstr ""
 msgid "Ajouter les utilisateurs sélectionnés"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/CmsController.php:39
+msgid "Ajouter un article"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:4
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:5
 msgid "Ajouter un catalogue"
@@ -1046,6 +1070,7 @@ msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:76
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:81
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:78
 msgid "Ajouter un nouvel article"
 msgstr ""
 
@@ -1058,6 +1083,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:566
 #: ../../application/modules/admin/controllers/BibController.php:563
 #: ../../application/modules/admin/controllers/BibController.php:504
+#: ../../application/modules/admin/controllers/BibController.php:509
 #, php-format
 msgid "Ajouter un plan de la bibliothèque: %s"
 msgstr ""
@@ -1109,6 +1135,7 @@ msgid "Ajouter une collection"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/formation/index.phtml:5
+#: ../../application/modules/admin/controllers/FormationController.php:37
 msgid "Ajouter une formation"
 msgstr ""
 
@@ -1128,6 +1155,10 @@ msgstr ""
 msgid "Ajouter une relation"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:37
+msgid "Ajouter une session"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/batch/index.phtml:4
 msgid "Ajouter une tâche"
 msgstr ""
@@ -1184,6 +1215,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:102
 #: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:141
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
 msgid "Annexe"
 msgstr ""
 
@@ -1265,6 +1297,8 @@ msgid "Aout"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:42
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:16
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:32
 msgid "Août"
 msgstr ""
 
@@ -1316,9 +1350,21 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:152
 #: ../../library/Class/CustomFieldsCategory.php:85
 #: ../../library/Class/CustomField/ModelConfiguration/Article.php:26
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:35
+#: ../../library/ZendAfi/Form/Admin/News.php:105
 msgid "Article"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/CmsController.php:35
+#, php-format
+msgid "Article \"%s\" sauvegardé"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:37
+#, php-format
+msgid "Article \"%s\" supprimé"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:24
 #: ../../library/Class/NoticeHtml.php:222
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:24
@@ -1353,6 +1399,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:76
 #: ../../application/modules/admin/controllers/CmsController.php:259
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:77
+#: ../../application/modules/admin/controllers/CmsController.php:247
+#: ../../library/ZendAfi/Form/Admin/News.php:185
 msgid "Aucun"
 msgstr ""
 
@@ -1387,6 +1435,7 @@ msgstr ""
 #: ../../library/Class/NoticeHtml.php:742
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:90
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:86
 msgid "Aucun avis pour le moment"
 msgstr ""
 
@@ -1411,6 +1460,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/ModoController.php:679
 #: ../../application/modules/admin/controllers/ModoController.php:747
 #: ../../application/modules/opac/controllers/AbonneController.php:896
+#: ../../application/modules/opac/controllers/AbonneController.php:901
 msgid "Aucun courriel envoyé, erreur: "
 msgstr ""
 
@@ -1521,6 +1571,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:233
 #: ../../application/modules/opac/controllers/RssController.php:252
 #: ../../application/modules/opac/controllers/RssController.php:248
+#: ../../application/modules/opac/controllers/RssController.php:249
 msgid "Aucune donnée à modérer"
 msgstr ""
 
@@ -1579,6 +1630,7 @@ msgid "Aucune réservation"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:4
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:6
 msgid "Aucune suggestion à modérer"
 msgstr ""
 
@@ -1640,6 +1692,10 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:48
 #: ../../library/Class/CriteresRecherche.php:107
 #: ../../library/Class/NoticeHtml.php:88
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:12
+#: ../../library/ZendAfi/Form/Admin/News.php:46
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/Class/SuggestionAchat.php:95
 msgid "Auteur"
 msgstr ""
 
@@ -1704,6 +1760,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:199
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:177
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:193
+#: ../../library/ZendAfi/Form/Admin/News.php:87
 msgid "Autoriser les commentaires d'internautes (Mode blog) ?"
 msgstr ""
 
@@ -1781,6 +1838,8 @@ msgid "Avr."
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:38
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:12
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:28
 msgid "Avril"
 msgstr ""
 
@@ -1882,6 +1941,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
 #: ../../application/modules/opac/views/scripts/abonne/prets.phtml:23
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:14
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
 msgid "Bibliothèque"
 msgstr ""
 
@@ -1889,6 +1950,10 @@ msgstr ""
 msgid "Bibliothèque : "
 msgstr ""
 
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:15
+msgid "Bibliothèque de destination"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:29
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:71
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
@@ -1984,6 +2049,10 @@ msgstr ""
 msgid "Bloc fermé"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:27
+msgid "Boite"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:117
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:126
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:173
@@ -2012,6 +2081,8 @@ msgstr ""
 #: ../../library/Class/Users.php:446 ../../library/Class/Users.php:592
 #: ../../library/Class/Users.php:659 ../../library/Class/Users.php:747
 #: ../../library/Class/Users.php:870 ../../library/Class/Users.php:885
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:1
+#: ../../library/Class/Users.php:892
 msgid "Bonjour,"
 msgstr ""
 
@@ -2020,6 +2091,7 @@ msgstr ""
 #: ../../library/Class/Users.php:510 ../../library/Class/Users.php:659
 #: ../../library/Class/Users.php:726 ../../library/Class/Users.php:814
 #: ../../library/Class/Users.php:927 ../../library/Class/Users.php:943
+#: ../../library/Class/Users.php:950
 msgid "Bonne navigation sur le portail"
 msgstr ""
 
@@ -2107,6 +2179,7 @@ msgstr ""
 #: ../../library/Class/Calendar.php:176
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:12
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:51
+#: ../../library/ZendAfi/Form/Admin/News.php:49
 msgid "Catégorie"
 msgstr ""
 
@@ -2130,6 +2203,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:639
 #: ../../application/modules/opac/controllers/AbonneController.php:671
 #: ../../application/modules/opac/controllers/AbonneController.php:731
+#: ../../application/modules/opac/controllers/AbonneController.php:736
 msgid "Ce créneau n'est pas dans les heures d'ouverture."
 msgstr ""
 
@@ -2166,6 +2240,12 @@ msgstr ""
 msgid "Ceci apparaîtra sous le nom de votre site dans les moteurs de recherche"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:10
+msgid ""
+"Celui-ci vous permet de vous connecter en temps qu'invité et de vous "
+"désincrire de la newsletter."
+msgstr ""
+
 #: ../../library/Class/Codification.php:102
 #: ../../library/Class/Codification.php:104
 #: ../../library/Class/Codification.php:105
@@ -2208,6 +2288,7 @@ msgstr ""
 #: ../../library/Class/Users.php:409 ../../library/Class/Users.php:556
 #: ../../library/Class/Users.php:623 ../../library/Class/Users.php:711
 #: ../../library/Class/Users.php:833 ../../library/Class/Users.php:868
+#: ../../library/Class/Users.php:875
 msgid "Cet identifiant existe déjà."
 msgstr ""
 
@@ -2283,6 +2364,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Admin/TagCustomFields.php:31
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:257
 #: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsValuesUrl.php:43
+#: ../../library/ZendAfi/Form/Admin/News.php:214
 msgid "Champs personnalisés"
 msgstr ""
 
@@ -2351,6 +2433,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:664
 #: ../../application/modules/opac/controllers/AbonneController.php:696
 #: ../../application/modules/opac/controllers/AbonneController.php:756
+#: ../../application/modules/opac/controllers/AbonneController.php:761
 msgid "Choisir"
 msgstr ""
 
@@ -2360,6 +2443,7 @@ msgid "Choisir des medias"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:63
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:61
 msgid "Choisissez le domaine de départ"
 msgstr ""
 
@@ -2367,6 +2451,10 @@ msgstr ""
 msgid "Choisissez les formations à afficher"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/ContactForm.php:40
+msgid "Choisissez votre bibliothèque"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:3
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:26
 msgid "Clef"
@@ -2419,11 +2507,14 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:97
 #: ../../application/modules/opac/controllers/IndexController.php:96
 #: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../application/modules/opac/controllers/AbonneController.php:442
+#: ../../library/ZendAfi/Form/ContactForm.php:69
 msgid "Code postal"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:42
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:44
 msgid "Code-barres / ISBN"
 msgstr ""
 
@@ -2476,6 +2567,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:98
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
 msgid "Comment se procurer ce document "
 msgstr ""
 
@@ -2492,6 +2584,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:356
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
 #: ../../library/Class/SuggestionAchat.php:81
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:34
+#: ../../library/Class/SuggestionAchat.php:102
 msgid "Commentaire"
 msgstr ""
 
@@ -2505,6 +2599,7 @@ msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:42
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:45
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:48
 msgid "Complet"
 msgstr ""
 
@@ -2519,6 +2614,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:41
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:44
 msgid "Compte"
 msgstr ""
 
@@ -2529,12 +2626,14 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:114
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:113
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
 msgid "Configuration"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/ProfilController.php:539
 #: ../../application/modules/admin/controllers/ProfilController.php:550
 #: ../../application/modules/admin/controllers/ProfilController.php:552
+#: ../../application/modules/admin/controllers/ProfilController.php:551
 msgid "Configuration des pages appliquée à tous les autres profils."
 msgstr ""
 
@@ -2546,9 +2645,14 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:745
 #: ../../application/modules/opac/controllers/AbonneController.php:777
 #: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../application/modules/opac/controllers/AbonneController.php:842
 msgid "Confirmation"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:347
+msgid "Confirmation d'inscription à la newsletter: "
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:45
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:13
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:64
@@ -2573,6 +2677,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:395
 #: ../../application/modules/opac/controllers/AbonneController.php:414
 #: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:479
 msgid "Confirmez le mot de passe"
 msgstr ""
 
@@ -2587,6 +2692,7 @@ msgstr "Entrez votre identité S.V.P."
 
 #: ../../application/modules/opac/controllers/AuthController.php:86
 #: ../../application/modules/opac/controllers/AuthController.php:89
+#: ../../application/modules/telephone/controllers/AuthController.php:43
 msgid "Connexion"
 msgstr ""
 
@@ -2754,6 +2860,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:258
 #: ../../application/modules/opac/controllers/RssController.php:277
 #: ../../application/modules/opac/controllers/RssController.php:266
+#: ../../application/modules/opac/controllers/RssController.php:268
 #, php-format
 msgid "Critiques de la sélection: %s"
 msgstr ""
@@ -2927,6 +3034,10 @@ msgstr ""
 msgid "De B à A"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:284
+msgid "Demande d'inscription à la lettre d'information: "
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:5
 msgid "Demande de réservation d'un document du réseau:"
 msgstr ""
@@ -2962,6 +3073,7 @@ msgid "Demandes d'inscription"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:78
+#: ../../library/Class/SuggestionAchat.php:99
 msgid "Demandeur"
 msgstr ""
 
@@ -2971,6 +3083,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/CmsController.php:154
 #: ../../application/modules/opac/controllers/CmsController.php:170
 #: ../../application/modules/opac/controllers/CmsController.php:171
+#: ../../application/modules/opac/controllers/CmsController.php:172
 msgid "Derniers Articles"
 msgstr ""
 
@@ -3047,6 +3160,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:44
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:38
 #: ../../library/ZendAfi/Form/Album.php:52
+#: ../../library/ZendAfi/Form/Admin/Formation.php:35
 msgid "Description"
 msgstr ""
 
@@ -3217,6 +3331,7 @@ msgstr ""
 #: ../../library/Class/NoticeHtml.php:819
 #: ../../library/Class/NoticeHtml.php:691
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:40
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:114
 msgid "Donnez ou modifiez votre avis"
 msgstr ""
 
@@ -3259,6 +3374,11 @@ msgstr ""
 msgid "Dupliquer l'article: "
 msgstr ""
 
+#: ../../application/modules/admin/controllers/CmsController.php:209
+#, php-format
+msgid "Dupliquer l'article: %s"
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:9
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:10
@@ -3292,6 +3412,7 @@ msgid "Début matinée"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:46
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:20
 msgid "Déc"
 msgstr ""
 
@@ -3299,6 +3420,10 @@ msgstr ""
 msgid "Déc."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:36
+msgid "Décembre"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/LieuController.php:29
 #: ../../application/modules/admin/views/scripts/lieu/index.phtml:4
 msgid "Déclarer un nouveau lieu"
@@ -3323,9 +3448,16 @@ msgstr ""
 msgid "Dépouillements"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:323
+msgid "Désinscription de la lettre d'information: "
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/error/404.phtml:4
 #: ../../application/modules/opac/controllers/CmsController.php:124
 #: ../../application/modules/opac/controllers/CmsController.php:125
+#: ../../application/modules/opac/controllers/CmsController.php:121
+#: ../../application/modules/opac/controllers/CmsController.php:126
+#: ../../application/modules/telephone/views/scripts/error/404.phtml:4
 msgid "Désolé, cette page n'existe pas"
 msgstr ""
 
@@ -3347,6 +3479,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:379
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../application/modules/opac/controllers/AbonneController.php:444
+#: ../../library/Class/SuggestionAchat.php:100
 msgid "E-Mail"
 msgstr ""
 
@@ -3361,6 +3495,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:105
 #: ../../application/modules/opac/controllers/IndexController.php:104
 #: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../library/ZendAfi/Form/ContactForm.php:75
 msgid "E-mail"
 msgstr ""
 
@@ -3515,6 +3650,12 @@ msgid ""
 "séparés par des virgules."
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/News.php:83
+msgid ""
+"Entrez la liste des mots-clefs et expressions qui caractérisent votre "
+"article séparés par ;"
+msgstr ""
+
 #: ../../application/modules/opac/controllers/AuthController.php:30
 #: ../../application/modules/opac/controllers/AuthController.php:48
 #: ../../application/modules/opac/controllers/AuthController.php:68
@@ -3538,6 +3679,7 @@ msgid "Entrez votre mot de passe S.V.P."
 msgstr "Entrez votre identité S.V.P."
 
 #: ../../application/modules/admin/controllers/AuthController.php:39
+#: ../../application/modules/admin/controllers/AuthController.php:49
 msgid "Entrez votre nom d'utilisateur puis validez S.V.P."
 msgstr ""
 
@@ -3561,7 +3703,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:46 ../../library/Class/Bib.php:47
 #: ../../library/Class/Bib.php:78 ../../library/Class/Bib.php:97
 #: ../../library/Class/Bib.php:117 ../../library/Class/Bib.php:128
-#: ../../library/Class/Bib.php:148
+#: ../../library/Class/Bib.php:148 ../../library/Class/Bib.php:168
 msgid "Envoie des données"
 msgstr ""
 
@@ -3573,6 +3715,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:58
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:72
 msgid "Envoyer"
 msgstr ""
 
@@ -3601,6 +3744,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:40
 #: ../../application/modules/opac/controllers/RssController.php:45
 #: ../../application/modules/opac/controllers/RssController.php:64
+#: ../../application/modules/opac/controllers/AbonneController.php:399
 msgid "Erreur"
 msgstr ""
 
@@ -3627,6 +3771,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/UploadController.php:78
 #: ../../application/modules/admin/controllers/BibController.php:326
 #: ../../application/modules/admin/controllers/BibController.php:298
+#: ../../application/modules/admin/controllers/BibController.php:303
 msgid ""
 "Erreur au téléchargement du fichier : L'image que vous essayez de "
 "télécharger est trop volumineuse ou inaccessible."
@@ -3657,6 +3802,10 @@ msgstr ""
 msgid "Erreur lors de l'enregistrement de la vignette"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:357
+msgid "Erreur lors de l\\inscription à la newsletter."
+msgstr ""
+
 #: ../../library/Class/AlbumRessource.php:278
 #: ../../library/Class/AlbumRessource.php:318
 #: ../../library/Class/AlbumRessource.php:327
@@ -3867,6 +4016,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:7
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:8
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:45
 msgid "Fermer"
 msgstr ""
 
@@ -3902,6 +4052,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:321
 #: ../../application/modules/admin/controllers/BibController.php:291
+#: ../../application/modules/admin/controllers/BibController.php:296
 #, php-format
 msgid "Fichier photo : %s"
 msgstr ""
@@ -3949,6 +4100,14 @@ msgstr ""
 msgid "Filtrer par statut : "
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:46
+msgid "Filtres activés"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:47
+msgid "Filtres disponibles"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
 msgid "Fin"
 msgstr ""
@@ -3967,25 +4126,39 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:94
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
 msgid "Fonds"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:67
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:91
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:64
 msgid "Format"
 msgstr ""
 
 #: ../../library/Class/CustomFieldsCategory.php:61
 #: ../../library/Class/CustomField/ModelConfiguration/Formation.php:26
+#: ../../library/ZendAfi/Form/Admin/Formation.php:40
 msgid "Formation"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/FormationController.php:32
+#, php-format
+msgid "Formation \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:34
+#, php-format
+msgid "Formation \"%s\" supprimée"
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/abonne/formations.phtml:2
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
 #: ../../application/modules/admin/controllers/FormationController.php:38
+#: ../../application/modules/admin/controllers/FormationController.php:60
 msgid "Formations"
 msgstr ""
 
@@ -4018,6 +4191,7 @@ msgid "Formulaires"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:36
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:10
 msgid "Fév"
 msgstr ""
 
@@ -4025,6 +4199,10 @@ msgstr ""
 msgid "Fév."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:26
+msgid "Février"
+msgstr ""
+
 #: ../../library/Class/Codification.php:103
 #: ../../library/Class/MoteurRecherche.php:349
 #: ../../library/Class/Codification.php:105
@@ -4104,6 +4282,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:41
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:18
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:32
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:33
 msgid "Généralités"
 msgstr ""
 
@@ -4160,6 +4339,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:94
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:31
 msgid "Hauteur"
 msgstr ""
 
@@ -4169,6 +4349,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:106
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:109
 msgid "Horaire"
 msgstr ""
 
@@ -4180,6 +4361,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:774
 #: ../../application/modules/opac/controllers/AbonneController.php:834
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:89
+#: ../../application/modules/opac/controllers/AbonneController.php:839
 msgid "Horaires"
 msgstr ""
 
@@ -4194,6 +4376,8 @@ msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:76
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:97
 msgid "ISBN"
 msgstr ""
 
@@ -4262,6 +4446,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:180
 #: ../../application/modules/opac/controllers/AbonneController.php:183
 #: ../../application/modules/opac/controllers/AbonneController.php:184
+#: ../../application/modules/opac/controllers/AbonneController.php:182
 msgid "Il faut compléter tous les champs."
 msgstr ""
 
@@ -4377,6 +4562,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:43
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:218
+#: ../../library/ZendAfi/Form/Admin/News.php:222
 msgid "Indexation"
 msgstr ""
 
@@ -4389,6 +4575,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:209
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:187
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:203
+#: ../../library/ZendAfi/Form/Admin/News.php:89
 msgid "Indexer l'article dans le catalogue ?"
 msgstr ""
 
@@ -4428,6 +4615,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:82
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:81
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 msgid "Information"
 msgstr ""
 
@@ -4440,6 +4628,7 @@ msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:52
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:50
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:66
 msgid "Informations sur le document"
 msgstr ""
 
@@ -4462,9 +4651,18 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:86
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:69
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
 msgid "Inscription"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:267
+msgid "Inscription à la lettre d'information: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:350
+msgid "Inscription à la newsletter invalide."
+msgstr ""
+
 #: ../../application/modules/admin/controllers/FormationController.php:333
 #: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:62
 msgid "Inscrire les stagiaires sélectionnés"
@@ -4482,6 +4680,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:126
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:129
 msgid "Interdire les réservations"
 msgstr ""
 
@@ -4497,7 +4696,7 @@ msgstr "Type de donnée non valide : chaîne attendue"
 #: ../../library/Class/Bib.php:44 ../../library/Class/Bib.php:45
 #: ../../library/Class/Bib.php:76 ../../library/Class/Bib.php:95
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:126
-#: ../../library/Class/Bib.php:146
+#: ../../library/Class/Bib.php:146 ../../library/Class/Bib.php:166
 msgid "Invisible"
 msgstr ""
 
@@ -4505,7 +4704,12 @@ msgstr ""
 msgid "Isbn"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register.phtml:8
+msgid "J'ai déjà un compte."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:35
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:9
 msgid "Jan"
 msgstr ""
 
@@ -4513,6 +4717,10 @@ msgstr ""
 msgid "Janv."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:25
+msgid "Janvier"
+msgstr ""
+
 #: ../../application/modules/telephone/views/scripts/recherche/grandeimage.phtml:2
 msgid "Jaquette"
 msgstr ""
@@ -4530,6 +4738,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
 #: ../../application/modules/opac/controllers/AbonneController.php:773
 #: ../../application/modules/opac/controllers/AbonneController.php:833
+#: ../../application/modules/opac/controllers/AbonneController.php:838
 msgid "Jour"
 msgstr ""
 
@@ -4538,11 +4747,15 @@ msgid "Juil."
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:41
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:15
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:31
 msgid "Juillet"
 msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:11
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:40
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:14
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:30
 msgid "Juin"
 msgstr ""
 
@@ -4551,6 +4764,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/JavaController.php:71
 #: ../../application/modules/opac/controllers/JavaController.php:80
 #: ../../application/modules/opac/controllers/JavaController.php:66
+#: ../../application/modules/opac/controllers/JavaController.php:67
 msgid "Kiosque de notices"
 msgstr ""
 
@@ -4586,6 +4800,11 @@ msgstr ""
 msgid "L'album \"%s\" a été créé"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/CmsController.php:36
+#, php-format
+msgid "L'article \"%s\" a été sauvegardé"
+msgstr ""
+
 #: ../../application/modules/opac/controllers/AbonneController.php:70
 #: ../../application/modules/opac/controllers/AbonneController.php:74
 #: ../../application/modules/opac/controllers/AbonneController.php:99
@@ -4593,6 +4812,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:178
 #: ../../application/modules/opac/controllers/AbonneController.php:181
 #: ../../application/modules/opac/controllers/AbonneController.php:182
+#: ../../application/modules/opac/controllers/AbonneController.php:180
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %d et %d caractères"
 msgstr ""
@@ -4601,6 +4821,7 @@ msgstr ""
 #: ../../library/Class/AvisNotice.php:276
 #: ../../library/Class/AvisNotice.php:311
 #: ../../library/Class/AvisNotice.php:245
+#: ../../library/Class/AvisNotice.php:244
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %s et %s caractères"
 msgstr ""
@@ -4610,6 +4831,7 @@ msgstr ""
 #: ../../library/Class/Users.php:356 ../../library/Class/Users.php:500
 #: ../../library/Class/Users.php:567 ../../library/Class/Users.php:648
 #: ../../library/Class/Users.php:770 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:828
 msgid "L'identifiant que vous avez choisi existe déjà."
 msgstr ""
 
@@ -4618,6 +4840,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:535
 #: ../../application/modules/admin/controllers/BibController.php:532
 #: ../../application/modules/admin/controllers/BibController.php:477
+#: ../../application/modules/admin/controllers/BibController.php:482
 msgid "L'image du plan est obligatoire."
 msgstr ""
 
@@ -4634,6 +4857,10 @@ msgstr ""
 msgid "L'utilisateur n'a pas renseigné son adresse e-mail."
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/News.php:73
+msgid "L'évenement dure toute la journée"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:131
 msgid "L'évènement dure toute la journée"
 msgstr ""
@@ -4649,6 +4876,7 @@ msgstr ""
 #: ../../library/Class/Users.php:364 ../../library/Class/Users.php:508
 #: ../../library/Class/Users.php:575 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:778 ../../library/Class/Users.php:830
+#: ../../library/Class/Users.php:837
 #, php-format
 msgid "La bibliothèque est obligatoire pour le rôle : %s"
 msgstr ""
@@ -4674,6 +4902,11 @@ msgstr ""
 msgid "La catégorie \"%s\" a été sauvegardée"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/FormationController.php:33
+#, php-format
+msgid "La formation \"%s\" a été sauvegardée"
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:6
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:14
 msgid "La notice "
@@ -4688,6 +4921,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:336
 #: ../../application/modules/admin/controllers/BibController.php:333
 #: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:310
 #, php-format
 msgid ""
 "La photo que vous avez sélectionnée doit être de type : 'image/jpg' et pas "
@@ -4699,6 +4933,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:337
 #: ../../application/modules/admin/controllers/BibController.php:334
 #: ../../application/modules/admin/controllers/BibController.php:307
+#: ../../application/modules/admin/controllers/BibController.php:312
 #, php-format
 msgid "La photo que vous avez sélectionnée est trop volumiseuse : %d ko"
 msgstr ""
@@ -4707,6 +4942,11 @@ msgstr ""
 msgid "La prolongation a échoué"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:33
+#, php-format
+msgid "La session \"%s\" a été sauvegardée"
+msgstr ""
+
 #: ../../library/Class/CriteresRecherche.php:268
 #: ../../library/Class/CriteresRecherche.php:301
 #: ../../library/Class/CriteresRecherche.php:312
@@ -4823,10 +5063,11 @@ msgstr ""
 #: ../../library/Class/Users.php:352 ../../library/Class/Users.php:496
 #: ../../library/Class/Users.php:563 ../../library/Class/Users.php:644
 #: ../../library/Class/Users.php:766 ../../library/Class/Users.php:817
+#: ../../library/Class/Users.php:824
 msgid "Le champ 'Identifiant' doit être inférieur à 50 caractères"
 msgstr ""
 
-#: ../../library/Class/Users.php:826
+#: ../../library/Class/Users.php:826 ../../library/Class/Users.php:833
 msgid "Le champ 'Mot de passe' doit être inférieur à 255 caractères"
 msgstr ""
 
@@ -4916,6 +5157,7 @@ msgstr ""
 #: ../../library/Class/Users.php:369 ../../library/Class/Users.php:513
 #: ../../library/Class/Users.php:580 ../../library/Class/Users.php:661
 #: ../../library/Class/Users.php:783 ../../library/Class/Users.php:835
+#: ../../library/Class/Users.php:842
 msgid ""
 "Le numéro de carte est obligatoire pour les abonnés identifiés dans un sigb."
 msgstr ""
@@ -4980,6 +5222,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:419
 #: ../../application/modules/opac/controllers/AbonneController.php:469
 #: ../../application/modules/opac/controllers/AbonneController.php:479
+#: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:484
 msgid "Les mots de passe ne correspondent pas"
 msgstr ""
 
@@ -5058,6 +5302,7 @@ msgid "Libellé du champ"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:77
+#: ../../library/Class/SuggestionAchat.php:98
 msgid "Lien"
 msgstr ""
 
@@ -5067,11 +5312,13 @@ msgid "Lien \"Suggérer un achat\""
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
 msgid "Lien Internet vers une description"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:75
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:78
 msgid "Lien cartographique"
 msgstr ""
 
@@ -5090,6 +5337,7 @@ msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:38
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
 msgid "Lien internet vers une description"
 msgstr ""
 
@@ -5144,11 +5392,15 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:832
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:77
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:67
+#: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../library/ZendAfi/Form/Admin/News.php:76
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:73
 msgid "Lieu"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
 #: ../../application/modules/opac/controllers/RechercheController.php:589
+#: ../../application/modules/opac/controllers/RechercheController.php:591
 msgid "Lieu de mise à disposition demandé"
 msgstr ""
 
@@ -5191,6 +5443,7 @@ msgid "Liste"
 msgstr ""
 
 #: ../../library/Class/CustomField/Meta.php:60
+#: ../../library/Class/CustomField/Meta.php:53
 msgid "Liste d'options"
 msgstr ""
 
@@ -5275,6 +5528,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:405
 #: ../../application/modules/admin/controllers/BibController.php:402
 #: ../../application/modules/admin/controllers/BibController.php:369
+#: ../../application/modules/admin/controllers/BibController.php:374
 #, php-format
 msgid "Localisations de la bibliothèque: %s"
 msgstr ""
@@ -5300,6 +5554,8 @@ msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:10
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:39
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:13
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:29
 msgid "Mai"
 msgstr ""
 
@@ -5315,12 +5571,18 @@ msgstr ""
 msgid "Mail : "
 msgstr ""
 
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:63
+msgid "Mail suggestions"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/UsergroupController.php:123
 msgid "Manuel"
 msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:37
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:11
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:27
 msgid "Mars"
 msgstr ""
 
@@ -5348,6 +5610,7 @@ msgstr "Vous avez attein le nombre maximum de réservations"
 #: ../../application/modules/admin/controllers/ProfilController.php:532
 #: ../../application/modules/admin/controllers/ProfilController.php:543
 #: ../../application/modules/admin/controllers/ProfilController.php:545
+#: ../../application/modules/admin/controllers/ProfilController.php:544
 msgid "Menu horizontal dupliqué sur tous les autres profils."
 msgstr ""
 
@@ -5367,10 +5630,12 @@ msgid "Mes derniers paniers"
 msgstr ""
 
 #: ../../library/Class/Users.php:1304 ../../library/Class/Users.php:1320
+#: ../../library/Class/Users.php:1328
 msgid "Mes paniers"
 msgstr ""
 
 #: ../../library/Class/Users.php:1337 ../../library/Class/Users.php:1353
+#: ../../library/Class/Users.php:1361
 msgid "Mes paniers rattachés à un domaine"
 msgstr ""
 
@@ -5383,6 +5648,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:124
 #: ../../application/modules/opac/controllers/IndexController.php:116
 #: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../library/ZendAfi/Form/ContactForm.php:84
 msgid "Message"
 msgstr ""
 
@@ -5404,6 +5670,10 @@ msgstr ""
 msgid "Message au dessus de la boite"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/News.php:158
+msgid "Message d'explication du refus."
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:459
 #: ../../application/modules/opac/controllers/RechercheController.php:492
 #: ../../application/modules/opac/controllers/RechercheController.php:517
@@ -5454,10 +5724,12 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:470
 #: ../../application/modules/admin/controllers/BibController.php:467
 #: ../../application/modules/admin/controllers/BibController.php:425
+#: ../../application/modules/admin/controllers/BibController.php:430
 msgid "Mise à jour de la localisation"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/CmsController.php:71
+#: ../../application/modules/admin/controllers/CmsController.php:87
 msgid "Mise à jour des articles"
 msgstr ""
 
@@ -5521,6 +5793,7 @@ msgid "Modifier"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:325
 #, php-format
 msgid "Modifier l'avis \"%s\""
 msgstr ""
@@ -5530,6 +5803,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:268
 #: ../../application/modules/admin/controllers/BibController.php:265
 #: ../../application/modules/admin/controllers/BibController.php:247
+#: ../../application/modules/admin/controllers/BibController.php:252
 #, php-format
 msgid "Modifier la bibliothèque: %s"
 msgstr ""
@@ -5544,6 +5818,16 @@ msgstr ""
 msgid "Modifier la configuration du tableau des exemplaires"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/FormationController.php:38
+#, php-format
+msgid "Modifier la formation: %s"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:38
+#, php-format
+msgid "Modifier la session: %s"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:124
 msgid "Modifier la source de données du kiosque"
 msgstr ""
@@ -5606,6 +5890,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:568
 #: ../../application/modules/admin/controllers/BibController.php:565
 #: ../../application/modules/admin/controllers/BibController.php:505
+#: ../../application/modules/admin/controllers/BibController.php:510
 #, php-format
 msgid "Modifier un plan de la bibliothèque: %s"
 msgstr ""
@@ -5656,6 +5941,7 @@ msgid "Modération des formulaires: "
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:1
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:2
 msgid "Modération des suggestions d'achat"
 msgstr ""
 
@@ -5671,6 +5957,10 @@ msgstr ""
 msgid "Modérations"
 msgstr ""
 
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:72
+msgid "Mois"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/HarvestController.php:43
 #: ../../application/modules/admin/controllers/HarvestController.php:44
 #: ../../application/modules/admin/controllers/HarvestController.php:26
@@ -5746,6 +6036,7 @@ msgstr ""
 
 #: ../../application/modules/telephone/controllers/AuthController.php:81
 #: ../../application/modules/telephone/controllers/AuthController.php:75
+#: ../../application/modules/telephone/controllers/AuthController.php:89
 msgid "Mot de passe ou date de naissance"
 msgstr ""
 
@@ -5789,7 +6080,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:45 ../../library/Class/Bib.php:46
 #: ../../library/Class/Bib.php:77 ../../library/Class/Bib.php:96
 #: ../../library/Class/Bib.php:116 ../../library/Class/Bib.php:127
-#: ../../library/Class/Bib.php:147
+#: ../../library/Class/Bib.php:147 ../../library/Class/Bib.php:167
 msgid "N'envoie pas de données"
 msgstr ""
 
@@ -5926,6 +6217,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:16
 #: ../../application/modules/opac/controllers/IndexController.php:83
 #: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../library/ZendAfi/Form/ContactForm.php:59
 msgid "Nom"
 msgstr ""
 
@@ -6018,6 +6311,7 @@ msgid "Nombre de traductions : %s"
 msgstr ""
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Non"
 msgstr ""
 
@@ -6124,6 +6418,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:385
 #: ../../application/modules/opac/controllers/AbonneController.php:404
 #: ../../application/modules/opac/controllers/AbonneController.php:464
+#: ../../application/modules/opac/controllers/AbonneController.php:469
 msgid "Nouveau mot de passe"
 msgstr ""
 
@@ -6203,6 +6498,7 @@ msgid "Nouvelle relation"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:45
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:19
 msgid "Nov"
 msgstr ""
 
@@ -6210,6 +6506,10 @@ msgstr ""
 msgid "Nov."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:35
+msgid "Novembre"
+msgstr ""
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:61
 msgid "Nuage de tags"
 msgstr ""
@@ -6230,16 +6530,19 @@ msgid "Numéro"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:13
 msgid "N° abonné"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../library/Class/SuggestionAchat.php:80
+#: ../../library/Class/SuggestionAchat.php:101
 msgid "N° carte abonné"
 msgstr ""
 
 #: ../../application/modules/telephone/controllers/AuthController.php:77
 #: ../../application/modules/telephone/controllers/AuthController.php:74
+#: ../../application/modules/telephone/controllers/AuthController.php:88
 msgid "N° de carte"
 msgstr ""
 
@@ -6287,6 +6590,7 @@ msgid "Objets javascript"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:44
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:18
 msgid "Oct"
 msgstr ""
 
@@ -6294,6 +6598,10 @@ msgstr ""
 msgid "Oct."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:34
+msgid "Octobre"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Avis.php:26
 #: ../../library/ZendAfi/View/Helper/Avis.php:28
 #: ../../library/ZendAfi/View/Helper/Avis.php:47
@@ -6317,6 +6625,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:175
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php:31
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php:29
+#: ../../library/ZendAfi/Form/Admin/News.php:114
 msgid "Options"
 msgstr ""
 
@@ -6346,6 +6655,7 @@ msgid "Os"
 msgstr ""
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Oui"
 msgstr ""
 
@@ -6589,6 +6899,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:518
 #: ../../application/modules/admin/controllers/BibController.php:515
 #: ../../application/modules/admin/controllers/BibController.php:463
+#: ../../application/modules/admin/controllers/BibController.php:468
 #, php-format
 msgid "Plans de la bibliothèque: %s"
 msgstr ""
@@ -6643,6 +6954,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:8
 #: ../../application/modules/opac/controllers/AbonneController.php:776
 #: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/opac/controllers/AbonneController.php:841
 msgid "Poste"
 msgstr ""
 
@@ -6660,7 +6972,7 @@ msgstr ""
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant :"
 msgstr ""
 
-#: ../../library/Class/Users.php:887
+#: ../../library/Class/Users.php:887 ../../library/Class/Users.php:894
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant:"
 msgstr ""
 
@@ -6672,6 +6984,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:661
 #: ../../application/modules/opac/controllers/AbonneController.php:693
 #: ../../application/modules/opac/controllers/AbonneController.php:753
+#: ../../application/modules/opac/controllers/AbonneController.php:758
 msgid "Pour quelle durée ?"
 msgstr ""
 
@@ -6681,8 +6994,19 @@ msgid ""
 "dessous."
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:19
+msgid "Pour valider l'abonnement, merci de cliquer sur le lien suivant:"
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:33
+msgid ""
+"Pour vous désinscrire de la lettre d'information, merci de cliquer sur le "
+"lien suivant:"
+msgstr ""
+
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:70
 msgid "Pourquoi suggérez-vous ce document ?"
 msgstr ""
 
@@ -6693,6 +7017,7 @@ msgid "Prochains rendez-vous"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/CalendarContent.php:84
+#: ../../library/ZendAfi/View/Helper/CalendarContent.php:94
 msgid "Prochains évènements"
 msgstr ""
 
@@ -6797,6 +7122,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/users/index.phtml:18
 #: ../../application/modules/opac/controllers/IndexController.php:88
 #: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../library/ZendAfi/Form/ContactForm.php:63
 msgid "Prénom"
 msgstr ""
 
@@ -6806,6 +7133,7 @@ msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:90
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
 msgid "Prêt"
 msgstr ""
 
@@ -6818,6 +7146,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:335
 #: ../../application/modules/opac/controllers/AbonneController.php:340
 #: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:398
 msgid "Prêt prolongé"
 msgstr ""
 
@@ -6842,6 +7171,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:392
 #: ../../application/modules/opac/controllers/AbonneController.php:368
 #: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:440
 msgid "Pseudo"
 msgstr ""
 
@@ -6858,6 +7188,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:29
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:18
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:81
+#: ../../library/ZendAfi/Form/Admin/News.php:54
+#: ../../library/ZendAfi/Form/Admin/News.php:102
 msgid "Publication"
 msgstr ""
 
@@ -6891,18 +7223,21 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:559
 #: ../../application/modules/opac/controllers/AbonneController.php:591
 #: ../../application/modules/opac/controllers/AbonneController.php:651
+#: ../../application/modules/opac/controllers/AbonneController.php:656
 msgid "Quota déjà atteint ce jour, choisissez un autre jour."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:565
 #: ../../application/modules/opac/controllers/AbonneController.php:597
 #: ../../application/modules/opac/controllers/AbonneController.php:657
+#: ../../application/modules/opac/controllers/AbonneController.php:662
 msgid "Quota déjà atteint ce mois, choisissez un autre mois."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:562
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:654
+#: ../../application/modules/opac/controllers/AbonneController.php:659
 msgid "Quota déjà atteint cette semaine, choisissez une autre semaine."
 msgstr ""
 
@@ -6961,6 +7296,7 @@ msgstr ""
 #: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:2
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 msgid "Recherche"
 msgstr ""
 
@@ -7226,6 +7562,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
 #: ../../application/modules/admin/views/scripts/custom-fields-report/edit.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:36
 msgid "Retour"
 msgstr ""
 
@@ -7351,6 +7689,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RechercheController.php:546
 #: ../../application/modules/opac/controllers/RechercheController.php:505
 #: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:517
 msgid "Réservation"
 msgstr ""
 
@@ -7491,6 +7830,11 @@ msgstr ""
 msgid "Résumé"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:39
+#: ../../library/ZendAfi/Form/Admin/News.php:108
+msgid "Résumé pour l'affichage dans les boîtes"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:128
 #: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:47
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:133
@@ -7547,6 +7891,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:36
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:35
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:47
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:65
 msgid "S'inscrire"
 msgstr ""
 
@@ -7571,6 +7917,8 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
 #: ../../application/modules/telephone/controllers/AuthController.php:85
 #: ../../application/modules/telephone/controllers/AuthController.php:90
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:5
+#: ../../application/modules/telephone/controllers/AuthController.php:104
 msgid "Se connecter"
 msgstr ""
 
@@ -7589,12 +7937,14 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:41
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:40
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:44
 msgid "Se désinscrire"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:743
 #: ../../application/modules/opac/controllers/AbonneController.php:775
 #: ../../application/modules/opac/controllers/AbonneController.php:835
+#: ../../application/modules/opac/controllers/AbonneController.php:840
 msgid "Secteur"
 msgstr ""
 
@@ -7646,6 +7996,7 @@ msgid "Sections"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:43
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:17
 msgid "Sept"
 msgstr ""
 
@@ -7653,6 +8004,10 @@ msgstr ""
 msgid "Sept."
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:33
+msgid "Septembre"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:30
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:38
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:23
@@ -7692,6 +8047,16 @@ msgstr ""
 msgid "Session"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:32
+#, php-format
+msgid "Session \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:34
+#, php-format
+msgid "Session \"%s\" supprimée"
+msgstr ""
+
 msgid "Should be greater than '%fieldToCompare%'"
 msgstr "Doit être plus grand que '%fieldToCompare%'"
 
@@ -7700,6 +8065,8 @@ msgstr "Doit être plus grand que '%fieldToCompare%'"
 #: ../../library/Class/Users.php:452 ../../library/Class/Users.php:598
 #: ../../library/Class/Users.php:665 ../../library/Class/Users.php:753
 #: ../../library/Class/Users.php:876 ../../library/Class/Users.php:888
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:30
+#: ../../library/Class/Users.php:895
 msgid ""
 "Si vous n'êtes pas à l'origine de cette demande d'inscription, merci de ne "
 "pas tenir compte de cet e-mail, et l'inscription ne sera pas activée."
@@ -7898,11 +8265,13 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../library/ZendAfi/Form/Admin/News.php:146
 msgid "Statut"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:118
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
 msgid "Statut de la bib"
 msgstr ""
 
@@ -7914,6 +8283,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:82
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:21
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:54
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:55
 msgid "Style de boite"
 msgstr ""
 
@@ -7937,11 +8307,13 @@ msgid "Suggestion d'achat supprimée"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:18
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:33
 msgid "Suggestion d'achat:"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:87
 #: ../../library/Class/SuggestionAchat.php:88
+#: ../../library/Class/SuggestionAchat.php:109
 msgid "Suggestion d'achat: "
 msgstr ""
 
@@ -7985,6 +8357,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:40
 #: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:31
 #: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../library/ZendAfi/Form/ContactForm.php:80
 msgid "Sujet"
 msgstr ""
 
@@ -8072,11 +8445,13 @@ msgid "Supprimer cette réservation"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/CmsController.php:397
+#: ../../application/modules/admin/controllers/CmsController.php:385
 #, php-format
 msgid "Supprimer l'article : %s"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/BibController.php:256
+#: ../../application/modules/admin/controllers/BibController.php:261
 #, php-format
 msgid "Supprimer la bibliothèque: %s"
 msgstr ""
@@ -8127,6 +8502,7 @@ msgstr ""
 
 #: ../../application/modules/admin/controllers/ModulesController.php:299
 #: ../../application/modules/admin/controllers/ModulesController.php:306
+#: ../../application/modules/admin/controllers/ModulesController.php:310
 msgid "Sélectionnez un panier ou un domaine"
 msgstr ""
 
@@ -8164,6 +8540,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
 #: ../../library/ZendAfi/Form/Album.php:191
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:186
+#: ../../library/ZendAfi/Form/Admin/News.php:82
 msgid "Tags"
 msgstr ""
 
@@ -8206,6 +8583,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:66
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:70
 #: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:47
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
 msgid "Territoire"
 msgstr ""
 
@@ -8248,6 +8626,7 @@ msgid "Tester"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/planacces.phtml:187
+#: ../../library/Class/CustomField/Meta.php:50
 msgid "Texte"
 msgstr ""
 
@@ -8330,6 +8709,12 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:50
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:39
 #: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:11
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:51
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:32
+#: ../../library/ZendAfi/Form/Admin/News.php:40
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/SuggestionAchat.php:94
 msgid "Titre"
 msgstr ""
 
@@ -8356,6 +8741,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:44
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:45
+#: ../../library/ZendAfi/Form/Admin/News.php:44
 msgid "Titre caché"
 msgstr ""
 
@@ -8374,6 +8760,7 @@ msgid "Titre et auteur"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:58
+#: ../../library/Class/SuggestionAchat.php:62
 msgid "Titre ou commentaire requis"
 msgstr ""
 
@@ -8407,6 +8794,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/TreeView.php:36
 #: ../../library/ZendAfi/View/Helper/TreeView.php:65
 #: ../../library/ZendAfi/View/Helper/TreeView.php:71
+#: ../../library/ZendAfi/View/Helper/Calendar/RenderFilters.php:88
 msgid "Tous"
 msgstr ""
 
@@ -8489,7 +8877,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:165 ../../library/Class/Bib.php:182
 #: ../../library/Class/Bib.php:213 ../../library/Class/Bib.php:241
 #: ../../library/Class/Bib.php:256 ../../library/Class/Bib.php:272
-#: ../../library/Class/Bib.php:292
+#: ../../library/Class/Bib.php:292 ../../library/Class/Bib.php:312
 msgid "Toutes"
 msgstr ""
 
@@ -8511,6 +8899,10 @@ msgstr ""
 msgid "Traductions"
 msgstr ""
 
+#: ../../application/modules/admin/views/scripts/cms/_traduction_navigator.phtml:3
+msgid "Traductions:"
+msgstr ""
+
 #: ../../library/Class/Upload.php:268
 msgid "Transfert impossible, ce formulaire est mal configuré"
 msgstr ""
@@ -8580,6 +8972,9 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:163
 #: ../../library/Class/CriteresRecherche.php:108
 #: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/SuggestionAchat.php:96
 msgid "Type de document"
 msgstr ""
 
@@ -8602,6 +8997,10 @@ msgstr ""
 msgid "Type de document : %s"
 msgstr ""
 
+#: ../../library/Class/SuggestionAchat.php:75
+msgid "Type de document requis"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:105
 #, php-format
 msgid "Type de document: %s"
@@ -8705,6 +9104,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:55
 #: ../../application/modules/opac/controllers/AbonneController.php:380
 #: ../../application/modules/opac/controllers/AbonneController.php:440
+#: ../../application/modules/opac/controllers/AbonneController.php:445
 msgid "Téléphone"
 msgstr ""
 
@@ -8737,6 +9137,10 @@ msgstr ""
 msgid "URL objet B est requis"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:7
+msgid "Un compte vous a été créé automatiquement."
+msgstr ""
+
 #: ../../library/Class/FRBR/LinkType.php:56
 msgid "Un libellé de l'objet A vers l'objet B est requis"
 msgstr ""
@@ -8759,9 +9163,22 @@ msgstr ""
 #: ../../library/Class/Users.php:515 ../../library/Class/Users.php:666
 #: ../../library/Class/Users.php:733 ../../library/Class/Users.php:821
 #: ../../library/Class/Users.php:934 ../../library/Class/Users.php:950
+#: ../../library/Class/Users.php:957
 msgid "Un mail vient de vous être envoyé avec vos paramètres de connexion."
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:277
+msgid ""
+"Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le "
+"compte qui utilise cet email."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:305
+msgid ""
+"Une demande de confirmation d'inscription vous a été envoyée à l'adresse "
+"mail renseignée."
+msgstr ""
+
 #: ../../library/Class/CommSigb.php:177
 msgid ""
 "Une erreur de communication avec le serveur a fait échouer la requête. Merci "
@@ -8775,6 +9192,12 @@ msgid ""
 "Merci de signaler ce problème à la bibliothèque."
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:301
+msgid ""
+"Une erreur est survenue à l'envoi du mail de confirmation. Veuillez "
+"réessayer. Si le problème persiste, veuillez contacter votre médiathèque."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:39
 msgid "Une seule suggestion enregistrée."
 msgstr ""
@@ -8846,6 +9269,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AuthController.php:221
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:65
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:71
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:35
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:69
 msgid "Valider"
 msgstr ""
 
@@ -8991,6 +9416,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:102
 #: ../../application/modules/opac/controllers/IndexController.php:101
 #: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../application/modules/opac/controllers/AbonneController.php:443
+#: ../../library/ZendAfi/Form/ContactForm.php:73
 msgid "Ville"
 msgstr ""
 
@@ -9119,6 +9546,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:128
 #: ../../application/modules/opac/controllers/IndexController.php:127
+#: ../../library/ZendAfi/Form/ContactForm.php:101
 msgid "Vos coordonnées"
 msgstr ""
 
@@ -9204,6 +9632,10 @@ msgstr ""
 msgid "Votre adresse E-mail :"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:29
+msgid "Votre adresse e-mail"
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:432
 #: ../../application/modules/opac/controllers/RechercheController.php:465
 #: ../../application/modules/opac/controllers/RechercheController.php:490
@@ -9244,11 +9676,16 @@ msgstr ""
 
 #: ../../library/Class/Users.php:657 ../../library/Class/Users.php:724
 #: ../../library/Class/Users.php:812 ../../library/Class/Users.php:925
-#: ../../library/Class/Users.php:941
+#: ../../library/Class/Users.php:941 ../../library/Class/Users.php:948
 #, fuzzy, php-format
 msgid "Votre identifiant : %s\n"
 msgstr "Entrez votre identité S.V.P."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:13
+#, fuzzy
+msgid "Votre identifiant: "
+msgstr "Entrez votre identité S.V.P."
+
 #: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:17
 #: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:31
 msgid "Votre identité s.v.p."
@@ -9258,6 +9695,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:141
 #: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../library/ZendAfi/Form/ContactForm.php:52
 msgid "Votre message"
 msgstr ""
 
@@ -9273,7 +9711,7 @@ msgid "Votre mot de passe : %s"
 msgstr ""
 
 #: ../../library/Class/Users.php:813 ../../library/Class/Users.php:926
-#: ../../library/Class/Users.php:942
+#: ../../library/Class/Users.php:942 ../../library/Class/Users.php:949
 #, fuzzy, php-format
 msgid "Votre mot de passe : %s\n"
 msgstr "Entrez votre identité S.V.P."
@@ -9285,6 +9723,15 @@ msgid ""
 "n"
 msgstr "Entrez votre identité S.V.P."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:16
+#, fuzzy
+msgid "Votre mot de passe: "
+msgstr "Entrez votre identité S.V.P."
+
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+msgid "Votre prêt a bien été prolongé."
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:1
 msgid "Votre réservation"
 msgstr ""
@@ -9300,6 +9747,7 @@ msgid "Votre réservation est enregistrée."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:542
+#: ../../application/modules/opac/controllers/RechercheController.php:544
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9307,6 +9755,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:542
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9394,11 +9843,16 @@ msgstr ""
 msgid "Vous avez %d réservations en cours"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid "Vous avez bien été abonné à la newsletter: "
+msgstr ""
+
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:596
 #: ../../application/modules/opac/controllers/AbonneController.php:634
 #: ../../application/modules/opac/controllers/AbonneController.php:666
 #: ../../application/modules/opac/controllers/AbonneController.php:726
+#: ../../application/modules/opac/controllers/AbonneController.php:731
 msgid "Vous avez déjà une réservation dans ce créneau horaire"
 msgstr ""
 
@@ -9410,15 +9864,20 @@ msgstr ""
 msgid "Vous avez fait une demande d'inscription sur le portail."
 msgstr ""
 
-#: ../../library/Class/Users.php:886
+#: ../../library/Class/Users.php:886 ../../library/Class/Users.php:893
 msgid "Vous avez fait une demande d'inscription sur le portail:"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:4
+msgid "Vous avez fait une demande d'inscription à la lettre d'information:"
+msgstr ""
+
 #: ../../library/Class/Users.php:313 ../../library/Class/Users.php:327
 #: ../../library/Class/Users.php:402 ../../library/Class/Users.php:478
 #: ../../library/Class/Users.php:507 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:723 ../../library/Class/Users.php:811
 #: ../../library/Class/Users.php:924 ../../library/Class/Users.php:940
+#: ../../library/Class/Users.php:947
 msgid "Vous avez fait une demande de mot de passe sur le portail."
 msgstr ""
 
@@ -9431,6 +9890,7 @@ msgstr ""
 #: ../../library/Class/Users.php:351 ../../library/Class/Users.php:495
 #: ../../library/Class/Users.php:562 ../../library/Class/Users.php:643
 #: ../../library/Class/Users.php:765 ../../library/Class/Users.php:816
+#: ../../library/Class/Users.php:823
 msgid "Vous devez compléter le champ 'Identifiant'"
 msgstr ""
 
@@ -9439,6 +9899,7 @@ msgstr ""
 #: ../../library/Class/Users.php:359 ../../library/Class/Users.php:503
 #: ../../library/Class/Users.php:570 ../../library/Class/Users.php:651
 #: ../../library/Class/Users.php:773 ../../library/Class/Users.php:824
+#: ../../library/Class/Users.php:831
 msgid "Vous devez compléter le champ 'Mot de passe'"
 msgstr ""
 
@@ -9451,7 +9912,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:112 ../../library/Class/Bib.php:130
 #: ../../library/Class/Bib.php:161 ../../library/Class/Bib.php:189
 #: ../../library/Class/Bib.php:204 ../../library/Class/Bib.php:220
-#: ../../library/Class/Bib.php:240
+#: ../../library/Class/Bib.php:240 ../../library/Class/Bib.php:260
 msgid "Vous devez compléter le champ 'Nom'"
 msgstr ""
 
@@ -9471,7 +9932,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:133
 #: ../../library/Class/Bib.php:164 ../../library/Class/Bib.php:192
 #: ../../library/Class/Bib.php:207 ../../library/Class/Bib.php:223
-#: ../../library/Class/Bib.php:243
+#: ../../library/Class/Bib.php:243 ../../library/Class/Bib.php:263
 msgid "Vous devez compléter le champ 'Ville'"
 msgstr ""
 
@@ -9483,11 +9944,12 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:389
 #: ../../application/modules/opac/controllers/AbonneController.php:408
 #: ../../application/modules/opac/controllers/AbonneController.php:468
+#: ../../application/modules/opac/controllers/AbonneController.php:473
 msgid "Vous devez confirmer le mot de passe"
 msgstr ""
 
 #: ../../library/Class/Users.php:671 ../../library/Class/Users.php:793
-#: ../../library/Class/Users.php:845
+#: ../../library/Class/Users.php:845 ../../library/Class/Users.php:852
 msgid "Vous devez fournir une adresse mail valide"
 msgstr ""
 
@@ -9499,11 +9961,12 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:399
 #: ../../application/modules/opac/controllers/AbonneController.php:418
 #: ../../application/modules/opac/controllers/AbonneController.php:478
+#: ../../application/modules/opac/controllers/AbonneController.php:483
 msgid "Vous devez saisir un mot de passe"
 msgstr ""
 
 #: ../../library/Class/Users.php:674 ../../library/Class/Users.php:796
-#: ../../library/Class/Users.php:848
+#: ../../library/Class/Users.php:848 ../../library/Class/Users.php:855
 msgid "Vous devez saisir un numéro de téléphone"
 msgstr ""
 
@@ -9511,6 +9974,7 @@ msgstr ""
 #: ../../library/Class/AvisNotice.php:278
 #: ../../library/Class/AvisNotice.php:313
 #: ../../library/Class/AvisNotice.php:249
+#: ../../library/Class/AvisNotice.php:248
 msgid "Vous devez saisir un titre"
 msgstr ""
 
@@ -9525,6 +9989,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:327
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:294
+#: ../../application/modules/admin/controllers/BibController.php:299
 msgid "Vous devez sélectionner une photo en cliquant sur le bouton : parcourir"
 msgstr ""
 
@@ -9533,6 +9998,7 @@ msgstr ""
 #: ../../library/Class/Users.php:561 ../../library/Class/Users.php:768
 #: ../../library/Class/Users.php:838 ../../library/Class/Users.php:926
 #: ../../library/Class/Users.php:1053 ../../library/Class/Users.php:1069
+#: ../../library/Class/Users.php:1076
 msgid ""
 "Vous devez vous connecter en tant qu'abonné de la bibliothèque pour obtenir "
 "plus d'informations."
@@ -9552,12 +10018,22 @@ msgid ""
 "réservation."
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:3
+msgid "Vous devez vous identifier pour vous désinscrire de la newsletter: "
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagCoursToutApprendre.php:28
 msgid ""
 "Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
 "accéder au cours en ligne"
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au livre numérique"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagNumeriquePremiumBook.php:27
 msgid ""
 "Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
@@ -9624,13 +10100,13 @@ msgstr ""
 
 #: ../../library/Class/Users.php:519 ../../library/Class/Users.php:586
 #: ../../library/Class/Users.php:667 ../../library/Class/Users.php:789
-#: ../../library/Class/Users.php:841
+#: ../../library/Class/Users.php:841 ../../library/Class/Users.php:848
 msgid "Vous n'avez pas les droits suffisants pour diriger une formation"
 msgstr ""
 
 #: ../../library/Class/Users.php:516 ../../library/Class/Users.php:583
 #: ../../library/Class/Users.php:664 ../../library/Class/Users.php:786
-#: ../../library/Class/Users.php:838
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:845
 msgid "Vous n'avez pas les droits suffisants pour suivre une formation"
 msgstr ""
 
@@ -9707,6 +10183,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:556
 #: ../../application/modules/opac/controllers/AbonneController.php:588
 #: ../../application/modules/opac/controllers/AbonneController.php:648
+#: ../../application/modules/opac/controllers/AbonneController.php:653
 msgid "Vous n'êtes pas autorisé à effectuer une réservation"
 msgstr ""
 
@@ -9742,6 +10219,14 @@ msgstr ""
 msgid "Zone"
 msgstr ""
 
+#: ../../library/Class/CustomField/Meta.php:52
+msgid "Zone de texte HTML"
+msgstr ""
+
+#: ../../library/Class/CustomField/Meta.php:51
+msgid "Zone de texte simple"
+msgstr ""
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:121
 msgid "Zones de titre(séparées par ;)"
 msgstr ""
@@ -9803,6 +10288,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:91
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:113
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:116
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:41
 msgid "au"
 msgstr ""
 
@@ -9898,6 +10384,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:178
 #: ../../application/modules/opac/controllers/IndexController.php:170
 #: ../../application/modules/opac/controllers/IndexController.php:149
+#: ../../application/modules/opac/controllers/IndexController.php:92
 msgid ""
 "destinataire non configuré. Vérifiez les paramètres du profil, champ 'E-mail "
 "du webmestre'"
@@ -9929,6 +10416,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:110
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:83
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:105
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:35
 msgid "du"
 msgstr ""
 
@@ -10123,6 +10611,8 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:531
 #: ../../application/modules/admin/controllers/BibController.php:382
 #: ../../application/modules/admin/controllers/BibController.php:475
+#: ../../application/modules/admin/controllers/BibController.php:387
+#: ../../application/modules/admin/controllers/BibController.php:480
 msgid "le libellé est obligatoire."
 msgstr ""
 
@@ -10526,6 +11016,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:659
 #: ../../application/modules/opac/controllers/AbonneController.php:691
 #: ../../application/modules/opac/controllers/AbonneController.php:751
+#: ../../application/modules/opac/controllers/AbonneController.php:756
 msgid "À partir de quelle heure ?"
 msgstr ""
 
diff --git a/library/translation/fr.pot b/library/translation/fr.pot
index 22a38a755a2e70bc282b0037aad741bcf7d1ee29..1a34295fb816100fd36c632ab4097d8a42202182 100644
--- a/library/translation/fr.pot
+++ b/library/translation/fr.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-11 14:22+0200\n"
+"POT-Creation-Date: 2014-10-02 16:13+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,6 +37,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/ComboProfils.php:114
 #: ../../library/Class/MoteurRecherche.php:415
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
 msgid "Accueil"
 msgstr ""
 
@@ -155,6 +156,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
 #: ../../application/modules/opac/views/scripts/abonne/prets.phtml:23
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:14
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
 msgid "Bibliothèque"
 msgstr ""
 
@@ -186,6 +189,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:16
 #: ../../application/modules/opac/controllers/IndexController.php:83
 #: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../library/ZendAfi/Form/ContactForm.php:59
 msgid "Nom"
 msgstr ""
 
@@ -213,6 +218,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:94
 #: ../../application/modules/opac/controllers/IndexController.php:93
 #: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../application/modules/opac/controllers/AbonneController.php:441
+#: ../../library/ZendAfi/Form/ContactForm.php:67
 msgid "Adresse"
 msgstr ""
 
@@ -225,6 +232,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:97
 #: ../../application/modules/opac/controllers/IndexController.php:96
 #: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../application/modules/opac/controllers/AbonneController.php:442
+#: ../../library/ZendAfi/Form/ContactForm.php:69
 msgid "Code postal"
 msgstr ""
 
@@ -238,6 +247,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:102
 #: ../../application/modules/opac/controllers/IndexController.php:101
 #: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../application/modules/opac/controllers/AbonneController.php:443
+#: ../../library/ZendAfi/Form/ContactForm.php:73
 msgid "Ville"
 msgstr ""
 
@@ -246,6 +257,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:55
 #: ../../application/modules/opac/controllers/AbonneController.php:380
 #: ../../application/modules/opac/controllers/AbonneController.php:440
+#: ../../application/modules/opac/controllers/AbonneController.php:445
 msgid "Téléphone"
 msgstr ""
 
@@ -264,68 +276,81 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:66
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:70
 #: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:47
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
 msgid "Territoire"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:75
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:78
 msgid "Lien cartographique"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:82
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:81
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 msgid "Information"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:86
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:69
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
 msgid "Inscription"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:90
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
 msgid "Prêt"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:94
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
 msgid "Fonds"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:98
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
 msgid "Comment se procurer ce document "
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:102
 #: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:141
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
 msgid "Annexe"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:106
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:109
 msgid "Horaire"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:114
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:113
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
 msgid "Configuration"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:118
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
 msgid "Statut de la bib"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:122
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
 msgid "Adresse URL"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:126
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:129
 msgid "Interdire les réservations"
 msgstr ""
 
@@ -374,6 +399,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:44
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:38
 #: ../../library/ZendAfi/Form/Album.php:52
+#: ../../library/ZendAfi/Form/Admin/Formation.php:35
 msgid "Description"
 msgstr ""
 
@@ -563,6 +589,12 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:50
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:39
 #: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:11
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:51
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:32
+#: ../../library/ZendAfi/Form/Admin/News.php:40
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/SuggestionAchat.php:94
 msgid "Titre"
 msgstr ""
 
@@ -596,6 +628,7 @@ msgid "Info"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/planacces.phtml:187
+#: ../../library/Class/CustomField/Meta.php:50
 msgid "Texte"
 msgstr ""
 
@@ -803,6 +836,7 @@ msgstr ""
 #: ../../library/Class/Calendar.php:176
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:12
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:51
+#: ../../library/ZendAfi/Form/Admin/News.php:49
 msgid "Catégorie"
 msgstr ""
 
@@ -819,6 +853,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:29
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:18
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:81
+#: ../../library/ZendAfi/Form/Admin/News.php:54
+#: ../../library/ZendAfi/Form/Admin/News.php:102
 msgid "Publication"
 msgstr ""
 
@@ -830,6 +866,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:44
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:45
+#: ../../library/ZendAfi/Form/Admin/News.php:44
 msgid "Titre caché"
 msgstr ""
 
@@ -844,6 +881,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:110
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:83
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:105
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:35
 msgid "du"
 msgstr ""
 
@@ -859,6 +897,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:91
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:113
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:116
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:41
 msgid "au"
 msgstr ""
 
@@ -868,6 +907,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:112
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:108
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:103
+#: ../../library/ZendAfi/Form/Admin/News.php:62
 msgid "Agenda"
 msgstr ""
 
@@ -884,6 +924,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:152
 #: ../../library/Class/CustomFieldsCategory.php:85
 #: ../../library/Class/CustomField/ModelConfiguration/Article.php:26
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:35
+#: ../../library/ZendAfi/Form/Admin/News.php:105
 msgid "Article"
 msgstr ""
 
@@ -921,6 +963,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:175
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php:31
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php:29
+#: ../../library/ZendAfi/Form/Admin/News.php:114
 msgid "Options"
 msgstr ""
 
@@ -941,6 +984,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
 #: ../../library/ZendAfi/Form/Album.php:191
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:186
+#: ../../library/ZendAfi/Form/Admin/News.php:82
 msgid "Tags"
 msgstr ""
 
@@ -953,6 +997,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:199
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:177
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:193
+#: ../../library/ZendAfi/Form/Admin/News.php:87
 msgid "Autoriser les commentaires d'internautes (Mode blog) ?"
 msgstr ""
 
@@ -965,6 +1010,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:209
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:187
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:203
+#: ../../library/ZendAfi/Form/Admin/News.php:89
 msgid "Indexer l'article dans le catalogue ?"
 msgstr ""
 
@@ -1099,6 +1145,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:94
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:31
 msgid "Hauteur"
 msgstr ""
 
@@ -1233,6 +1280,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:356
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
 #: ../../library/Class/SuggestionAchat.php:81
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:34
+#: ../../library/Class/SuggestionAchat.php:102
 msgid "Commentaire"
 msgstr ""
 
@@ -1391,6 +1440,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/users/index.phtml:18
 #: ../../application/modules/opac/controllers/IndexController.php:88
 #: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../library/ZendAfi/Form/ContactForm.php:63
 msgid "Prénom"
 msgstr ""
 
@@ -1461,6 +1512,8 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
 #: ../../application/modules/telephone/controllers/AuthController.php:85
 #: ../../application/modules/telephone/controllers/AuthController.php:90
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:5
+#: ../../application/modules/telephone/controllers/AuthController.php:104
 msgid "Se connecter"
 msgstr ""
 
@@ -1488,6 +1541,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/admin/controllers/AuthController.php:39
+#: ../../application/modules/admin/controllers/AuthController.php:49
 msgid "Entrez votre nom d'utilisateur puis validez S.V.P."
 msgstr ""
 
@@ -1557,6 +1611,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AuthController.php:221
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:65
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:71
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:35
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:69
 msgid "Valider"
 msgstr ""
 
@@ -1811,6 +1867,7 @@ msgstr "Le code de sécurité n'est pas le bon"
 #: ../../application/modules/opac/controllers/AbonneController.php:178
 #: ../../application/modules/opac/controllers/AbonneController.php:181
 #: ../../application/modules/opac/controllers/AbonneController.php:182
+#: ../../application/modules/opac/controllers/AbonneController.php:180
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %d et %d caractères"
 msgstr ""
@@ -1822,6 +1879,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:180
 #: ../../application/modules/opac/controllers/AbonneController.php:183
 #: ../../application/modules/opac/controllers/AbonneController.php:184
+#: ../../application/modules/opac/controllers/AbonneController.php:182
 msgid "Il faut compléter tous les champs."
 msgstr ""
 
@@ -1956,6 +2014,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:335
 #: ../../application/modules/opac/controllers/AbonneController.php:340
 #: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:398
 msgid "Prêt prolongé"
 msgstr ""
 
@@ -1966,6 +2025,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:392
 #: ../../application/modules/opac/controllers/AbonneController.php:368
 #: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:440
 msgid "Pseudo"
 msgstr ""
 
@@ -1978,6 +2038,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:379
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../application/modules/opac/controllers/AbonneController.php:444
+#: ../../library/Class/SuggestionAchat.php:100
 msgid "E-Mail"
 msgstr ""
 
@@ -1989,6 +2051,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:385
 #: ../../application/modules/opac/controllers/AbonneController.php:404
 #: ../../application/modules/opac/controllers/AbonneController.php:464
+#: ../../application/modules/opac/controllers/AbonneController.php:469
 msgid "Nouveau mot de passe"
 msgstr ""
 
@@ -2000,6 +2063,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:389
 #: ../../application/modules/opac/controllers/AbonneController.php:408
 #: ../../application/modules/opac/controllers/AbonneController.php:468
+#: ../../application/modules/opac/controllers/AbonneController.php:473
 msgid "Vous devez confirmer le mot de passe"
 msgstr ""
 
@@ -2019,6 +2083,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:419
 #: ../../application/modules/opac/controllers/AbonneController.php:469
 #: ../../application/modules/opac/controllers/AbonneController.php:479
+#: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:484
 msgid "Les mots de passe ne correspondent pas"
 msgstr ""
 
@@ -2030,6 +2096,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:395
 #: ../../application/modules/opac/controllers/AbonneController.php:414
 #: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:479
 msgid "Confirmez le mot de passe"
 msgstr ""
 
@@ -2041,6 +2108,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:399
 #: ../../application/modules/opac/controllers/AbonneController.php:418
 #: ../../application/modules/opac/controllers/AbonneController.php:478
+#: ../../application/modules/opac/controllers/AbonneController.php:483
 msgid "Vous devez saisir un mot de passe"
 msgstr ""
 
@@ -2052,6 +2120,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:410
 #: ../../application/modules/opac/controllers/AbonneController.php:460
 #: ../../application/modules/opac/controllers/AbonneController.php:520
+#: ../../application/modules/opac/controllers/AbonneController.php:525
 msgid "Abonnement aux lettres d'information"
 msgstr ""
 
@@ -2086,6 +2155,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:268
 #: ../../application/modules/admin/controllers/BibController.php:265
 #: ../../application/modules/admin/controllers/BibController.php:247
+#: ../../application/modules/admin/controllers/BibController.php:252
 #, php-format
 msgid "Modifier la bibliothèque: %s"
 msgstr ""
@@ -2095,6 +2165,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:321
 #: ../../application/modules/admin/controllers/BibController.php:291
+#: ../../application/modules/admin/controllers/BibController.php:296
 #, php-format
 msgid "Fichier photo : %s"
 msgstr ""
@@ -2104,6 +2175,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:327
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:294
+#: ../../application/modules/admin/controllers/BibController.php:299
 msgid "Vous devez sélectionner une photo en cliquant sur le bouton : parcourir"
 msgstr ""
 
@@ -2126,6 +2198,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/UploadController.php:78
 #: ../../application/modules/admin/controllers/BibController.php:326
 #: ../../application/modules/admin/controllers/BibController.php:298
+#: ../../application/modules/admin/controllers/BibController.php:303
 msgid ""
 "Erreur au téléchargement du fichier : L'image que vous essayez de "
 "télécharger est trop volumineuse ou inaccessible."
@@ -2136,6 +2209,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:336
 #: ../../application/modules/admin/controllers/BibController.php:333
 #: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:310
 #, php-format
 msgid ""
 "La photo que vous avez sélectionnée doit être de type : 'image/jpg' et pas "
@@ -2147,6 +2221,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:337
 #: ../../application/modules/admin/controllers/BibController.php:334
 #: ../../application/modules/admin/controllers/BibController.php:307
+#: ../../application/modules/admin/controllers/BibController.php:312
 #, php-format
 msgid "La photo que vous avez sélectionnée est trop volumiseuse : %d ko"
 msgstr ""
@@ -2209,6 +2284,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
 #: ../../application/modules/admin/views/scripts/custom-fields-report/edit.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:36
 msgid "Retour"
 msgstr ""
 
@@ -2235,6 +2312,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:405
 #: ../../application/modules/admin/controllers/BibController.php:402
 #: ../../application/modules/admin/controllers/BibController.php:369
+#: ../../application/modules/admin/controllers/BibController.php:374
 #, php-format
 msgid "Localisations de la bibliothèque: %s"
 msgstr ""
@@ -2249,6 +2327,8 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:531
 #: ../../application/modules/admin/controllers/BibController.php:382
 #: ../../application/modules/admin/controllers/BibController.php:475
+#: ../../application/modules/admin/controllers/BibController.php:387
+#: ../../application/modules/admin/controllers/BibController.php:480
 msgid "le libellé est obligatoire."
 msgstr ""
 
@@ -2257,6 +2337,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:445
 #: ../../application/modules/admin/controllers/BibController.php:442
 #: ../../application/modules/admin/controllers/BibController.php:401
+#: ../../application/modules/admin/controllers/BibController.php:406
 msgid "** nouvelle localisation **"
 msgstr ""
 
@@ -2265,6 +2346,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:470
 #: ../../application/modules/admin/controllers/BibController.php:467
 #: ../../application/modules/admin/controllers/BibController.php:425
+#: ../../application/modules/admin/controllers/BibController.php:430
 msgid "Mise à jour de la localisation"
 msgstr ""
 
@@ -2273,6 +2355,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:518
 #: ../../application/modules/admin/controllers/BibController.php:515
 #: ../../application/modules/admin/controllers/BibController.php:463
+#: ../../application/modules/admin/controllers/BibController.php:468
 #, php-format
 msgid "Plans de la bibliothèque: %s"
 msgstr ""
@@ -2282,6 +2365,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:535
 #: ../../application/modules/admin/controllers/BibController.php:532
 #: ../../application/modules/admin/controllers/BibController.php:477
+#: ../../application/modules/admin/controllers/BibController.php:482
 msgid "L'image du plan est obligatoire."
 msgstr ""
 
@@ -2290,6 +2374,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:556
 #: ../../application/modules/admin/controllers/BibController.php:553
 #: ../../application/modules/admin/controllers/BibController.php:493
+#: ../../application/modules/admin/controllers/BibController.php:498
 msgid "** nouveau plan **"
 msgstr ""
 
@@ -2298,6 +2383,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:566
 #: ../../application/modules/admin/controllers/BibController.php:563
 #: ../../application/modules/admin/controllers/BibController.php:504
+#: ../../application/modules/admin/controllers/BibController.php:509
 #, php-format
 msgid "Ajouter un plan de la bibliothèque: %s"
 msgstr ""
@@ -2307,6 +2393,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:568
 #: ../../application/modules/admin/controllers/BibController.php:565
 #: ../../application/modules/admin/controllers/BibController.php:505
+#: ../../application/modules/admin/controllers/BibController.php:510
 #, php-format
 msgid "Modifier un plan de la bibliothèque: %s"
 msgstr ""
@@ -2377,6 +2464,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/CmsController.php:154
 #: ../../application/modules/opac/controllers/CmsController.php:170
 #: ../../application/modules/opac/controllers/CmsController.php:171
+#: ../../application/modules/opac/controllers/CmsController.php:172
 msgid "Derniers Articles"
 msgstr ""
 
@@ -2412,6 +2500,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/JavaController.php:71
 #: ../../application/modules/opac/controllers/JavaController.php:80
 #: ../../application/modules/opac/controllers/JavaController.php:66
+#: ../../application/modules/opac/controllers/JavaController.php:67
 msgid "Kiosque de notices"
 msgstr ""
 
@@ -2744,6 +2833,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:40
 #: ../../application/modules/opac/controllers/RssController.php:45
 #: ../../application/modules/opac/controllers/RssController.php:64
+#: ../../application/modules/opac/controllers/AbonneController.php:399
 msgid "Erreur"
 msgstr ""
 
@@ -2796,6 +2886,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:233
 #: ../../application/modules/opac/controllers/RssController.php:252
 #: ../../application/modules/opac/controllers/RssController.php:248
+#: ../../application/modules/opac/controllers/RssController.php:249
 msgid "Aucune donnée à modérer"
 msgstr ""
 
@@ -2814,6 +2905,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RssController.php:258
 #: ../../application/modules/opac/controllers/RssController.php:277
 #: ../../application/modules/opac/controllers/RssController.php:266
+#: ../../application/modules/opac/controllers/RssController.php:268
 #, php-format
 msgid "Critiques de la sélection: %s"
 msgstr ""
@@ -2985,6 +3077,10 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:48
 #: ../../library/Class/CriteresRecherche.php:107
 #: ../../library/Class/NoticeHtml.php:88
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:12
+#: ../../library/ZendAfi/Form/Admin/News.php:46
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/Class/SuggestionAchat.php:95
 msgid "Auteur"
 msgstr ""
 
@@ -3070,6 +3166,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:105
 #: ../../application/modules/opac/controllers/IndexController.php:104
 #: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../library/ZendAfi/Form/ContactForm.php:75
 msgid "E-mail"
 msgstr ""
 
@@ -3443,6 +3540,8 @@ msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:37
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:11
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:27
 msgid "Mars"
 msgstr ""
 
@@ -3452,11 +3551,15 @@ msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:10
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:39
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:13
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:29
 msgid "Mai"
 msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:11
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:40
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:14
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:30
 msgid "Juin"
 msgstr ""
 
@@ -3632,6 +3735,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:58
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:72
 msgid "Envoyer"
 msgstr ""
 
@@ -3995,6 +4099,9 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:163
 #: ../../library/Class/CriteresRecherche.php:108
 #: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/SuggestionAchat.php:96
 msgid "Type de document"
 msgstr ""
 
@@ -4568,6 +4675,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:40
 #: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:31
 #: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../library/ZendAfi/Form/ContactForm.php:80
 msgid "Sujet"
 msgstr ""
 
@@ -4877,6 +4985,7 @@ msgstr ""
 #: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:2
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 msgid "Recherche"
 msgstr ""
 
@@ -4926,6 +5035,7 @@ msgstr ""
 #: ../../library/Class/AvisNotice.php:276
 #: ../../library/Class/AvisNotice.php:311
 #: ../../library/Class/AvisNotice.php:245
+#: ../../library/Class/AvisNotice.php:244
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %s et %s caractères"
 msgstr ""
@@ -4934,6 +5044,7 @@ msgstr ""
 #: ../../library/Class/AvisNotice.php:278
 #: ../../library/Class/AvisNotice.php:313
 #: ../../library/Class/AvisNotice.php:249
+#: ../../library/Class/AvisNotice.php:248
 msgid "Vous devez saisir un titre"
 msgstr ""
 
@@ -4941,7 +5052,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:44 ../../library/Class/Bib.php:45
 #: ../../library/Class/Bib.php:76 ../../library/Class/Bib.php:95
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:126
-#: ../../library/Class/Bib.php:146
+#: ../../library/Class/Bib.php:146 ../../library/Class/Bib.php:166
 msgid "Invisible"
 msgstr ""
 
@@ -4949,7 +5060,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:45 ../../library/Class/Bib.php:46
 #: ../../library/Class/Bib.php:77 ../../library/Class/Bib.php:96
 #: ../../library/Class/Bib.php:116 ../../library/Class/Bib.php:127
-#: ../../library/Class/Bib.php:147
+#: ../../library/Class/Bib.php:147 ../../library/Class/Bib.php:167
 msgid "N'envoie pas de données"
 msgstr ""
 
@@ -4957,7 +5068,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:46 ../../library/Class/Bib.php:47
 #: ../../library/Class/Bib.php:78 ../../library/Class/Bib.php:97
 #: ../../library/Class/Bib.php:117 ../../library/Class/Bib.php:128
-#: ../../library/Class/Bib.php:148
+#: ../../library/Class/Bib.php:148 ../../library/Class/Bib.php:168
 msgid "Envoie des données"
 msgstr ""
 
@@ -4965,7 +5076,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:112 ../../library/Class/Bib.php:130
 #: ../../library/Class/Bib.php:161 ../../library/Class/Bib.php:189
 #: ../../library/Class/Bib.php:204 ../../library/Class/Bib.php:220
-#: ../../library/Class/Bib.php:240
+#: ../../library/Class/Bib.php:240 ../../library/Class/Bib.php:260
 msgid "Vous devez compléter le champ 'Nom'"
 msgstr ""
 
@@ -4973,7 +5084,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:133
 #: ../../library/Class/Bib.php:164 ../../library/Class/Bib.php:192
 #: ../../library/Class/Bib.php:207 ../../library/Class/Bib.php:223
-#: ../../library/Class/Bib.php:243
+#: ../../library/Class/Bib.php:243 ../../library/Class/Bib.php:263
 msgid "Vous devez compléter le champ 'Ville'"
 msgstr ""
 
@@ -4981,7 +5092,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:165 ../../library/Class/Bib.php:182
 #: ../../library/Class/Bib.php:213 ../../library/Class/Bib.php:241
 #: ../../library/Class/Bib.php:256 ../../library/Class/Bib.php:272
-#: ../../library/Class/Bib.php:292
+#: ../../library/Class/Bib.php:292 ../../library/Class/Bib.php:312
 msgid "Toutes"
 msgstr ""
 
@@ -5815,6 +5926,7 @@ msgstr ""
 #: ../../library/Class/NoticeHtml.php:819
 #: ../../library/Class/NoticeHtml.php:691
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:40
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:114
 msgid "Donnez ou modifiez votre avis"
 msgstr ""
 
@@ -5826,6 +5938,7 @@ msgstr ""
 #: ../../library/Class/NoticeHtml.php:742
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:90
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:86
 msgid "Aucun avis pour le moment"
 msgstr ""
 
@@ -5852,6 +5965,7 @@ msgstr ""
 #: ../../library/Class/Users.php:351 ../../library/Class/Users.php:495
 #: ../../library/Class/Users.php:562 ../../library/Class/Users.php:643
 #: ../../library/Class/Users.php:765 ../../library/Class/Users.php:816
+#: ../../library/Class/Users.php:823
 msgid "Vous devez compléter le champ 'Identifiant'"
 msgstr ""
 
@@ -5860,6 +5974,7 @@ msgstr ""
 #: ../../library/Class/Users.php:352 ../../library/Class/Users.php:496
 #: ../../library/Class/Users.php:563 ../../library/Class/Users.php:644
 #: ../../library/Class/Users.php:766 ../../library/Class/Users.php:817
+#: ../../library/Class/Users.php:824
 msgid "Le champ 'Identifiant' doit être inférieur à 50 caractères"
 msgstr ""
 
@@ -5868,6 +5983,7 @@ msgstr ""
 #: ../../library/Class/Users.php:356 ../../library/Class/Users.php:500
 #: ../../library/Class/Users.php:567 ../../library/Class/Users.php:648
 #: ../../library/Class/Users.php:770 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:828
 msgid "L'identifiant que vous avez choisi existe déjà."
 msgstr ""
 
@@ -5876,6 +5992,7 @@ msgstr ""
 #: ../../library/Class/Users.php:359 ../../library/Class/Users.php:503
 #: ../../library/Class/Users.php:570 ../../library/Class/Users.php:651
 #: ../../library/Class/Users.php:773 ../../library/Class/Users.php:824
+#: ../../library/Class/Users.php:831
 msgid "Vous devez compléter le champ 'Mot de passe'"
 msgstr ""
 
@@ -5892,6 +6009,7 @@ msgstr ""
 #: ../../library/Class/Users.php:364 ../../library/Class/Users.php:508
 #: ../../library/Class/Users.php:575 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:778 ../../library/Class/Users.php:830
+#: ../../library/Class/Users.php:837
 #, php-format
 msgid "La bibliothèque est obligatoire pour le rôle : %s"
 msgstr ""
@@ -5901,6 +6019,7 @@ msgstr ""
 #: ../../library/Class/Users.php:369 ../../library/Class/Users.php:513
 #: ../../library/Class/Users.php:580 ../../library/Class/Users.php:661
 #: ../../library/Class/Users.php:783 ../../library/Class/Users.php:835
+#: ../../library/Class/Users.php:842
 msgid ""
 "Le numéro de carte est obligatoire pour les abonnés identifiés dans un sigb."
 msgstr ""
@@ -5910,6 +6029,7 @@ msgstr ""
 #: ../../library/Class/Users.php:409 ../../library/Class/Users.php:556
 #: ../../library/Class/Users.php:623 ../../library/Class/Users.php:711
 #: ../../library/Class/Users.php:833 ../../library/Class/Users.php:868
+#: ../../library/Class/Users.php:875
 msgid "Cet identifiant existe déjà."
 msgstr ""
 
@@ -5974,6 +6094,8 @@ msgstr ""
 #: ../../library/Class/Users.php:446 ../../library/Class/Users.php:592
 #: ../../library/Class/Users.php:659 ../../library/Class/Users.php:747
 #: ../../library/Class/Users.php:870 ../../library/Class/Users.php:885
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:1
+#: ../../library/Class/Users.php:892
 msgid "Bonjour,"
 msgstr ""
 
@@ -6015,6 +6137,8 @@ msgstr ""
 #: ../../library/Class/Users.php:452 ../../library/Class/Users.php:598
 #: ../../library/Class/Users.php:665 ../../library/Class/Users.php:753
 #: ../../library/Class/Users.php:876 ../../library/Class/Users.php:888
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:30
+#: ../../library/Class/Users.php:895
 msgid ""
 "Si vous n'êtes pas à l'origine de cette demande d'inscription, merci de ne "
 "pas tenir compte de cet e-mail, et l'inscription ne sera pas activée."
@@ -6033,6 +6157,7 @@ msgstr ""
 #: ../../library/Class/Users.php:507 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:723 ../../library/Class/Users.php:811
 #: ../../library/Class/Users.php:924 ../../library/Class/Users.php:940
+#: ../../library/Class/Users.php:947
 msgid "Vous avez fait une demande de mot de passe sur le portail."
 msgstr ""
 
@@ -6055,6 +6180,7 @@ msgstr ""
 #: ../../library/Class/Users.php:510 ../../library/Class/Users.php:659
 #: ../../library/Class/Users.php:726 ../../library/Class/Users.php:814
 #: ../../library/Class/Users.php:927 ../../library/Class/Users.php:943
+#: ../../library/Class/Users.php:950
 msgid "Bonne navigation sur le portail"
 msgstr ""
 
@@ -6063,6 +6189,7 @@ msgstr ""
 #: ../../library/Class/Users.php:515 ../../library/Class/Users.php:666
 #: ../../library/Class/Users.php:733 ../../library/Class/Users.php:821
 #: ../../library/Class/Users.php:934 ../../library/Class/Users.php:950
+#: ../../library/Class/Users.php:957
 msgid "Un mail vient de vous être envoyé avec vos paramètres de connexion."
 msgstr ""
 
@@ -6071,6 +6198,7 @@ msgstr ""
 #: ../../library/Class/Users.php:561 ../../library/Class/Users.php:768
 #: ../../library/Class/Users.php:838 ../../library/Class/Users.php:926
 #: ../../library/Class/Users.php:1053 ../../library/Class/Users.php:1069
+#: ../../library/Class/Users.php:1076
 msgid ""
 "Vous devez vous connecter en tant qu'abonné de la bibliothèque pour obtenir "
 "plus d'informations."
@@ -6154,6 +6282,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../library/ZendAfi/Form/Admin/News.php:146
 msgid "Statut"
 msgstr ""
 
@@ -6452,6 +6581,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:7
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:8
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:45
 msgid "Fermer"
 msgstr ""
 
@@ -6474,6 +6604,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/TreeView.php:36
 #: ../../library/ZendAfi/View/Helper/TreeView.php:65
 #: ../../library/ZendAfi/View/Helper/TreeView.php:71
+#: ../../library/ZendAfi/View/Helper/Calendar/RenderFilters.php:88
 msgid "Tous"
 msgstr ""
 
@@ -6484,6 +6615,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/CmsController.php:48
 #: ../../application/modules/admin/controllers/UsergroupController.php:28
 #: ../../application/modules/admin/controllers/UsergroupController.php:48
+#: ../../application/modules/admin/controllers/CmsController.php:64
 msgid " Ajouter une catégorie"
 msgstr ""
 
@@ -6734,6 +6866,7 @@ msgid "Copier le code suivant sur le site où vous voulez afficher le kiosque"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/formation/index.phtml:5
+#: ../../application/modules/admin/controllers/FormationController.php:37
 msgid "Ajouter une formation"
 msgstr ""
 
@@ -6767,6 +6900,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:124
 #: ../../application/modules/opac/controllers/IndexController.php:116
 #: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../library/ZendAfi/Form/ContactForm.php:84
 msgid "Message"
 msgstr ""
 
@@ -6775,6 +6909,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:128
 #: ../../application/modules/opac/controllers/IndexController.php:127
+#: ../../library/ZendAfi/Form/ContactForm.php:101
 msgid "Vos coordonnées"
 msgstr ""
 
@@ -6782,6 +6917,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:141
 #: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../library/ZendAfi/Form/ContactForm.php:52
 msgid "Votre message"
 msgstr ""
 
@@ -6821,6 +6957,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
 #: ../../application/modules/admin/controllers/FormationController.php:38
+#: ../../application/modules/admin/controllers/FormationController.php:60
 msgid "Formations"
 msgstr ""
 
@@ -6885,6 +7022,9 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:832
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:77
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:67
+#: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../library/ZendAfi/Form/Admin/News.php:76
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:73
 msgid "Lieu"
 msgstr ""
 
@@ -6982,6 +7122,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:634
 #: ../../application/modules/opac/controllers/AbonneController.php:666
 #: ../../application/modules/opac/controllers/AbonneController.php:726
+#: ../../application/modules/opac/controllers/AbonneController.php:731
 msgid "Vous avez déjà une réservation dans ce créneau horaire"
 msgstr ""
 
@@ -6989,6 +7130,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:178
 #: ../../application/modules/opac/controllers/IndexController.php:170
 #: ../../application/modules/opac/controllers/IndexController.php:149
+#: ../../application/modules/opac/controllers/IndexController.php:92
 msgid ""
 "destinataire non configuré. Vérifiez les paramètres du profil, champ 'E-mail "
 "du webmestre'"
@@ -7046,6 +7188,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
 #: ../../application/modules/opac/controllers/AbonneController.php:773
 #: ../../application/modules/opac/controllers/AbonneController.php:833
+#: ../../application/modules/opac/controllers/AbonneController.php:838
 msgid "Jour"
 msgstr ""
 
@@ -7070,6 +7213,7 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:8
 #: ../../application/modules/opac/controllers/AbonneController.php:776
 #: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/opac/controllers/AbonneController.php:841
 msgid "Poste"
 msgstr ""
 
@@ -7100,6 +7244,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:774
 #: ../../application/modules/opac/controllers/AbonneController.php:834
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:89
+#: ../../application/modules/opac/controllers/AbonneController.php:839
 msgid "Horaires"
 msgstr ""
 
@@ -7143,11 +7288,13 @@ msgstr ""
 
 #: ../../application/modules/telephone/controllers/AuthController.php:77
 #: ../../application/modules/telephone/controllers/AuthController.php:74
+#: ../../application/modules/telephone/controllers/AuthController.php:88
 msgid "N° de carte"
 msgstr ""
 
 #: ../../application/modules/telephone/controllers/AuthController.php:81
 #: ../../application/modules/telephone/controllers/AuthController.php:75
+#: ../../application/modules/telephone/controllers/AuthController.php:89
 msgid "Mot de passe ou date de naissance"
 msgstr ""
 
@@ -7286,6 +7433,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RechercheController.php:546
 #: ../../application/modules/opac/controllers/RechercheController.php:505
 #: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:517
 msgid "Réservation"
 msgstr ""
 
@@ -7355,6 +7503,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:745
 #: ../../application/modules/opac/controllers/AbonneController.php:777
 #: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../application/modules/opac/controllers/AbonneController.php:842
 msgid "Confirmation"
 msgstr ""
 
@@ -7366,13 +7515,13 @@ msgstr ""
 
 #: ../../library/Class/Users.php:516 ../../library/Class/Users.php:583
 #: ../../library/Class/Users.php:664 ../../library/Class/Users.php:786
-#: ../../library/Class/Users.php:838
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:845
 msgid "Vous n'avez pas les droits suffisants pour suivre une formation"
 msgstr ""
 
 #: ../../library/Class/Users.php:519 ../../library/Class/Users.php:586
 #: ../../library/Class/Users.php:667 ../../library/Class/Users.php:789
-#: ../../library/Class/Users.php:841
+#: ../../library/Class/Users.php:841 ../../library/Class/Users.php:848
 msgid "Vous n'avez pas les droits suffisants pour diriger une formation"
 msgstr ""
 
@@ -7383,7 +7532,7 @@ msgstr ""
 
 #: ../../library/Class/Users.php:657 ../../library/Class/Users.php:724
 #: ../../library/Class/Users.php:812 ../../library/Class/Users.php:925
-#: ../../library/Class/Users.php:941
+#: ../../library/Class/Users.php:941 ../../library/Class/Users.php:948
 #, php-format
 msgid "Votre identifiant : %s\n"
 msgstr ""
@@ -7500,6 +7649,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:41
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:40
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:44
 msgid "Se désinscrire"
 msgstr ""
 
@@ -7511,6 +7661,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:36
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:35
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:47
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:65
 msgid "S'inscrire"
 msgstr ""
 
@@ -7537,11 +7689,14 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:41
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:44
 msgid "Compte"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:42
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:45
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:48
 msgid "Complet"
 msgstr ""
 
@@ -7632,6 +7787,8 @@ msgstr "Doit être plus grand que '%fieldToCompare%'"
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:76
 #: ../../application/modules/admin/controllers/CmsController.php:259
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:77
+#: ../../application/modules/admin/controllers/CmsController.php:247
+#: ../../library/ZendAfi/Form/Admin/News.php:185
 msgid "Aucun"
 msgstr ""
 
@@ -7951,14 +8108,17 @@ msgid "Javascript"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:1
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:2
 msgid "Modération des suggestions d'achat"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:4
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:6
 msgid "Aucune suggestion à modérer"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:13
 msgid "N° abonné"
 msgstr ""
 
@@ -7995,54 +8155,63 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:556
 #: ../../application/modules/opac/controllers/AbonneController.php:588
 #: ../../application/modules/opac/controllers/AbonneController.php:648
+#: ../../application/modules/opac/controllers/AbonneController.php:653
 msgid "Vous n'êtes pas autorisé à effectuer une réservation"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:559
 #: ../../application/modules/opac/controllers/AbonneController.php:591
 #: ../../application/modules/opac/controllers/AbonneController.php:651
+#: ../../application/modules/opac/controllers/AbonneController.php:656
 msgid "Quota déjà atteint ce jour, choisissez un autre jour."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:562
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:654
+#: ../../application/modules/opac/controllers/AbonneController.php:659
 msgid "Quota déjà atteint cette semaine, choisissez une autre semaine."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:565
 #: ../../application/modules/opac/controllers/AbonneController.php:597
 #: ../../application/modules/opac/controllers/AbonneController.php:657
+#: ../../application/modules/opac/controllers/AbonneController.php:662
 msgid "Quota déjà atteint ce mois, choisissez un autre mois."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:639
 #: ../../application/modules/opac/controllers/AbonneController.php:671
 #: ../../application/modules/opac/controllers/AbonneController.php:731
+#: ../../application/modules/opac/controllers/AbonneController.php:736
 msgid "Ce créneau n'est pas dans les heures d'ouverture."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:659
 #: ../../application/modules/opac/controllers/AbonneController.php:691
 #: ../../application/modules/opac/controllers/AbonneController.php:751
+#: ../../application/modules/opac/controllers/AbonneController.php:756
 msgid "À partir de quelle heure ?"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:661
 #: ../../application/modules/opac/controllers/AbonneController.php:693
 #: ../../application/modules/opac/controllers/AbonneController.php:753
+#: ../../application/modules/opac/controllers/AbonneController.php:758
 msgid "Pour quelle durée ?"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:664
 #: ../../application/modules/opac/controllers/AbonneController.php:696
 #: ../../application/modules/opac/controllers/AbonneController.php:756
+#: ../../application/modules/opac/controllers/AbonneController.php:761
 msgid "Choisir"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:743
 #: ../../application/modules/opac/controllers/AbonneController.php:775
 #: ../../application/modules/opac/controllers/AbonneController.php:835
+#: ../../application/modules/opac/controllers/AbonneController.php:840
 msgid "Secteur"
 msgstr ""
 
@@ -8155,29 +8324,36 @@ msgid "Formulaires"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:58
+#: ../../library/Class/SuggestionAchat.php:62
 msgid "Titre ou commentaire requis"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:76
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:97
 msgid "ISBN"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:77
+#: ../../library/Class/SuggestionAchat.php:98
 msgid "Lien"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:78
+#: ../../library/Class/SuggestionAchat.php:99
 msgid "Demandeur"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../library/Class/SuggestionAchat.php:80
+#: ../../library/Class/SuggestionAchat.php:101
 msgid "N° carte abonné"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:87
 #: ../../library/Class/SuggestionAchat.php:88
+#: ../../library/Class/SuggestionAchat.php:109
 msgid "Suggestion d'achat: "
 msgstr ""
 
@@ -8262,21 +8438,25 @@ msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:38
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
 msgid "Lien internet vers une description"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:42
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:44
 msgid "Code-barres / ISBN"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:52
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:50
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:66
 msgid "Informations sur le document"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:70
 msgid "Pourquoi suggérez-vous ce document ?"
 msgstr ""
 
@@ -8348,6 +8528,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:43
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:218
+#: ../../library/ZendAfi/Form/Admin/News.php:222
 msgid "Indexation"
 msgstr ""
 
@@ -8368,6 +8549,7 @@ msgid "Avis:"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:18
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:33
 msgid "Suggestion d'achat:"
 msgstr ""
 
@@ -8399,12 +8581,14 @@ msgstr ""
 #: ../../application/modules/admin/controllers/ProfilController.php:532
 #: ../../application/modules/admin/controllers/ProfilController.php:543
 #: ../../application/modules/admin/controllers/ProfilController.php:545
+#: ../../application/modules/admin/controllers/ProfilController.php:544
 msgid "Menu horizontal dupliqué sur tous les autres profils."
 msgstr ""
 
 #: ../../application/modules/admin/controllers/ProfilController.php:539
 #: ../../application/modules/admin/controllers/ProfilController.php:550
 #: ../../application/modules/admin/controllers/ProfilController.php:552
+#: ../../application/modules/admin/controllers/ProfilController.php:551
 msgid "Configuration des pages appliquée à tous les autres profils."
 msgstr ""
 
@@ -8655,16 +8839,19 @@ msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:450
 #: ../../application/modules/opac/controllers/AbonneController.php:510
+#: ../../application/modules/opac/controllers/AbonneController.php:515
 msgid " par courrier postal"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:451
 #: ../../application/modules/opac/controllers/AbonneController.php:511
+#: ../../application/modules/opac/controllers/AbonneController.php:516
 msgid " par E-Mail"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:452
 #: ../../application/modules/opac/controllers/AbonneController.php:512
+#: ../../application/modules/opac/controllers/AbonneController.php:517
 msgid " par SMS"
 msgstr ""
 
@@ -8673,6 +8860,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/ModoController.php:679
 #: ../../application/modules/admin/controllers/ModoController.php:747
 #: ../../application/modules/opac/controllers/AbonneController.php:896
+#: ../../application/modules/opac/controllers/AbonneController.php:901
 msgid "Aucun courriel envoyé, erreur: "
 msgstr ""
 
@@ -9056,17 +9244,17 @@ msgid "Le champ 'Url' doit être inférieur à 250 caractères"
 msgstr ""
 
 #: ../../library/Class/Users.php:671 ../../library/Class/Users.php:793
-#: ../../library/Class/Users.php:845
+#: ../../library/Class/Users.php:845 ../../library/Class/Users.php:852
 msgid "Vous devez fournir une adresse mail valide"
 msgstr ""
 
 #: ../../library/Class/Users.php:674 ../../library/Class/Users.php:796
-#: ../../library/Class/Users.php:848
+#: ../../library/Class/Users.php:848 ../../library/Class/Users.php:855
 msgid "Vous devez saisir un numéro de téléphone"
 msgstr ""
 
 #: ../../library/Class/Users.php:813 ../../library/Class/Users.php:926
-#: ../../library/Class/Users.php:942
+#: ../../library/Class/Users.php:942 ../../library/Class/Users.php:949
 #, php-format
 msgid "Votre mot de passe : %s\n"
 msgstr ""
@@ -9142,6 +9330,9 @@ msgstr ""
 #: ../../application/modules/opac/views/scripts/error/404.phtml:4
 #: ../../application/modules/opac/controllers/CmsController.php:124
 #: ../../application/modules/opac/controllers/CmsController.php:125
+#: ../../application/modules/opac/controllers/CmsController.php:121
+#: ../../application/modules/opac/controllers/CmsController.php:126
+#: ../../application/modules/telephone/views/scripts/error/404.phtml:4
 msgid "Désolé, cette page n'existe pas"
 msgstr ""
 
@@ -9160,6 +9351,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:41
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:18
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:32
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:33
 msgid "Généralités"
 msgstr ""
 
@@ -9215,11 +9407,13 @@ msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
 #: ../../application/modules/opac/controllers/RechercheController.php:589
+#: ../../application/modules/opac/controllers/RechercheController.php:591
 msgid "Lieu de mise à disposition demandé"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AuthController.php:86
 #: ../../application/modules/opac/controllers/AuthController.php:89
+#: ../../application/modules/telephone/controllers/AuthController.php:43
 msgid "Connexion"
 msgstr ""
 
@@ -9295,6 +9489,7 @@ msgid "Propriété du bloc des exemplaires"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/CmsController.php:71
+#: ../../application/modules/admin/controllers/CmsController.php:87
 msgid "Mise à jour des articles"
 msgstr ""
 
@@ -9304,12 +9499,14 @@ msgid "Dupliquer l'article: "
 msgstr ""
 
 #: ../../application/modules/admin/controllers/CmsController.php:397
+#: ../../application/modules/admin/controllers/CmsController.php:385
 #, php-format
 msgid "Supprimer l'article : %s"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/ModulesController.php:299
 #: ../../application/modules/admin/controllers/ModulesController.php:306
+#: ../../application/modules/admin/controllers/ModulesController.php:310
 msgid "Sélectionnez un panier ou un domaine"
 msgstr ""
 
@@ -9329,6 +9526,7 @@ msgid "Aucun courriel envoyé, erreur: le formulaire n'existe plus"
 msgstr ""
 
 #: ../../application/modules/admin/controllers/BibController.php:256
+#: ../../application/modules/admin/controllers/BibController.php:261
 #, php-format
 msgid "Supprimer la bibliothèque: %s"
 msgstr ""
@@ -9454,15 +9652,18 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:82
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:21
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:54
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:55
 msgid "Style de boite"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:63
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:61
 msgid "Choisissez le domaine de départ"
 msgstr ""
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:67
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:91
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:64
 msgid "Format"
 msgstr ""
 
@@ -9640,6 +9841,7 @@ msgid "dans le panier:&nbsp;"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/CalendarContent.php:84
+#: ../../library/ZendAfi/View/Helper/CalendarContent.php:94
 msgid "Prochains évènements"
 msgstr ""
 
@@ -9657,6 +9859,7 @@ msgid "Date de création"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
 msgid "Lien Internet vers une description"
 msgstr ""
 
@@ -9695,42 +9898,55 @@ msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:76
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:81
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:78
 msgid "Ajouter un nouvel article"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:35
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:9
 msgid "Jan"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:36
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:10
 msgid "Fév"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:38
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:12
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:28
 msgid "Avril"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:41
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:15
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:31
 msgid "Juillet"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:42
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:16
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:32
 msgid "Août"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:43
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:17
 msgid "Sept"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:44
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:18
 msgid "Oct"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:45
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:19
 msgid "Nov"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:46
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:20
 msgid "Déc"
 msgstr ""
 
@@ -9821,10 +10037,12 @@ msgid "Reservation limit reached for $this->is document type"
 msgstr ""
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Oui"
 msgstr ""
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Non"
 msgstr ""
 
@@ -9835,10 +10053,12 @@ msgid ""
 msgstr ""
 
 #: ../../library/Class/Users.php:1304 ../../library/Class/Users.php:1320
+#: ../../library/Class/Users.php:1328
 msgid "Mes paniers"
 msgstr ""
 
 #: ../../library/Class/Users.php:1337 ../../library/Class/Users.php:1353
+#: ../../library/Class/Users.php:1361
 msgid "Mes paniers rattachés à un domaine"
 msgstr ""
 
@@ -10128,6 +10348,7 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Admin/TagCustomFields.php:31
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:257
 #: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsValuesUrl.php:43
+#: ../../library/ZendAfi/Form/Admin/News.php:214
 msgid "Champs personnalisés"
 msgstr ""
 
@@ -10214,6 +10435,7 @@ msgid "Vous avez été déconnecté"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:542
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -10221,6 +10443,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:542
+#: ../../application/modules/opac/controllers/RechercheController.php:544
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -10228,6 +10451,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:325
 #, php-format
 msgid "Modifier l'avis \"%s\""
 msgstr ""
@@ -10483,15 +10707,15 @@ msgstr ""
 msgid "Envoie des newsletters"
 msgstr ""
 
-#: ../../library/Class/Users.php:826
+#: ../../library/Class/Users.php:826 ../../library/Class/Users.php:833
 msgid "Le champ 'Mot de passe' doit être inférieur à 255 caractères"
 msgstr ""
 
-#: ../../library/Class/Users.php:886
+#: ../../library/Class/Users.php:886 ../../library/Class/Users.php:893
 msgid "Vous avez fait une demande d'inscription sur le portail:"
 msgstr ""
 
-#: ../../library/Class/Users.php:887
+#: ../../library/Class/Users.php:887 ../../library/Class/Users.php:894
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant:"
 msgstr ""
 
@@ -10503,6 +10727,7 @@ msgstr ""
 
 #: ../../library/Class/CustomFieldsCategory.php:61
 #: ../../library/Class/CustomField/ModelConfiguration/Formation.php:26
+#: ../../library/ZendAfi/Form/Admin/Formation.php:40
 msgid "Formation"
 msgstr ""
 
@@ -10532,6 +10757,7 @@ msgid "Champ zone de texte"
 msgstr ""
 
 #: ../../library/Class/CustomField/Meta.php:60
+#: ../../library/Class/CustomField/Meta.php:53
 msgid "Liste d'options"
 msgstr ""
 
@@ -10544,3 +10770,266 @@ msgstr ""
 #, php-format
 msgid "Réserver %s"
 msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:3
+msgid "Vous devez vous identifier pour vous désinscrire de la newsletter: "
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register.phtml:8
+msgid "J'ai déjà un compte."
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:4
+msgid "Vous avez fait une demande d'inscription à la lettre d'information:"
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:7
+msgid "Un compte vous a été créé automatiquement."
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:10
+msgid ""
+"Celui-ci vous permet de vous connecter en temps qu'invité et de vous "
+"désincrire de la newsletter."
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:13
+msgid "Votre identifiant: "
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:16
+msgid "Votre mot de passe: "
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:19
+msgid "Pour valider l'abonnement, merci de cliquer sur le lien suivant:"
+msgstr ""
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:33
+msgid ""
+"Pour vous désinscrire de la lettre d'information, merci de cliquer sur le "
+"lien suivant:"
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+msgid "Votre prêt a bien été prolongé."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:267
+msgid "Inscription à la lettre d'information: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:277
+msgid ""
+"Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le "
+"compte qui utilise cet email."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:284
+msgid "Demande d'inscription à la lettre d'information: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:301
+msgid ""
+"Une erreur est survenue à l'envoi du mail de confirmation. Veuillez "
+"réessayer. Si le problème persiste, veuillez contacter votre médiathèque."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:305
+msgid ""
+"Une demande de confirmation d'inscription vous a été envoyée à l'adresse "
+"mail renseignée."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:323
+msgid "Désinscription de la lettre d'information: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:347
+msgid "Confirmation d'inscription à la newsletter: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:350
+msgid "Inscription à la newsletter invalide."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid "Vous avez bien été abonné à la newsletter: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid " avec l'adresse suivante: "
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:357
+msgid "Erreur lors de l\\inscription à la newsletter."
+msgstr ""
+
+#: ../../application/modules/admin/views/scripts/cms/_traduction_navigator.phtml:3
+msgid "Traductions:"
+msgstr ""
+
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:63
+msgid "Mail suggestions"
+msgstr ""
+
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:15
+msgid "Bibliothèque de destination"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:35
+#, php-format
+msgid "Article \"%s\" sauvegardé"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:36
+#, php-format
+msgid "L'article \"%s\" a été sauvegardé"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:37
+#, php-format
+msgid "Article \"%s\" supprimé"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:39
+msgid "Ajouter un article"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:209
+#, php-format
+msgid "Dupliquer l'article: %s"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:32
+#, php-format
+msgid "Formation \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:33
+#, php-format
+msgid "La formation \"%s\" a été sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:34
+#, php-format
+msgid "Formation \"%s\" supprimée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:38
+#, php-format
+msgid "Modifier la formation: %s"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:32
+#, php-format
+msgid "Session \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:33
+#, php-format
+msgid "La session \"%s\" a été sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:34
+#, php-format
+msgid "Session \"%s\" supprimée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:37
+msgid "Ajouter une session"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:38
+#, php-format
+msgid "Modifier la session: %s"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:29
+msgid "Votre adresse e-mail"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/ContactForm.php:40
+msgid "Choisissez votre bibliothèque"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:39
+#: ../../library/ZendAfi/Form/Admin/News.php:108
+msgid "Résumé pour l'affichage dans les boîtes"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/Admin/News.php:73
+msgid "L'évenement dure toute la journée"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/Admin/News.php:83
+msgid ""
+"Entrez la liste des mots-clefs et expressions qui caractérisent votre "
+"article séparés par ;"
+msgstr ""
+
+#: ../../library/ZendAfi/Form/Admin/News.php:158
+msgid "Message d'explication du refus."
+msgstr ""
+
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:27
+msgid "Boite"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:25
+msgid "Janvier"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:26
+msgid "Février"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:33
+msgid "Septembre"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:34
+msgid "Octobre"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:35
+msgid "Novembre"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:36
+msgid "Décembre"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:46
+msgid "Filtres activés"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:47
+msgid "Filtres disponibles"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au livre numérique"
+msgstr ""
+
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:33
+msgid "Accéder au livre numérique"
+msgstr ""
+
+#: ../../library/Class/SuggestionAchat.php:75
+msgid "Type de document requis"
+msgstr ""
+
+#: ../../library/Class/CustomField/Meta.php:51
+msgid "Zone de texte simple"
+msgstr ""
+
+#: ../../library/Class/CustomField/Meta.php:52
+msgid "Zone de texte HTML"
+msgstr ""
+
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:72
+msgid "Mois"
+msgstr ""
diff --git a/library/translation/ro.mo b/library/translation/ro.mo
index cd1e87d07020205ac61cb4002bd981a990b5cb04..6cb98c7ddd2110644c91308bd48bb7a86e75c3a3 100644
Binary files a/library/translation/ro.mo and b/library/translation/ro.mo differ
diff --git a/library/translation/ro.po b/library/translation/ro.po
index c8c95a6b0afad5bf2105404f42c54e9e55d0dd6d..010ddd337f09542a9ad2bd90c9bb0b1099894caa 100644
--- a/library/translation/ro.po
+++ b/library/translation/ro.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-08-11 14:22+0200\n"
+"POT-Creation-Date: 2014-10-02 16:13+0200\n"
 "PO-Revision-Date: 2011-07-14 18:15+0200\n"
 "Last-Translator: Lupu Mariana <lupumariana@yahoo.com>\n"
 "Language-Team: Romanian\n"
@@ -36,6 +36,7 @@ msgstr "(căutare avansată prin triere în funcţie de pertinenţă)"
 #: ../../application/modules/admin/controllers/CmsController.php:48
 #: ../../application/modules/admin/controllers/UsergroupController.php:28
 #: ../../application/modules/admin/controllers/UsergroupController.php:48
+#: ../../application/modules/admin/controllers/CmsController.php:64
 msgid " Ajouter une catégorie"
 msgstr "Adaugă o categorie"
 
@@ -82,6 +83,10 @@ msgstr "CoÅŸurile dvs."
 msgid " aux lettres d'information: "
 msgstr "la buletinele informative:"
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid " avec l'adresse suivante: "
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:343
 #: ../../application/modules/opac/controllers/RechercheController.php:363
 #: ../../application/modules/opac/controllers/RechercheController.php:382
@@ -151,17 +156,20 @@ msgstr "sau"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:451
 #: ../../application/modules/opac/controllers/AbonneController.php:511
+#: ../../application/modules/opac/controllers/AbonneController.php:516
 #, fuzzy
 msgid " par E-Mail"
 msgstr "E-Mail"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:452
 #: ../../application/modules/opac/controllers/AbonneController.php:512
+#: ../../application/modules/opac/controllers/AbonneController.php:517
 msgid " par SMS"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:450
 #: ../../application/modules/opac/controllers/AbonneController.php:510
+#: ../../application/modules/opac/controllers/AbonneController.php:515
 msgid " par courrier postal"
 msgstr ""
 
@@ -423,6 +431,7 @@ msgstr "(acest comentariu a fost semnalat moderatorilor)"
 #: ../../application/modules/admin/controllers/BibController.php:556
 #: ../../application/modules/admin/controllers/BibController.php:553
 #: ../../application/modules/admin/controllers/BibController.php:493
+#: ../../application/modules/admin/controllers/BibController.php:498
 msgid "** nouveau plan **"
 msgstr "** nou plan **"
 
@@ -455,6 +464,7 @@ msgstr "** nouă informaţie **"
 #: ../../application/modules/admin/controllers/BibController.php:445
 #: ../../application/modules/admin/controllers/BibController.php:442
 #: ../../application/modules/admin/controllers/BibController.php:401
+#: ../../application/modules/admin/controllers/BibController.php:406
 msgid "** nouvelle localisation **"
 msgstr "** nouă localizare **"
 
@@ -625,6 +635,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:410
 #: ../../application/modules/opac/controllers/AbonneController.php:460
 #: ../../application/modules/opac/controllers/AbonneController.php:520
+#: ../../application/modules/opac/controllers/AbonneController.php:525
 msgid "Abonnement aux lettres d'information"
 msgstr "Abonament la buletinele informative"
 
@@ -672,6 +683,7 @@ msgstr "Vizualizarea scrisorii:"
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/ComboProfils.php:114
 #: ../../library/Class/MoteurRecherche.php:415
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
 msgid "Accueil"
 msgstr "Pagină iniţială"
 
@@ -701,6 +713,11 @@ msgstr "Acces la Cosmogramă "
 msgid "Accéder au document Numérique Premium"
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:33
+#, fuzzy
+msgid "Accéder au livre numérique"
+msgstr "Resurse OAI"
+
 #: ../../application/modules/admin/views/scripts/users/index.phtml:19
 #: ../../application/modules/admin/views/scripts/users/index.phtml:21
 msgid "Action"
@@ -762,6 +779,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/IndexController.php:94
 #: ../../application/modules/opac/controllers/IndexController.php:93
 #: ../../application/modules/opac/controllers/AbonneController.php:436
+#: ../../application/modules/opac/controllers/AbonneController.php:441
+#: ../../library/ZendAfi/Form/ContactForm.php:67
 msgid "Adresse"
 msgstr "Adresă "
 
@@ -772,6 +791,7 @@ msgstr "Adresă:"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:122
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
 msgid "Adresse URL"
 msgstr "Adresă URL"
 
@@ -947,6 +967,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:112
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:108
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:103
+#: ../../library/ZendAfi/Form/Admin/News.php:62
 msgid "Agenda"
 msgstr "Agendă"
 
@@ -1049,6 +1070,11 @@ msgstr "Adaugă instrucţiunea în coş"
 msgid "Ajouter les utilisateurs sélectionnés"
 msgstr "Vedeţi fluxurile RSS selectate"
 
+#: ../../application/modules/admin/controllers/CmsController.php:39
+#, fuzzy
+msgid "Ajouter un article"
+msgstr "Adaugă o localizare"
+
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:4
 #: ../../application/modules/admin/views/scripts/opds/index.phtml:5
 msgid "Ajouter un catalogue"
@@ -1085,6 +1111,7 @@ msgstr "Adaugă un meniu"
 
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:76
 #: ../../library/ZendAfi/View/Helper/Accueil/News.php:81
+#: ../../library/ZendAfi/View/Helper/Accueil/News.php:78
 #, fuzzy
 msgid "Ajouter un nouvel article"
 msgstr "Adaugă o localizare"
@@ -1098,6 +1125,7 @@ msgstr "Adaugă un plan "
 #: ../../application/modules/admin/controllers/BibController.php:566
 #: ../../application/modules/admin/controllers/BibController.php:563
 #: ../../application/modules/admin/controllers/BibController.php:504
+#: ../../application/modules/admin/controllers/BibController.php:509
 #, php-format
 msgid "Ajouter un plan de la bibliothèque: %s"
 msgstr "Adaugă un plan al bibliotecii: %s"
@@ -1152,6 +1180,7 @@ msgid "Ajouter une collection"
 msgstr "Adaugă o colecţie"
 
 #: ../../application/modules/admin/views/scripts/formation/index.phtml:5
+#: ../../application/modules/admin/controllers/FormationController.php:37
 #, fuzzy
 msgid "Ajouter une formation"
 msgstr "Adaugă o localizare"
@@ -1175,6 +1204,11 @@ msgstr "Adaugă o categorie"
 msgid "Ajouter une relation"
 msgstr "Adaugă o localizare"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:37
+#, fuzzy
+msgid "Ajouter une session"
+msgstr "Adaugă o localizare"
+
 #: ../../application/modules/admin/views/scripts/batch/index.phtml:4
 #, fuzzy
 msgid "Ajouter une tâche"
@@ -1230,6 +1264,7 @@ msgstr "Animaţie"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:102
 #: ../../application/modules/admin/views/scripts/bib/localisationsmaj.phtml:141
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
 msgid "Annexe"
 msgstr "Anexă"
 
@@ -1314,6 +1349,8 @@ msgid "Aout"
 msgstr "August"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:42
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:16
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:32
 msgid "Août"
 msgstr ""
 
@@ -1366,9 +1403,21 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:152
 #: ../../library/Class/CustomFieldsCategory.php:85
 #: ../../library/Class/CustomField/ModelConfiguration/Article.php:26
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:35
+#: ../../library/ZendAfi/Form/Admin/News.php:105
 msgid "Article"
 msgstr "Articol"
 
+#: ../../application/modules/admin/controllers/CmsController.php:35
+#, php-format
+msgid "Article \"%s\" sauvegardé"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/CmsController.php:37
+#, fuzzy, php-format
+msgid "Article \"%s\" supprimé"
+msgstr "Rezervări în curs"
+
 #: ../../library/ZendAfi/View/Helper/admin/MenuGaucheAdmin.php:24
 #: ../../library/Class/NoticeHtml.php:222
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:24
@@ -1403,6 +1452,8 @@ msgstr "Atenţie..."
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:76
 #: ../../application/modules/admin/controllers/CmsController.php:259
 #: ../../library/ZendAfi/View/Helper/Abonne/Resume.php:77
+#: ../../application/modules/admin/controllers/CmsController.php:247
+#: ../../library/ZendAfi/Form/Admin/News.php:185
 #, fuzzy
 msgid "Aucun"
 msgstr "nici o"
@@ -1439,6 +1490,7 @@ msgstr "Nici o  părere pentru %s"
 #: ../../library/Class/NoticeHtml.php:742
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:90
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:93
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:86
 msgid "Aucun avis pour le moment"
 msgstr "Nici o  părere pentru moment"
 
@@ -1464,6 +1516,7 @@ msgstr "Nici un conţinut"
 #: ../../application/modules/admin/controllers/ModoController.php:679
 #: ../../application/modules/admin/controllers/ModoController.php:747
 #: ../../application/modules/opac/controllers/AbonneController.php:896
+#: ../../application/modules/opac/controllers/AbonneController.php:901
 msgid "Aucun courriel envoyé, erreur: "
 msgstr ""
 
@@ -1582,6 +1635,7 @@ msgstr "Nici o dată de localizare nu a fost găsită pentru acest exemplar"
 #: ../../application/modules/opac/controllers/RssController.php:233
 #: ../../application/modules/opac/controllers/RssController.php:252
 #: ../../application/modules/opac/controllers/RssController.php:248
+#: ../../application/modules/opac/controllers/RssController.php:249
 msgid "Aucune donnée à modérer"
 msgstr "Nici o dată de moderat"
 
@@ -1641,6 +1695,7 @@ msgid "Aucune réservation"
 msgstr "Moderare"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:4
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:6
 #, fuzzy
 msgid "Aucune suggestion à modérer"
 msgstr "Nici o dată de moderat"
@@ -1704,6 +1759,10 @@ msgstr "Nu a fost găsită nici o înregistrare video"
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:48
 #: ../../library/Class/CriteresRecherche.php:107
 #: ../../library/Class/NoticeHtml.php:88
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:12
+#: ../../library/ZendAfi/Form/Admin/News.php:46
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/Class/SuggestionAchat.php:95
 msgid "Auteur"
 msgstr "Autor"
 
@@ -1769,6 +1828,7 @@ msgstr "Identificare"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:199
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:177
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:193
+#: ../../library/ZendAfi/Form/Admin/News.php:87
 msgid "Autoriser les commentaires d'internautes (Mode blog) ?"
 msgstr "Autorizaţi comentariile utilizatorilor (Mod blog) ?"
 
@@ -1851,6 +1911,8 @@ msgid "Avr."
 msgstr "Aprilie"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:38
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:12
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:28
 #, fuzzy
 msgid "Avril"
 msgstr "aprilie"
@@ -1954,6 +2016,8 @@ msgstr "Bibliografii"
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:45
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:46
 #: ../../application/modules/opac/views/scripts/abonne/prets.phtml:23
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:14
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:54
 msgid "Bibliothèque"
 msgstr "Bibliotecă"
 
@@ -1961,6 +2025,11 @@ msgstr "Bibliotecă"
 msgid "Bibliothèque : "
 msgstr "Bibliotecă :"
 
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:15
+#, fuzzy
+msgid "Bibliothèque de destination"
+msgstr "Bibliotecă :"
+
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:29
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:71
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:73
@@ -2060,6 +2129,10 @@ msgstr ""
 msgid "Bloc fermé"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:27
+msgid "Boite"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:117
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:126
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:173
@@ -2088,6 +2161,8 @@ msgstr "Căsuţă setări iniţiale pentru diviziune"
 #: ../../library/Class/Users.php:446 ../../library/Class/Users.php:592
 #: ../../library/Class/Users.php:659 ../../library/Class/Users.php:747
 #: ../../library/Class/Users.php:870 ../../library/Class/Users.php:885
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:1
+#: ../../library/Class/Users.php:892
 msgid "Bonjour,"
 msgstr "Bună ziua,"
 
@@ -2096,6 +2171,7 @@ msgstr "Bună ziua,"
 #: ../../library/Class/Users.php:510 ../../library/Class/Users.php:659
 #: ../../library/Class/Users.php:726 ../../library/Class/Users.php:814
 #: ../../library/Class/Users.php:927 ../../library/Class/Users.php:943
+#: ../../library/Class/Users.php:950
 msgid "Bonne navigation sur le portail"
 msgstr "Navigare plăcută pe portal"
 
@@ -2185,6 +2261,7 @@ msgstr "Cataloguri tineret"
 #: ../../library/Class/Calendar.php:176
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:12
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:51
+#: ../../library/ZendAfi/Form/Admin/News.php:49
 msgid "Catégorie"
 msgstr "Categorie"
 
@@ -2210,6 +2287,7 @@ msgstr "Cauză"
 #: ../../application/modules/opac/controllers/AbonneController.php:639
 #: ../../application/modules/opac/controllers/AbonneController.php:671
 #: ../../application/modules/opac/controllers/AbonneController.php:731
+#: ../../application/modules/opac/controllers/AbonneController.php:736
 msgid "Ce créneau n'est pas dans les heures d'ouverture."
 msgstr ""
 
@@ -2246,6 +2324,12 @@ msgstr "Acest coÅŸ este gol"
 msgid "Ceci apparaîtra sous le nom de votre site dans les moteurs de recherche"
 msgstr "Se va afişa sub numele site-ului dvs. în motoarele de cautare"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:10
+msgid ""
+"Celui-ci vous permet de vous connecter en temps qu'invité et de vous "
+"désincrire de la newsletter."
+msgstr ""
+
 #: ../../library/Class/Codification.php:102
 #: ../../library/Class/Codification.php:104
 #: ../../library/Class/Codification.php:105
@@ -2288,6 +2372,7 @@ msgstr ""
 #: ../../library/Class/Users.php:409 ../../library/Class/Users.php:556
 #: ../../library/Class/Users.php:623 ../../library/Class/Users.php:711
 #: ../../library/Class/Users.php:833 ../../library/Class/Users.php:868
+#: ../../library/Class/Users.php:875
 msgid "Cet identifiant existe déjà."
 msgstr "Acest nume de utilizator există deja."
 
@@ -2364,6 +2449,7 @@ msgstr "Câmpuri disponibile"
 #: ../../library/ZendAfi/View/Helper/Admin/TagCustomFields.php:31
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:257
 #: ../../library/ZendAfi/View/Helper/Admin/CustomFieldsValuesUrl.php:43
+#: ../../library/ZendAfi/Form/Admin/News.php:214
 #, fuzzy
 msgid "Champs personnalisés"
 msgstr "Câmpuri selectate"
@@ -2434,6 +2520,7 @@ msgstr "Încărcare în curs"
 #: ../../application/modules/opac/controllers/AbonneController.php:664
 #: ../../application/modules/opac/controllers/AbonneController.php:696
 #: ../../application/modules/opac/controllers/AbonneController.php:756
+#: ../../application/modules/opac/controllers/AbonneController.php:761
 msgid "Choisir"
 msgstr ""
 
@@ -2443,6 +2530,7 @@ msgid "Choisir des medias"
 msgstr "Alegeţi media"
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:63
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:61
 msgid "Choisissez le domaine de départ"
 msgstr ""
 
@@ -2451,6 +2539,11 @@ msgstr ""
 msgid "Choisissez les formations à afficher"
 msgstr "Modificare titlu coÅŸ"
 
+#: ../../library/ZendAfi/Form/ContactForm.php:40
+#, fuzzy
+msgid "Choisissez votre bibliothèque"
+msgstr "Localizare a bibliotecii: %s"
+
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:3
 #: ../../application/modules/admin/views/scripts/index/adminvar.phtml:26
 msgid "Clef"
@@ -2503,11 +2596,14 @@ msgstr "Cod Anti-spam"
 #: ../../application/modules/opac/controllers/IndexController.php:97
 #: ../../application/modules/opac/controllers/IndexController.php:96
 #: ../../application/modules/opac/controllers/AbonneController.php:437
+#: ../../application/modules/opac/controllers/AbonneController.php:442
+#: ../../library/ZendAfi/Form/ContactForm.php:69
 msgid "Code postal"
 msgstr "Cod poÅŸtal"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:42
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:40
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:44
 msgid "Code-barres / ISBN"
 msgstr ""
 
@@ -2562,6 +2658,7 @@ msgstr "ÈŠncepe cu"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:98
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:101
 msgid "Comment se procurer ce document "
 msgstr "Cum să obţii acest document"
 
@@ -2578,6 +2675,8 @@ msgstr "Cum să obţii acest document"
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:356
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
 #: ../../library/Class/SuggestionAchat.php:81
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:34
+#: ../../library/Class/SuggestionAchat.php:102
 msgid "Commentaire"
 msgstr "Comentariu"
 
@@ -2591,6 +2690,7 @@ msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:42
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:45
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:48
 msgid "Complet"
 msgstr ""
 
@@ -2605,6 +2705,8 @@ msgstr ""
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:41
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:16
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:44
 msgid "Compte"
 msgstr ""
 
@@ -2615,12 +2717,14 @@ msgstr "Condiţii de înscriere"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:114
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:113
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
 msgid "Configuration"
 msgstr "Configurare"
 
 #: ../../application/modules/admin/controllers/ProfilController.php:539
 #: ../../application/modules/admin/controllers/ProfilController.php:550
 #: ../../application/modules/admin/controllers/ProfilController.php:552
+#: ../../application/modules/admin/controllers/ProfilController.php:551
 msgid "Configuration des pages appliquée à tous les autres profils."
 msgstr ""
 
@@ -2633,10 +2737,16 @@ msgstr "Constituire a planului de acces"
 #: ../../application/modules/opac/controllers/AbonneController.php:745
 #: ../../application/modules/opac/controllers/AbonneController.php:777
 #: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../application/modules/opac/controllers/AbonneController.php:842
 #, fuzzy
 msgid "Confirmation"
 msgstr "Configurare"
 
+#: ../../application/modules/opac/controllers/AuthController.php:347
+#, fuzzy
+msgid "Confirmation d'inscription à la newsletter: "
+msgstr "Condiţii de înscriere"
+
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:45
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:13
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:64
@@ -2661,6 +2771,7 @@ msgstr "Confirmare parolă"
 #: ../../application/modules/opac/controllers/AbonneController.php:395
 #: ../../application/modules/opac/controllers/AbonneController.php:414
 #: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:479
 msgid "Confirmez le mot de passe"
 msgstr "Confirmaţi parola"
 
@@ -2676,6 +2787,7 @@ msgstr "Confirmare parolă"
 
 #: ../../application/modules/opac/controllers/AuthController.php:86
 #: ../../application/modules/opac/controllers/AuthController.php:89
+#: ../../application/modules/telephone/controllers/AuthController.php:43
 #, fuzzy
 msgid "Connexion"
 msgstr "Căsuţă de conectare"
@@ -2849,6 +2961,7 @@ msgstr "Critici redactate de %s"
 #: ../../application/modules/opac/controllers/RssController.php:258
 #: ../../application/modules/opac/controllers/RssController.php:277
 #: ../../application/modules/opac/controllers/RssController.php:266
+#: ../../application/modules/opac/controllers/RssController.php:268
 #, php-format
 msgid "Critiques de la sélection: %s"
 msgstr "Critici ale selecţiei"
@@ -3032,6 +3145,11 @@ msgstr ""
 msgid "De B à A"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:284
+#, fuzzy
+msgid "Demande d'inscription à la lettre d'information: "
+msgstr "la buletinul informativ"
+
 #: ../../application/modules/opac/views/scripts/recherche/reservation.phtml:5
 msgid "Demande de réservation d'un document du réseau:"
 msgstr "Cerere de rezervare a unui document din reţea:"
@@ -3067,6 +3185,7 @@ msgid "Demandes d'inscription"
 msgstr "Cereri de înscriere"
 
 #: ../../library/Class/SuggestionAchat.php:78
+#: ../../library/Class/SuggestionAchat.php:99
 msgid "Demandeur"
 msgstr ""
 
@@ -3076,6 +3195,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/CmsController.php:154
 #: ../../application/modules/opac/controllers/CmsController.php:170
 #: ../../application/modules/opac/controllers/CmsController.php:171
+#: ../../application/modules/opac/controllers/CmsController.php:172
 msgid "Derniers Articles"
 msgstr "Ultimele Articole"
 
@@ -3154,6 +3274,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Album.php:44
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:38
 #: ../../library/ZendAfi/Form/Album.php:52
+#: ../../library/ZendAfi/Form/Admin/Formation.php:35
 msgid "Description"
 msgstr "Descriere"
 
@@ -3337,6 +3458,7 @@ msgstr "Cataloguri dinamice"
 #: ../../library/Class/NoticeHtml.php:819
 #: ../../library/Class/NoticeHtml.php:691
 #: ../../library/ZendAfi/View/Helper/Notice/Avis.php:40
+#: ../../library/ZendAfi/View/Helper/Notice/Avis.php:114
 msgid "Donnez ou modifiez votre avis"
 msgstr "Exprimaţi-vă sau modificaţi-vă părerea"
 
@@ -3380,6 +3502,11 @@ msgstr ""
 msgid "Dupliquer l'article: "
 msgstr "Ultimele articole"
 
+#: ../../application/modules/admin/controllers/CmsController.php:209
+#, fuzzy, php-format
+msgid "Dupliquer l'article: %s"
+msgstr "Ultimele articole"
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:9
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-confirm.phtml:10
@@ -3413,6 +3540,7 @@ msgid "Début matinée"
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:46
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:20
 #, fuzzy
 msgid "Déc"
 msgstr "Dec."
@@ -3421,6 +3549,11 @@ msgstr "Dec."
 msgid "Déc."
 msgstr "Dec."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:36
+#, fuzzy
+msgid "Décembre"
+msgstr "decembrie"
+
 #: ../../application/modules/admin/controllers/LieuController.php:29
 #: ../../application/modules/admin/views/scripts/lieu/index.phtml:4
 msgid "Déclarer un nouveau lieu"
@@ -3448,9 +3581,17 @@ msgstr "defilare la dreapta"
 msgid "Dépouillements"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:323
+#, fuzzy
+msgid "Désinscription de la lettre d'information: "
+msgstr "la buletinul informativ"
+
 #: ../../application/modules/opac/views/scripts/error/404.phtml:4
 #: ../../application/modules/opac/controllers/CmsController.php:124
 #: ../../application/modules/opac/controllers/CmsController.php:125
+#: ../../application/modules/opac/controllers/CmsController.php:121
+#: ../../application/modules/opac/controllers/CmsController.php:126
+#: ../../application/modules/telephone/views/scripts/error/404.phtml:4
 msgid "Désolé, cette page n'existe pas"
 msgstr ""
 
@@ -3473,6 +3614,8 @@ msgstr "Validare selecţie"
 #: ../../application/modules/opac/controllers/AbonneController.php:379
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../application/modules/opac/controllers/AbonneController.php:444
+#: ../../library/Class/SuggestionAchat.php:100
 msgid "E-Mail"
 msgstr "E-Mail"
 
@@ -3487,6 +3630,7 @@ msgstr "E-Mail"
 #: ../../application/modules/opac/controllers/IndexController.php:105
 #: ../../application/modules/opac/controllers/IndexController.php:104
 #: ../../application/modules/opac/controllers/AuthController.php:198
+#: ../../library/ZendAfi/Form/ContactForm.php:75
 msgid "E-mail"
 msgstr "E-mail"
 
@@ -3646,6 +3790,15 @@ msgstr ""
 "Introduceţi lista cuvintelor-cheie şi a expresiilor care caracterizează site-"
 "ul dvs. separate de virgule."
 
+#: ../../library/ZendAfi/Form/Admin/News.php:83
+#, fuzzy
+msgid ""
+"Entrez la liste des mots-clefs et expressions qui caractérisent votre "
+"article séparés par ;"
+msgstr ""
+"Introduceţi lista cuvintelor-cheie şi a expresiilor care caracterizează site-"
+"ul dvs. separate de virgule."
+
 #: ../../application/modules/opac/controllers/AuthController.php:30
 #: ../../application/modules/opac/controllers/AuthController.php:48
 #: ../../application/modules/opac/controllers/AuthController.php:68
@@ -3667,6 +3820,7 @@ msgid "Entrez votre mot de passe S.V.P."
 msgstr "Introduceţi parola"
 
 #: ../../application/modules/admin/controllers/AuthController.php:39
+#: ../../application/modules/admin/controllers/AuthController.php:49
 msgid "Entrez votre nom d'utilisateur puis validez S.V.P."
 msgstr "Vă rugăm să introduceţi numele de utilizator şi apoi să validaţi "
 
@@ -3690,7 +3844,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:46 ../../library/Class/Bib.php:47
 #: ../../library/Class/Bib.php:78 ../../library/Class/Bib.php:97
 #: ../../library/Class/Bib.php:117 ../../library/Class/Bib.php:128
-#: ../../library/Class/Bib.php:148
+#: ../../library/Class/Bib.php:148 ../../library/Class/Bib.php:168
 msgid "Envoie des données"
 msgstr "Trimite date"
 
@@ -3703,6 +3857,7 @@ msgstr "Trimite date"
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:58
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:52
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:72
 msgid "Envoyer"
 msgstr "Trimiteţi"
 
@@ -3733,6 +3888,7 @@ msgstr "Trimiteţi"
 #: ../../application/modules/opac/controllers/RssController.php:40
 #: ../../application/modules/opac/controllers/RssController.php:45
 #: ../../application/modules/opac/controllers/RssController.php:64
+#: ../../application/modules/opac/controllers/AbonneController.php:399
 msgid "Erreur"
 msgstr "Eroare"
 
@@ -3760,6 +3916,7 @@ msgstr "Eroare la transferul fişierului către fişierele utilizatorilor"
 #: ../../application/modules/opac/controllers/UploadController.php:78
 #: ../../application/modules/admin/controllers/BibController.php:326
 #: ../../application/modules/admin/controllers/BibController.php:298
+#: ../../application/modules/admin/controllers/BibController.php:303
 msgid ""
 "Erreur au téléchargement du fichier : L'image que vous essayez de "
 "télécharger est trop volumineuse ou inaccessible."
@@ -3793,6 +3950,10 @@ msgstr "Eroare de configurare"
 msgid "Erreur lors de l'enregistrement de la vignette"
 msgstr ""
 
+#: ../../application/modules/opac/controllers/AuthController.php:357
+msgid "Erreur lors de l\\inscription à la newsletter."
+msgstr ""
+
 #: ../../library/Class/AlbumRessource.php:278
 #: ../../library/Class/AlbumRessource.php:318
 #: ../../library/Class/AlbumRessource.php:327
@@ -4017,6 +4178,7 @@ msgstr "Tip de document"
 #: ../../application/modules/opac/views/scripts/panier/creation-panier-success.phtml:7
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:8
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:16
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:45
 msgid "Fermer"
 msgstr "ÃŽnchidere"
 
@@ -4052,6 +4214,7 @@ msgstr "FiÅŸier"
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:321
 #: ../../application/modules/admin/controllers/BibController.php:291
+#: ../../application/modules/admin/controllers/BibController.php:296
 #, php-format
 msgid "Fichier photo : %s"
 msgstr "FiÅŸier fotografie : %s"
@@ -4102,6 +4265,16 @@ msgstr "Filtrează"
 msgid "Filtrer par statut : "
 msgstr "Filtrează în funcţie de statut"
 
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:46
+#, fuzzy
+msgid "Filtres activés"
+msgstr "Filtrează"
+
+#: ../../library/ZendAfi/View/Helper/FormSortableConnectLists.php:47
+#, fuzzy
+msgid "Filtres disponibles"
+msgstr "Câmpuri disponibile"
+
 #: ../../application/modules/admin/views/scripts/multimedia/holds.phtml:5
 msgid "Fin"
 msgstr ""
@@ -4121,27 +4294,41 @@ msgstr "Acţiune"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:94
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:97
 msgid "Fonds"
 msgstr "Fonduri"
 
 #: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:67
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:91
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:64
 #, fuzzy
 msgid "Format"
 msgstr "Informaţie"
 
 #: ../../library/Class/CustomFieldsCategory.php:61
 #: ../../library/Class/CustomField/ModelConfiguration/Formation.php:26
+#: ../../library/ZendAfi/Form/Admin/Formation.php:40
 #, fuzzy
 msgid "Formation"
 msgstr "Informaţie"
 
+#: ../../application/modules/admin/controllers/FormationController.php:32
+#, php-format
+msgid "Formation \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/FormationController.php:34
+#, fuzzy, php-format
+msgid "Formation \"%s\" supprimée"
+msgstr "Rezervări în curs"
+
 #: ../../application/modules/opac/views/scripts/abonne/formations.phtml:2
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:36
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:63
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:67
 #: ../../library/ZendAfi/View/Helper/Admin/MenuGaucheAdmin.php:90
 #: ../../application/modules/admin/controllers/FormationController.php:38
+#: ../../application/modules/admin/controllers/FormationController.php:60
 #, fuzzy
 msgid "Formations"
 msgstr "Informaţie"
@@ -4177,6 +4364,7 @@ msgid "Formulaires"
 msgstr "Orar"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:36
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:10
 #, fuzzy
 msgid "Fév"
 msgstr "Feb."
@@ -4185,6 +4373,11 @@ msgstr "Feb."
 msgid "Fév."
 msgstr "Feb."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:26
+#, fuzzy
+msgid "Février"
+msgstr "februarie"
+
 #: ../../library/Class/Codification.php:103
 #: ../../library/Class/MoteurRecherche.php:349
 #: ../../library/Class/Codification.php:105
@@ -4265,6 +4458,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:41
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:18
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:32
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:33
 msgid "Généralités"
 msgstr ""
 
@@ -4325,6 +4519,7 @@ msgstr "Sus"
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:94
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:141
 #: ../../application/modules/admin/views/scripts/profil/_formProfil.phtml:144
+#: ../../library/ZendAfi/Form/Album/DisplayDiaporama.php:31
 msgid "Hauteur"
 msgstr "Înălţime"
 
@@ -4335,6 +4530,7 @@ msgstr "specificaţia conţine"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:106
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:105
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:109
 msgid "Horaire"
 msgstr "Orar"
 
@@ -4346,6 +4542,7 @@ msgstr "Orar"
 #: ../../application/modules/opac/controllers/AbonneController.php:774
 #: ../../application/modules/opac/controllers/AbonneController.php:834
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:89
+#: ../../application/modules/opac/controllers/AbonneController.php:839
 #, fuzzy
 msgid "Horaires"
 msgstr "Orar"
@@ -4361,6 +4558,8 @@ msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:76
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:33
+#: ../../library/Class/SuggestionAchat.php:97
 msgid "ISBN"
 msgstr ""
 
@@ -4429,6 +4628,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:180
 #: ../../application/modules/opac/controllers/AbonneController.php:183
 #: ../../application/modules/opac/controllers/AbonneController.php:184
+#: ../../application/modules/opac/controllers/AbonneController.php:182
 msgid "Il faut compléter tous les champs."
 msgstr "Trebuie completate toate câmpurile"
 
@@ -4544,6 +4744,7 @@ msgstr "Imposibil de găsit această adresă"
 #: ../../application/modules/admin/views/scripts/sito/sitoform.phtml:43
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:202
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:218
+#: ../../library/ZendAfi/Form/Admin/News.php:222
 #, fuzzy
 msgid "Indexation"
 msgstr "Identificare"
@@ -4557,6 +4758,7 @@ msgstr "Identificare"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:209
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:187
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:203
+#: ../../library/ZendAfi/Form/Admin/News.php:89
 msgid "Indexer l'article dans le catalogue ?"
 msgstr "Se indexează articolul din catalog?"
 
@@ -4598,6 +4800,7 @@ msgstr "Info"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:82
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:81
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 msgid "Information"
 msgstr "Informaţie"
 
@@ -4611,6 +4814,7 @@ msgstr "Informaţie"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:52
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:50
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:66
 #, fuzzy
 msgid "Informations sur le document"
 msgstr "Informaţie"
@@ -4636,9 +4840,19 @@ msgstr "Vizualizare instrucţiuni"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:86
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:85
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:69
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
 msgid "Inscription"
 msgstr "ÃŽnscriere"
 
+#: ../../application/modules/opac/controllers/AuthController.php:267
+#, fuzzy
+msgid "Inscription à la lettre d'information: "
+msgstr "la buletinul informativ"
+
+#: ../../application/modules/opac/controllers/AuthController.php:350
+msgid "Inscription à la newsletter invalide."
+msgstr ""
+
 #: ../../application/modules/admin/controllers/FormationController.php:333
 #: ../../library/ZendAfi/View/Helper/Admin/FormationSubscribers.php:62
 #, fuzzy
@@ -4657,6 +4871,7 @@ msgstr "Interzicere linkuri outbound"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:126
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:125
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:129
 msgid "Interdire les réservations"
 msgstr "Interzicerea rezervărilor"
 
@@ -4672,7 +4887,7 @@ msgstr "Tip dat invalid, valoarea trebuie să fie un şir"
 #: ../../library/Class/Bib.php:44 ../../library/Class/Bib.php:45
 #: ../../library/Class/Bib.php:76 ../../library/Class/Bib.php:95
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:126
-#: ../../library/Class/Bib.php:146
+#: ../../library/Class/Bib.php:146 ../../library/Class/Bib.php:166
 msgid "Invisible"
 msgstr "Invizibil"
 
@@ -4680,7 +4895,12 @@ msgstr "Invizibil"
 msgid "Isbn"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register.phtml:8
+msgid "J'ai déjà un compte."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:35
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:9
 #, fuzzy
 msgid "Jan"
 msgstr "Ian."
@@ -4689,6 +4909,11 @@ msgstr "Ian."
 msgid "Janv."
 msgstr "Ian."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:25
+#, fuzzy
+msgid "Janvier"
+msgstr "ianuarie"
+
 #: ../../application/modules/telephone/views/scripts/recherche/grandeimage.phtml:2
 msgid "Jaquette"
 msgstr ""
@@ -4707,6 +4932,7 @@ msgstr "Obiecte java-script"
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:5
 #: ../../application/modules/opac/controllers/AbonneController.php:773
 #: ../../application/modules/opac/controllers/AbonneController.php:833
+#: ../../application/modules/opac/controllers/AbonneController.php:838
 msgid "Jour"
 msgstr ""
 
@@ -4715,12 +4941,16 @@ msgid "Juil."
 msgstr "Iul."
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:41
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:15
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:31
 #, fuzzy
 msgid "Juillet"
 msgstr "iulie"
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:11
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:40
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:14
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:30
 msgid "Juin"
 msgstr "Iun."
 
@@ -4729,6 +4959,7 @@ msgstr "Iun."
 #: ../../application/modules/opac/controllers/JavaController.php:71
 #: ../../application/modules/opac/controllers/JavaController.php:80
 #: ../../application/modules/opac/controllers/JavaController.php:66
+#: ../../application/modules/opac/controllers/JavaController.php:67
 msgid "Kiosque de notices"
 msgstr "Chioşc de instrucţiuni"
 
@@ -4766,6 +4997,11 @@ msgstr "Adresa e-mail este invalidă sau este deja utilizată."
 msgid "L'album \"%s\" a été créé"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/CmsController.php:36
+#, fuzzy, php-format
+msgid "L'article \"%s\" a été sauvegardé"
+msgstr "Nu a fost găsit nici un articol"
+
 #: ../../application/modules/opac/controllers/AbonneController.php:70
 #: ../../application/modules/opac/controllers/AbonneController.php:74
 #: ../../application/modules/opac/controllers/AbonneController.php:99
@@ -4773,6 +5009,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:178
 #: ../../application/modules/opac/controllers/AbonneController.php:181
 #: ../../application/modules/opac/controllers/AbonneController.php:182
+#: ../../application/modules/opac/controllers/AbonneController.php:180
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %d et %d caractères"
 msgstr ""
@@ -4782,6 +5019,7 @@ msgstr ""
 #: ../../library/Class/AvisNotice.php:276
 #: ../../library/Class/AvisNotice.php:311
 #: ../../library/Class/AvisNotice.php:245
+#: ../../library/Class/AvisNotice.php:244
 #, php-format
 msgid "L'avis doit avoir une longueur comprise entre %s et %s caractères"
 msgstr ""
@@ -4792,6 +5030,7 @@ msgstr ""
 #: ../../library/Class/Users.php:356 ../../library/Class/Users.php:500
 #: ../../library/Class/Users.php:567 ../../library/Class/Users.php:648
 #: ../../library/Class/Users.php:770 ../../library/Class/Users.php:821
+#: ../../library/Class/Users.php:828
 msgid "L'identifiant que vous avez choisi existe déjà."
 msgstr "Numele de utilizator ales există deja."
 
@@ -4800,6 +5039,7 @@ msgstr "Numele de utilizator ales există deja."
 #: ../../application/modules/admin/controllers/BibController.php:535
 #: ../../application/modules/admin/controllers/BibController.php:532
 #: ../../application/modules/admin/controllers/BibController.php:477
+#: ../../application/modules/admin/controllers/BibController.php:482
 msgid "L'image du plan est obligatoire."
 msgstr "Imaginea planului este obligatorie."
 
@@ -4817,6 +5057,10 @@ msgstr ""
 msgid "L'utilisateur n'a pas renseigné son adresse e-mail."
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/News.php:73
+msgid "L'évenement dure toute la journée"
+msgstr ""
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:131
 msgid "L'évènement dure toute la journée"
 msgstr ""
@@ -4832,6 +5076,7 @@ msgstr "Biblioteca conţine %s instrucţiuni."
 #: ../../library/Class/Users.php:364 ../../library/Class/Users.php:508
 #: ../../library/Class/Users.php:575 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:778 ../../library/Class/Users.php:830
+#: ../../library/Class/Users.php:837
 #, php-format
 msgid "La bibliothèque est obligatoire pour le rôle : %s"
 msgstr "Biblioteca este obligatorie pentru rol : %s"
@@ -4857,6 +5102,11 @@ msgstr ""
 msgid "La catégorie \"%s\" a été sauvegardée"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/FormationController.php:33
+#, fuzzy, php-format
+msgid "La formation \"%s\" a été sauvegardée"
+msgstr "Nu a fost găsită nici o informaţie"
+
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:6
 #: ../../application/modules/opac/views/scripts/panier/ajout-ajax-success.phtml:14
 #, fuzzy
@@ -4872,6 +5122,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:336
 #: ../../application/modules/admin/controllers/BibController.php:333
 #: ../../application/modules/admin/controllers/BibController.php:305
+#: ../../application/modules/admin/controllers/BibController.php:310
 #, php-format
 msgid ""
 "La photo que vous avez sélectionnée doit être de type : 'image/jpg' et pas "
@@ -4885,6 +5136,7 @@ msgstr ""
 #: ../../application/modules/admin/controllers/BibController.php:337
 #: ../../application/modules/admin/controllers/BibController.php:334
 #: ../../application/modules/admin/controllers/BibController.php:307
+#: ../../application/modules/admin/controllers/BibController.php:312
 #, php-format
 msgid "La photo que vous avez sélectionnée est trop volumiseuse : %d ko"
 msgstr "Fotografia pe care aţi selectat-o este prea mare: %d ko"
@@ -4893,6 +5145,11 @@ msgstr "Fotografia pe care aţi selectat-o este prea mare: %d ko"
 msgid "La prolongation a échoué"
 msgstr "Prelungire nereuşită"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:33
+#, php-format
+msgid "La session \"%s\" a été sauvegardée"
+msgstr ""
+
 #: ../../library/Class/CriteresRecherche.php:268
 #: ../../library/Class/CriteresRecherche.php:301
 #: ../../library/Class/CriteresRecherche.php:312
@@ -5011,10 +5268,11 @@ msgstr ""
 #: ../../library/Class/Users.php:352 ../../library/Class/Users.php:496
 #: ../../library/Class/Users.php:563 ../../library/Class/Users.php:644
 #: ../../library/Class/Users.php:766 ../../library/Class/Users.php:817
+#: ../../library/Class/Users.php:824
 msgid "Le champ 'Identifiant' doit être inférieur à 50 caractères"
 msgstr "Câmpul 'Nume de utilizator' trebuie să nu depăşească 50 de caractere"
 
-#: ../../library/Class/Users.php:826
+#: ../../library/Class/Users.php:826 ../../library/Class/Users.php:833
 #, fuzzy
 msgid "Le champ 'Mot de passe' doit être inférieur à 255 caractères"
 msgstr "Câmpul 'Parola' nu trebuie să depăşească 50 de caractere"
@@ -5108,6 +5366,7 @@ msgstr "Parola este obligatorie."
 #: ../../library/Class/Users.php:369 ../../library/Class/Users.php:513
 #: ../../library/Class/Users.php:580 ../../library/Class/Users.php:661
 #: ../../library/Class/Users.php:783 ../../library/Class/Users.php:835
+#: ../../library/Class/Users.php:842
 msgid ""
 "Le numéro de carte est obligatoire pour les abonnés identifiés dans un sigb."
 msgstr ""
@@ -5178,6 +5437,8 @@ msgstr "CoÅŸurile dvs. de documente"
 #: ../../application/modules/opac/controllers/AbonneController.php:419
 #: ../../application/modules/opac/controllers/AbonneController.php:469
 #: ../../application/modules/opac/controllers/AbonneController.php:479
+#: ../../application/modules/opac/controllers/AbonneController.php:474
+#: ../../application/modules/opac/controllers/AbonneController.php:484
 msgid "Les mots de passe ne correspondent pas"
 msgstr "Parolele nu corespund"
 
@@ -5261,6 +5522,7 @@ msgid "Libellé du champ"
 msgstr "Specificaţie"
 
 #: ../../library/Class/SuggestionAchat.php:77
+#: ../../library/Class/SuggestionAchat.php:98
 msgid "Lien"
 msgstr ""
 
@@ -5270,11 +5532,13 @@ msgid "Lien \"Suggérer un achat\""
 msgstr ""
 
 #: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:31
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:32
 msgid "Lien Internet vers une description"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:75
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:78
 msgid "Lien cartographique"
 msgstr "Link cartografic"
 
@@ -5293,6 +5557,7 @@ msgstr "Link internet"
 
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:38
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:40
 msgid "Lien internet vers une description"
 msgstr ""
 
@@ -5347,11 +5612,15 @@ msgstr "Linkuri internet"
 #: ../../application/modules/opac/controllers/AbonneController.php:832
 #: ../../library/ZendAfi/View/Helper/RenderSession.php:77
 #: ../../library/ZendAfi/View/Helper/RenderSessions.php:67
+#: ../../application/modules/opac/controllers/AbonneController.php:837
+#: ../../library/ZendAfi/Form/Admin/News.php:76
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:73
 msgid "Lieu"
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
 #: ../../application/modules/opac/controllers/RechercheController.php:589
+#: ../../application/modules/opac/controllers/RechercheController.php:591
 msgid "Lieu de mise à disposition demandé"
 msgstr ""
 
@@ -5394,6 +5663,7 @@ msgid "Liste"
 msgstr ""
 
 #: ../../library/Class/CustomField/Meta.php:60
+#: ../../library/Class/CustomField/Meta.php:53
 #, fuzzy
 msgid "Liste d'options"
 msgstr "Buletine informative"
@@ -5483,6 +5753,7 @@ msgstr "Localizare a bibliotecii: %s"
 #: ../../application/modules/admin/controllers/BibController.php:405
 #: ../../application/modules/admin/controllers/BibController.php:402
 #: ../../application/modules/admin/controllers/BibController.php:369
+#: ../../application/modules/admin/controllers/BibController.php:374
 #, php-format
 msgid "Localisations de la bibliothèque: %s"
 msgstr "Localizare a bibliotecii: %s"
@@ -5509,6 +5780,8 @@ msgstr "Moderare"
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:10
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:39
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:13
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:29
 msgid "Mai"
 msgstr "Mai"
 
@@ -5524,12 +5797,18 @@ msgstr "Email"
 msgid "Mail : "
 msgstr "Email:"
 
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:63
+msgid "Mail suggestions"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/UsergroupController.php:123
 msgid "Manuel"
 msgstr ""
 
 #: ../../application/modules/opac/views/scripts/cms/articleviewbydate.phtml:8
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:37
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:11
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:27
 msgid "Mars"
 msgstr "Martie"
 
@@ -5558,6 +5837,7 @@ msgstr "Cerere de rezervare a unui document"
 #: ../../application/modules/admin/controllers/ProfilController.php:532
 #: ../../application/modules/admin/controllers/ProfilController.php:543
 #: ../../application/modules/admin/controllers/ProfilController.php:545
+#: ../../application/modules/admin/controllers/ProfilController.php:544
 msgid "Menu horizontal dupliqué sur tous les autres profils."
 msgstr ""
 
@@ -5578,11 +5858,13 @@ msgid "Mes derniers paniers"
 msgstr "Ultimele articole"
 
 #: ../../library/Class/Users.php:1304 ../../library/Class/Users.php:1320
+#: ../../library/Class/Users.php:1328
 #, fuzzy
 msgid "Mes paniers"
 msgstr "CoÅŸurile dvs."
 
 #: ../../library/Class/Users.php:1337 ../../library/Class/Users.php:1353
+#: ../../library/Class/Users.php:1361
 msgid "Mes paniers rattachés à un domaine"
 msgstr ""
 
@@ -5596,6 +5878,7 @@ msgstr "Mesaj..."
 #: ../../application/modules/opac/controllers/IndexController.php:124
 #: ../../application/modules/opac/controllers/IndexController.php:116
 #: ../../application/modules/opac/controllers/IndexController.php:115
+#: ../../library/ZendAfi/Form/ContactForm.php:84
 #, fuzzy
 msgid "Message"
 msgstr "Mesaj..."
@@ -5619,6 +5902,10 @@ msgstr "Mesaj..."
 msgid "Message au dessus de la boite"
 msgstr ""
 
+#: ../../library/ZendAfi/Form/Admin/News.php:158
+msgid "Message d'explication du refus."
+msgstr ""
+
 #: ../../application/modules/opac/controllers/RechercheController.php:459
 #: ../../application/modules/opac/controllers/RechercheController.php:492
 #: ../../application/modules/opac/controllers/RechercheController.php:517
@@ -5671,10 +5958,12 @@ msgstr "Punere în pagină"
 #: ../../application/modules/admin/controllers/BibController.php:470
 #: ../../application/modules/admin/controllers/BibController.php:467
 #: ../../application/modules/admin/controllers/BibController.php:425
+#: ../../application/modules/admin/controllers/BibController.php:430
 msgid "Mise à jour de la localisation"
 msgstr "Actualizare a localizării"
 
 #: ../../application/modules/admin/controllers/CmsController.php:71
+#: ../../application/modules/admin/controllers/CmsController.php:87
 #, fuzzy
 msgid "Mise à jour des articles"
 msgstr "Aviz asupra articolelor"
@@ -5746,6 +6035,7 @@ msgid "Modifier"
 msgstr "Modificare"
 
 #: ../../application/modules/opac/controllers/AbonneController.php:327
+#: ../../application/modules/opac/controllers/AbonneController.php:325
 #, fuzzy, php-format
 msgid "Modifier l'avis \"%s\""
 msgstr "Modificare bibliotecă: %s"
@@ -5755,6 +6045,7 @@ msgstr "Modificare bibliotecă: %s"
 #: ../../application/modules/admin/controllers/BibController.php:268
 #: ../../application/modules/admin/controllers/BibController.php:265
 #: ../../application/modules/admin/controllers/BibController.php:247
+#: ../../application/modules/admin/controllers/BibController.php:252
 #, php-format
 msgid "Modifier la bibliothèque: %s"
 msgstr "Modificare bibliotecă: %s"
@@ -5770,6 +6061,16 @@ msgstr "Modifică fişa mea"
 msgid "Modifier la configuration du tableau des exemplaires"
 msgstr ""
 
+#: ../../application/modules/admin/controllers/FormationController.php:38
+#, fuzzy, php-format
+msgid "Modifier la formation: %s"
+msgstr "Modificare titlu coÅŸ"
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:38
+#, fuzzy, php-format
+msgid "Modifier la session: %s"
+msgstr "Modificare bibliotecă: %s"
+
 #: ../../library/ZendAfi/View/Helper/Accueil/Kiosque.php:124
 msgid "Modifier la source de données du kiosque"
 msgstr ""
@@ -5838,6 +6139,7 @@ msgstr "Modificare titlu coÅŸ"
 #: ../../application/modules/admin/controllers/BibController.php:568
 #: ../../application/modules/admin/controllers/BibController.php:565
 #: ../../application/modules/admin/controllers/BibController.php:505
+#: ../../application/modules/admin/controllers/BibController.php:510
 #, php-format
 msgid "Modifier un plan de la bibliothèque: %s"
 msgstr "Modifică un plan al bibliotecii: %s"
@@ -5893,6 +6195,7 @@ msgid "Modération des formulaires: "
 msgstr "Moderare alerte"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:1
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:2
 #, fuzzy
 msgid "Modération des suggestions d'achat"
 msgstr "Moderare alerte"
@@ -5909,6 +6212,10 @@ msgstr "Moderarea tag-urilor privind instrucţiunile"
 msgid "Modérations"
 msgstr "Moderări"
 
+#: ../../library/Class/Systeme/ModulesAccueil/Calendrier.php:72
+msgid "Mois"
+msgstr ""
+
 #: ../../application/modules/admin/controllers/HarvestController.php:43
 #: ../../application/modules/admin/controllers/HarvestController.php:44
 #: ../../application/modules/admin/controllers/HarvestController.php:26
@@ -5990,6 +6297,7 @@ msgstr "Parolă"
 
 #: ../../application/modules/telephone/controllers/AuthController.php:81
 #: ../../application/modules/telephone/controllers/AuthController.php:75
+#: ../../application/modules/telephone/controllers/AuthController.php:89
 #, fuzzy
 msgid "Mot de passe ou date de naissance"
 msgstr "AÅ£i uitat parola"
@@ -6034,7 +6342,7 @@ msgstr ""
 #: ../../library/Class/Bib.php:45 ../../library/Class/Bib.php:46
 #: ../../library/Class/Bib.php:77 ../../library/Class/Bib.php:96
 #: ../../library/Class/Bib.php:116 ../../library/Class/Bib.php:127
-#: ../../library/Class/Bib.php:147
+#: ../../library/Class/Bib.php:147 ../../library/Class/Bib.php:167
 msgid "N'envoie pas de données"
 msgstr "Nu trimite date"
 
@@ -6175,6 +6483,8 @@ msgstr "Vedeţi planul"
 #: ../../application/modules/admin/views/scripts/rss/catform.phtml:16
 #: ../../application/modules/opac/controllers/IndexController.php:83
 #: ../../application/modules/opac/controllers/AbonneController.php:433
+#: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../library/ZendAfi/Form/ContactForm.php:59
 msgid "Nom"
 msgstr "Nume"
 
@@ -6273,6 +6583,7 @@ msgid "Nombre de traductions : %s"
 msgstr "Număr de diviziuni"
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 #, fuzzy
 msgid "Non"
 msgstr "Nume"
@@ -6383,6 +6694,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:385
 #: ../../application/modules/opac/controllers/AbonneController.php:404
 #: ../../application/modules/opac/controllers/AbonneController.php:464
+#: ../../application/modules/opac/controllers/AbonneController.php:469
 msgid "Nouveau mot de passe"
 msgstr "Parolă nouă"
 
@@ -6470,6 +6782,7 @@ msgid "Nouvelle relation"
 msgstr "** nouă localizare **"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:45
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:19
 #, fuzzy
 msgid "Nov"
 msgstr "Nov."
@@ -6478,6 +6791,11 @@ msgstr "Nov."
 msgid "Nov."
 msgstr "Nov."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:35
+#, fuzzy
+msgid "Novembre"
+msgstr "noiembrie"
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:61
 #, fuzzy
 msgid "Nuage de tags"
@@ -6499,17 +6817,20 @@ msgid "Numéro"
 msgstr "Număr"
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:10
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:13
 msgid "N° abonné"
 msgstr ""
 
 #: ../../library/Class/SuggestionAchat.php:79
 #: ../../library/Class/SuggestionAchat.php:80
+#: ../../library/Class/SuggestionAchat.php:101
 #, fuzzy
 msgid "N° carte abonné"
 msgstr "Sunteţi abonat"
 
 #: ../../application/modules/telephone/controllers/AuthController.php:77
 #: ../../application/modules/telephone/controllers/AuthController.php:74
+#: ../../application/modules/telephone/controllers/AuthController.php:88
 msgid "N° de carte"
 msgstr ""
 
@@ -6560,6 +6881,7 @@ msgid "Objets javascript"
 msgstr "Obiecte java-script"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:44
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:18
 #, fuzzy
 msgid "Oct"
 msgstr "Oct."
@@ -6568,6 +6890,11 @@ msgstr "Oct."
 msgid "Oct."
 msgstr "Oct."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:34
+#, fuzzy
+msgid "Octobre"
+msgstr "octombrie"
+
 #: ../../library/ZendAfi/View/Helper/Avis.php:26
 #: ../../library/ZendAfi/View/Helper/Avis.php:28
 #: ../../library/ZendAfi/View/Helper/Avis.php:47
@@ -6591,6 +6918,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:175
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldModel.php:31
 #: ../../library/ZendAfi/Form/Admin/CustomFields/CustomFieldMeta.php:29
+#: ../../library/ZendAfi/Form/Admin/News.php:114
 msgid "Options"
 msgstr "Opţiuni"
 
@@ -6621,6 +6949,7 @@ msgid "Os"
 msgstr ""
 
 #: ../../library/Class/Notice.php:653 ../../library/Class/Notice.php:619
+#: ../../library/Class/Notice.php:618
 msgid "Oui"
 msgstr ""
 
@@ -6870,6 +7199,7 @@ msgstr "Plan al bibliotecii: %s"
 #: ../../application/modules/admin/controllers/BibController.php:518
 #: ../../application/modules/admin/controllers/BibController.php:515
 #: ../../application/modules/admin/controllers/BibController.php:463
+#: ../../application/modules/admin/controllers/BibController.php:468
 #, php-format
 msgid "Plans de la bibliothèque: %s"
 msgstr "Plan al bibliotecii: %s"
@@ -6925,6 +7255,7 @@ msgstr "Paginaţie"
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:8
 #: ../../application/modules/opac/controllers/AbonneController.php:776
 #: ../../application/modules/opac/controllers/AbonneController.php:836
+#: ../../application/modules/opac/controllers/AbonneController.php:841
 msgid "Poste"
 msgstr ""
 
@@ -6942,7 +7273,7 @@ msgstr ""
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant :"
 msgstr "Pentru a vă activa contul, vă rugăm să faceţi clic pe linkul următor :"
 
-#: ../../library/Class/Users.php:887
+#: ../../library/Class/Users.php:887 ../../library/Class/Users.php:894
 #, fuzzy
 msgid "Pour activer votre compte, merci de cliquer sur le lien suivant:"
 msgstr "Pentru a vă activa contul, vă rugăm să faceţi clic pe linkul următor :"
@@ -6955,6 +7286,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:661
 #: ../../application/modules/opac/controllers/AbonneController.php:693
 #: ../../application/modules/opac/controllers/AbonneController.php:753
+#: ../../application/modules/opac/controllers/AbonneController.php:758
 msgid "Pour quelle durée ?"
 msgstr ""
 
@@ -6966,8 +7298,21 @@ msgstr ""
 "Pentru a rezerva unul sau mai multe documente, vă rugăm să completaţi "
 "formularul de mai jos."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:19
+#, fuzzy
+msgid "Pour valider l'abonnement, merci de cliquer sur le lien suivant:"
+msgstr "Pentru a vă activa contul, vă rugăm să faceţi clic pe linkul următor :"
+
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:33
+#, fuzzy
+msgid ""
+"Pour vous désinscrire de la lettre d'information, merci de cliquer sur le "
+"lien suivant:"
+msgstr "Pentru a vă activa contul, vă rugăm să faceţi clic pe linkul următor :"
+
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:56
 #: ../../library/ZendAfi/Form/SuggestionAchat.php:54
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:70
 msgid "Pourquoi suggérez-vous ce document ?"
 msgstr ""
 
@@ -6978,6 +7323,7 @@ msgid "Prochains rendez-vous"
 msgstr "Următoarele întâlniri"
 
 #: ../../library/ZendAfi/View/Helper/CalendarContent.php:84
+#: ../../library/ZendAfi/View/Helper/CalendarContent.php:94
 #, fuzzy
 msgid "Prochains évènements"
 msgstr "Următoarele întâlniri"
@@ -7086,6 +7432,8 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/users/index.phtml:18
 #: ../../application/modules/opac/controllers/IndexController.php:88
 #: ../../application/modules/opac/controllers/AbonneController.php:434
+#: ../../application/modules/opac/controllers/AbonneController.php:439
+#: ../../library/ZendAfi/Form/ContactForm.php:63
 msgid "Prénom"
 msgstr "Prenume"
 
@@ -7096,6 +7444,7 @@ msgstr "Palmaresul vizualizărilor"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:90
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:89
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:93
 msgid "Prêt"
 msgstr "ÃŽmprumut"
 
@@ -7108,6 +7457,7 @@ msgstr "ÃŽmprumut"
 #: ../../application/modules/opac/controllers/AbonneController.php:335
 #: ../../application/modules/opac/controllers/AbonneController.php:340
 #: ../../application/modules/opac/controllers/AbonneController.php:400
+#: ../../application/modules/opac/controllers/AbonneController.php:398
 msgid "Prêt prolongé"
 msgstr "ÃŽmprumut prelungit"
 
@@ -7133,6 +7483,7 @@ msgstr "Împrumuturi şi rezervări"
 #: ../../application/modules/opac/controllers/AbonneController.php:392
 #: ../../application/modules/opac/controllers/AbonneController.php:368
 #: ../../application/modules/opac/controllers/AbonneController.php:435
+#: ../../application/modules/opac/controllers/AbonneController.php:440
 msgid "Pseudo"
 msgstr "Pseudonim"
 
@@ -7149,6 +7500,8 @@ msgstr "Pseudonim"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:29
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:18
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:81
+#: ../../library/ZendAfi/Form/Admin/News.php:54
+#: ../../library/ZendAfi/Form/Admin/News.php:102
 msgid "Publication"
 msgstr "Publicare"
 
@@ -7182,18 +7535,21 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:559
 #: ../../application/modules/opac/controllers/AbonneController.php:591
 #: ../../application/modules/opac/controllers/AbonneController.php:651
+#: ../../application/modules/opac/controllers/AbonneController.php:656
 msgid "Quota déjà atteint ce jour, choisissez un autre jour."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:565
 #: ../../application/modules/opac/controllers/AbonneController.php:597
 #: ../../application/modules/opac/controllers/AbonneController.php:657
+#: ../../application/modules/opac/controllers/AbonneController.php:662
 msgid "Quota déjà atteint ce mois, choisissez un autre mois."
 msgstr ""
 
 #: ../../application/modules/opac/controllers/AbonneController.php:562
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:654
+#: ../../application/modules/opac/controllers/AbonneController.php:659
 msgid "Quota déjà atteint cette semaine, choisissez une autre semaine."
 msgstr ""
 
@@ -7256,6 +7612,7 @@ msgstr "Se indexează articolul din catalog?"
 #: ../../application/modules/telephone/views/scripts/recherche/viewnotice.phtml:2
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:32
 #: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:35
+#: ../../library/ZendAfi/View/Helper/Telephone/Tags/Toolbar.php:38
 msgid "Recherche"
 msgstr "Căutare"
 
@@ -7531,6 +7888,8 @@ msgstr "Adaugă instrucţiunea în coş"
 #: ../../library/ZendAfi/View/Helper/Notice/Exemplaires.php:52
 #: ../../application/modules/admin/views/scripts/custom-fields-report/edit.phtml:6
 #: ../../application/modules/opac/views/scripts/abonne/detail-session.phtml:11
+#: ../../application/modules/admin/controllers/BibController.php:324
+#: ../../library/ZendAfi/View/Helper/BoutonRetour.php:36
 msgid "Retour"
 msgstr "ÃŽntoarcere"
 
@@ -7662,6 +8021,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/RechercheController.php:546
 #: ../../application/modules/opac/controllers/RechercheController.php:505
 #: ../../application/modules/opac/controllers/RechercheController.php:515
+#: ../../application/modules/opac/controllers/RechercheController.php:517
 #, fuzzy
 msgid "Réservation"
 msgstr "Rezervări în curs"
@@ -7809,6 +8169,12 @@ msgstr "Rezultatele următoare"
 msgid "Résumé"
 msgstr "Rezumat"
 
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:39
+#: ../../library/ZendAfi/Form/Admin/News.php:108
+#, fuzzy
+msgid "Résumé pour l'affichage dans les boîtes"
+msgstr "Rezumat pentru pagina iniţială"
+
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:128
 #: ../../application/modules/admin/views/scripts/cms/traductionform.phtml:47
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:133
@@ -7866,6 +8232,8 @@ msgstr "ÃŽnregistrare"
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:36
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:35
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:47
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:39
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:65
 msgid "S'inscrire"
 msgstr ""
 
@@ -7892,6 +8260,8 @@ msgstr "Încărcare in curs"
 #: ../../application/modules/opac/views/scripts/auth/boitelogin.phtml:29
 #: ../../application/modules/telephone/controllers/AuthController.php:85
 #: ../../application/modules/telephone/controllers/AuthController.php:90
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:5
+#: ../../application/modules/telephone/controllers/AuthController.php:104
 msgid "Se connecter"
 msgstr "Conectare "
 
@@ -7910,6 +8280,7 @@ msgstr "Deconectare"
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:41
 #: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:40
 #: ../../library/ZendAfi/View/Helper/TagSessionFormationInscription.php:41
+#: ../../library/ZendAfi/View/Helper/Accueil/Newsletters.php:44
 #, fuzzy
 msgid "Se désinscrire"
 msgstr "Deconectare"
@@ -7917,6 +8288,7 @@ msgstr "Deconectare"
 #: ../../application/modules/opac/controllers/AbonneController.php:743
 #: ../../application/modules/opac/controllers/AbonneController.php:775
 #: ../../application/modules/opac/controllers/AbonneController.php:835
+#: ../../application/modules/opac/controllers/AbonneController.php:840
 #, fuzzy
 msgid "Secteur"
 msgstr "Conectare "
@@ -7969,6 +8341,7 @@ msgid "Sections"
 msgstr "Secţii"
 
 #: ../../library/ZendAfi/View/Helper/Calendar/MonthList.php:43
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:17
 #, fuzzy
 msgid "Sept"
 msgstr "Sept."
@@ -7977,6 +8350,11 @@ msgstr "Sept."
 msgid "Sept."
 msgstr "Sept."
 
+#: ../../library/ZendAfi/View/Helper/Calendar/Months.php:33
+#, fuzzy
+msgid "Septembre"
+msgstr "septembrie"
+
 #: ../../application/modules/admin/views/scripts/catalogue/form.phtml:30
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:38
 #: ../../application/modules/admin/views/scripts/catalogue/index.phtml:23
@@ -8017,6 +8395,16 @@ msgstr "Serviciu indisponibil"
 msgid "Session"
 msgstr "Versiune"
 
+#: ../../application/modules/admin/controllers/SessionFormationController.php:32
+#, php-format
+msgid "Session \"%s\" sauvegardée"
+msgstr ""
+
+#: ../../application/modules/admin/controllers/SessionFormationController.php:34
+#, fuzzy, php-format
+msgid "Session \"%s\" supprimée"
+msgstr "Rezervări în curs"
+
 msgid "Should be greater than '%fieldToCompare%'"
 msgstr "Doit être plus grand que '%fieldToCompare%'"
 
@@ -8025,6 +8413,8 @@ msgstr "Doit être plus grand que '%fieldToCompare%'"
 #: ../../library/Class/Users.php:452 ../../library/Class/Users.php:598
 #: ../../library/Class/Users.php:665 ../../library/Class/Users.php:753
 #: ../../library/Class/Users.php:876 ../../library/Class/Users.php:888
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:30
+#: ../../library/Class/Users.php:895
 msgid ""
 "Si vous n'êtes pas à l'origine de cette demande d'inscription, merci de ne "
 "pas tenir compte de cet e-mail, et l'inscription ne sera pas activée."
@@ -8231,11 +8621,13 @@ msgstr "Statistici"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:61
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:63
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:52
+#: ../../library/ZendAfi/Form/Admin/News.php:146
 msgid "Statut"
 msgstr "Statut"
 
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:118
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:117
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:121
 msgid "Statut de la bib"
 msgstr "Statut al bib"
 
@@ -8247,6 +8639,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:82
 #: ../../application/modules/admin/views/scripts/modules/recherche_viewnotice.phtml:21
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:54
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:55
 #, fuzzy
 msgid "Style de boite"
 msgstr "Căsuţă de căutare"
@@ -8271,12 +8664,14 @@ msgid "Suggestion d'achat supprimée"
 msgstr ""
 
 #: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:18
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:33
 #, fuzzy
 msgid "Suggestion d'achat:"
 msgstr "Moderare alerte"
 
 #: ../../library/Class/SuggestionAchat.php:87
 #: ../../library/Class/SuggestionAchat.php:88
+#: ../../library/Class/SuggestionAchat.php:109
 msgid "Suggestion d'achat: "
 msgstr ""
 
@@ -8320,6 +8715,7 @@ msgstr ""
 #: ../../library/ZendAfi/Form/ReponseFormulaireMail.php:40
 #: ../../library/ZendAfi/View/Helper/ReponseFormulaireFilled.php:31
 #: ../../application/modules/opac/controllers/IndexController.php:110
+#: ../../library/ZendAfi/Form/ContactForm.php:80
 msgid "Sujet"
 msgstr "Subiect"
 
@@ -8407,11 +8803,13 @@ msgid "Supprimer cette réservation"
 msgstr "Ștergeţi această rezervare"
 
 #: ../../application/modules/admin/controllers/CmsController.php:397
+#: ../../application/modules/admin/controllers/CmsController.php:385
 #, fuzzy, php-format
 msgid "Supprimer l'article : %s"
 msgstr "Ștergere categorie"
 
 #: ../../application/modules/admin/controllers/BibController.php:256
+#: ../../application/modules/admin/controllers/BibController.php:261
 #, fuzzy, php-format
 msgid "Supprimer la bibliothèque: %s"
 msgstr "Modificare bibliotecă: %s"
@@ -8463,6 +8861,7 @@ msgstr "Selecţie de site-uri"
 
 #: ../../application/modules/admin/controllers/ModulesController.php:299
 #: ../../application/modules/admin/controllers/ModulesController.php:306
+#: ../../application/modules/admin/controllers/ModulesController.php:310
 #, fuzzy
 msgid "Sélectionnez un panier ou un domaine"
 msgstr "Acest meniu nu conţine date"
@@ -8501,6 +8900,7 @@ msgstr "Tag(uri)"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:170
 #: ../../library/ZendAfi/Form/Album.php:191
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:186
+#: ../../library/ZendAfi/Form/Admin/News.php:82
 msgid "Tags"
 msgstr "Taguri"
 
@@ -8543,6 +8943,7 @@ msgstr "Tel. :"
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:66
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:70
 #: ../../library/ZendAfi/View/Helper/Admin/ProfileSelect.php:47
+#: ../../application/modules/admin/views/scripts/bib/_form.phtml:74
 msgid "Territoire"
 msgstr "Teritoriu"
 
@@ -8585,6 +8986,7 @@ msgid "Tester"
 msgstr "Testare"
 
 #: ../../application/modules/admin/views/scripts/bib/planacces.phtml:187
+#: ../../library/Class/CustomField/Meta.php:50
 msgid "Texte"
 msgstr "Text"
 
@@ -8665,6 +9067,12 @@ msgstr "Temă"
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:50
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:39
 #: ../../library/Class/CriteresRecherche.php:106
+#: ../../application/modules/admin/views/scripts/suggestion-achat/index.phtml:11
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:51
+#: ../../library/ZendAfi/Form/Admin/NewsTranslation.php:32
+#: ../../library/ZendAfi/Form/Admin/News.php:40
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:30
+#: ../../library/Class/SuggestionAchat.php:94
 msgid "Titre"
 msgstr "Titlu"
 
@@ -8692,6 +9100,7 @@ msgstr "Titlu : %s"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:44
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:33
 #: ../../library/ZendAfi/Form/Admin/EditCms.php:45
+#: ../../library/ZendAfi/Form/Admin/News.php:44
 msgid "Titre caché"
 msgstr "Titlu ascuns"
 
@@ -8713,6 +9122,7 @@ msgid "Titre et auteur"
 msgstr "Biografii"
 
 #: ../../library/Class/SuggestionAchat.php:58
+#: ../../library/Class/SuggestionAchat.php:62
 msgid "Titre ou commentaire requis"
 msgstr ""
 
@@ -8748,6 +9158,7 @@ msgstr "Titluri"
 #: ../../library/ZendAfi/View/Helper/TreeView.php:36
 #: ../../library/ZendAfi/View/Helper/TreeView.php:65
 #: ../../library/ZendAfi/View/Helper/TreeView.php:71
+#: ../../library/ZendAfi/View/Helper/Calendar/RenderFilters.php:88
 msgid "Tous"
 msgstr "Toţi"
 
@@ -8835,7 +9246,7 @@ msgstr "Toată actualitatea portalului"
 #: ../../library/Class/Bib.php:165 ../../library/Class/Bib.php:182
 #: ../../library/Class/Bib.php:213 ../../library/Class/Bib.php:241
 #: ../../library/Class/Bib.php:256 ../../library/Class/Bib.php:272
-#: ../../library/Class/Bib.php:292
+#: ../../library/Class/Bib.php:292 ../../library/Class/Bib.php:312
 msgid "Toutes"
 msgstr "Toate"
 
@@ -8857,6 +9268,11 @@ msgstr "Traducere"
 msgid "Traductions"
 msgstr "Traduceri"
 
+#: ../../application/modules/admin/views/scripts/cms/_traduction_navigator.phtml:3
+#, fuzzy
+msgid "Traductions:"
+msgstr "Traduceri"
+
 #: ../../library/Class/Upload.php:268
 msgid "Transfert impossible, ce formulaire est mal configuré"
 msgstr ""
@@ -8928,6 +9344,9 @@ msgstr "Tip de doc."
 #: ../../library/ZendAfi/Form/Album.php:163
 #: ../../library/Class/CriteresRecherche.php:108
 #: ../../library/Class/CriteresRecherche.php:109
+#: ../../library/ZendAfi/Form/SuggestionAchat.php:36
+#: ../../library/ZendAfi/View/Helper/SuggestionAchat.php:29
+#: ../../library/Class/SuggestionAchat.php:96
 msgid "Type de document"
 msgstr "Tip de document"
 
@@ -8950,6 +9369,11 @@ msgstr "Tip de document : %s "
 msgid "Type de document : %s"
 msgstr "Tip de document : %s "
 
+#: ../../library/Class/SuggestionAchat.php:75
+#, fuzzy
+msgid "Type de document requis"
+msgstr "Tip de document : %s "
+
 #: ../../library/ZendAfi/View/Helper/TagCriteresRecherche.php:105
 #, fuzzy, php-format
 msgid "Type de document: %s"
@@ -9059,6 +9483,7 @@ msgstr ""
 #: ../../application/modules/admin/views/scripts/bib/_form.phtml:55
 #: ../../application/modules/opac/controllers/AbonneController.php:380
 #: ../../application/modules/opac/controllers/AbonneController.php:440
+#: ../../application/modules/opac/controllers/AbonneController.php:445
 msgid "Téléphone"
 msgstr "Telefon"
 
@@ -9092,6 +9517,10 @@ msgstr ""
 msgid "URL objet B est requis"
 msgstr ""
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:7
+msgid "Un compte vous a été créé automatiquement."
+msgstr ""
+
 #: ../../library/Class/FRBR/LinkType.php:56
 msgid "Un libellé de l'objet A vers l'objet B est requis"
 msgstr ""
@@ -9116,9 +9545,22 @@ msgstr "Tocmai v-a fost trimis un email cu datele dvs. de conectare."
 #: ../../library/Class/Users.php:515 ../../library/Class/Users.php:666
 #: ../../library/Class/Users.php:733 ../../library/Class/Users.php:821
 #: ../../library/Class/Users.php:934 ../../library/Class/Users.php:950
+#: ../../library/Class/Users.php:957
 msgid "Un mail vient de vous être envoyé avec vos paramètres de connexion."
 msgstr "Tocmai v-a fost trimis un email cu datele dvs. de conectare."
 
+#: ../../application/modules/opac/controllers/AuthController.php:277
+msgid ""
+"Un utilisateur a déjà renseigné cet email. Merci de vous identifier avec le "
+"compte qui utilise cet email."
+msgstr ""
+
+#: ../../application/modules/opac/controllers/AuthController.php:305
+msgid ""
+"Une demande de confirmation d'inscription vous a été envoyée à l'adresse "
+"mail renseignée."
+msgstr ""
+
 #: ../../library/Class/CommSigb.php:177
 #, fuzzy
 msgid ""
@@ -9137,6 +9579,12 @@ msgstr ""
 "Rezervare eşuată din cauza unei erori de comunicare cu serverul. Vă rugăm să "
 "semnalaţi această problemă la bibliotecă."
 
+#: ../../application/modules/opac/controllers/AuthController.php:301
+msgid ""
+"Une erreur est survenue à l'envoi du mail de confirmation. Veuillez "
+"réessayer. Si le problème persiste, veuillez contacter votre médiathèque."
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/ListeSuggestionAchat.php:39
 #, fuzzy
 msgid "Une seule suggestion enregistrée."
@@ -9210,6 +9658,8 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AuthController.php:221
 #: ../../library/ZendAfi/Form/Configuration/FormationsWidget.php:65
 #: ../../library/ZendAfi/View/Helper/BoutonIco.php:71
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:35
+#: ../../library/ZendAfi/Form/Configuration/DomainWidget.php:69
 msgid "Valider"
 msgstr "Validare"
 
@@ -9359,6 +9809,8 @@ msgstr "Etichetă"
 #: ../../application/modules/opac/controllers/IndexController.php:102
 #: ../../application/modules/opac/controllers/IndexController.php:101
 #: ../../application/modules/opac/controllers/AbonneController.php:438
+#: ../../application/modules/opac/controllers/AbonneController.php:443
+#: ../../library/ZendAfi/Form/ContactForm.php:73
 msgid "Ville"
 msgstr "OraÅŸ"
 
@@ -9491,6 +9943,7 @@ msgstr "Numele ÅŸi Prenumele dvs :"
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:128
 #: ../../application/modules/opac/controllers/IndexController.php:127
+#: ../../library/ZendAfi/Form/ContactForm.php:101
 #, fuzzy
 msgid "Vos coordonnées"
 msgstr "Coordonate hartă"
@@ -9577,6 +10030,11 @@ msgstr ""
 msgid "Votre adresse E-mail :"
 msgstr "Adresa dvs. de e-mail :"
 
+#: ../../library/ZendAfi/Form/NewsletterRegister.php:29
+#, fuzzy
+msgid "Votre adresse e-mail"
+msgstr "Adresa dvs. de e-mail :"
+
 #: ../../application/modules/opac/controllers/RechercheController.php:432
 #: ../../application/modules/opac/controllers/RechercheController.php:465
 #: ../../application/modules/opac/controllers/RechercheController.php:490
@@ -9617,11 +10075,16 @@ msgstr "Numele dvs. de utilizator: %s"
 
 #: ../../library/Class/Users.php:657 ../../library/Class/Users.php:724
 #: ../../library/Class/Users.php:812 ../../library/Class/Users.php:925
-#: ../../library/Class/Users.php:941
+#: ../../library/Class/Users.php:941 ../../library/Class/Users.php:948
 #, fuzzy, php-format
 msgid "Votre identifiant : %s\n"
 msgstr "Numele dvs. de utilizator: %s"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:13
+#, fuzzy
+msgid "Votre identifiant: "
+msgstr "Numele dvs. de utilizator: %s"
+
 #: ../../application/modules/opac/views/scripts/auth/ajaxlogin.phtml:17
 #: ../../application/modules/opac/views/scripts/auth/ajaxlostpass.phtml:31
 msgid "Votre identité s.v.p."
@@ -9631,6 +10094,7 @@ msgstr "Vă rugăm să vă identificaţi"
 #: ../../application/modules/opac/controllers/IndexController.php:136
 #: ../../application/modules/opac/controllers/IndexController.php:141
 #: ../../application/modules/opac/controllers/IndexController.php:133
+#: ../../library/ZendAfi/Form/ContactForm.php:52
 #, fuzzy
 msgid "Votre message"
 msgstr "Mesajul dvs. :"
@@ -9647,7 +10111,7 @@ msgid "Votre mot de passe : %s"
 msgstr "Parola dvs. :%s"
 
 #: ../../library/Class/Users.php:813 ../../library/Class/Users.php:926
-#: ../../library/Class/Users.php:942
+#: ../../library/Class/Users.php:942 ../../library/Class/Users.php:949
 #, fuzzy, php-format
 msgid "Votre mot de passe : %s\n"
 msgstr "Parola dvs. :%s"
@@ -9659,6 +10123,15 @@ msgid ""
 "n"
 msgstr "Parola dvs. :%s"
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:16
+#, fuzzy
+msgid "Votre mot de passe: "
+msgstr "Parola dvs. :%s"
+
+#: ../../application/modules/opac/controllers/AbonneController.php:402
+msgid "Votre prêt a bien été prolongé."
+msgstr ""
+
 #: ../../application/modules/opac/views/scripts/abonne/multimedia-hold-view.phtml:1
 #, fuzzy
 msgid "Votre réservation"
@@ -9675,6 +10148,7 @@ msgid "Votre réservation est enregistrée."
 msgstr "Rezervarea dvs. a fost înregistrată."
 
 #: ../../application/modules/opac/controllers/RechercheController.php:542
+#: ../../application/modules/opac/controllers/RechercheController.php:544
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9682,6 +10156,7 @@ msgid ""
 msgstr ""
 
 #: ../../application/modules/opac/controllers/RechercheController.php:540
+#: ../../application/modules/opac/controllers/RechercheController.php:542
 #, php-format
 msgid ""
 "Votre réservation est enregistrée.<br>Nous vous informerons quand le document"
@@ -9769,11 +10244,16 @@ msgstr "Aveţi %d rezervare în curs"
 msgid "Vous avez %d réservations en cours"
 msgstr "Aveţi %d  rezervări în curs"
 
+#: ../../application/modules/opac/controllers/AuthController.php:356
+msgid "Vous avez bien été abonné à la newsletter: "
+msgstr ""
+
 #: ../../application/modules/opac/controllers/AbonneController.php:594
 #: ../../application/modules/opac/controllers/AbonneController.php:596
 #: ../../application/modules/opac/controllers/AbonneController.php:634
 #: ../../application/modules/opac/controllers/AbonneController.php:666
 #: ../../application/modules/opac/controllers/AbonneController.php:726
+#: ../../application/modules/opac/controllers/AbonneController.php:731
 #, fuzzy
 msgid "Vous avez déjà une réservation dans ce créneau horaire"
 msgstr "Aveţi %d  rezervări în curs"
@@ -9786,16 +10266,22 @@ msgstr "Aveţi %d  rezervări în curs"
 msgid "Vous avez fait une demande d'inscription sur le portail."
 msgstr "Aţi făcut o cerere de înscriere pe portal."
 
-#: ../../library/Class/Users.php:886
+#: ../../library/Class/Users.php:886 ../../library/Class/Users.php:893
 #, fuzzy
 msgid "Vous avez fait une demande d'inscription sur le portail:"
 msgstr "Aţi făcut o cerere de înscriere pe portal."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-register-mail.phtml:4
+#, fuzzy
+msgid "Vous avez fait une demande d'inscription à la lettre d'information:"
+msgstr "Aţi făcut o cerere de înscriere pe portal."
+
 #: ../../library/Class/Users.php:313 ../../library/Class/Users.php:327
 #: ../../library/Class/Users.php:402 ../../library/Class/Users.php:478
 #: ../../library/Class/Users.php:507 ../../library/Class/Users.php:656
 #: ../../library/Class/Users.php:723 ../../library/Class/Users.php:811
 #: ../../library/Class/Users.php:924 ../../library/Class/Users.php:940
+#: ../../library/Class/Users.php:947
 msgid "Vous avez fait une demande de mot de passe sur le portail."
 msgstr "Aţi făcut o cerere de parolă pe portal."
 
@@ -9808,6 +10294,7 @@ msgstr ""
 #: ../../library/Class/Users.php:351 ../../library/Class/Users.php:495
 #: ../../library/Class/Users.php:562 ../../library/Class/Users.php:643
 #: ../../library/Class/Users.php:765 ../../library/Class/Users.php:816
+#: ../../library/Class/Users.php:823
 msgid "Vous devez compléter le champ 'Identifiant'"
 msgstr "Trebuie să completaţi câmpul ‘Nume de utilizator’"
 
@@ -9816,6 +10303,7 @@ msgstr "Trebuie să completaţi câmpul ‘Nume de utilizator’"
 #: ../../library/Class/Users.php:359 ../../library/Class/Users.php:503
 #: ../../library/Class/Users.php:570 ../../library/Class/Users.php:651
 #: ../../library/Class/Users.php:773 ../../library/Class/Users.php:824
+#: ../../library/Class/Users.php:831
 msgid "Vous devez compléter le champ 'Mot de passe'"
 msgstr "Trebuie să completaţi câmpul ‘Parolă’"
 
@@ -9829,7 +10317,7 @@ msgstr "Trebuie să completaţi câmpul ‘Parolă’"
 #: ../../library/Class/Bib.php:112 ../../library/Class/Bib.php:130
 #: ../../library/Class/Bib.php:161 ../../library/Class/Bib.php:189
 #: ../../library/Class/Bib.php:204 ../../library/Class/Bib.php:220
-#: ../../library/Class/Bib.php:240
+#: ../../library/Class/Bib.php:240 ../../library/Class/Bib.php:260
 msgid "Vous devez compléter le champ 'Nom'"
 msgstr "Trebuie să completaţi câmpul ‘Nume’"
 
@@ -9851,7 +10339,7 @@ msgstr "Trebuie să completaţi câmpul ‘Oraş’"
 #: ../../library/Class/Bib.php:115 ../../library/Class/Bib.php:133
 #: ../../library/Class/Bib.php:164 ../../library/Class/Bib.php:192
 #: ../../library/Class/Bib.php:207 ../../library/Class/Bib.php:223
-#: ../../library/Class/Bib.php:243
+#: ../../library/Class/Bib.php:243 ../../library/Class/Bib.php:263
 msgid "Vous devez compléter le champ 'Ville'"
 msgstr "Trebuie să completaţi câmpul ‘Oraş’"
 
@@ -9863,11 +10351,12 @@ msgstr "Trebuie să completaţi câmpul ‘Oraş’"
 #: ../../application/modules/opac/controllers/AbonneController.php:389
 #: ../../application/modules/opac/controllers/AbonneController.php:408
 #: ../../application/modules/opac/controllers/AbonneController.php:468
+#: ../../application/modules/opac/controllers/AbonneController.php:473
 msgid "Vous devez confirmer le mot de passe"
 msgstr "Trebuie să confirmaţi parola"
 
 #: ../../library/Class/Users.php:671 ../../library/Class/Users.php:793
-#: ../../library/Class/Users.php:845
+#: ../../library/Class/Users.php:845 ../../library/Class/Users.php:852
 msgid "Vous devez fournir une adresse mail valide"
 msgstr ""
 
@@ -9879,11 +10368,12 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:399
 #: ../../application/modules/opac/controllers/AbonneController.php:418
 #: ../../application/modules/opac/controllers/AbonneController.php:478
+#: ../../application/modules/opac/controllers/AbonneController.php:483
 msgid "Vous devez saisir un mot de passe"
 msgstr "Trebuie să introduceţi o parolă "
 
 #: ../../library/Class/Users.php:674 ../../library/Class/Users.php:796
-#: ../../library/Class/Users.php:848
+#: ../../library/Class/Users.php:848 ../../library/Class/Users.php:855
 #, fuzzy
 msgid "Vous devez saisir un numéro de téléphone"
 msgstr "Trebuie să introduceţi o parolă "
@@ -9892,6 +10382,7 @@ msgstr "Trebuie să introduceţi o parolă "
 #: ../../library/Class/AvisNotice.php:278
 #: ../../library/Class/AvisNotice.php:313
 #: ../../library/Class/AvisNotice.php:249
+#: ../../library/Class/AvisNotice.php:248
 msgid "Vous devez saisir un titre"
 msgstr "Trebuie să introduceţi un titlu         "
 
@@ -9906,6 +10397,7 @@ msgstr "Trebuie să selectaţi o imagine făcând clic pe buton : căutare"
 #: ../../application/modules/admin/controllers/BibController.php:327
 #: ../../application/modules/admin/controllers/BibController.php:324
 #: ../../application/modules/admin/controllers/BibController.php:294
+#: ../../application/modules/admin/controllers/BibController.php:299
 msgid "Vous devez sélectionner une photo en cliquant sur le bouton : parcourir"
 msgstr "Trebuie să selectaţi o fotografie făcând clic pe buton: căutare"
 
@@ -9914,6 +10406,7 @@ msgstr "Trebuie să selectaţi o fotografie făcând clic pe buton: căutare"
 #: ../../library/Class/Users.php:561 ../../library/Class/Users.php:768
 #: ../../library/Class/Users.php:838 ../../library/Class/Users.php:926
 #: ../../library/Class/Users.php:1053 ../../library/Class/Users.php:1069
+#: ../../library/Class/Users.php:1076
 msgid ""
 "Vous devez vous connecter en tant qu'abonné de la bibliothèque pour obtenir "
 "plus d'informations."
@@ -9937,12 +10430,22 @@ msgstr ""
 "Trebuie să vă conectaţi folosind numărul dvs. de card pentru a efectua o "
 "rezervare."
 
+#: ../../application/modules/opac/views/scripts/auth/newsletter-unsubscribe.phtml:3
+msgid "Vous devez vous identifier pour vous désinscrire de la newsletter: "
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagCoursToutApprendre.php:28
 msgid ""
 "Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
 "accéder au cours en ligne"
 msgstr ""
 
+#: ../../library/ZendAfi/View/Helper/TagCyberlibrisBook.php:28
+msgid ""
+"Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
+"accéder au livre numérique"
+msgstr ""
+
 #: ../../library/ZendAfi/View/Helper/TagNumeriquePremiumBook.php:27
 msgid ""
 "Vous devez être connecté sous un compte avec abonnement valide pour pouvoir "
@@ -10012,13 +10515,13 @@ msgstr "Nu aţi introdus un nume de utilizator."
 
 #: ../../library/Class/Users.php:519 ../../library/Class/Users.php:586
 #: ../../library/Class/Users.php:667 ../../library/Class/Users.php:789
-#: ../../library/Class/Users.php:841
+#: ../../library/Class/Users.php:841 ../../library/Class/Users.php:848
 msgid "Vous n'avez pas les droits suffisants pour diriger une formation"
 msgstr ""
 
 #: ../../library/Class/Users.php:516 ../../library/Class/Users.php:583
 #: ../../library/Class/Users.php:664 ../../library/Class/Users.php:786
-#: ../../library/Class/Users.php:838
+#: ../../library/Class/Users.php:838 ../../library/Class/Users.php:845
 msgid "Vous n'avez pas les droits suffisants pour suivre une formation"
 msgstr ""
 
@@ -10095,6 +10598,7 @@ msgstr "Nu sunteţi abonat la nici un buletin informativ    "
 #: ../../application/modules/opac/controllers/AbonneController.php:556
 #: ../../application/modules/opac/controllers/AbonneController.php:588
 #: ../../application/modules/opac/controllers/AbonneController.php:648
+#: ../../application/modules/opac/controllers/AbonneController.php:653
 #, fuzzy
 msgid "Vous n'êtes pas autorisé à effectuer une réservation"
 msgstr "Nu sunteţi abonat la nici un buletin informativ    "
@@ -10133,6 +10637,16 @@ msgstr "Web"
 msgid "Zone"
 msgstr ""
 
+#: ../../library/Class/CustomField/Meta.php:52
+#, fuzzy
+msgid "Zone de texte HTML"
+msgstr "Culoarea textului"
+
+#: ../../library/Class/CustomField/Meta.php:51
+#, fuzzy
+msgid "Zone de texte simple"
+msgstr "Culoarea textului"
+
 #: ../../library/ZendAfi/Form/Configuration/SearchResult.php:121
 msgid "Zones de titre(séparées par ;)"
 msgstr ""
@@ -10195,6 +10709,7 @@ msgstr "august"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:91
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:113
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:116
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:41
 msgid "au"
 msgstr "la"
 
@@ -10295,6 +10810,7 @@ msgstr "CoÅŸurile dvs."
 #: ../../application/modules/opac/controllers/IndexController.php:178
 #: ../../application/modules/opac/controllers/IndexController.php:170
 #: ../../application/modules/opac/controllers/IndexController.php:149
+#: ../../application/modules/opac/controllers/IndexController.php:92
 msgid ""
 "destinataire non configuré. Vérifiez les paramètres du profil, champ 'E-mail "
 "du webmestre'"
@@ -10327,6 +10843,7 @@ msgstr "instrucţiuni găsite"
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:110
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:83
 #: ../../application/modules/admin/views/scripts/cms/newsform.phtml:105
+#: ../../library/ZendAfi/Form/Decorator/DateRangePicker.php:35
 msgid "du"
 msgstr "de la"
 
@@ -10522,6 +11039,8 @@ msgstr "până la"
 #: ../../application/modules/admin/controllers/BibController.php:531
 #: ../../application/modules/admin/controllers/BibController.php:382
 #: ../../application/modules/admin/controllers/BibController.php:475
+#: ../../application/modules/admin/controllers/BibController.php:387
+#: ../../application/modules/admin/controllers/BibController.php:480
 msgid "le libellé est obligatoire."
 msgstr "specificaţia este obligatorie."
 
@@ -10933,6 +11452,7 @@ msgstr ""
 #: ../../application/modules/opac/controllers/AbonneController.php:659
 #: ../../application/modules/opac/controllers/AbonneController.php:691
 #: ../../application/modules/opac/controllers/AbonneController.php:751
+#: ../../application/modules/opac/controllers/AbonneController.php:756
 msgid "À partir de quelle heure ?"
 msgstr ""
 
diff --git a/library/translation/update_translations.sh b/library/translation/update_translations.sh
deleted file mode 100644
index 3f1131a035b3b789ce73e8cfa3807f19c081bead..0000000000000000000000000000000000000000
--- a/library/translation/update_translations.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/sh
-export LC_ALL="fr_FR.UTF-8"
-
-for i in {2..4}
-do
-		find \
-				../../application \
-				../../library \
-				-type f \( -name "*.php" -o -name "*.phtml" \) \
-				-exec  xgettext \
-				-j \
-				-L PHP \
-				-o fr.pot \
-				--from-code=utf-8 \
-				--keyword=traduire \
-				--keyword=openBoite \
-				--keyword=_plural:$i \
-				{} \;
-done
-
-for i in `ls *.po`
-do
-		msgmerge -s $i fr.pot -o $i
-		msgfmt -o `echo $i|cut -d '.' -f1`.mo $i
-done
diff --git a/public/opac/css/global.css b/public/opac/css/global.css
index 4256730331b0e2ed7aca2877e3bfa720c83ab9e6..07f2b0b703af8bc5c738f0a7735aa04795d623ee 100644
--- a/public/opac/css/global.css
+++ b/public/opac/css/global.css
@@ -459,6 +459,13 @@ div#open_accessibility:hover {
 }
 
 
+.facette_outer,
+.nuage_outer {
+    margin-left: 10px; 
+    margin-top: 17px;
+}
+
+
 .facette ul {
     list-style-type:none;
     padding:0px;
@@ -2799,4 +2806,76 @@ a.loan-export {
 
 [data-spambots] {
     margin-left: -5000px;
+}
+
+/* Calendar box filters */
+.boite.calendar div.contenu,
+.boite.calendar div.contenuInner {
+    overflow: visible;
+}
+
+.calendar ul.filters {
+  padding: 0;
+  width: 100%;
+}
+
+.calendar ul.filters > li {
+  display: inline-block;
+  vertical-align: top;
+  position: relative;
+  padding: 0px 5px 5px 0px;
+  min-width: 100px;
+}
+
+.calendar ul.filters > li h2 {
+  text-align: center;
+  padding: 5px 5px 5px 26px;
+  margin: 0px;
+  background: transparent url(../images/buttons/down-chevron.png) 2px center no-repeat;
+}
+
+
+.calendar ul.filters > li:hover h2 {
+  background-image: url(../images/buttons/up-chevron.png);
+}
+
+.calendar ul.filters > li h2,
+.calendar ul.filters ul {
+  background-color: #ddd;
+}
+
+.calendar ul.filters li {
+  list-style-type: none;
+}
+
+.calendar ul.filters ul {
+  padding: 0px;
+  margin: 0px;
+  position: absolute;
+  display: none;
+  white-space: nowrap;
+  box-shadow: 0px 10px 10px rgba(0,0,0,0.5);
+  z-index: 100;
+  min-width: 90%;
+}
+
+.calendar ul.filters li:hover ul {
+  display: block;
+}
+
+.calendar ul.filters ul li.selected {
+  font-weight: bold;
+}
+
+.calendar ul.filters ul li {
+  display: block;
+}
+
+.calendar ul.filters ul li a {
+    display: block;
+    padding: 5px;
+}
+
+.calendar ul.filters ul li a:hover {
+    background-color: white;
 }
\ No newline at end of file
diff --git a/public/opac/images/buttons/down-chevron.png b/public/opac/images/buttons/down-chevron.png
new file mode 100644
index 0000000000000000000000000000000000000000..f58b2a81d15047fbb67b4f9ccebcc3533052b34c
Binary files /dev/null and b/public/opac/images/buttons/down-chevron.png differ
diff --git a/public/opac/images/buttons/no_preview.png b/public/opac/images/buttons/no_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..40a85b29bf8ffb98d07aa011e4869fd17721c94e
Binary files /dev/null and b/public/opac/images/buttons/no_preview.png differ
diff --git a/public/opac/images/buttons/up-chevron.png b/public/opac/images/buttons/up-chevron.png
new file mode 100644
index 0000000000000000000000000000000000000000..45079665c87795450d574ff524cf9026849d98a7
Binary files /dev/null and b/public/opac/images/buttons/up-chevron.png differ
diff --git a/public/opac/java/diaporama_navigation/defaults.ini b/public/opac/java/diaporama_navigation/defaults.ini
index f0f26a1043ff988ee7c7f3bea25873bcba526eaf..b1840be32dd2270c607cffde56d0dfc824593493 100644
--- a/public/opac/java/diaporama_navigation/defaults.ini
+++ b/public/opac/java/diaporama_navigation/defaults.ini
@@ -1,3 +1,4 @@
 navigation_mode="buttons"
 navigation_window_width="350"
-navigation_window_height="250"
\ No newline at end of file
+navigation_window_height="250"
+navigation_cycle=0
\ No newline at end of file
diff --git a/public/opac/java/diaporama_navigation/properties.phtml b/public/opac/java/diaporama_navigation/properties.phtml
index 6bf2f62b93cc6dfce800530795745d47c5b9de8a..ac59d570fe7f29f0fe9774dcd8835d740f01a565 100644
--- a/public/opac/java/diaporama_navigation/properties.phtml
+++ b/public/opac/java/diaporama_navigation/properties.phtml
@@ -1,12 +1,13 @@
 <?php
 $form = new ZendAfi_Form();
 $form
-->addElement('select', 
-									'op_navigation_mode', 
+->addElement('select',
+									'op_navigation_mode',
 									['label' => $this->_('Mode de navigation'),
 									 'value' => $this->preferences['op_navigation_mode'],
 									 'multiOptions' => ['buttons' => $this->_('Un bouton pour chaque élément'),
-																			'next_previous' => $this->_('Boutons précédent et suivant')]])
+																			'next_previous' => $this->_('Boutons précédent et suivant'),
+																			'preview' => $this->_('Une miniature pour chaque élément')]])
 ->addElement('text',
 						 'op_navigation_window_width',
 						 ['label' => $this->_('Largeur du widget en pixels'),
@@ -14,6 +15,11 @@ $form
 ->addElement('text',
 						 'op_navigation_window_height',
 						 ['label' => $this->_('Hauteur du widget en pixels'),
-							'value' => $this->preferences['op_navigation_window_height']]);
+							'value' => $this->preferences['op_navigation_window_height']])
+->addElement('text',
+						 'op_navigation_cycle',
+						 ['label' => $this->_('Délai de défilement en millisecondes'),
+							'value' => $this->preferences['op_navigation_cycle'],
+							'placeholder' => $this->_('0 pour désactiver')]);
 echo $form;
 ?>
diff --git a/public/opac/java/slider_navigation/slider.css b/public/opac/java/slider_navigation/slider.css
index ae350ccacd973cd2e641e652ba6b9a3209145fd1..e4b79ac516c912a4bf8c2d62d34c64905fb569dd 100644
--- a/public/opac/java/slider_navigation/slider.css
+++ b/public/opac/java/slider_navigation/slider.css
@@ -34,4 +34,41 @@
 
 .slider_button[data-event="next"] {
     background: url('../../images/buttons/2rightarrow.png') no-repeat 0px 0px;
+}
+
+
+.preview_button {
+    border: 1px solid black;
+    cursor: pointer;
+    float: left;
+    height: 30px;
+    margin:10px 10px 0px 0px;
+    overflow: hidden;
+    position: relative;
+    width: 70px;
+}
+
+
+.preview_button span{
+    background-color: rgba(0, 0, 0, 0.4);
+    color: white;
+    font-size: 1.2em;
+    text-shadow: 1px 1px black;
+    position: absolute;
+    top: 5px;
+    left: 5px
+}
+
+
+.preview_button.selected span {
+    background: none;
+}
+
+
+.preview_button img {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    height: 30px;
+    width: 70px;
 }
\ No newline at end of file
diff --git a/public/opac/java/slider_navigation/slider_navigation.js b/public/opac/java/slider_navigation/slider_navigation.js
index c967f5933bdf90335b0f362889e2ca916d504f1b..4f7b00078d58d80374622038df91ea2bbdc53492 100755
--- a/public/opac/java/slider_navigation/slider_navigation.js
+++ b/public/opac/java/slider_navigation/slider_navigation.js
@@ -18,99 +18,107 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 (function ( $ ) {
-  $.fn.slider_navigation = function (base_url, width, height, button_strategy) {
+  $.fn.slider_navigation = function (options) {
     if ($('head').find('link[href*="slider.css"]').length < 1) {
-      $('head').append('<link media="screen" href="' + base_url + '/public/opac/java/slider_navigation/slider.css" rel="stylesheet" type="text/css"></link>');
+      $('head').append('<link media="screen" href="' 
+		       + baseUrl + '/public/opac/java/slider_navigation/slider.css" rel="stylesheet" type="text/css"></link>');
     }
 
     var html = $(this);
-    var articles = html.find('article');
-
-    if(!articles.length>0){
-      return $(this);
-    }
     
-    var article_width = width;
-    var article_height = height;
-    var article_size = 'width:'+article_width+'px;height:'+article_height+'px';
-
-    prepareHtml();
-
-    var news_row = html.find('div.news_row');
-    var position = 0;
-
-    var strategy;
+    if(!html.find('article').length > 0)
+      return html;
+    
+    html = upgradeHtml(html);
+    html = setWindowAndArticleSize(html, 'width:' + options.width + 'px;height:' + options.height + 'px');
+    html = placeArticlesWithPosition(html, 0, options.width);
+
+    var strategy = getStrategy(options.strategy);
+    html = strategy.generateButtons(html);
+    html = strategy.implementsButtons(html, options);
+
+    if (parseInt(options.cycle) > 0) {
+      var current_cycle = setTimeout(cycle, options.cycle, html, strategy, options.cycle);
+      html.click(function () {
+	clearTimeout(current_cycle);
+      });
+    }
 
-    initArticles();
+    function getStrategy(strategy) {
+      if(strategy === "next_previous")
+	return new Strategy_Next_Previous();
+      
+      if(strategy ==="preview")
+	return new Strategy_Preview()
 
-    if(button_strategy === "next_previous"){
-      strategy = new Strategy_Next_Previous(html, articles, article_width, news_row);
-    } else {
-      strategy = new Strategy(html, articles, article_width, position, news_row);
+      return new Strategy();
     }
 
-    html = strategy.createButton();
-    html = strategy.implementsButtons();
 
-    function prepareHtml() {
+    function upgradeHtml(html) {
       html.find('div.article_full_separator').remove();
-      articles.wrapAll('<div class="news_row"></div>');
+      html.find('article').wrapAll('<div class="news_row"></div>');
       html.find('div.news_row').wrap('<div class="window"></div>');
       html.find('div.window').wrap('<div class="slider_navigation"></div>');
       html.find('div.slider_navigation').append('<div class="slider_navigation_controls"></div>');
-      setSize();
+      return html;
+    }
+
+
+    function cycle(html, strategy, delay) {
+      strategy.next(html);
+      current_cycle = setTimeout(cycle, delay, html, strategy, delay);
     }
 
     
-    function setSize() {
-      articles.attr('style', article_size);
-      html.find('div.window').attr('style', article_size);
+    function setWindowAndArticleSize(html, size) {
+      html.find('article').attr('style', size);
+      html.find('div.window').attr('style', size);
+      return html;
     }
 
 
-    function initArticles() {
-      news_row.css('margin-left', position+'px');
-      news_row.width(articles.length*article_width);
+    function placeArticlesWithPosition(html, position, width) {
+      html.find('div.news_row').css('margin-left', position + 'px');
+      html.find('div.news_row').width(html.find('article').length * width);
+      return html;
     }
   };
 
-
-  var initCssForHorizontalSlideOnElement = function(element, length) {
-    return element.css({'margin-left': length+'px', 
-			'transition-property': 'all', 
-			'transition-duration': '0.8s'});
+  
+  function initCssForHorizontalSlide(length) {
+    return {'margin-left': length+'px', 
+	    'transition-property': 'all', 
+	    'transition-duration': '0.8s'};
   }
 
+  
+  function Strategy() {
+    this.current_position = 0;
 
-  var Strategy = function(html, articles, article_width, position, news_row) {
-    var html = html;
-    var articles = articles;
-    var article_width = article_width;
-    var position = position;
-    var news_row = news_row;
-    
-    this.createButton = function() {
-      var slider_controls = html.find('div.slider_navigation_controls');
-      articles.each(function(index) {
-	slider_controls.append('<div class="slider_button" data-article="'+(index+=1)+'"></div>');
+    this.next = function (html) {
+      var total = html.find('div[data-article]').length;
+      var next = this.current_position + 1;
+      if (next > total)
+	next = 1;
+      html.find('div[data-article='+ next +']').trigger('click');
+    }
+
+    this.generateButtons = function(html) {
+      html.find('article').each(function(index) {
+	html.find('div.slider_navigation_controls').append('<div class="slider_button" data-article="'+(index+=1)+'"></div>');
       });
       return html;
     };
 
-    this.implementsButtons = function() {
+    this.implementsButtons = function(html, properties) {
+      var my = this;
       html.find('div[data-article=1]').addClass('selected');
-      var current_position = 0;
-
       html.find('div[data-article]').click(function() {
-	
 	html.find('div[data-article]').removeClass('selected');
 	$(this).addClass('selected');
-
-	current_position = $(this).data('article');
-
-	position = (-1) * (current_position-1) * article_width;
-	
-	initCssForHorizontalSlideOnElement(news_row, position);
+	my.current_position = $(this).data('article');
+	html.find('div.news_row').css(initCssForHorizontalSlide(((-1) * ((my.current_position-1) * properties.width))));
       });
       return html;
     }
@@ -118,44 +126,81 @@
 
 
 
-  var Strategy_Next_Previous = function(html, articles, article_width, news_row) {
-    var html = html;
-    var articles = articles;
-    var article_width = article_width;
-    var news_row = news_row;
+  function Strategy_Next_Previous() {
+    this.next = function(html) {
+      if(parseInt( html.find('div.news_row').css('margin-left')) == this.right_cleat)
+	return html.find('div.news_row').css(initCssForHorizontalSlide(this.left_cleat));
+      return html.find('div[data-event="next"]').trigger('click');
+    }
 
-    this.createButton = function() {
+    this.generateButtons = function(html) {
       html.find('div.slider_navigation_controls')
 	.append('<div class="slider_button" data-event="previous"></div>')
 	.append('<div class="slider_button" data-event="next"></div>');
       return html;
     };
 
-    this.implementsButtons = function() {
-      var right_cleat = ((articles.length * article_width) - article_width) * (-1);
+    this.implementsButtons = function(html, properties) {
+      var right_cleat = ((html.find('article').length * properties.width) - properties.width) * (-1);
+      this.right_cleat = right_cleat;
       var left_cleat = 0;
+      this.left_cleat = left_cleat;
 
       html.find('div[data-event="next"]').click(function() {
-	var old_margin = parseInt( news_row.css('margin-left'));
-	var length = (old_margin > right_cleat && (old_margin % article_width == 0)) 
-	  ? old_margin - article_width 
+	var old_margin = parseInt( html.find('div.news_row').css('margin-left'));
+	var length = (old_margin > right_cleat && (old_margin % properties.width == 0)) 
+	  ? old_margin - parseInt( properties.width )
 	  : right_cleat;
 
-	initCssForHorizontalSlideOnElement(news_row, length);
+	html.find('div.news_row').css(initCssForHorizontalSlide(length));
       });
 
 
       html.find('div[data-event="previous"]').click(function() {
-	var old_margin = parseInt( news_row.css('margin-left'));
-	var length = (old_margin < left_cleat && (old_margin % article_width == 0)) 
-	  ? old_margin + article_width 
+	var old_margin = parseInt( html.find('div.news_row').css('margin-left'));
+	var length = (old_margin < left_cleat && (old_margin % properties.width == 0)) 
+	  ? old_margin + parseInt( properties.width )
 	  : 0;
 
-	initCssForHorizontalSlideOnElement(news_row, length);
+	html.find('div.news_row').css(initCssForHorizontalSlide(length));
       });
 
       return html;
     }
   };
 
+
+
+  function Strategy_Preview() {
+    this.strategy = new Strategy();
+
+    this.next = function(html) {
+      this.strategy.next(html);
+    }
+
+
+    this.generateButtons = function(html, properties) {
+      html.find('article').each(function(index) {
+	var image_url = $(this).find('.article_content img').attr('src');
+	var title = $(this).find('header h2').text();
+
+	if(!title) 
+	  title = '';
+
+	if(!image_url)
+	  image_url= baseUrl + '/public/opac/images/buttons/no_preview.png';
+	
+	html
+	  .find('div.slider_navigation_controls')
+	  .append('<div class="preview_button" data-article="'+(index+=1)+'"><img src='+image_url+'></img><span>'+title+'</span></div>');
+      });
+      return html;
+    };
+
+    this.implementsButtons = function(html, properties) {
+      return this.strategy.implementsButtons(html, properties);
+    }
+  };
+
+
 } (jQuery));
diff --git a/public/opac/java/slider_navigation/tests/agenda_slider.html b/public/opac/java/slider_navigation/tests/agenda_slider.html
index 9b004dd6068a2d2375d0bd6e44a8cd40adcd791b..10f747672bb2fd76960976d1a767577abc2a71eb 100644
--- a/public/opac/java/slider_navigation/tests/agenda_slider.html
+++ b/public/opac/java/slider_navigation/tests/agenda_slider.html
@@ -31,6 +31,7 @@
   <div id="qunit-fixture"></div>
   <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
   <script src="../slider_navigation.js"></script>
+  <script type="text/javascript">var baseUrl = ".."</script>
   <script src="http://code.jquery.com/qunit/qunit-1.13.0.js"></script>
   <script src="agenda_slider_test.js"></script>
 </body>
diff --git a/public/opac/java/slider_navigation/tests/agenda_slider_test.js b/public/opac/java/slider_navigation/tests/agenda_slider_test.js
index 93dfd9630ed15b1c02fb4a76155e22e9aad3d402..8dc444c37c770b2601ac43d29aceb88b128db481 100644
--- a/public/opac/java/slider_navigation/tests/agenda_slider_test.js
+++ b/public/opac/java/slider_navigation/tests/agenda_slider_test.js
@@ -28,7 +28,7 @@ QUnit.module('slider_navigation', {
 		+'<article>Bokeh la biquette</article>'
 		+'</div>');
 
-    fixture.slider_navigation('../', 110, 80 ,'next_previous');
+    fixture.slider_navigation({width:110, height:80, strategy:'next_previous', cycle: 500});
   }
 });
 
@@ -88,3 +88,23 @@ test('window width should be 110px', function() {
 test('window height should be 80px', function() {
   deepEqual(fixture.find('div.window').attr('style'), 'width:110px;height:80px', fixture.html());
 });
+
+
+QUnit.asyncTest('cycle should trigger click and move articles', function( assert ) {
+  expect( 1 );
+ 
+  setTimeout(function() {
+     deepEqual(fixture.find('div.news_row').css('margin-left'), '-110px', fixture.html());
+    QUnit.start();
+  }, 1000);
+});
+
+
+QUnit.asyncTest('cycle should not trigger click and not move articles', function( assert ) {
+  expect( 1 );
+  fixture.trigger('click');
+  setTimeout(function() {
+     deepEqual(fixture.find('div.news_row').css('margin-left'), '0px', fixture.html());
+    QUnit.start();
+  }, 1500);
+});
diff --git a/public/opac/java/slider_navigation/tests/news_slider.html b/public/opac/java/slider_navigation/tests/news_slider.html
index f3d520f78dfcbc0d55e16a0e9d888204169930e0..ba4559fe811848d8a6a254f5ee5273fdec330e32 100644
--- a/public/opac/java/slider_navigation/tests/news_slider.html
+++ b/public/opac/java/slider_navigation/tests/news_slider.html
@@ -31,6 +31,7 @@
   <div id="qunit-fixture"></div>
   <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
   <script src="../slider_navigation.js"></script>
+  <script type="text/javascript">var baseUrl = ".."</script>
   <script src="http://code.jquery.com/qunit/qunit-1.13.0.js"></script>
   <script src="news_slider_test.js"></script>
 </body>
diff --git a/public/opac/java/slider_navigation/tests/news_slider_test.js b/public/opac/java/slider_navigation/tests/news_slider_test.js
index 370b4d4feceb04b0a80ddefdd38c7a4e67e3990b..9771223af3e1a0c906cc5750115ed63c295548fe 100644
--- a/public/opac/java/slider_navigation/tests/news_slider_test.js
+++ b/public/opac/java/slider_navigation/tests/news_slider_test.js
@@ -29,7 +29,7 @@ QUnit.module('slider_navigation', {
 		+'<article>Biquette</article>'
 		+'</div>');
 
-    fixture.slider_navigation("..", 50, 300);
+    fixture.slider_navigation({width:50, height:300});
   }
 });
 
@@ -118,3 +118,12 @@ test('div.news_row width should be 100px', function() {
 test('slider.css should be loaded only once', function() {
   deepEqual(html.find('link[href*="public/opac/java/slider_navigation/slider.css"]').length, 1, html.html());
 });
+
+
+QUnit.asyncTest('with no cycle articles should not move', function( assert ) {
+  expect( 1 );
+  setTimeout(function() {
+     deepEqual(fixture.find('div.news_row').css('margin-left'), '0px', fixture.html());
+    QUnit.start();
+  }, 1500);
+});
diff --git a/public/opac/java/slider_navigation/tests/preview_slider.html b/public/opac/java/slider_navigation/tests/preview_slider.html
new file mode 100644
index 0000000000000000000000000000000000000000..4cb4a0cdbdec09067e94726e9a4eaa387c048ac9
--- /dev/null
+++ b/public/opac/java/slider_navigation/tests/preview_slider.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!--
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ */
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>QUnit tests</title>
+  <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-git.css">
+</head>
+<body>
+  <div id="qunit"></div>
+  <div id="qunit-fixture"></div>
+  <script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
+  <script src="../slider_navigation.js"></script>
+  <script src="http://code.jquery.com/qunit/qunit-1.13.0.js"></script>
+  <script type="text/javascript">var baseUrl = ".."</script>
+  <script src="preview_slider_test.js"></script>
+</body>
+</html>
diff --git a/public/opac/java/slider_navigation/tests/preview_slider_test.js b/public/opac/java/slider_navigation/tests/preview_slider_test.js
new file mode 100644
index 0000000000000000000000000000000000000000..815c78d49008c67e894684f6f2a717c82114115d
--- /dev/null
+++ b/public/opac/java/slider_navigation/tests/preview_slider_test.js
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2014, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ */
+var fixture;
+
+QUnit.module('slider_navigation', {
+  setup: function() {
+    fixture = $('<div>'
+		+'<article>Bokeh<div class="article_content"><img src="preview.png"></img></div></article>'
+		+'<article>Biquette<div class="article_content"><img src="../folder/playa.png"></img></div></article>'
+		+'<article>Bokeh la biquette</article>'
+		+'</div>');
+
+    fixture.slider_navigation({width:110, height:80, strategy:'preview', cycle: '500'});
+  }
+});
+
+
+test('first button should have preview.png as img', function() {
+  deepEqual(fixture.find('div.preview_button[data-article="1"]').find('img').attr('src'), 'preview.png', fixture.html());
+});
+
+
+test('second button should have playa.png as background', function() {
+  deepEqual(fixture.find('div.preview_button[data-article="2"]').find('img').attr('src'), '../folder/playa.png', fixture.html());
+});
+
+
+test('third button should have no_preview.png as background', function() {
+  deepEqual(fixture.find('div.preview_button[data-article="3"]').find('img').attr('src'), '../public/opac/images/buttons/no_preview.png', fixture.html());
+});
+
+
+QUnit.asyncTest('cycle should trigger click and move articles', function( assert ) {
+  expect( 1 );
+ 
+  setTimeout(function() {
+     deepEqual(fixture.find('div.news_row').css('margin-left'), '-110px', fixture.html());
+    QUnit.start();
+  }, 1500);
+});
+
+
+QUnit.asyncTest('cycle should not trigger click and not move articles', function( assert ) {
+  expect( 1 );
+  fixture.trigger('click');
+  setTimeout(function() {
+     deepEqual(fixture.find('div.news_row').css('margin-left'), '0px', fixture.html());
+    QUnit.start();
+  }, 1500);
+});
diff --git a/public/opac/js/calendrier.js b/public/opac/js/calendrier.js
index e748f64089a67431408e67841f6d678b6e63b9ae..a70e163d9f427e209baf618287630adf2f1d65df 100644
--- a/public/opac/js/calendrier.js
+++ b/public/opac/js/calendrier.js
@@ -1,5 +1,5 @@
 var ajaxify_calendars = function () {
-  var month_link = $("a.calendar_title_month_clickable:first-child, a.calendar_title_month_clickable:last-child, .calendar .month_list a:not(.no_event)");
+  var month_link = $(".calendar_ajax_ready, .calendar_title_left_arrow a, .calendar_title_right_arrow a, .calendar .month_list a:not(.no_event), .filters a");
 
   month_link.click(function(event) {
     var url = $(this).attr('href');
@@ -13,7 +13,7 @@ var ajaxify_calendars = function () {
       url = $(this).jqmData('href');
 
     $(this).closest(".contenu").load(url+'/render/ajax', 
-																		 ajaxify_calendars);
+				     ajaxify_calendars);
     event.preventDefault();
   });
 
@@ -22,26 +22,27 @@ var ajaxify_calendars = function () {
     event.preventDefault();
   });
 
-    $('.calendar').bind('swiperight', 
-											function () {
-												$("a.calendar_title_month_clickable:first-child").click();
-											}); 
+  $('.calendar').bind('swiperight', 
+		      function () {
+			$("a.calendar_title_month_clickable:first-child").click();
+		      }); 
   $('.calendar').bind('swipeleft', 
-											function () {
-												$("a.calendar_title_month_clickable:last-child").click();
-											}); 
+		      function () {
+			$("a.calendar_title_month_clickable:last-child").click();
+		      }); 
 
 
   $("form#calendar_select_categorie").change(function(event) {
     var url = $(this).attr('action');
     $(this).closest(".calendar").load(url, 
-																			{'select_id_categorie':$(this).children('select').val(),
-																			 'id_module':$(this).children('input').val()},
-																			ajaxify_calendars);
+				      {'select_id_categorie':$(this).children('select').val(),
+				       'id_module':$(this).children('input').val()},
+				      ajaxify_calendars);
   });
 
 
   $('.auto_resize').removeClass('auto_resize');
+  initializePopups();
   if (undefined != window.calendrierAfterLoad)
     calendrierAfterLoad();
 
diff --git a/public/opac/js/input_connect_list/input_connect_list.css b/public/opac/js/input_connect_list/input_connect_list.css
new file mode 100644
index 0000000000000000000000000000000000000000..9eee276ba64e808aff180966ccf3076e499a105a
--- /dev/null
+++ b/public/opac/js/input_connect_list/input_connect_list.css
@@ -0,0 +1,27 @@
+.input_connect_list > div {
+  border: 1px solid #738ead;
+  display: inline-block;
+  margin: 5px;
+  vertical-align: top;
+}
+
+.input_connect_list h2 {
+  background-color: #738ead;
+  color: white;
+  font-size: 0.9em;
+  padding: 5px;
+  margin: 0;
+}
+
+.input_connect_list ul {
+  list-style-type: none;
+  min-width: 120px;
+  min-height: 120px;
+  padding: 5px 2px;
+}
+
+.input_connect_list li {
+  cursor: move;
+  margin: 2px 0;
+  padding: 0 5px;
+}
diff --git a/public/opac/js/input_connect_list/input_connect_list.js b/public/opac/js/input_connect_list/input_connect_list.js
new file mode 100644
index 0000000000000000000000000000000000000000..317a2694995918a94b9b959df7647458dfb63773
--- /dev/null
+++ b/public/opac/js/input_connect_list/input_connect_list.js
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ */
+
+(function ( $ ) {
+  $.fn.inputConnectList = function () {
+    var input = this.find('input');
+    var lists = this.find('ul');
+    this.addClass('input_connect_list');
+    this.find('li').addClass('ui-state-default');
+    lists.sortable({
+        connectWith: lists,
+        update: function() {
+            var values = $(lists[0]).sortable("toArray", {
+              attribute: "data-value"
+            });
+            input.val( values.join(';') );
+        }
+    });
+    lists.disableSelection();
+  };
+} (jQuery));
diff --git a/public/opac/js/subModal.js b/public/opac/js/subModal.js
index 211ae3b98d0d4f05e5c871dab19786fc81a18fa1..ee669febda0552348fdd28847f2b2f71014e5452 100644
--- a/public/opac/js/subModal.js
+++ b/public/opac/js/subModal.js
@@ -139,24 +139,26 @@
     if (data['show_modal'] && data['show_modal']=='true')
       show_modal=true;
 
-		var position = { my: "center top", at: "center top", of: window };
+    var position = (data['position'] != undefined) ? 
+      data['position'] : 
+      { my: "center top", at: "center top", of: window };
 
-		//pour que le dialogue soit en dessous de la notification
-		if ($("#info_message").size())
-			position = {my: "center top", 
-									at: "center bottom",
-									of: "#info_message", 
-									collision: "flip"};
+    //pour que le dialogue soit en dessous de la notification
+    if ($("#info_message").size())
+      position = {my: "center top", 
+		  at: "center bottom",
+		  of: "#info_message", 
+		  collision: "flip"};
 
     var modal = container.dialog({
       width:modal_size['width'],
       height:modal_size['height'],
-      modal:false,
+      modal:show_modal,
       title: titre,
       dialogClass: dialogClass,
       close:onClose,
       open:onOpen,
-			position: position
+      position: position
     });
     return modal;
   }
diff --git a/tests/application/modules/AbstractControllerTestCase.php b/tests/application/modules/AbstractControllerTestCase.php
index 2054ed62933c6b38774b2b7f060884578c47f1d6..2684a52fbff4f3fde8af47e2107c3b52bebfcdcb 100644
--- a/tests/application/modules/AbstractControllerTestCase.php
+++ b/tests/application/modules/AbstractControllerTestCase.php
@@ -116,6 +116,12 @@ abstract class AbstractControllerTestCase extends Zend_Test_PHPUnit_ControllerTe
 			->newInstanceWithId('WORKFLOW')
 			->setValeur(0);
 
+		$admin_var_loader
+			->newInstanceWithId('TEXT_REPLACEMENTS')
+			->setValeur('');
+
+		Class_TextReplacements::reset();
+
 		$admin_var_loader
 			->newInstanceWithId('LANGUES')
 			->setValeur(null);
diff --git a/tests/application/modules/admin/controllers/AccueilControllerCalendarTest.php b/tests/application/modules/admin/controllers/AccueilControllerCalendarTest.php
index a96104c6dbc040602b002a7346c951c8c6fec974..cf3bb566fc0967643b87c97e36c6720f3507c106 100644
--- a/tests/application/modules/admin/controllers/AccueilControllerCalendarTest.php
+++ b/tests/application/modules/admin/controllers/AccueilControllerCalendarTest.php
@@ -16,39 +16,63 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
-class Admin_AccueilControllerCalendarTestWithDefaultDiaporamaNavigation extends Admin_AbstractControllerTestCase {
-	
+abstract class Admin_AccueilControllerCalendarTestCase extends Admin_AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		
-		$this->fixture('Class_Profil', 
+
+		Class_CustomField_Meta::beVolatile();
+		$this->fixture('Class_CustomField',
+									 ['id' => 1,
+										'priority' => 3,
+										'label' => 'Public',
+										'field_type' => Class_CustomField_Meta::SELECT,
+										'options_list' => 'junior; senior; ',
+										'model' => 'Article']);
+		$this->fixture('Class_CustomField',
+									 ['id' => 2,
+										'priority' => 3,
+										'label' => 'Theme',
+										'field_type' => Class_CustomField_Meta::SELECT,
+										'options_list' => 'music;theater;movie',
+										'model' => 'Article']);
+
+		$this->fixture('Class_Profil',
 									 ['id' => 1,
 										'libelle' => 'Afibre'])
-			->updateModuleConfigAccueil(1, ['type_module' => 'CALENDRIER',
-																			'division' => 1,
-																			'id_module' => 1,
-																			'preferences' => ['nb_events' => 3,
-																												'rss_avis' => 0,
-																												'display_calendar' => 1,
-																												'mode-affichage' => 'diaporama_navigation',
-																												'op_navigation_mode' => 'next_previous',
-																												'display_event_info' => 'bib',
-																												'display_mode' => 'Summary',
-																												'display_order' => 'EventDebut',
-																												'display_cat_select' => '',
-																			'id_categorie' => '',
-																			'event_filter' => 'none'
-																				]])
-			->beCurrentProfil();
-
-		$this->dispatch('admin/accueil/calendrier?config=accueil&id_profil=1&id_module=1&type_module=CALENDRIER', true);
-	}
-
-	
+				 ->updateModuleConfigAccueil(1, ['type_module' => 'CALENDAR',
+																				 'division' => 1,
+																				 'id_module' => 1,
+																				 'preferences' => ['nb_events' => 3,
+																													 'rss_avis' => 0,
+																													 'display_calendar' => 1,
+																													 'mode-affichage' => 'diaporama_navigation',
+																													 'op_navigation_mode' => 'next_previous',
+																													 'display_event_info' => 'bib',
+																													 'display_mode' => 'Summary',
+																													 'display_order' => 'EventDebut',
+																													 'display_cat_select' => '',
+																													 'enabled_filters' => 'date;place;custom_field_1',
+																													 'id_categorie' => '',
+																													 'event_filter' => 'none']])
+				 ->beCurrentProfil();
+
+
+	}
+}
+
+
+
+class Admin_AccueilControllerCalendarTestWithDefaultDiaporamaNavigation extends Admin_AccueilControllerCalendarTestCase {
+	public function setUp() {
+		parent::setUp();
+		$this->dispatch('admin/accueil/calendrier?config=accueil&id_profil=1&id_module=1&type_module=CALENDAR', true);
+	}
+
+
 	/** @test */
 	public function settingsEventFilterToDisplayShouldBePresent() {
 		$this->assertXPath('//td[contains(text(),"Filtre")]/following-sibling::td/select[@name="event_filter"]/option[@value="none"][@selected="selected"]', $this->_response->getBody());
@@ -71,5 +95,115 @@ class Admin_AccueilControllerCalendarTestWithDefaultDiaporamaNavigation extends
 	public function navigationModeShouldBeSetToNextPrevious() {
 		$this->assertXPathContentContains('//div[@id="objet_props"]//select[@name="op_navigation_mode"]/option[@value="next_previous"][@selected="selected"]', 'Boutons précédent et suivant');
 	}
+
+
+	/** @test */
+	public function inputFiltersShouldBePresent() {
+		$this->assertXPath('//div[@id="input_enabled_filters"]/input[@type="hidden"][@name="enabled_filters"]');
+	}
+
+
+	/** @test */
+	public function secondListShouldContainsOnlyOneElement() {
+		$this->assertXPathCount('//div[@id="input_enabled_filters"]/div[2]/ul/li', 1, $this->_response->getBody());
+	}
+
+
+	/** @test */
+	public function secondListShouldContainsTheme() {
+		$this->assertXPathContentContains('//div[@id="input_enabled_filters"]/div[2]/ul/li[@data-value="custom_field_2"]', 'Theme');
+	}
+
+
+	/** @test */
+	public function firstListShouldContainsThreeElements() {
+		$this->assertXPathCount('//div[@id="input_enabled_filters"]/div[1]/ul/li', 3);
+	}
+
+
+	/** @test */
+	public function firstListShouldContainsPublic() {
+		$this->assertXPathContentContains('//div[@id="input_enabled_filters"]/div[1]/ul/li[@data-value="custom_field_1"]', 'Public');
+	}
+
+
+	/** @test */
+	public function firstListShouldContainsMonthPlace() {
+		$this->assertXPathContentContains('//div[@id="input_enabled_filters"]/div[1]/ul/li[@data-value="date"]', 'Mois');
+	}
+
+
+	/** @test */
+	public function firstListShouldContainsPlace() {
+		$this->assertXPathContentContains('//div[@id="input_enabled_filters"]/div[1]/ul/li[@data-value="place"]', 'Lieu');
+	}
+
+
+	/** @test */
+	public function checkBoxDisableDisplayFullPageShouldBePresent () {
+		$this->assertXPath('//div[@class="formTable"]//fieldset//input[@type="checkbox"][@checked="checked"][@name="display_full_page"]');
+	}
+}
+
+
+
+
+class Admin_AccueilControllerCalendarPostTest extends Admin_AccueilControllerCalendarTestCase {
+	public function setUp() {
+		parent::setUp();
+		$this->postDispatch('admin/accueil/calendrier?config=accueil&id_profil=1&id_module=1&type_module=CALENDAR',
+												['display_full_page' => 0]);
+	}
+
+
+	/** @test */
+	public function displayFullDayShouldHaveBeenSaved() {
+		$this->assertequals(0, Class_Profil::find(1)->getCfgAccueilAsArray()['modules'][1]['preferences']['display_full_page']);
+	}
+}
+
+
+
+
+class Admin_AccueilControllerCalendarPostFiltersTest extends Admin_AccueilControllerCalendarTestCase {
+	public function setUp() {
+		parent::setUp();
+		$this->postDispatch('admin/profil/accueil/id_profil/1',
+												['libelle' => 'new title',
+												 'use_parent_css' => 1,
+												 'page_css' => '',
+												 'saveContent' => 'box2|5|CALENDAR|titre=Calendrier+des+animations/id_categorie=/display_cat_select=/display_event_info=bib/rss_avis=0/display_next_event=1/display_order=EventDebut/display_mode=Title/nb_events=3/display_calendar=1/mode-affichage=simple/event_filter=none/enabled_filters=date;place;custom_field_1;custom_field_2/boite=/id_items=/Valider=Valider/;box1|1|RESERVATIONS|titre=Mes+réservations/boite=/=/;box2|2|PRETS|titre=Mes+prêts/boite=/=/;box2|3|NEWSLETTERS|titre=Newsletters/boite=/=/;box2|4|MULTIMEDIA|titre=Postes+multimédia/boite=/=/']);
+	}
+
+	/** @test */
+	public function cfgModuleShouldContainsCalendarFiltersDatePlaceAndCustomFilters() {
+		$prefs = Class_Profil::find(1)->getModuleAccueilPreferences(5, 'CALENDAR');
+		$this->assertEquals('date;place;custom_field_1;custom_field_2',
+												$prefs['enabled_filters']);
+
+	}
+
+
+	/** @test */
+	public function calendarDivisionShouldBeTwo() {
+		$config = Class_Profil::find(1)->getModuleAccueilConfig(5, 'CALENDAR');
+		$this->assertEquals(2,
+												$config['division']);
+	}
+
+
+	/** @test */
+	public function reservationsDivisionShouldBeOne() {
+		$config = Class_Profil::find(1)->getModuleAccueilConfig(1, 'RESERVATIONS');
+		$this->assertEquals(1,
+												$config['division']);
+	}
+
+
+	/** @test */
+	public function profilShouldHaveFiveModules() {
+		$this->assertEquals(5, count(Class_Profil::find(1)->getCfgAccueilAsArray()['modules']));
+	}
 }
+
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/AccueilControllerCmsTest.php b/tests/application/modules/admin/controllers/AccueilControllerCmsTest.php
index cca998b1eabd092d6c597c3b454d6aafa5427f87..f553fcc2d2d50dae141164ab55bfec1098371df4 100644
--- a/tests/application/modules/admin/controllers/AccueilControllerCmsTest.php
+++ b/tests/application/modules/admin/controllers/AccueilControllerCmsTest.php
@@ -16,16 +16,16 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
-class Admin_AccueilControllerCmsTestWithDefaultDiaporamaNavigation extends Admin_AbstractControllerTestCase {		
+class Admin_AccueilControllerCmsTestWithDefaultDiaporamaNavigation extends Admin_AbstractControllerTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		
-		$this->fixture('Class_Profil', 
+
+		$this->fixture('Class_Profil',
 									 ['id' => 1,
 										'libelle' => 'Afibre'])
 			->updateModuleConfigAccueil(1, ['type_module' => 'NEWS',
@@ -56,11 +56,24 @@ class Admin_AccueilControllerCmsTestWithDefaultDiaporamaNavigation extends Admin
 	}
 
 
+	/** @test */
+	public function navigationModePreviewShouldBePresent() {
+		$this->assertXPathContentContains('//div[@id="objet_props"]//select[@name="op_navigation_mode"]/option[@value="preview"]', 'Une miniature pour chaque élément');
+	}
+
+
+	/** @test */
+	public function cycleIntervalShouldBePresent() {
+		$this->assertXPath('//div[@id="objet_props"]//input[@name="op_navigation_cycle"]');
+	}
+
+
+
 	/** @test */
 	public function navigationModeShouldBeSetToButtons() {
 		$this->assertXPathContentContains('//div[@id="objet_props"]//select[@name="op_navigation_mode"]/option[@value="buttons"][@selected="selected"]', 'Un bouton pour chaque élément', $this->_response->getBody());
 	}
-	
+
 
 	/** @test */
 	public function windowWidthShouldBeSetTo350px() {
@@ -77,12 +90,12 @@ class Admin_AccueilControllerCmsTestWithDefaultDiaporamaNavigation extends Admin
 
 
 
-class Admin_AccueilControllerCmsWithNextPreviousDiaporamaNavigation extends Admin_AbstractControllerTestCase {		
+class Admin_AccueilControllerCmsWithNextPreviousDiaporamaNavigation extends Admin_AbstractControllerTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		
-		$this->fixture('Class_Profil', 
+
+		$this->fixture('Class_Profil',
 									 ['id' => 1,
 										'libelle' => 'Afibre'])
 			->updateModuleConfigAccueil(1, ['type_module' => 'NEWS',
@@ -91,18 +104,19 @@ class Admin_AccueilControllerCmsWithNextPreviousDiaporamaNavigation extends Admi
 																			'preferences' => ['style_liste' => 'diaporama_navigation',
 																												'op_navigation_mode' => 'next_previous',
 																												'op_navigation_window_height' => 500,
-																												'op_navigation_window_width' => 150]])
+																												'op_navigation_window_width' => 150,
+																												'op_navigation_cycle' => 1000]])
 			->beCurrentProfil();
 
 		$this->dispatch('admin/accueil/news?config=accueil&id_profil=1&id_module=1&type_module=NEWS', true);
 	}
 
-	
+
 	/** @test */
 	public function navigationModeShouldBeSetToNextPrevious() {
 		$this->assertXPathContentContains('//div[@id="objet_props"]//select[@name="op_navigation_mode"]/option[@value="next_previous"][@selected="selected"]', 'Boutons précédent et suivant');
 	}
-	
+
 
 	/** @test */
 	public function windowWidthShouldBeSetTo150px() {
@@ -114,5 +128,11 @@ class Admin_AccueilControllerCmsWithNextPreviousDiaporamaNavigation extends Admi
 	public function windowHeightShouldBeSetTo500px() {
 		$this->assertXPath('//div[@id="objet_props"]//input[@name="op_navigation_window_height"][@value="500"]');
 	}
+
+
+/** @test */
+	public function cycleShouldBeSetTo1000() {
+		$this->assertXPath('//div[@id="objet_props"]//input[@name="op_navigation_cycle"][@value="1000"]');
+	}
 }
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/AdminIndexControllerTest.php b/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
index d0ea2434649ef83ee43cadbd58ddf85ed071fb78..b48ecea0b61be1b3e750d1abe7a30ebc0d0eb8fd 100644
--- a/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
+++ b/tests/application/modules/admin/controllers/AdminIndexControllerTest.php
@@ -194,6 +194,18 @@ class AdminIndexControllerAdminVarActionTest extends Admin_AbstractControllerTes
 	public function cyberlibrisIDShouldBePresent() {
 		$this->assertXpathContentContains('//td', 'CYBERLIBRIS_ID');
 	}
+
+
+	/** @test */
+	public function textReplacementsShouldBePresent() {
+		$this->assertXpathContentContains('//td', 'TEXT_REPLACEMENTS');
+	}
+
+
+	/** @test */
+	public function pageShouldBeHTML5Valid() {
+		$this->assertHTML5();
+	}
 }
 
 
@@ -228,6 +240,8 @@ class AdminIndexControllerAdminVarEditModoBlogActionTest extends Admin_AbstractC
 											'valeur' => "<b>2  \n</b>"));
 		$this->dispatch('/admin/index/adminvaredit/cle/MODO_BLOG');
 		$this->assertEquals(2, $this->modo_blog->getValeur());
+		$this->assertRedirectTo('/admin/index/adminvaredit/cle/MODO_BLOG');
+		$this->assertFlashMessengerContains('Variable MODO_BLOG sauvegardée');
 	}
 }
 
diff --git a/tests/application/modules/admin/controllers/CatalogueControllerTest.php b/tests/application/modules/admin/controllers/CatalogueControllerTest.php
index 3dab132da37064174f3e1f3ccf2b16647b427207..b1d50761dff6e7f542fd1e5eeffe3346367ceb0f 100644
--- a/tests/application/modules/admin/controllers/CatalogueControllerTest.php
+++ b/tests/application/modules/admin/controllers/CatalogueControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 require_once 'AbstractControllerTestCase.php';
@@ -44,18 +44,18 @@ abstract class AdminCatalogueControllerTestCase extends AbstractControllerTestCa
 			->whenCalled('findAll')
 			->answers([$this->bib_annecy, $this->bib_cran]);
 
-		$panier_jeunesse_dupont = Class_PanierNotice::newInstanceWithId(3, 
+		$panier_jeunesse_dupont = Class_PanierNotice::newInstanceWithId(3,
 																																		['libelle' => 'selection jeunesse',
 																																		 'user' => Class_Users::newInstanceWithId(45, ['nom' => 'Dupont']),
 																																		 'catalogues' => []]);
 
 		$duchamp = Class_Users::newInstanceWithId(98, ['nom' => 'Duchamp']);
-		$panier_adulte_duchamp = Class_PanierNotice::newInstanceWithId(8, 
+		$panier_adulte_duchamp = Class_PanierNotice::newInstanceWithId(8,
 																																	 ['libelle' => 'selection adulte',
 																																		'user' => $duchamp,
 																																		'catalogues' => []]);
 
-		$panier_senior_duchamp = Class_PanierNotice::newInstanceWithId(9, 
+		$panier_senior_duchamp = Class_PanierNotice::newInstanceWithId(9,
 																																	 ['libelle' => 'selection senior',
 																																		'user' => $duchamp,
 																																		'catalogues' => []]);
@@ -68,7 +68,7 @@ abstract class AdminCatalogueControllerTestCase extends AbstractControllerTestCa
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_PanierNoticeCatalogue')
 			->whenCalled('delete')->answers(true)
 			->whenCalled('save')->answers(true);
-		
+
 		$this->_catalogue_adultes = Class_Catalogue::newInstanceWithId(6,
 																																	 ['libelle' => 'Adultes',
 																																		'description' => 'Mon catalogue',
@@ -81,11 +81,11 @@ abstract class AdminCatalogueControllerTestCase extends AbstractControllerTestCa
 																																		'sous_domaines' => [],
 																																		'bibliotheque' => 1,
 																																		'paniers' => []]);
-		
+
 		$this->user_referent=Class_Users::newInstanceWithId(2,['login' => 'referent',
 																													 'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL,
 																													 'pseudo' => 'referent']);
-		$histoire = Class_Catalogue::newInstanceWithId(100, 
+		$histoire = Class_Catalogue::newInstanceWithId(100,
 																									 [ 'libelle' => 'Histoire',
 																										 'sous_domaines' => [
 																											 Class_Catalogue::newInstanceWithId(200, [ 'libelle' => 'Politique',
@@ -93,7 +93,7 @@ abstract class AdminCatalogueControllerTestCase extends AbstractControllerTestCa
 																																																 'dewey'  =>78308,
 																																																 'paniers' => []
 																																														]),
-																											 
+
 																											 Class_Catalogue::newInstanceWithId(300, [ 'libelle'=>'Moyen-age',
 																																																 'user' => $this->user_referent,
 																																																 'parent_id' => 100,
@@ -266,7 +266,7 @@ class CatalogueControllerWithAdminBibAndRightTotalAccessTest extends AdminCatalo
 	/** @test */
 	public function editCatalogueShouldShowValiderButton() {
 		$this->dispatch('/admin/catalogue/edit/id_catalogue/300');
-		$this->assertXPathContentContains('//td', 'Valider');	
+		$this->assertXPathContentContains('//td', 'Valider');
 	}
 }
 
@@ -350,7 +350,7 @@ class CatalogueControllerWithModoPortailIndexTest extends AdminCatalogueControll
 
 	/** @test */
 	public function pageShouldDisplayOAIBaseUrl() {
-		$this->assertXPath(sprintf('//input[@class="permalink"][@readonly="true"][@value="http://localhost%s/opac/oai/request"]', 
+		$this->assertXPath(sprintf('//input[@class="permalink"][@readonly="true"][@value="http://localhost%s/opac/oai/request"]',
 															 BASE_URL));
 	}
 }
@@ -499,14 +499,14 @@ class CatalogueControllerActionTesterTest extends AdminCatalogueControllerTestCa
 			->with("select id_notice  from notices  where MATCH(facettes) AGAINST(' +(B1) +( D78308*)' IN BOOLEAN MODE) and type_doc IN (1, 3, 4, 5) and annee >= '2012' and annee <= '2012' order by alpha_titre  LIMIT 5000")
 			->answers([ ['id_notice' => 2] ]);
 
-		
+
 		$this->dispatch('admin/catalogue/tester/id_catalogue/6', true);
 	}
 
 
 	/** @test */
 	public function pageShouldDisplayRequest() {
-		$this->assertContains("select * from notices  where MATCH(facettes) AGAINST(' +(B1) +( D78308*)' IN BOOLEAN MODE) and type_doc IN (1, 3, 4, 5) and annee >= '2012' and annee <= '2012' order by alpha_titre  LIMIT 0,20",
+		$this->assertContains("select * from notices where MATCH(facettes) AGAINST(' +(B1) +( D78308*)' IN BOOLEAN MODE) and type_doc IN (1, 3, 4, 5) and annee >= '2012' and annee <= '2012' order by alpha_titre  LIMIT 0,20",
 													$this->_response->getBody());
 	}
 
@@ -525,7 +525,7 @@ class CatalogueControllerActionTesterTest extends AdminCatalogueControllerTestCa
 		$this->assertEquals('alpha_titre',
 												$params['order']);
 	}
-	
+
 	/** @test */
 	public function modifyLinkShouldContainsSlashes() {
 		$this->assertXPathContentContains('//a[contains(@href, "/admin/catalogue/edit/id_catalogue/6")]', "Modifier la définition du catalogue");
@@ -535,10 +535,10 @@ class CatalogueControllerActionTesterTest extends AdminCatalogueControllerTestCa
 
 
 
-class CatalogueControllerEditUnknownCatalogueTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditUnknownCatalogueTest extends AdminCatalogueControllerTestCase {
 	/** @test */
 	public function responseShouldRedirectToPageIndex() {
-		$this->dispatch('/admin/catalogue/edit/id_catalogue/1293234');		
+		$this->dispatch('/admin/catalogue/edit/id_catalogue/1293234');
 		$this->assertRedirectTo('/admin/catalogue/index');
 	}
 }
@@ -546,7 +546,7 @@ class CatalogueControllerEditUnknownCatalogueTest extends AdminCatalogueControll
 
 
 
-class CatalogueControllerEditCatalogueTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditCatalogueTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->fixture('Class_CodifAnnexe', ['id' => 1, 'code' => 12, 'libelle' => 'Annexe 12']);
@@ -659,7 +659,7 @@ class CatalogueControllerEditCatalogueTest extends AdminCatalogueControllerTestC
 
 
 
-class CatalogueControllerEditCatalogueInPopupTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditCatalogueInPopupTest extends AdminCatalogueControllerTestCase {
 	protected
 		$_json;
 
@@ -671,8 +671,8 @@ class CatalogueControllerEditCatalogueInPopupTest extends AdminCatalogueControll
 	}
 
 
-	/** 
-	 * @test 
+	/**
+	 * @test
 	 * @pagetitles
 	 */
 	public function titleShouldBeModificationDuDomaine() {
@@ -683,7 +683,7 @@ class CatalogueControllerEditCatalogueInPopupTest extends AdminCatalogueControll
 	/** @test */
 	public function boutonRetourShouldCloseThePopup() {
 		$xpath = new Storm_Test_XPath();
-		$xpath->assertXPath($this->_json->content, 
+		$xpath->assertXPath($this->_json->content,
 												'//div[@class="bouton"][contains(@onclick, "opacDialogClose")][not(contains(@onclick, "window.replace"))]');
 	}
 }
@@ -691,7 +691,7 @@ class CatalogueControllerEditCatalogueInPopupTest extends AdminCatalogueControll
 
 
 
-class CatalogueControllerEditCatalogueWithOAIServerTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditCatalogueWithOAIServerTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 
@@ -712,7 +712,7 @@ class CatalogueControllerEditCatalogueWithOAIServerTest extends AdminCatalogueCo
 
 
 
-class CatalogueControllerEditCataloguePostTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditCataloguePostTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->postDispatch('/admin/catalogue/edit/id_catalogue/6', array('libelle' => 'Jeunes',
@@ -742,8 +742,8 @@ class CatalogueControllerEditCataloguePostTest extends AdminCatalogueControllerT
 
 
 
-abstract class CatalogueControllerEditInPopupTestCase extends AdminCatalogueControllerTestCase { 
-	protected 
+abstract class CatalogueControllerEditInPopupTestCase extends AdminCatalogueControllerTestCase {
+	protected
 		$_json,
 		$_xpath;
 
@@ -756,11 +756,11 @@ abstract class CatalogueControllerEditInPopupTestCase extends AdminCatalogueCont
 
 
 
-class CatalogueControllerEditInPopupPostTest extends CatalogueControllerEditInPopupTestCase { 
+class CatalogueControllerEditInPopupPostTest extends CatalogueControllerEditInPopupTestCase {
 	public function setUp() {
 		parent::setUp();
 		$_SERVER['HTTP_REFERER'] = 'opac/index';
-		$this->postDispatch('/admin/catalogue/edit/id_catalogue/6/render/popup', 
+		$this->postDispatch('/admin/catalogue/edit/id_catalogue/6/render/popup',
 												['libelle' => 'Jeunes',
 												 'pcdm4' => '5']);
 		$this->_json = json_decode($this->_response->getBody());
@@ -775,8 +775,8 @@ class CatalogueControllerEditInPopupPostTest extends CatalogueControllerEditInPo
 
 	/** @test */
 	public function responseShouldBeARedirectWithJavascript() {
-		$this->_xpath->assertXPathContentContains($this->_json->content, 
-																							'//script', 
+		$this->_xpath->assertXPathContentContains($this->_json->content,
+																							'//script',
 																							'window.location="opac/index"');
 	}
 }
@@ -784,10 +784,10 @@ class CatalogueControllerEditInPopupPostTest extends CatalogueControllerEditInPo
 
 
 
-class CatalogueControllerAddCatalogueInPopupPostTest extends CatalogueControllerEditInPopupTestCase { 
+class CatalogueControllerAddCatalogueInPopupPostTest extends CatalogueControllerEditInPopupTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->postDispatch('/admin/catalogue/add/render/popup', 
+		$this->postDispatch('/admin/catalogue/add/render/popup',
 												['libelle' => 'Geeks',
 												 'pcdm4' => '5',
 												 'annee_debut' => '20',
@@ -804,8 +804,8 @@ class CatalogueControllerAddCatalogueInPopupPostTest extends CatalogueController
 
 	/** @test */
 	public function responseShouldBeARedirectWithJavascript() {
-		$this->_xpath->assertXPathContentContains($this->_json->content, 
-																							'//script', 
+		$this->_xpath->assertXPathContentContains($this->_json->content,
+																							'//script',
 																							'window.location="opac/index"');
 	}
 }
@@ -813,7 +813,7 @@ class CatalogueControllerAddCatalogueInPopupPostTest extends CatalogueController
 
 
 
-class CatalogueControllerDuplicateCatalogueTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerDuplicateCatalogueTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->dispatch('/admin/catalogue/duplicate/id_catalogue/200');
@@ -844,7 +844,7 @@ class CatalogueControllerDuplicateCatalogueTest extends AdminCatalogueController
 
 
 
-class CatalogueControllerDuplicateCataloguePostTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerDuplicateCataloguePostTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->postDispatch('/admin/catalogue/duplicate/id_catalogue/6', array('libelle' => 'Jeunes',
@@ -874,7 +874,7 @@ class CatalogueControllerDuplicateCataloguePostTest extends AdminCatalogueContro
 
 
 
-class CatalogueControllerAddCatalogueTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerAddCatalogueTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->dispatch('/admin/catalogue/add/id_catalogue/100', true);
@@ -922,7 +922,7 @@ class CatalogueControllerAddCatalogueTest extends AdminCatalogueControllerTestCa
 
 
 
-class CatalogueControllerAddCataloguePostTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerAddCataloguePostTest extends AdminCatalogueControllerTestCase {
 	protected $_new_catalogue;
 
 	public function setUp() {
@@ -984,7 +984,7 @@ class CatalogueControllerAddCataloguePostTest extends AdminCatalogueControllerTe
 
 
 
-class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueControllerTestCase {
 	protected $_new_catalogue;
 
 	public function setUp() {
@@ -996,7 +996,7 @@ class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueCon
 												'modules' => [
 													'10' => ['division' => '2',
 																	 'type_module' => 'KIOSQUE']],
-														 
+
 												'options' => []]);
 
 
@@ -1007,7 +1007,7 @@ class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueCon
 				});
 
 
-		$this->postDispatch('/admin/catalogue/add/id_module/10', 
+		$this->postDispatch('/admin/catalogue/add/id_module/10',
 												['libelle' => 'Geeks',
 												 'pcdm4' => '5',
 												 'annee_debut' => '20',
@@ -1027,7 +1027,7 @@ class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueCon
 	/** @test **/
 	public function boiteKiosqueShouldBeUpdatedToNewCatalogue78() {
 		$this->assertEquals(
-			78, 
+			78,
 			Class_Profil::getCurrentProfil()
 			->getModuleAccueilPreferences(10, 'KIOSQUE')['id_catalogue']);
 	}
@@ -1036,7 +1036,7 @@ class CatalogueControllerAddCatalogueToAdultesPostTest extends AdminCatalogueCon
 
 
 
-class CatalogueControllerAddCatalogueInvalidePostTest extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerAddCatalogueInvalidePostTest extends AdminCatalogueControllerTestCase {
 	protected $_new_catalogue;
 
 	public function setUp() {
@@ -1051,27 +1051,27 @@ class CatalogueControllerAddCatalogueInvalidePostTest extends AdminCatalogueCont
 	/** @test */
 	public function pageShouldDisplayErrorsLibelleRequis() {
 		$this->assertXPathContentContains('//p[@class="error"]', 'Le libellé est requis');
-	} 
+	}
 
 
 	/** @test */
 	public function pageShouldDisplayErrorAnneeFinSuperieurAnneeDebut() {
 		$this->assertXPathContentContains('//p[@class="error"]', "L'année de début doit être inférieure ou égale à l'année de fin");
-	} 
+	}
 }
 
 
 
-class CatalogueControllerDeleteAction extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerDeleteAction extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->dispatch('/admin/catalogue/delete/id_catalogue/6');
 	}
 
-	
+
 	/** @test */
 	public function responseShouldRedirectToIndex() {
-		$this->assertRedirectTo('/admin/catalogue/index');	
+		$this->assertRedirectTo('/admin/catalogue/index');
 	}
 
 
@@ -1084,7 +1084,7 @@ class CatalogueControllerDeleteAction extends AdminCatalogueControllerTestCase {
 
 
 
-class CatalogueControllerDeleteActionForReferent extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerDeleteActionForReferent extends AdminCatalogueControllerTestCase {
 	protected function _loginHook($account) {
 		$account->ROLE_LEVEL = ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL;
 		$account->ROLE = 'referent';
@@ -1096,10 +1096,10 @@ class CatalogueControllerDeleteActionForReferent extends AdminCatalogueControlle
 		$this->dispatch('/admin/catalogue/delete/id_catalogue/6');
 	}
 
-	
+
 	/** @test */
 	public function responseShouldRedirectToIndex() {
-		$this->assertRedirectTo('/admin/catalogue/index');	
+		$this->assertRedirectTo('/admin/catalogue/index');
 	}
 
 
@@ -1112,7 +1112,7 @@ class CatalogueControllerDeleteActionForReferent extends AdminCatalogueControlle
 
 
 
-class CatalogueControllerEditActionForReferent extends AdminCatalogueControllerTestCase { 
+class CatalogueControllerEditActionForReferent extends AdminCatalogueControllerTestCase {
 
 	protected function _loginHook($account) {
 		$account->ROLE_LEVEL = ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL;
@@ -1124,17 +1124,17 @@ class CatalogueControllerEditActionForReferent extends AdminCatalogueControllerT
 		$this->addUserToRightsReferent($this->user_referent);
 	}
 
-	
+
 	/** @test */
 	public function withReferentShouldHideValiderButtonIfNotCreator() {
 		$this->dispatch('/admin/catalogue/edit/id_catalogue/6');
-		$this->assertNotXPathContentContains('//td', 'Valider');	
+		$this->assertNotXPathContentContains('//td', 'Valider');
 	}
 
 	/** @test */
 	public function withReferentShouldShowValiderButtonIfCreator() {
 		$this->dispatch('/admin/catalogue/edit/id_catalogue/300');
-		$this->assertXPathContentContains('//td', 'Valider');	
+		$this->assertXPathContentContains('//td', 'Valider');
 	}
 
 }
@@ -1172,7 +1172,7 @@ class CatalogueControllerPaniersHistoireTest extends AdminCatalogueControllerTes
 		$this->assertXPathContentContains('//li', 'selection jeunesse - Dupont');
 	}
 
-	
+
 	/** @test */
 	public function formShouldContainsSelectWithAllPaniersAdmin() {
 		$this->assertXPathContentContains('//form//select[@name="id_panier"]//option[@value="9"]',
@@ -1198,7 +1198,7 @@ class CatalogueControllerPaniersHistoireTest extends AdminCatalogueControllerTes
 class CatalogueControllerPaniersHistoirePostPanierSelectionSenorTest extends AdminCatalogueControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->postDispatch('admin/catalogue/paniers/id_catalogue/100', 
+		$this->postDispatch('admin/catalogue/paniers/id_catalogue/100',
 												['id_panier' => 9],
 												true);
 	}
@@ -1210,7 +1210,7 @@ class CatalogueControllerPaniersHistoirePostPanierSelectionSenorTest extends Adm
 												Class_Catalogue::find(100)->getPanierNotices());
 	}
 
-	
+
 	/** @test */
 	public function answerShouldRedirectToCataloguePanier100() {
 		$this->assertRedirectTo('/admin/catalogue/paniers/id_catalogue/100');
@@ -1255,7 +1255,7 @@ class CatalogueControllerPaniersHistoireRemovePanierJeunesseTest extends AdminCa
 
 
 class CatalogueControllerDomaintePaniersJsonActionTest extends AbstractControllerTestCase {
-	
+
 	public function setup() {
 		parent::setup();
 
@@ -1267,12 +1267,12 @@ class CatalogueControllerDomaintePaniersJsonActionTest extends AbstractControlle
 			->answers([]);
 	}
 
-	
+
 	/** @test */
 	function withDomainesPaniersTreeShouldRenderArtJSON() {
 		$this->dispatch('admin/catalogue/domaines-paniers-json',true);
-	
-		$expectedJSON = 
+
+		$expectedJSON =
 			[
 				['id' => 'panier_for_user',
 				 'label' => 'Mes paniers',
@@ -1293,7 +1293,7 @@ class CatalogueControllerDomaintePaniersJsonActionTest extends AbstractControlle
 					'items' => [],
 					'options' => ['multipleSelection' => false]]];
 
-		
+
 
 		$this->assertJsonStringEqualsJsonString(json_encode($expectedJSON),
 																						$this->_response->getBody(),json_encode($this->_response->getBody()));
@@ -1305,16 +1305,16 @@ class CatalogueControllerDomaintePaniersJsonActionTest extends AbstractControlle
 class AdminCatalogueControllerEditCatalogueWithWrongGenre extends AbstractControllerTestCase {
 	public function setup() {
 		parent::setup();
-		
+
 		Class_CodifGenre::beVolatile();
-		
+
 		$this->fixture('Class_Catalogue',
 									 ['id' => 15,
 										'libelle' => 'Mon Cata',
 										'description' => 'Mon catalogue',
 										'genre' => 2]);
 
-		$this->dispatch('/admin/catalogue/edit/id_catalogue/15');	
+		$this->dispatch('/admin/catalogue/edit/id_catalogue/15');
 	}
 
 
diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php
index 66676a7502120b55192463fb587d49c8c1d99811..d2e15f8e9a292db4c85687249fb25642d185fde6 100644
--- a/tests/application/modules/admin/controllers/CmsControllerTest.php
+++ b/tests/application/modules/admin/controllers/CmsControllerTest.php
@@ -983,6 +983,10 @@ class CmsControllerArticleConcertEditActionPostRenderPopupTest extends CmsContro
 										'id_cat' => 34,
 										'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />',
 										'description' => '',
+										'debut' => '',
+										'fin' => '',
+										'events_debut' => '',
+										'events_fin' => '',
 										'id_items' => ['1']];
 
 		$_SERVER['HTTP_REFERER'] = 'opac/index';
@@ -1030,6 +1034,10 @@ class CmsControllerArticleConcertEditActionPostWithWrongDataRenderPopupTest exte
 		$this->_data = ['titre' => '',
 										'id_cat' => 34,
 										'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />',
+										'debut' => '',
+										'fin' => '',
+										'events_debut' => '',
+										'events_fin' => '',
 										'description' => '',
 										'id_items' => ['1']];
 
@@ -1089,7 +1097,8 @@ class CmsControllerArticleConcertEditActionPostWithErrorTest extends CmsControll
 									'events_debut' => '',
 									'events_fin' => '01/04/2011',
 									'description' => '',
-									'contenu' => '');
+									'contenu' => '',
+									'id_cat' => 23);
 
 
 		$this
@@ -1120,7 +1129,9 @@ class CmsControllerArticleConcertEditActionPostWithErrorTest extends CmsControll
 
 	/** @test */
 	function errorShouldContainsDateDebutError() {
-		$this->assertXPathContentContains('//ul[@class="errors"]', "La date de début de publication doit être plus récente que la date de fin");
+		$this->assertXPathContentContains('//ul[@class="errors"]',
+																			"La date de début de publication doit être plus récente que la date de fin",
+																			$this->_response->getBody());
 	}
 
 
@@ -1670,7 +1681,8 @@ class CmsControllerArticleAddActionInvalidDatePostTest extends CmsControllerTest
 									'events_debut' => '',
 									'events_fin' => '',
 									'description' => '',
-									'contenu' => '');
+									'contenu' => '',
+									'id_cat' => 23);
 
 		$this
 			->getRequest()
@@ -2133,6 +2145,10 @@ class CmsControllerNewsAddToCatALaUneInNewsModuleActionTest extends CmsControlle
 
 		$this->postDispatch('/admin/cms/add/id_module/10/id_cat/34',
 												['titre' => 'Erik Truffaz - Ladyland quartet en concert',
+												 'debut' => '',
+												 'fin' => '',
+												 'events_debut' => '',
+												 'events_fin' => '',
 												 'auteur' => Class_Users::newInstanceWithId(1, ['login' => 'tom']),
 												 'id_cat' => 34,
 												 'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />',
diff --git a/tests/application/modules/admin/controllers/CustomFieldsControllerTest.php b/tests/application/modules/admin/controllers/CustomFieldsControllerTest.php
index eb15a4635bcd4b73c8c181d9685328c1d16b8091..9d2e7acd59ab116d56e1a148a2c922b58c53cf2f 100644
--- a/tests/application/modules/admin/controllers/CustomFieldsControllerTest.php
+++ b/tests/application/modules/admin/controllers/CustomFieldsControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -25,7 +25,7 @@ require_once 'AbstractControllerTestCase.php';
 abstract class CustomFieldControllerTestCase extends AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		
+
 		$this->fixture('Class_CustomField_Meta',
 																						['id' => 1,
 																						'label' => 'Address',
@@ -39,7 +39,7 @@ abstract class CustomFieldControllerTestCase extends AbstractControllerTestCase
 										'priority' => 1,
 										'model' => 'Article']);
 
-		
+
 		$this->fixture('Class_CustomField',
 									 ['id' => 2,
 										'meta_id' => 1,
@@ -58,7 +58,7 @@ abstract class CustomFieldControllerTestCase extends AbstractControllerTestCase
 										'label' => 'Age',
 										'field_type' => Class_CustomField_Meta::TEXT_AREA,
 										'model' => 'UserGroup']);
-										
+
 		$this->fixture('Class_CustomField',
 									 ['id' => 5,
 										'priority' => 3,
@@ -74,6 +74,13 @@ abstract class CustomFieldControllerTestCase extends AbstractControllerTestCase
 										'field_type' => Class_CustomField_Meta::TEXT_INPUT,
 										'model' => 'UserGroup']);
 
+		$this->fixture('Class_CustomField',
+									 ['id' => 7,
+										'priority' => 5,
+										'label' => 'Notes',
+										'field_type' => Class_CustomField_Meta::CKEDITOR,
+										'model' => 'UserGroup']);
+
 
 		$this->fixture('Class_UserGroup',
 									 ['id' => 1,
@@ -116,8 +123,8 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 						 ['Formation', 'Formation'],
 						 ['UserGroup', "Groupe d'utilisateurs"]];
 	}
-	
-	
+
+
 	/** @test */
 	public function titleShouldBeCustomFields() {
 		$this->assertXPathContentContains('//div[@class="modules"]/h1', 'Champs personnalisés');
@@ -130,7 +137,7 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 	}
 
 
-	/** @test 
+	/** @test
 	 * @dataProvider customFieldsCategories
 	 **/
 	public function treeSelectShouldContainsCustomFieldsCategoies($custom_field_category, $expected) {
@@ -138,7 +145,7 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 	}
 
 
-	/** @test 
+	/** @test
 	 * @dataProvider customFieldsCategories
 	 **/
 	public function addCustomFieldLinkShouldBeDisplay($expected, $custom_field_category) {
@@ -151,7 +158,7 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 		$this->assertXPathContentContains('//li//li',	'Address');
 	}
 
-	
+
 	/** @test */
 	public function linkToEditAddressShouldBePresent() {
 		$this->assertXPath('//li//a[contains(@href, "admin/custom-fields/edit/id/1")]');
@@ -163,7 +170,7 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 		$this->assertXPath('//li//a[contains(@href, "admin/custom-fields/delete/id/1")]');
 	}
 
-	
+
 	/** @test */
 	public function jsVariableTreeViewSelectCategoryShouldBeUserGroup() {
 		$this->assertXPathContentContains('//script', 'var treeViewSelectedCategory = "UserGroup";');
@@ -181,7 +188,7 @@ class CustomFieldsControllerIndexTest extends CustomFieldControllerTestCase {
 		$this->assertXPath('//li//a[contains(@href, "admin/custom-fields/up/id/1")]');
 	}
 
-	
+
 	/** @test */
 	public function downLinkShouldBePresent() {
 		$this->assertXPath('//li//a[contains(@href, "admin/custom-fields/down/id/1")]');
@@ -209,7 +216,7 @@ class CustomFieldsControllerAddIndexTest extends CustomFieldControllerTestCase {
 		$this->assertXpath('//form[@id="custom_field"]');
 	}
 
-	
+
 	/** @test */
 	public function labelInputShouldBeDisplay() {
 		$this->assertXPath('//form//input[@name="label"]');
@@ -228,17 +235,11 @@ class CustomFieldsControllerAddIndexTest extends CustomFieldControllerTestCase {
 	}
 
 
-	public function getFieldTypeValues() {
-		return [ [Class_CustomField_Meta::TEXT_INPUT, 'champ texte'],
-						 [Class_CustomField_Meta::TEXT_AREA, 'champ zone de texte'],
-						 [Class_CustomField_Meta::SELECT, "liste d'options"]];
-	}
-	
-	/** @test 
-	 * @dataProvider getFieldTypeValues
-	 */
-	public function fieldTypeValueShouldBeAsExpected($value, $label) {
-		$this->assertXpathContentContains('//form//select/option[@value="'.$value.'"]', $label);
+	/** @test */
+	public function fieldTypeValueShouldBeAsExpected() {
+		foreach((new Class_CustomField_Meta())->getFieldTypes() as $value => $label)
+			$this->assertXpathContentContains('//form//select/option[@value="'.$value.'"]',
+																				$label);
 	}
 
 
@@ -269,19 +270,19 @@ class CustomFieldsControllerPostAddActionTest extends AbstractControllerTestCase
 		Class_CustomField::beVolatile();
 		Class_CustomField_Meta::beVolatile();
 
-		$this->postDispatch('admin/custom-fields/add/model/Article', 
+		$this->postDispatch('admin/custom-fields/add/model/Article',
 												['label' => 'public',
 												'field_type' => 'text',
 												'model' => 'Article']);
 	}
-	
-	
+
+
 	/** @test */
 	public function customFieldMetaShouldHaveBeenCreated() {
 		$this->assertEquals('public', Class_CustomField::find(1)->getLabel());
 	}
 
-	
+
 	/** @test */
 	public function customFieldShouldNotHaveAttributFieldType() {
 		$attributes = Class_CustomField::find(1)->getRawAttributes();
@@ -309,13 +310,13 @@ class CustomFieldsControllerEditIndexTest extends CustomFieldControllerTestCase
 		$this->dispatch('admin/custom-fields/edit/id/1', true);
 	}
 
-	
+
   /** @test */
 	public function inputLabelShouldContainsAdress() {
 		$this->assertXPath('//input[@name="label"][@value="Address"]');
 	}
 
-	
+
 	/** @test */
 	public function fieldTypeShouldBeText() {
 		$this->assertXPath('//select/option[@value="text"][@selected="selected"]');
@@ -327,7 +328,7 @@ class CustomFieldsControllerEditIndexTest extends CustomFieldControllerTestCase
 		$this->assertXPath('//input[@name="options_list"][@value=""]');
 	}
 
-	
+
 	/** @test */
 	public function scriptToggleOptionsListShouldBePresent() {
 		$this->assertXPathContentContains('//script', 'formSelectToggleVisibilityForElement("#field_type", "#fieldset-options", "'.Class_CustomField_Meta::SELECT.'");');
@@ -339,7 +340,7 @@ class CustomFieldsControllerEditIndexTest extends CustomFieldControllerTestCase
 class CustomFieldsControllerPostEditActionTest extends CustomFieldControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		
+
 		$this->postDispatch('admin/custom-fields/edit/model/Article/id/1', ['label' => 'public',
 																																				'field_type' => 'SELECT',
 																																				'options_list' => 'all; teens',
@@ -351,7 +352,7 @@ class CustomFieldsControllerPostEditActionTest extends CustomFieldControllerTest
 	public function modelArtileShouldHavePublicAsMeta() {
 		$this->assertEquals('public', Class_CustomField::find(1)->getMeta()->getLabel());
 	}
-	
+
 
 	/** @test */
 	public function metaPuclicOptionsListShouldContainsAllAndTeens() {
@@ -368,7 +369,7 @@ class CustomFieldsControllerSelectActionTest extends CustomFieldControllerTestCa
 		$this->dispatch('admin/custom-fields/select/model/UserGroup/id/1', true);
 	}
 
-	
+
 	/** @test */
 	public function modelUserGroupShouldContainsCUstomFieldMetaAdress() {
 		$this->assertEquals(1, Class_CustomField::findFirstBy(['order' => 'id desc'])->getMetaId());
@@ -394,21 +395,21 @@ class CustomFieldsControllerUpDownActionTest extends CustomFieldControllerTestCa
 	public function updownForFieldExpectedOrder() {
 		// at start we have: Address, Age, Status
 		return [
-			['down', 3, ['Age', 'Address', 'Status', 'Zip code']],
-			['down', 4, ['Address', 'Status', 'Age', 'Zip code']],
-			['down', 6, ['Address', 'Age', 'Status', 'Zip code']],
-			['down', 0, ['Address', 'Age', 'Status', 'Zip code']],
-
-			['up', 0, ['Address', 'Age', 'Status', 'Zip code']],
-			['up', 4, ['Age', 'Address', 'Status', 'Zip code']],
-			['up', 5, ['Address', 'Status', 'Age', 'Zip code']]
+						['down', 3, ['Age', 'Address', 'Status', 'Zip code','Notes']],
+						['down', 4, ['Address', 'Status', 'Age', 'Zip code','Notes']],
+						['down', 6, ['Address', 'Age', 'Status','Notes' , 'Zip code']],
+						['down', 0, ['Address', 'Age', 'Status', 'Zip code','Notes']],
+
+						['up', 0, ['Address', 'Age', 'Status', 'Zip code','Notes']],
+						['up', 4, ['Age', 'Address', 'Status', 'Zip code','Notes']],
+						['up', 5, ['Address', 'Status', 'Age', 'Zip code','Notes']]
 			];
 	}
 
-	
-	/** 
+
+	/**
 	 * @dataProvider updownForFieldExpectedOrder
-	 * @test 
+	 * @test
 	 */
 	public function userGroupFieldsShouldBeOrdererd($action, $id, $expected_order) {
 		$this->dispatch('admin/custom-fields/'.$action.'/id/'.$id, true);
@@ -432,7 +433,7 @@ class CustomFieldsControllerValuesForUserGroupWithMetaDeletedTest extends Custom
 	public function setUp() {
 		parent::setUp();
 		Class_CustomField_Meta::deleteBy([]);
-		
+
 	}
 
 
@@ -474,7 +475,7 @@ class CustomFieldsControllerValuesForUserGroupTeachersTest extends CustomFieldCo
 	 /** @test */
 	 public function addressInputShouldBePresentOnce() {
 		 $this->assertXPathCount('//label[contains(text(), "Address")]', 1);
-		 
+
 	 }
 
 	 /** @test */
@@ -489,7 +490,7 @@ class CustomFieldsControllerValuesForUserGroupTeachersTest extends CustomFieldCo
 																			 '25');
 	 }
 
-	 
+
 	 /** @test */
 	 public function statusSelectOptionsShouldBePresent() {
 		 $this->assertXPath('//form//fieldset//select//option[@value=""][not(text())]');
@@ -500,7 +501,7 @@ class CustomFieldsControllerValuesForUserGroupTeachersTest extends CustomFieldCo
 
 	 /** @test */
 	 public function statusSelectOptionDisabledShouldBeSelected() {
-		 $this->assertXPath('//form//fieldset//select//option[@value="enabled"][@selected="selected"]',$this->_response->getBody()); 
+		 $this->assertXPath('//form//fieldset//select//option[@value="enabled"][@selected="selected"]',$this->_response->getBody());
 	 }
 
 	 /** @test */
@@ -515,33 +516,48 @@ class CustomFieldsControllerValuesForUserGroupTeachersTest extends CustomFieldCo
 class CustomFieldsControllerValuesForUserGroupPostTest extends CustomFieldControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-										
-		$this->postDispatch('/admin/custom-fields/values/model/UserGroup/id/1', 
-												[
-													'field_3' => '1, menardeix', //address
-													'field_4' => 12,   // age
-													'field_5' => 0,    // status
-													'field_6' => 74000, //zip code
+
+		$this->postDispatch('/admin/custom-fields/values/model/UserGroup/id/1',
+												['field_3' => '1, menardeix', //address
+												 'field_4' => 12,   // age
+												 'field_5' => 0,    // status
+												 'field_6' => 74000, //zip code
+												 'field_7' => 'blabla<br/>', //notes
 												]);
+
 		Class_CustomField_Value::clearCache();
+		$this->custom_field_values = Class_CustomField_Value::findAllByInstance(Class_UserGroup::find(1));
 	}
 
-  /** @test */
+
+	protected function _getValueOfField($id) {
+		foreach($this->custom_field_values as $value)
+			if ($id == $value->getCustomFieldId())
+				return $value->getValue();
+	}
+
+
+	/** @test */
 	public function adresseShouldBeMenardeix() {
-		$this->assertEquals('1, menardeix', Class_CustomField_Value::find(23)->getValue());
+		$this->assertEquals('1, menardeix', $this->_getValueOfField(3));
 	}
 
 
 	/** @test */
 	public function statusShouldBeZero() {
-		$this->assertEquals(0, Class_CustomField_Value::find(25)->getValue());
+		$this->assertEquals(0, $this->_getValueOfField(5));
 	}
 
 
 	/** @test */
 	public function zipCodeShouldBeCreatedWithValue7400() {
+		$this->assertEquals(74000, $this->_getValueOfField(6));
+	}
+
+	/** @test */
+	public function notesCodeShouldBeCreatedWithValueBlabla() {
 		$this->assertEquals(
-			74000, 
+			'blabla<br/>',
 			Class_CustomField_Value::findFirstBy(['order' => 'id desc'])->getValue());
 	}
 
@@ -569,7 +585,7 @@ class CustomFieldsControllerValuesForArticleIronMaidenLiveTest extends CustomFie
 									 ['id' => 1,
 										'titre' => 'Iron Maiden Live',
 										'contenu' => 'Ed is back !']);
-										
+
 		$this->dispatch('/admin/custom-fields/values/model/Article/id/1', true);
 	}
 
@@ -605,7 +621,7 @@ class CustomFieldsControllerValuesForFormationLearnSmalltalkTest extends CustomF
 																									 'effectif_min' => 1,
 																									 'effectif_max' => 50])
 											]]);
-										
+
 	}
 
 
@@ -635,7 +651,7 @@ class CustomFieldsControllerValuesForInexistingFormationTest extends CustomField
 									 ['id' => 1,
 										'libelle' => 'Learn Smalltalk',
 										'description' => 'fun & useful']);
-										
+
 		$this->dispatch('/admin/custom-fields/values/model/Formation/id/232', true);
 	}
 
diff --git a/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php b/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
index 1eadc41e0af99c98e9393abf643a4de3d8bb5328..f6cbeb78c152960fff274901eb5cfb05c09eb106 100644
--- a/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
+++ b/tests/application/modules/admin/controllers/CustomFieldsMetaControllerTest.php
@@ -16,19 +16,19 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 abstract class CustomFieldsMetaControllerTestCase extends AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		
+
 		$this->fixture('Class_CustomField_Meta', [
 			'id' => 1,
 			'label' => 'Address',
 			'field_type' => Class_CustomField_Meta::TEXT_INPUT,
 			'options_list' => '']);
-		
+
 		$this->fixture('Class_CustomField_Meta', [
 			'id' => 2,
 			'label' => 'Status',
@@ -61,7 +61,7 @@ class CustomFieldsMetaControllerIndexActionTest extends CustomFieldsMetaControll
 
 	/** @test */
 	public function fieldTypeForAddressShouldBeChampTexte() {
-		$this->assertXPathContentContains('//table[@id="custom-fields-meta"]//td', 'Champ texte');
+		$this->assertXPathContentContains('//table[@id="custom-fields-meta"]//td', 'Texte');
 	}
 
 
@@ -97,13 +97,13 @@ class CustomFieldsMetaControllerEditActionTest extends CustomFieldsMetaControlle
 		$this->dispatch('admin/custom-fields-meta/edit/id/1', true);
 	}
 
-	
+
   /** @test */
 	public function inputLabelShouldContainsAdress() {
 		$this->assertXPath('//input[@name="label"][@value="Address"]');
 	}
 
-	
+
 	/** @test */
 	public function fieldTypeShouldBeText() {
 		$this->assertXPath('//select/option[@value="text"][@selected="selected"]');
@@ -132,7 +132,7 @@ class CustomFieldsMetaControllerPostEditActionTest extends CustomFieldsMetaContr
 	public function setup() {
 		parent::setup();
 
-		$this->postDispatch('admin/custom-fields-meta/edit/id/1', 
+		$this->postDispatch('admin/custom-fields-meta/edit/id/1',
 												['label' => 'public',
 												 'field_type' => Class_CustomField_Meta::SELECT,
 												 'options_list' => 'teens; parents ; all public   ;  ']);
@@ -144,11 +144,11 @@ class CustomFieldsMetaControllerPostEditActionTest extends CustomFieldsMetaContr
 		$this->assertEquals('public', Class_CustomField_Meta::find(1)->getLabel());
 	}
 
-	
+
 	/** @test */
 	public function fieldTypeShouldBeSelect() {
 		$this->assertEquals(
-			Class_CustomField_Meta::SELECT, 
+			Class_CustomField_Meta::SELECT,
 			Class_CustomField_Meta::find(1)->getFieldType());
 	}
 
@@ -156,7 +156,7 @@ class CustomFieldsMetaControllerPostEditActionTest extends CustomFieldsMetaContr
 	/** @test */
 	public function optionsListShouldBeTeensAndParents() {
 		$this->assertEquals(
-			['teens', 'parents', 'all public'], 
+			['teens', 'parents', 'all public'],
 			Class_CustomField_Meta::find(1)->getOptionsListAsArray());
 	}
 }
diff --git a/tests/application/modules/admin/controllers/UserGroupControllerTest.php b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
index 500108bb4a89c4188e2911f3f0ecea6fa4a37b7c..6e2a03a1174699ab59c631cfdc0d29367be4bbfe 100644
--- a/tests/application/modules/admin/controllers/UserGroupControllerTest.php
+++ b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AdminAbstractControllerTestCase.php';
 
@@ -43,7 +43,7 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 		Class_AdminVar::getLoader()
 			->newInstanceWithId('MULTIMEDIA_KEY')
 			->setValeur('');
-		
+
 
 		$this->_etablissement = $this->fixture('Class_UserGroupCategorie',
 																					 ['id' => 2,
@@ -63,14 +63,14 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 																				 ['id' => 5,
 																					'libelle' => 'Association',
 																					'parent_id' => 2]);
-		
+
 		$this->_batman = $this->fixture('Class_Users',
 																		['id' => 31,
 																		 'login'=>'batman',
 																		 'nom'=>'Wayne',
 																		 'prenom' => 'Bruce',
 																		 'password' => 'tit']);
-		
+
 		$this->_spiderman = $this->fixture('Class_Users',
 																			 ['id' => 32,
 																				'login' => 'Spiderman',
@@ -83,7 +83,7 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 																					 'libelle' => 'Chercheurs',
 																					 'users' => [],
 																					 'rights' => []]);
-		
+
 		$this->_group_moderateurs = $this->fixture('Class_UserGroup',
 																							 ['id' => 6,
 																								'libelle'=> 'Modérateurs bib',
@@ -98,8 +98,8 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 																								'group_type' => Class_UserGroup::TYPE_DYNAMIC,
 																								'users' => [],
 																								'rights' => [],
-																								'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]); 
-		
+																								'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]);
+
 		$this->_user_group = $this->fixture('Class_UserGroup',
 																				['id' => 3,
 																				 'libelle'=> 'Stagiaires',
@@ -108,8 +108,8 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 																				 'users' => [$this->_batman,
 																										 $this->_spiderman]]);
 
-		
-		
+
+
 		$this->_association->setUserGroups([$this->_user_group,
 																				$this->_group_search,
 																				$this->_group_subscribers,
@@ -124,7 +124,7 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle
 										'label' => 'Age',
 										'field_type' => Class_CustomField_Meta::TEXT_AREA,
 										'model' => 'UserGroup']);
-										
+
 		$this->fixture('Class_CustomField',
 									 ['id' => 5,
 										'priority' => 3,
@@ -154,7 +154,7 @@ class Admin_UserGroupControllerListTest extends Admin_UserGroupControllerTestCas
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_UserGroupCategorie')
 			->whenCalled('getTopCategories')
 			->answers([$this->_etablissement]);
-																							
+
 		$this->dispatch('admin/usergroup/list.json', true);
 		$this->_json = json_decode($this->_response->getBody());
 	}
@@ -174,7 +174,7 @@ class Admin_UserGroupControllerListTest extends Admin_UserGroupControllerTestCas
 
 	/** @test */
 	public function jsonShouldContainGroupChercheursInCategorieEtablissementAssociation() {
-		$this->assertEquals('Chercheurs', 
+		$this->assertEquals('Chercheurs',
 												$this->_json[0]->categories[0]->categories[0]->items[1]->label);
 	}
 }
@@ -256,7 +256,7 @@ class Admin_UserGroupControllerIndexTest extends Admin_UserGroupControllerTestCa
 	/** @test */
 	public function aDivShouldContainsChercheurs() {
 		$this->assertXPathContentContains('//div[@class="item-label"]', 'Chercheurs',$this->_response->getBody());
-	
+
 	}
 
 
@@ -268,7 +268,7 @@ class Admin_UserGroupControllerIndexTest extends Admin_UserGroupControllerTestCa
 
 	/** @test */
 	public function menuGaucheAdminShouldHaveAnEntryForGroups() {
-		$this->assertXPathContentContains('//ul[@class="menuAdmin"]//a[contains(@href, "/admin/usergroup")]', 
+		$this->assertXPathContentContains('//ul[@class="menuAdmin"]//a[contains(@href, "/admin/usergroup")]',
 																			'Groupes');
 	}
 
@@ -331,13 +331,13 @@ class Admin_UserGroupControllerAddTest extends Admin_UserGroupControllerTestCase
 
 	/** @test */
 	public function aCheckBoxShouldContainsRightDomainesAccesTotal() {
-		$this->assertRightInputFor(19, 
+		$this->assertRightInputFor(19,
 															 'Domaines: accès total en modification et suppression');
 	}
 
 
 	protected function assertRightInputFor($value, $label) {
-		$this->assertXPathContentContains('//input[@name="rights[]"][@value="' . $value. '"]/parent::label', 
+		$this->assertXPathContentContains('//input[@name="rights[]"][@value="' . $value. '"]/parent::label',
 																			$label);
 	}
 }
@@ -347,7 +347,7 @@ class Admin_UserGroupControllerAddTest extends Admin_UserGroupControllerTestCase
 class Admin_UserGroupControllerAddPostTest extends Admin_UserGroupControllerTestCase {
 	protected $last;
 
-	
+
 	public function setUp() {
 		parent::setUp();
 		$this->postDispatch('admin/usergroup/add/id_cat/2',
@@ -359,7 +359,7 @@ class Admin_UserGroupControllerAddPostTest extends Admin_UserGroupControllerTest
 
 	/** @test */
 	public function newGroupShouldBeCreatedWithLibelleIntervenants() {
-		$this->assertEquals('Intervenants', 
+		$this->assertEquals('Intervenants',
 												$this->last->getLibelle());
 	}
 
@@ -372,7 +372,7 @@ class Admin_UserGroupControllerAddPostTest extends Admin_UserGroupControllerTest
 
 	/** @test */
 	public function intervenantShouldBeInCategorieAssociation() {
-		$this->assertEquals(2, 
+		$this->assertEquals(2,
 												$this->last->getIdCat());
 	}
 
@@ -387,8 +387,10 @@ class Admin_UserGroupControllerAddPostTest extends Admin_UserGroupControllerTest
 class Admin_UserGroupControllerAddPostInvalidDataTest extends Admin_UserGroupControllerTestCase {
 	public function setUp() {
 		parent::setUp();
+		$this->beCustomized();
 		$this->postDispatch('admin/usergroup/add',
-												['libelle' => '']);
+												['libelle' => '',
+												'field_6' => '74000']);
 		$groups = Class_UserGroup::findAll();
 		$this->last = $groups[(count($groups)-1)];
 	}
@@ -399,6 +401,10 @@ class Admin_UserGroupControllerAddPostInvalidDataTest extends Admin_UserGroupCon
 		$this->assertFalse($this->last->getLibelle==='');
 	}
 
+  /** @test */
+	public function zipCodeShouldKeepDefaultValue() {
+		$this->assertXPath('//input[contains(@value,"74000")]',$this->_response->getBody());
+	}
 
 	/** @test */
 	public function errorsShouldContainsUneValeurEstRequise() {
@@ -445,7 +451,7 @@ class Admin_UserGroupControllerEditGroupStagiairesTest extends Admin_UserGroupCo
 		$this->dispatch('admin/usergroup/edit/id/3', true);
 	}
 
-	
+
 	/** @test */
 	public function titreShouldBeModifierLeGroupeStagiaires() {
 		$this->assertXPathContentContains('//h1', "Modifier le groupe d'utilisateurs: Stagiaires");
@@ -518,7 +524,7 @@ class Admin_UserGroupControllerEditGroupModerateursBibTest extends Admin_UserGro
 		$this->assertXPath('//label[text()="Dynamique"]/input[@name="group_type"][@value="1"][@checked="checked"]');
 	}
 
-	
+
 	/** @test */
 	public function roleLevelSelectShouldHaveRoleModoBibSelected() {
 		$this->assertXPath('//select[@name="role_level"]/option[@value="0"][@label="invité"][not(@selected)]');
@@ -527,7 +533,7 @@ class Admin_UserGroupControllerEditGroupModerateursBibTest extends Admin_UserGro
 		$this->assertXPath('//select[@name="role_level"]/option[@value="3"][@label="rédacteur bibliothèque"][@selected="selected"]');
 
 		$this->assertXPath('//select[@name="role_level"]/option[@value="6"][@label="administrateur portail"][not(@selected)]');
-		
+
 		$this->assertNotXPath('//select[@name="role_level"]/option[@value="7"]');
 	}
 }
@@ -570,7 +576,7 @@ class Admin_UserGroupControllerEditMembersGroupStagiairesTest extends Admin_User
 		$this->assertXPath('//form[@id="user_subscribe"]//input[@value="Ajouter les utilisateurs sélectionnés"]');
 	}
 
-	
+
 	/** @test */
 	public function userSubcribeFormShouldContainsCheckBoxWithSpiderman() {
 		$this->assertXPathContentContains('//form[@id="user_subscribe"]//label', 'Parker Peeter - Spiderman');
@@ -710,7 +716,7 @@ class Admin_UserGroupControllerEditStagiairesPostDataWithCustomFieldsTest extend
 	public function setUp() {
 		parent::setUp();
 		$this->beCustomized();
-		
+
 		$this->fixture('Class_CustomField_Value', //age
 									 ['id' => 24,
 										'custom_field_id' => 4,
@@ -730,11 +736,13 @@ class Admin_UserGroupControllerEditStagiairesPostDataWithCustomFieldsTest extend
 			'field_4' => '42',
 			'field_5' => 'disabled',
 			'field_6' => '74000',
+			'field_7' => '',
 			'rights' => [
 				Class_UserGroup::RIGHT_SUIVRE_FORMATION,
 				Class_UserGroup::RIGHT_DIRIGER_FORMATION]]);
 
 		$this->_group = Class_UserGroup::getLoader()->find(3);
+		Class_CustomField_Value::clearCache();
 	}
 
 
@@ -754,11 +762,68 @@ class Admin_UserGroupControllerEditStagiairesPostDataWithCustomFieldsTest extend
 	public function customZipCodeShouldBe74000() {
 		$this->assertEquals('74000', Class_CustomField_Value::find(26)->getValue());
 	}
+
+
+  /** @test */
+	public function groupShouldHaveThreeCustomFieldValues() {
+		$this->assertEquals(3, count(Class_CustomField_Value::findAllByInstance($this->_group)));
+	}
 }
 
 
 
-class Admin_UserGroupControllerDeleteGroupWithCustomValuesTest 
+
+class Admin_UserGroupControllerEditStagiairesPostDataWithEmptyCustomFieldsTest extends Admin_UserGroupControllerTestCase {
+	protected $_group;
+
+	public function setUp() {
+		parent::setUp();
+		$this->beCustomized();
+
+		$this->fixture('Class_CustomField_Value', //age
+									 ['id' => 24,
+										'custom_field_id' => 4,
+										'model_id' => 3,
+										'value' => '25']);
+
+		$this->postDispatch('admin/usergroup/edit/id/3', [
+			'libelle' => 'étudiants',
+			'field_4' => '',
+			'field_5' => '',
+			'field_6' => '74000',
+			'field_7' => '',
+			'rights' => [
+				Class_UserGroup::RIGHT_SUIVRE_FORMATION,
+				Class_UserGroup::RIGHT_DIRIGER_FORMATION]]);
+
+		$this->_group = Class_UserGroup::getLoader()->find(3);
+		Class_CustomField_Value::clearCache();
+	}
+
+
+	/** @test */
+	public function customAgeShouldBeDeleted() {
+		$this->assertEmpty(Class_CustomField_Value::find(24));
+	}
+
+
+  /** @test */
+	public function groupShouldHaveOneCustomFieldValue() {
+		$values = Class_CustomField_Value::findAllByInstance($this->_group);
+		$this->assertEquals(1, count($values));
+	}
+
+
+	/** @test */
+	public function customZipCodeShouldBe74000() {
+		$value = Class_CustomField_Value::findAllByInstance($this->_group)[0];
+		$this->assertEquals('74000', $value->getValue());
+	}
+}
+
+
+
+class Admin_UserGroupControllerDeleteGroupWithCustomValuesTest
 	extends Admin_UserGroupControllerTestCase {
 	public function setUp() {
 		parent::setUp();
@@ -864,14 +929,14 @@ class Admin_UserGroupControllerWrongIdsTest extends Admin_UserGroupControllerTes
 	/** @test */
 	public function editMembersInexistentGroupShouldRedirectToIndex() {
 		$this->dispatch('/admin/usergroup/editmembers/id/999999');
-		$this->assertRedirectTo('/admin/usergroup');		
+		$this->assertRedirectTo('/admin/usergroup');
 	}
 
 
 	/** @test */
 	public function deleteInexistentGroupShouldRedirectToIndex() {
 		$this->dispatch('/admin/usergroup/delete/id/999999');
-		$this->assertRedirectTo('/admin/usergroup/index');		
+		$this->assertRedirectTo('/admin/usergroup/index');
 	}
 }
 
@@ -892,7 +957,7 @@ class Admin_UserGroupControllerRessourcesNumeriquesTest extends Admin_UserGroupC
 	}
 
 
-	/** 
+	/**
 	 * @test
 	 * @dataProvider datas
 	 */
@@ -903,7 +968,7 @@ class Admin_UserGroupControllerRessourcesNumeriquesTest extends Admin_UserGroupC
 	}
 
 
-	/** 
+	/**
 	 * @test
 	 * @dataProvider datas
 	 */
@@ -918,7 +983,7 @@ class Admin_UserGroupControllerRessourcesNumeriquesTest extends Admin_UserGroupC
 	public function editCyberlibrisGroupShouldBeVisible() {
 		RessourcesNumeriquesFixtures::activateCyberlibris();
 		$this->dispatch('admin/usergroup/edit/id/6', true);
-		$this->assertXPathContentContains('//label','Cyberlibris',$this->_response->getBody());	
+		$this->assertXPathContentContains('//label','Cyberlibris',$this->_response->getBody());
 	}
 
 
@@ -926,7 +991,7 @@ class Admin_UserGroupControllerRessourcesNumeriquesTest extends Admin_UserGroupC
 	public function editToutApprendreGroupShouldBeVisible() {
 		RessourcesNumeriquesFixtures::activateToutApprendre();
 		$this->dispatch('admin/usergroup/edit/id/6', true);
-		$this->assertXPathContentContains('//label','Tout Apprendre',$this->_response->getBody());	
+		$this->assertXPathContentContains('//label','Tout Apprendre',$this->_response->getBody());
 	}
 }
 
@@ -937,13 +1002,13 @@ class Admin_UserGroupControllerAddCategoryTest extends Admin_UserGroupController
 		parent::setup();
 		$this->dispatch('admin/usergroup/catadd',true);
 	}
-	
+
   /** @test **/
 	public function categorySelectShoudContainsAssociation() {
 		$this->assertXPathContentContains('//option', 'Association', $this->_response->getBody());
 	}
 
-	
+
 	/** @test **/
 	public function inputLibelleShouldBeEmpty() {
 		$this->assertXPath('//input[@name="libelle"]');
@@ -960,7 +1025,7 @@ class Admin_UserGroupControllerAddCategoryPostTest extends Admin_UserGroupContro
 																									'libelle' => 'Société',
 																									'parent_id' => '2']);
 	}
-	
+
   /** @test **/
 	public function validerActionShouldRedirectToAdminSlashUsergroup() {
 		$this->assertRedirectTo('/admin/usergroup/index/id_cat/45');
@@ -969,7 +1034,7 @@ class Admin_UserGroupControllerAddCategoryPostTest extends Admin_UserGroupContro
 
 	/** @test **/
 	public function societeShouldHaveEtablissementAsParent() {
-		$this->assertEquals($this->_etablissement->getId(), 
+		$this->assertEquals($this->_etablissement->getId(),
 												Class_UserGroupCategorie::find(45)->getParentId());
 	}
 
@@ -982,7 +1047,7 @@ class Admin_UserGroupControllerIndexWithEtablissementOpenTest extends Admin_User
 		parent::setup();
 		$this->dispatch('admin/usergroup/index/id_cat/2',true);
 	}
-	
+
   /** @test **/
 	public function treeViewShouldBeOpenAndDisplayAssociation() {
 		$this->assertXPathContentContains('//ul[@class="root"][1]//li//ul//li','Association',$this->_response->getBody());
@@ -995,7 +1060,7 @@ class Admin_UserGroupControllerIndexWithEtablissementOpenTest extends Admin_User
 class Admin_UserGroupControllerDeleteCategorieTest extends Admin_UserGroupControllerTestCase {
 	public function setup() {
 		parent::setup();
-		
+
 		$association =	$this->fixture('Class_UserGroupCategorie',
 																				 ['id' => 2,
 																					'libelle' => 'Association',
@@ -1009,7 +1074,7 @@ class Admin_UserGroupControllerDeleteCategorieTest extends Admin_UserGroupContro
 		$this->dispatch('admin/usergroup/catdel/id/2',true);
 	}
 
-	
+
   /** @test **/
 	public function deleteAssociationActionShouldRedirectToIndex() {
 		$this->assertRedirectTo('/admin/usergroup/index/id_cat/5');
@@ -1022,7 +1087,7 @@ class Admin_UserGroupControllerDeleteCategorieTest extends Admin_UserGroupContro
 class Admin_UserGroupControllerCateditCategorieTest extends Admin_Abstractcontrollertestcase {
 	public function setup() {
 		parent::setup();
-		
+
 		$association =	$this->fixture('Class_UserGroupCategorie',
 																				 ['id' => 2,
 																					'libelle' => 'Association',
@@ -1033,7 +1098,7 @@ class Admin_UserGroupControllerCateditCategorieTest extends Admin_Abstractcontro
 																						'libelle'=>'Etablissement',
 																						'parent_id' => 0]);
 
-		
+
 		$this->dispatch('admin/usergroup/catedit/id/2',true);
 	}
 
@@ -1043,7 +1108,7 @@ class Admin_UserGroupControllerCateditCategorieTest extends Admin_Abstractcontro
 		$this->assertXPathContentContains('//select//option[@selected="selected"]', 'Etablissement',$this->_response->getBody());
 	}
 
-	
+
 	/** @test **/
 	public function inputLibelleShouldBeEmpty() {
 		$this->assertXPath('//input[@name="libelle"][@value="Association"]');
@@ -1076,20 +1141,20 @@ class Admin_UserGroupControllerEditMembersWithPaginationTest extends Admin_Abstr
 		}
 		$user_group->setUsers($members);
 		$user_group->save();
-		
+
 		$this->dispatch('admin/usergroup/editmembers/id/1',true);
 	}
 
   /** @test */
 	public function paginationToolsShouldBeDisplay() {
 		$this->assertXPath('//div[@class="paginationControl"]', $this->_response->getBody());
-	} 
+	}
 
 
 	/** @test */
 	public function nb29UsersShouldBeDisplay() {
 		$this->assertXPathContentContains('//div','29 utilisateurs', $this->_response->getBody());
-	} 
+	}
 
 }
 
@@ -1125,13 +1190,13 @@ class Admin_UserGroupControllerEditMembersWithPaginationAsAutomaticUserGroupTest
   /** @test */
 	public function paginationToolsShouldBeDisplay() {
 		$this->assertXPath('//div[@class="paginationControl"]', $this->_response->getBody());
-	} 
+	}
 
 
 	/** @test */
 	public function nb29UsersShouldBeDisplay() {
 		$this->assertXPathContentContains('//div','29 utilisateurs', $this->_response->getBody());
-	} 
+	}
 
 }
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php b/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php
index f7df2434016dca6c6c6ae0dd4e476ac63160cc79..6536ca0c8af4cca1d839a46873a402e16bbd9289 100644
--- a/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php
+++ b/tests/application/modules/opac/controllers/AbonneControllerPretsTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -45,12 +45,12 @@ abstract class AbstractAbonneControllerPretsTestCase extends AbstractControllerT
 			->answers(true);
 	}
 
-	
+
 	public function assertUserRemovedFromEmprunteurCache($user) {
-		$user_key = md5(serialize(['local', 
+		$user_key = md5(serialize(['local',
 															 Class_WebService_SIGB_EmprunteurCache::newInstance()->keyFor($user)]));
 		$this->assertTrue($this->zend_cache
-											->methodHasBeenCalledWithParams('remove', array($user_key)));		
+											->methodHasBeenCalledWithParams('remove', array($user_key)));
 	}
 }
 
@@ -69,10 +69,10 @@ abstract class AbonneControllerPretsListTwoPretsTestCase extends AbstractAbonneC
 																	 'Type' => 'P1']);
 
 		$this->fixture('Class_Exemplaire',
-									 ['id' => 967, 
+									 ['id' => 967,
 										'id_origine' => 1234,
 										'zone995' => serialize([['clef' => 'a', 'valeur' => 'PotterItem']]),
-										'notice' => $this->fixture('Class_Notice', 
+										'notice' => $this->fixture('Class_Notice',
 																							 ['id' => 889,
 																								'titre_principal' => 'Potter',
 																								'unimarc' => '00577nam0 2200181   450 001001500000010001800015100004100033101000800074200010700082210003000189215001100219461002000230606002900250676000800279700004500287801005600332940000700388frOr1314913787  a9781408812792  a20140320                  0103        aEng1 aHarry Potter and the deathly hallowsdHarry Potter et les reliques de la mortfJoanne Kathleen Rowling  aLondrescBloomsburyd2010  a831 p. 1tHarry Potterv7  aAnglais (langue)2Rameau  a420 1aRowlingbJoanne Kathleenf1965-....4070  aFRbBibliothèque de l\'agglomération de Saint-Omer  apm'])]);
@@ -86,10 +86,10 @@ abstract class AbonneControllerPretsListTwoPretsTestCase extends AbstractAbonneC
 																	'N° de notice' => '5678']);
 
 		$this->fixture('Class_Exemplaire',
-									 ['id' => 918, 
+									 ['id' => 918,
 										'id_origine' => 5678,
 										'zone995' => serialize([['clef' => 'a', 'valeur' => 'AliceItem']]),
-										'notice' => $this->fixture('Class_Notice', 
+										'notice' => $this->fixture('Class_Notice',
 																							 ['id' => 827,
 																								'titre_principal' => 'Alice',
 																								'unimarc' => '01175cam0 22002771  450 001001500000010003700015100004100052101000800093102000700101105001800108106000600126200009300132210002400225211001300249215006400262300002400326307002900350330027300379345001800652461005600670700001800726701003000744801003300774856008300807940000700890frOr0354235228  a978-2-35592-635-8bbr.d7,65 EUR  a20140225d2014    |  |0fre|0103||||ba  afre  aFR  a        0||y|  ar1 aAlice au royaume de TrèfleeCheshire cat Waltzh5fQuinRosegdessin Mamenosuke Fujimaru  aPariscKi-oond2014 1a20140227  a1 vol. (164 p.)cillustrations en noir et blancd18 x 13 cm  aTraduit du japonais  aSens de lecture japonais  aPerdue dans la forêt aux portes, Alice tombe nez à nez avec Ace. Devenue malgré elle la confidente du chevalier, elle ne sait comment repousser ses avances. Lorsque le chat du Cheshire, qui a assisté à la scène, intervient, la rencontre tourne à l\'affrontement.  b9782355926358 1tAlice au royaume de Trèfle : Cheshire cat Waltzv5 1aQuinRose4070 1aFujimarubMamenosuke4440  aFRbElectrec20140225gAFNOR  uhttp://www.electre.com//GetBlob.ashx?Ean=9782355926358,0-1913692&Size=Original  aLR'])]);
@@ -109,7 +109,7 @@ abstract class AbonneControllerPretsListTwoPretsTestCase extends AbstractAbonneC
 
 
 class AbonneControllerPretsExportTwoPretsTest extends AbonneControllerPretsListTwoPretsTestCase {
-	protected 
+	protected
 		$_dl_file,
 		$unimarc = '01201nam0 22002891  450 001001500000010003700015100004100052101000800093102000700101105001800108106000600126200009300132210002400225211001300249215006400262300002400326307002900350330027300379345001800652461005600670700001800726701003000744801003300774856008300807940000700890995001400897frOr0354235228  a978-2-35592-635-8bbr.d7,65 EUR  a20140225d2014    |  |0fre|0103||||ba  afre  aFR  a        0||y|  ar1 aAlice au royaume de TrÁefleeCheshire cat Waltzh5fQuinRosegdessin Mamenosuke Fujimaru  aPariscKi-oond2014 1a20140227  a1 vol. (164 p.)cillustrations en noir et blancd18 x 13 cm  aTraduit du japonais  aSens de lecture japonais  aPerdue dans la forÃet aux portes, Alice tombe nez Áa nez avec Ace. Devenue malgrÂe elle la confidente du chevalier, elle ne sait comment repousser ses avances. Lorsque le chat du Cheshire, qui a assistÂe Áa la scÁene, intervient, la rencontre tourne Áa l\'affrontement.  b9782355926358 1tAlice au royaume de TrÁefle : Cheshire cat Waltzv5 1aQuinRose4070 1aFujimarubMamenosuke4440  aFRbElectrec20140225gAFNOR  uhttp://www.electre.com//GetBlob.ashx?Ean=9782355926358,0-1913692&Size=Original  aLR 1aAliceItem00604nam0 22001931  450 001001500000010001800015100004100033101000800074200010700082210003000189215001100219461002000230606002900250676000800279700004500287801005600332940000700388995001500395frOr1314913787  a9781408812792  a20140320                  0103        aEng1 aHarry Potter and the deathly hallowsdHarry Potter et les reliques de la mortfJoanne Kathleen Rowling  aLondrescBloomsburyd2010  a831 p. 1tHarry Potterv7  aAnglais (langue)2Rameau  a420 1aRowlingbJoanne Kathleenf1965-....4070  aFRbBibliothÁeque de l\'agglomÂeration de Saint-Omer  apm 1aPotterItem';
 
@@ -162,7 +162,7 @@ class AbonneControllerPretsListTwoPretsTest extends AbonneControllerPretsListTwo
 		$this->dispatch('/opac/abonne/prets', true);
 	}
 
-	
+
 	/** @test */
 	public function returnToMyHomeShouldBePresent() {
 		$this->assertXPathContentContains('//a[contains(@href, "/abonne/fiche")]',
@@ -191,7 +191,7 @@ class AbonneControllerPretsListTwoPretsTest extends AbonneControllerPretsListTwo
 
 	/** @test */
 	public function loanExportLinkShouldBePresent() {
-		$this->assertXPathContentContains('//a[contains(@href, "/abonne/loan-export")]', 
+		$this->assertXPathContentContains('//a[contains(@href, "/abonne/loan-export")]',
 																			'Export unimarc',
 																			$this->_response->getBody());
 	}
@@ -213,7 +213,7 @@ class AbonneControllerPretsListTwoPretsTest extends AbonneControllerPretsListTwo
 
 	/** @test */
 	public function aliceLoanShouldBePresent() {
-		$this->assertXPathContentContains("//tbody/tr[1][@class=\"pret_en_retard\"]//td//a[contains(@href, '/recherche/viewnotice/id/827/retour_abonne/prets')]", 
+		$this->assertXPathContentContains("//tbody/tr[1][@class=\"pret_en_retard\"]//td//a[contains(@href, '/recherche/viewnotice/id/827/retour_abonne/prets')]",
 																			'Alice');
 	}
 
@@ -238,7 +238,7 @@ class AbonneControllerPretsListTwoPretsTest extends AbonneControllerPretsListTwo
 
 	/** @test */
 	public function aliceLoanShouldHaveExtendLink() {
-		$this->assertXPathContentContains("//tbody/tr[1]//td//a[@href='/abonne/prolongerPret/id_pret/13']",
+		$this->assertXPathContentContains("//tbody/tr[1]//td//a[@href='/abonne/prolongerPret/id_pret/13'][@data-popup='true']",
 																			'Prolonger');
 	}
 
@@ -269,7 +269,7 @@ class AbonneControllerPretsListTwoPretsTest extends AbonneControllerPretsListTwo
 
 	/** @test */
 	public function potterLoanShouldHaveExtendLink() {
-		$this->assertXPathContentContains("//tbody/tr[2]//td//a[@href='/abonne/prolongerPret/id_pret/12']",
+		$this->assertXPathContentContains("//tbody/tr[2]//td//a[@href='/abonne/prolongerPret/id_pret/12'][@data-popup='true']",
 																			'Prolonger');
 	}
 
@@ -295,8 +295,8 @@ class AbonneControllerPretsListReservationTest extends AbstractAbonneControllerP
 
 		Class_Exemplaire::beVolatile();
 
-		$potter = 
-			(new Class_WebService_SIGB_Reservation('12', 
+		$potter =
+			(new Class_WebService_SIGB_Reservation('12',
 																						 (new Class_WebService_SIGB_Exemplaire(123))->setTitre('Potter')))
 			->parseExtraAttributes(array('Etat' => 'Réservation émise',
 																	 'Rang' => '2',
@@ -310,8 +310,8 @@ class AbonneControllerPretsListReservationTest extends AbstractAbonneControllerP
 																		])->assertSave();
 
 		// This item has no library: non-regression test.
-		$dobby = 
-			(new Class_WebService_SIGB_Reservation('13', 
+		$dobby =
+			(new Class_WebService_SIGB_Reservation('13',
 																						 (new Class_WebService_SIGB_Exemplaire(124))->setTitre('Dobby')))
 			->parseExtraAttributes(array('Etat' => 'Réservation émise',
 																	 'Rang' => '2',
@@ -374,7 +374,7 @@ class AbonneControllerPretsListReservationTest extends AbstractAbonneControllerP
 
 	/** @test */
 	public function titreShouldBePotterAndLinkToNotice() {
-		$this->assertXPathContentContains('//tbody/tr[1]//td//a[contains(@href, "recherche/viewnotice/id/823/retour_abonne/reservations")]', 
+		$this->assertXPathContentContains('//tbody/tr[1]//td//a[contains(@href, "recherche/viewnotice/id/823/retour_abonne/reservations")]',
 																			'Potter',
 																			$this->_response->getBody());
 	}
@@ -411,4 +411,89 @@ class AbonneControllerPretsListReservationTest extends AbstractAbonneControllerP
 																			$this->_response->getBody());
 	}
 }
-?>
\ No newline at end of file
+
+
+
+abstract class AbonneControllerPretsRenewTwoPretsTestCase extends AbonneControllerPretsListTwoPretsTestCase {
+	public function setUp() {
+		parent::setUp();
+		Class_CommSigb::setInstance($this->getSigbMock());
+		$this->dispatch('/opac/abonne/prolongerPret/render/popup', true);
+		$this->json = json_decode($this->_response->getBody());
+	}
+
+
+	protected function getSigbMock() {
+		return $this->mock();
+	}
+
+
+	public function tearDown() {
+		Class_CommSigb::setInstance(null);
+		parent::tearDown();
+	}
+
+
+	/** @test */
+	public function responseShouldBeJson() {
+		$this->assertNotNull($this->json);
+	}
+
+
+	/** @test */
+	public function popupShouldBeModal() {
+		$this->assertEquals('true', $this->json->show_modal);
+	}
+
+
+	/** @test */
+	public function popupShouldBeContered() {
+		$this->assertEquals('center center', $this->json->position->my);
+		$this->assertEquals('center center', $this->json->position->at);
+	}
+
+}
+
+
+
+class AbonneControllerPretsRenewErrorTwoPretsTest extends AbonneControllerPretsRenewTwoPretsTestCase {
+	protected function getSigbMock() {
+		return $this->mock()
+								->whenCalled('prolongerPret')
+								->answers(['statut' => 0,
+													 'erreur' => 'Patron not found']);
+	}
+
+	/** @test */
+	public function popupTitleShouldBeErreur() {
+		$this->assertEquals('Erreur', $this->json->title);
+	}
+
+
+	/** @test */
+	public function popupContentShouldContainsPatronNotFound() {
+		$this->assertEquals('Patron not found', $this->json->content);
+	}
+}
+
+
+
+class AbonneControllerPretsRenewSuccessTwoPretsTest extends AbonneControllerPretsRenewTwoPretsTestCase {
+	protected function getSigbMock() {
+		return $this->mock()
+								->whenCalled('prolongerPret')
+								->answers(['statut' => 1]);
+	}
+
+
+	/** @test */
+	public function popupTitleShouldBeErreur() {
+		$this->assertEquals(utf8_encode('Prêt prolongé'), $this->json->title);
+	}
+
+
+	/** @test */
+	public function popupContentShouldContainsPatronNotFound() {
+		$this->assertEquals(utf8_encode('Votre prêt a bien été prolongé.'), $this->json->content);
+	}
+}
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/AuthControllerTest.php b/tests/application/modules/opac/controllers/AuthControllerTest.php
index 41fbd8ca896a3343dce25e242380559d4cb43360..788b583a253e75c0f0dc665a1b5b59e1d0fa679e 100644
--- a/tests/application/modules/opac/controllers/AuthControllerTest.php
+++ b/tests/application/modules/opac/controllers/AuthControllerTest.php
@@ -562,10 +562,6 @@ class AuthControllerNumilogConnectedUserDeconnexionTest extends PortailWithOneLo
 
 
 class AuthControllerNoLoggedTest extends AuthControllerNobodyLoggedTestCase {
-	public function setUp() {
-		parent::setUp();
-
-	}
 	/** @test */
 	public function pageAuthLoginWithServiceShouldIncludeHiddenService() {
 		$this->dispatch('/opac/auth/login?service=http://monurlservice',true);
@@ -924,29 +920,80 @@ class AuthControllerPostSimpleSuccessfulWithRedirectTest extends AuthControllerP
 	}
 }
 
+abstract class AuthControllerLecturaTestCase extends AuthControllerPostSimpleTestCase {
+	protected $server_host;
+	public function setUp() {
+		parent::setUp();
+		$this->server_host = $_SERVER['HTTP_HOST'];
+		$_SERVER['HTTPS']='on';
+		$_SERVER['HTTP_HOST'] = 'test.webuser.lectura.fr';
+
+		$this->fixture('Class_AdminVar', ['id' => 'LECTURA_DOMAIN',
+																			'valeur' => 'test.webuser.lectura.fr']);
+		Class_Users::beVolatile();
 
+	}
 
 
-class AuthControllerPostSuccessfulFromCASClientTest extends AuthControllerPostSimpleSuccessfulTestCase {
+	public function tearDown() {
+		unset($_SERVER['HTTPS']);
+		$_SERVER['HTTP_HOST'] = $this->server_host;
+		parent::tearDown();
+	}
+
+
+}
+
+
+class AuthControllerPostWrongUserFromLecturaClientTest extends AuthControllerLecturaTestCase {
 	public function setUp() {
 		parent::setUp();
+		$this->postDispatch('/',
+												['CAB' => '0007',
+												 'PWD' => 'toto' ]);
 
-		$this->postDispatch('/opac/auth/login',
-												['username' => 'foo',
-												 'password' => 'bar',
-												 'service' => 'http://www.numilog.com/view?book=bilbo']);
 	}
+	/** @test */
+	public function responseShouldContainsError() {
+		$this->assertContains('error', $this->_response->getBody());
+	}
+
+}
+
+
+class AuthControllerPostSuccessfulFromLecturaClientTest extends AuthControllerLecturaTestCase {
+	public function setUp() {
+		parent::setUp();
 
+		$this->fixture('Class_Users', ['id' => 5 ,
+																	 'login' => '0007',
+																	 'idabon' => '0007',
+																	 'password' => 'toto']);
+
+		$this->_auth->whenCalled('authenticateLoginPassword')
+								->with('0007', 'toto')
+								->answers(true);
+		$this->postDispatch('/',
+												['CAB' => '0007',
+												 'PWD' => 'toto' ]);
+
+	}
 
 	/** @test */
-	public function responseShouldRedirectToCasClientWithTicket() {
-		$this->assertRedirectTo('http://www.numilog.com/view?book=bilbo&ticket=ST-'.md5(Zend_Session::getId().'2'));
+	public function controllerShouldBeAuth() {
+		$this->assertEquals('auth',$this->_request->getControllerName());
 	}
 
 	/** @test */
-	public function userFooShouldBeLogged() {
-		$this->assertEquals('foo', Class_Users::getIdentity()->getLogin());
+	public function actionShouldBeLogin() {
+		$this->assertEquals('login',$this->_request->getActionName());
 	}
+
+  /** @test */
+	public function responseShouldContainsSuccess() {
+		$this->assertContains('success',$this->_response->getBody());
+	}
+
 }
 
 
@@ -975,8 +1022,6 @@ class AuthControllerPostSuccessfulFromMusicMeCASClientTest extends AuthControlle
 }
 
 
-
-
 class AuthControllerFromCASClientUserConnectedTest extends AuthControllerNobodyLoggedTestCase {
 	public function setUp() {
 		parent::setUp();
@@ -1656,7 +1701,7 @@ class AuthControllerPostRegisterNewsletterDailyNewsTest extends AuthControllerNo
 
 	/** @test */
 	public function mailShouldContainsAccountMessage() {
-		$this->assertContains("Un compte vous a été créé automatiquement.\n\nCelui-ci vous permet de vous connecter en temps qu'invité et de vous désincrire de la newsletter.", $this->getSentMailContent());
+		$this->assertContains("Un compte vous a été créé automatiquement.", $this->getSentMailContent());
 	}
 
 
diff --git a/tests/application/modules/opac/controllers/CalendarTest.php b/tests/application/modules/opac/controllers/CalendarTest.php
deleted file mode 100644
index 28a960d0efcf87293e9628a64e8d9a7b3f9c84c4..0000000000000000000000000000000000000000
--- a/tests/application/modules/opac/controllers/CalendarTest.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
- *
- * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
- * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
- * the Free Software Foundation.
- *
- * There are special exceptions to the terms and conditions of the AGPL as it
- * is applied to this software (see README file).
- *
- * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
- * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
- */
-require_once 'AbstractControllerTestCase.php';
-
-class CalendarCmsActionTest extends AbstractControllerTestCase {
-	public function setUp() {
-		parent::setUp();
-
-		$this->cfg_accueil =
-			array('modules' => array('1' => array('division' => '1',
-																						'type_module' => 'CALENDAR',
-																						'preferences' => array('titre' => 'Rendez-vous',
-																																	 'rss_avis' => false,
-																																	 'id_categorie' => '12-2',
-																																	 'display_cat_select' => true,
-																																	 'display_event_info' => 'none'))),
-						'options' => 	array());
-
-
-		$this->profil_rdv = Class_Profil::getLoader()->newInstanceWithId(3)
-			->setBrowser('opac')
-			->setLibelle('Rendez-vous')
-			->setCfgAccueil($this->cfg_accueil);
-
-		$_SESSION["CALENDAR"] = array('DATE' => '',
-																	'HTML' => array(''));
-
-		Class_AdminVar::getLoader()->newInstanceWithId('CACHE_ACTIF')->setValeur('1');
-
-		$nanook2 = Class_Article::getLoader()
-			->newInstanceWithId(4)
-			->setTitre('Nanook 2 en prod !')
-			->setEventsDebut('2011-02-17')
-			->setEventsFin('2011-02-22');
-
-
-		$opac4 = Class_Article::getLoader()
-			->newInstanceWithId(4)
-			->setTitre('OPAC 4 en prod !')
-			->setEventsDebut('2011-02-17')
-			->setEventsFin('2011-02-22');
-
-		$article_loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
-			->whenCalled('getArticlesByPreferences')
-			->answers(array($nanook2))->getWrapper();
-	}
-
-
-	function tearDown() {
-		Class_AdminVar::getLoader()->find('CACHE_ACTIF')->setValeur('0');
-		parent::tearDown();
-	}
-
-
-	/**
-	 * Test non-regression vu sur Bucarest (prenait le layout normal au lieu du layout iframe)
-	 * @test
-	 */
-	function calendarShouldNotBeInAnIframeEventWithCacheActive() {
-		$cache = Storm_Test_ObjectWrapper::mock();
-		Storm_Cache::setDefaultZendCache($cache);
-		$module_cal = new ZendAfi_View_Helper_Accueil_Calendar(1, $this->cfg_accueil['modules']['1']);
-		$module_cal->setView(new ZendAfi_Controller_Action_Helper_View());
-
-		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/render/ajax');
-		// ça plantait lors de la réutilisation du cache, donc 2 dispatchs
-		$this->bootstrap();
-		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/render/ajax');
-		$this->assertNotXPath('//div[@id="site_web_wrapper"]');
-	}
-
-
-	/** @test */
-	function withLocaleEnMonthShouldBeFebruary() {
-		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/select_id_categorie/2/date/2011-02/language/en/render/ajax');
-		$this->assertXPathContentContains('//td[@class="calendar_title_month"]/a', "february", $this->_response->getBody()); 
-	}
-
-
-	/** @test **/
-	function calendarShouldContains3AwithClassCalendarTitleMonthClickable() {
-		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/select_id_categorie/2/date/2011-02/language/en/render/ajax');
-		$this->assertXPathCount('//a[@class="calendar_title_month_clickable"]',3,$this->_response->getBody());
-	}
-}
-
-?>
diff --git a/tests/application/modules/opac/controllers/CatalogueControllerTest.php b/tests/application/modules/opac/controllers/CatalogueControllerTest.php
index 5d2285f34cfd617760da6be0c72e92abcc38b49b..e792233fc1c02ee41d73b781bfdc1df3d0068ef0 100644
--- a/tests/application/modules/opac/controllers/CatalogueControllerTest.php
+++ b/tests/application/modules/opac/controllers/CatalogueControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -35,7 +35,7 @@ class CatalogueControllerAppelMenuTest extends AbstractControllerTestCase {
 			->answers(null)
 			->whenCalled('fetchAll')
 			->answers([]);
-		
+
 		Zend_Registry::set('sql', $this->_sql_mock);
 
 		Class_Catalogue::newInstanceWithId(151, ['libelle' => 'Nouveautés',
@@ -43,15 +43,9 @@ class CatalogueControllerAppelMenuTest extends AbstractControllerTestCase {
 	}
 
 
-	public function tearDown() {
-		Zend_Registry::set('sql', $this->_sql);
-		parent::tearDown();
-	}
-	
-		
-	/** 
+	/**
 	 * Test non regression chatenay: ecran blanc sur menu vertical
-	 * @test 
+	 * @test
 	 */
 	public function withWrongRequestShouldNotDoError500() {
 		$this->_dispatchQuery("titre=Le+Dispositif+Trace&aleatoire=1&tri=1&nb_notices=0&nb_analyse=50&id_catalogue=0&id_panier=139999&id_user=20001&reset=true");
@@ -60,9 +54,9 @@ class CatalogueControllerAppelMenuTest extends AbstractControllerTestCase {
 	}
 
 
-	/** 
+	/**
 	 * Test non regression Pontault-Combault: ecran blanc sur lien catalogue
-	 * @test 
+	 * @test
 	 */
 	public function getFacettesSqlError() {
 		$this->_dispatchQuery('titre=Catalogue&aleatoire=0&tri=1&nb_notices=+&nb_analyse=&id_catalogue=151&id_panier=0&id_user=0&reset=true');
@@ -83,7 +77,7 @@ class CatalogueControllerAppelMenuTest extends AbstractControllerTestCase {
 		$this->dispatch('/recherche/appelmenu?id_catalogue=151',true);
 		$this->assertXPathContentContains('//h1', 'Nouveautés',$this->_response->getBody());
 	}
-	
+
 
 	/**
 	 * @param $query string
@@ -131,7 +125,7 @@ class CatalogueControllerJsonActionTest extends AbstractControllerTestCase {
 	public function domainesActionShouldReturnJson() {
 		$this->dispatch('/admin/catalogue/domaines');
 		$this->assertJsonStringEqualsJsonString(
-			$this->_response->getBody(), 
+			$this->_response->getBody(),
 			json_encode([
 										["id" => "domaines",
 										 "label" => "Domaines",
@@ -147,7 +141,7 @@ class CatalogueControllerJsonActionTest extends AbstractControllerTestCase {
 	public function domainesPaniersJsonActionShouldReturnJson() {
 		$this->dispatch('/admin/catalogue/domaines-paniers-json');
 		$this->assertJsonStringEqualsJsonString(
-			$this->_response->getBody(), 
+			$this->_response->getBody(),
 			json_encode([
 										["id" => "panier_for_user",
 										 "label" => "Mes paniers",
diff --git a/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac31275605f2f6540108961a2eb2cbb332636473
--- /dev/null
+++ b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php
@@ -0,0 +1,345 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+abstract class CmsControllerCalendarActionTestCase extends AbstractControllerTestCase {
+	protected
+		$_nanook2;
+
+	public function setUp() {
+		parent::setUp();
+
+		$this->cfg_accueil =
+			['modules' =>
+			 [ '1' => [
+								 'division' => '1',
+								 'type_module' => 'CALENDAR',
+								 'preferences' => [
+																	 'titre' => 'Rendez-vous',
+																	 'rss_avis' => false,
+																	 'id_categorie' => '12-2',
+																	 'display_cat_select' => true,
+																	 'enabled_filters' => 'date;place;custom_field_2;zork',
+																	 'display_event_info' => 'none']]],
+			 'options' => 	[]];
+
+
+		$this->fixture('Class_Profil',
+									 ['id' => 3,
+										'browser' => 'opac',
+										'libelle' => 'Rendez-vous',
+										'cfg_accueil' => $this->cfg_accueil]);
+
+		Class_AdminVar::newInstanceWithId('CACHE_ACTIF',
+																			['valeur' => '1']);
+
+		$this->_nanook2 = $this->fixture('Class_Article',
+																		 ['id' => 4,
+																			'titre' => 'Nanook 2 en prod !',
+																			'contenu' => 'youpi !',
+																			'events_debut' => '2011-02-17',
+																			'events_fin' => '2011-02-22']);
+
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
+			->whenCalled('getArticlesByPreferences')
+			->answers([$this->_nanook2]);
+	}
+
+
+	function tearDown() {
+		Class_AdminVar::getLoader()->find('CACHE_ACTIF')->setValeur('0');
+		parent::tearDown();
+	}
+}
+
+
+
+
+class CmsControllerCalendarActionCacheTest extends CmsControllerCalendarActionTestCase {
+	public function setUp() {
+		parent::setUp();
+		$cache = Storm_Test_ObjectWrapper::mock();
+		Storm_Cache::setDefaultZendCache($cache);
+		$module_cal = new ZendAfi_View_Helper_Accueil_Calendar(1, $this->cfg_accueil['modules']['1']);
+		$module_cal->setView(new ZendAfi_Controller_Action_Helper_View());
+	}
+	/**
+	 * Test non-regression vu sur Bucarest (prenait le layout normal au lieu du layout iframe)
+	 * @test
+	 */
+	function calendarShouldNotBeInAnIframeEventWithCacheActive() {
+		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/render/ajax');
+		// ça plantait lors de la réutilisation du cache, donc 2 dispatchs
+		$this->bootstrap();
+		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/render/ajax');
+		$this->assertNotXPath('//div[@id="site_web_wrapper"]');
+	}
+}
+
+
+
+
+class CmsControllerCalendarActionLanguageEnTest extends CmsControllerCalendarActionTestCase {
+	public function setUp() {
+		parent::setUp();
+		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/select_id_categorie/2/date/2011-02/language/en/render/ajax');
+	}
+
+
+	/** @test */
+	function withLocaleEnMonthShouldBeFebruary() {
+		$this->assertXPathContentContains('//td[@class="calendar_title_month"]/a', "february", $this->_response->getBody());
+	}
+
+
+	/** @test **/
+	function calendarShouldContains3AwithClassCalendarTitleMonthClickable() {
+		$this->assertXPathCount('//a[@class="calendar_title_month_clickable"]',3);
+	}
+}
+
+
+
+
+class CmsControllerCalendarActionWithFiltersTest extends CmsControllerCalendarActionTestCase {
+	protected $_opac4;
+	protected $_date;
+
+	public function setupCustomFields() {
+		Class_CustomField_Meta::beVolatile();
+		$theme = $this->fixture('Class_CustomField',
+														['id' => 2,
+														 'priority' => 3,
+														 'label' => 'Theme',
+														 'field_type' => Class_CustomField_Meta::SELECT,
+														 'options_list' => 'sigb;opac',
+														 'model' => 'Article']);
+
+		$this->fixture('Class_CustomField_Value',
+									 ['id' => 5,
+										'custom_field_id' => $theme->getId(),
+										'model_id' => $this->_nanook2->getId(),
+										'value' => 'sigb']);
+
+		$this->fixture('Class_CustomField_Value',
+									 ['id' => 2,
+										'custom_field_id' => $theme->getId(),
+										'model_id' => $this->_opac4->getId(),
+										'value' => 'opac']);
+	}
+
+
+	public function setUp() {
+		parent::setUp();
+		$this->_opac4 = $this->fixture('Class_Article',
+																	 ['id' => 5,
+																		'titre' => 'OPAC 4 en prod !',
+																		'contenu' => 'youpi !',
+																		'events_debut' => '2011-02-17',
+																		'events_fin' => '2011-02-22']);
+		$this->setupCustomFields();
+
+		$common_preferences = ['display_order' => 'EventDebut',
+													 'id_categorie' => '',
+													 'events_only' => true,
+													 'id_bib' => 0,
+													 'id_lieu' => '',
+													 'custom_fields' => [2 => 'opac'],
+													 'published' => true];
+
+		$time_source = new TimeSourceForTest('2014-06-06 14:14:14');
+		ZendAfi_View_Helper_CalendarContent::setTimeSource($time_source);
+		ZendAfi_View_Helper_Calendar_Months::setTimeSource($time_source);
+
+		Class_Article::getLoader()
+			->whenCalled('getArticlesByPreferences')
+			->with(array_merge($common_preferences, ['event_date' => '2014-07']))
+			->answers([$this->_opac4])
+
+			->whenCalled('getArticlesByPreferences')
+			->with(array_merge($common_preferences, ['event_date' => '',
+																							 'event_start_after' => '2014-07',
+																							 'event_end_after' => '',
+																							 'limit' => 3]))
+			->answers([])
+			->beStrict();
+
+		$this->dispatch('/cms/calendar/id_profil/3/id_module/1/date/2014-07/custom_field_2/opac/render/ajax', true);
+	}
+
+
+	/** @test **/
+	public function calendarWithCustomFieldFiltersShouldBuildPreferencesForGetArticlesByPreferences() {
+		$this->assertXPathContentContains('//a[@class="calendar_event_title"]',
+																			'OPAC 4 en prod !');
+	}
+
+
+	/** @test */
+	public function monthFilterShouldContainsCustomField2Music() {
+		$this->assertXPathContentContains('//li[@class="date"]//li[not(@class="selected")]/a[contains(@href, "/cms/calendar/id_module/1/custom_field_2/opac/date/2014-11")]',
+																			'Novembre');
+	}
+
+
+	/** @test */
+	public function selectedMonthFilterShouldHaveClassSelected() {
+		$this->assertXPath('//li[@class="date"]//li[@class="selected"]/a[contains(@href, "/cms/calendar/id_module/1/custom_field_2/opac/date/2014-07")]');
+	}
+
+
+	/** @test */
+	public function themeFilterShouldContainsDate() {
+		$this->assertXPathContentContains('//li[@class="custom_field_2"]//li//a[contains(@href, "/cms/calendar/id_module/1/custom_field_2/sigb/date/2014-07")]',
+																			'sigb');
+	}
+
+
+	/** @test */
+	public function themeFilterHeaderShouldBeThemeOPAC() {
+		$this->assertXPathContentContains('//li[@class="custom_field_2"]/h2', 'Theme: opac');
+	}
+
+
+	/** @test */
+	public function monthFilterShouldHaveTitleMoisJuillet() {
+		$this->assertXPathContentContains('//ul[@class="filters"]/li[@class="date"]/h2',
+																			'Mois: Juillet');
+	}
+}
+
+
+
+
+class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+
+		$cfg_accueil = ['modules' =>
+										[ '1' => [
+															'division' => '1',
+															'type_module' => 'CALENDAR',
+															'preferences' => ['mode-affichage' => 'article',
+																								'display_full_page' => 0]]],
+										'options' => 	[]];
+
+
+		$this->fixture('Class_Profil',
+									 ['id' => 3,
+										'browser' => 'opac',
+										'libelle' => 'Plop',
+										'cfg_accueil' => $cfg_accueil]);
+
+
+		$this->fixture('Class_Article',
+									 ['id' => 5,
+										'titre' => 'News of the 15th September',
+										'contenu' => 'youpi !',
+										'events_debut' => '2014-09-15',
+										'events_fin' => '2014-09-15']);
+
+		$this->fixture('Class_Article',
+									 ['id' => 2,
+										'titre' => 'News of the 30th September',
+										'contenu' => 'youpi !',
+										'events_debut' => '2014-09-28',
+										'events_fin' => '2014-09-30']);
+
+		$time_source = new TimeSourceForTest('2014-09-02 14:14:14');
+		ZendAfi_View_Helper_CalendarContent::setTimeSource($time_source);
+		ZendAfi_View_Helper_Calendar_Table::setTimeSource($time_source);
+
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
+			->whenCalled('getArticlesByPreferences')
+			->with(['display_order' => 'EventDebut',
+							'id_categorie' => '',
+							'events_only' => true,
+							'event_date' => '2014-09',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'published' => true])
+			->answers([Class_Article::find(2), Class_Article::find(5)])
+
+			->whenCalled('getArticlesByPreferences')
+			->with(['display_order' => 'EventDebut',
+							'id_categorie' => '',
+							'events_only' => true,
+							'event_date' => '2014-09',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'published' => true,
+							'event_end_after' => '2014-09-02'])
+			->answers([Class_Article::find(2), Class_Article::find(5)])
+
+			->whenCalled('getArticlesByPreferences')
+			->with(['display_order' => 'EventDebut',
+							'id_categorie' => '',
+							'events_only' => true,
+							'event_date' => '',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'published' => true,
+							'event_start_after' => '2014-09',
+							'event_end_after' => '',
+							'limit' => 3])
+			->answers([Class_Article::find(2), Class_Article::find(5)])
+
+			->whenCalled('getArticlesByPreferences')
+			->with(['display_order' => 'EventDebut',
+							'id_categorie' => '',
+							'events_only' => true,
+							'event_date' => '2014-09-30',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'published' => true])
+			->answers([Class_Article::find(2)])
+			->beStrict();
+
+		$this->dispatch('cms/calendar/date/2014-09-30/id_profil/3/id_module/1/opac/render/ajax', true);
+	}
+
+
+	/** @test */
+	public function currentMonthLinkShouldHaveReadyAjaxClass() {
+		$this->assertXPath('//table[@class="calendar_main"]//td[@class="calendar_title_month"]//a[contains(@class, "calendar_ajax_ready")]');
+	}
+
+
+	/** @test */
+	public function newsOfThe30thShouldBePresent() {
+		$this->assertXPathContentContains('//div[@class="calendar"]//article//header//h2//a', 'News of the 30th September');
+	}
+
+
+	/** @test **/
+	public function newsOfThe15ThSeptemberEventShouldNotBPresent() {
+		$this->assertNotXPathContentContains('//div[@id="boite_1"][@class="calendar"]//article//header', 'News of the 15th September', $this->_response->getBody());
+	}
+
+
+	/** @test */
+	public function newsOfThe15thSeptemberShouldBeClickableAtThe15Th() {
+		$this->assertXPath('//div[@class="calendar"]//table//a[contains(@class, "day_clickable")][contains(@href, "date/2014-09-15")]');
+	}
+}
+?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/IndexControllerTest.php b/tests/application/modules/opac/controllers/IndexControllerTest.php
index f8065ce30a6308609ca9b9039ce6f0337fffb88c..10b4adbfa0ca2e60c7c308cb1dff340c652e33cd 100644
--- a/tests/application/modules/opac/controllers/IndexControllerTest.php
+++ b/tests/application/modules/opac/controllers/IndexControllerTest.php
@@ -123,4 +123,23 @@ class IndexControllerWithInvitedLevelRestrictionForProfilTest extends AbstractCo
 											 $this->_response->getBody());
 	}
 }
+
+
+
+class IndexControllerWithLoggedUserTest extends AbstractControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+		ZendAfi_Auth::getInstance()->logUser($this->fixture('Class_Users',
+																												['id' => 1,
+																												 'login' => 'tom',
+																												 'password' => 'ok']));
+		$this->dispatch('index/index', true);
+	}
+
+
+	/** @test */
+	public function bodyShouldHaveDataLoggedTrue() {
+		$this->assertXPath('//body[@data-logged="true"]');
+	}
+}
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/JavaControllerTest.php b/tests/application/modules/opac/controllers/JavaControllerTest.php
index 978fc05f060b82c88460d9abd2efb83e1dace08f..06fa6598cf1fc825919b4633be1982c16a977cb0 100644
--- a/tests/application/modules/opac/controllers/JavaControllerTest.php
+++ b/tests/application/modules/opac/controllers/JavaControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -24,11 +24,11 @@ class JavaControllerWidthDefaultKiosqueTest extends AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 		$cfg_accueil = ['modules' => ['1' => ['division' => 1,
-																					'type_module' => 'KIOSQUE']], 
+																					'type_module' => 'KIOSQUE']],
 										'options' => 	[]];
 
 
-		
+
 		$this->profil_cache = Class_Profil::getLoader()->newInstanceWithId(5345)
 			->setBrowser('opac')
 			->setLibelle('Profil cache')
@@ -56,13 +56,53 @@ class JavaControllerWidthDefaultKiosqueTest extends AbstractControllerTestCase {
 
 
 
+class JavaControllerCarrouselHorizontalTest extends AbstractControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+		$this->fixture('Class_Profil',
+									 ['id' => 3,
+										'browser' => 'opac',
+										'libelle' => 'kiosque test',
+										'cfg_accueil' => ['modules' => ['1' => ['division' => 1,
+																														'type_module' => 'KIOSQUE',
+																														'titre' => '',
+																														'vue' => 'mycarousel_horizontal',
+																														'preferences' => ['op_speed' => 400]]],
+																			'options' => 	[]]])
+				 ->beCurrentProfil();
+
+		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
+			->whenCalled('getNoticesByPreferences')
+			->answers([
+								 ['id_notice' => 4,
+									'titre' => 'Madagascar',
+									'vignette' => 'http://thumbnail.com/madagascar.jpg'
+									]
+								 ]);
+		$this->dispatch('java/kiosque/id_module/1/titre/title+%2F+with+some+%2F+slashes/vue/mycarousel_horizontal', true);
+	}
+
+
+	/** @test */
+	public function titleShouldBeRemovedBecauseOfPossibleApacheMisconfigurationOfAllowEncodedSlashes() {
+		$this->assertXPath('//div[@class="jMyCarousel"]//a[@href="/recherche/viewnotice/id_module/1/vue/mycarousel_horizontal/id/4"]');
+	}
+
+
+	/** @test */
+	public function jMyCarouselShouldBeLoaded() {
+		$this->assertContains('jMyCarousel', $this->_response->getBody());
+	}
+}
+
+
 
 class JavaControllerWithKiosqueMurPageTest extends AbstractControllerTestCase {
 	public function setUp() {
 		parent::setUp();
 
 		$cfg_accueil = ['modules' => ['1' => ['division' => 1,
-																					'type_module' => 'KIOSQUE', 
+																					'type_module' => 'KIOSQUE',
 																					'preferences' => 	['style_liste' => 'mur',
 																														 'nb_notices' => 10,
 																														 'nb_analyse' => 50]]]];
@@ -92,7 +132,7 @@ class JavaControllerWithKiosqueMurAndPanierDeletedTest extends AbstractControlle
 	public function setUp() {
 		parent::setUp();
 		$cfg_accueil = ['modules' => ['1' => ['division' => 1,
-																					'type_module' => 'KIOSQUE', 
+																					'type_module' => 'KIOSQUE',
 																					'preferences' => 	['style_liste' => 'mur',
 																														 'id_panier' => 99999,
 																														 'nb_notices' => 10,
@@ -118,11 +158,11 @@ class JavaControllerKiosqueSlideShowWidthWrongParamsTest extends AbstractControl
 	public function setUp() {
 		parent::setUp();
 		$cfg_accueil = ['modules' => ['1' => ['division' => 1,
-																					'type_module' => 'MENU']], 
+																					'type_module' => 'MENU']],
 										'options' => 	[]];
 
 
-		
+
 		$this->profil = Class_Profil::newInstanceWithId(5345, ['browser' => 'opac',
 																													 'libelle' => 'Profil cache',
 																													 'cfg_acceuil' => $cfg_accueil]);
@@ -134,7 +174,7 @@ class JavaControllerKiosqueSlideShowWidthWrongParamsTest extends AbstractControl
 
 		$this->mock_sql
 			->whenCalled('fetchAll')
-			->with("select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre from notices  where url_vignette > '' and url_vignette != 'NO' order by date_creation DESC  LIMIT 0,50",
+			->with("select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre from notices where url_vignette > '' and url_vignette != 'NO' order by date_creation DESC  LIMIT 0,50",
 							false)
 			->answers([])
 			->beStrict();
diff --git a/tests/application/modules/opac/controllers/OAIControllerTest.php b/tests/application/modules/opac/controllers/OAIControllerTest.php
index 9b2d548c1797660d298ac8c8ee31260bd527f856..4b945118587ae0023bceecd905b3d300fd6abcd3 100644
--- a/tests/application/modules/opac/controllers/OAIControllerTest.php
+++ b/tests/application/modules/opac/controllers/OAIControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -28,7 +28,7 @@ abstract class OAIControllerRequestTestCase extends AbstractControllerTestCase {
 
 		Class_AdminVar::getLoader()
 			->newInstanceWithId('OAI_SERVER')
-			->setValeur('1');	
+			->setValeur('1');
 
 		$this->_xpath = new Storm_Test_XPathXML();
 		$this->_xpath->registerNameSpace('oai', 'http://www.openarchives.org/OAI/2.0/');
@@ -59,20 +59,20 @@ abstract class OAIControllerRequestTestCase extends AbstractControllerTestCase {
 class OAIControllerIndentifyRequestTest extends OaiControllerRequestTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->dispatch('/opac/oai/request?verb=Identify', true);		
+		$this->dispatch('/opac/oai/request?verb=Identify', true);
 	}
 
 
 	/** @test */
 	public function shouldReturnIdentifyResponse() {
-		$this->_xpath->assertXPath($this->_response->getBody(), 
+		$this->_xpath->assertXPath($this->_response->getBody(),
 															 '//oai:request[@verb="Identify"]');
 	}
 
 
 	/** @test */
 	public function responseShouldNotHaveError() {
-		$this->_xpath->assertNotXPath($this->_response->getBody(), 
+		$this->_xpath->assertNotXPath($this->_response->getBody(),
 																	'//oai:error');
 	}
 }
@@ -89,14 +89,14 @@ class OAIControllerIndentifyRequestWithIllegalParameterTest extends OaiControlle
 
 	/** @test */
 	public function shouldReturnErrorBadArgumentWithIllegalParameter() {
-		$this->_xpath->assertXPath($this->_response->getBody(), 
+		$this->_xpath->assertXPath($this->_response->getBody(),
 															 '//oai:error[@code="badArgument"]');
 	}
 
 
 	/** @test */
 	public function shouldNotReturnIdentify() {
-		$this->_xpath->assertNotXPath($this->_response->getBody(), 
+		$this->_xpath->assertNotXPath($this->_response->getBody(),
 															 '//oai:Identify');
 	}
 
@@ -110,7 +110,7 @@ class OAIControllerRequestWithoutOAIEnabledTest extends AbstractControllerTestCa
 	public function responseShouldBeEmpty() {
 		Class_AdminVar::getLoader()
 			->newInstanceWithId('OAI_SERVER')
-			->setValeur('0');	
+			->setValeur('0');
 		$this->dispatch('/opac/oai/request?verb=Identify');
 		$this->assertEmpty($this->_response->getBody());
 	}
@@ -121,7 +121,7 @@ class OAIControllerRequestWithoutOAIEnabledTest extends AbstractControllerTestCa
 
 class OaiControllerListSetsRequestTest extends OaiControllerRequestTestCase {
 	protected $_xpath;
-	 
+
 	public function setUp() {
 		parent::setUp();
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
@@ -137,7 +137,7 @@ class OaiControllerListSetsRequestTest extends OaiControllerRequestTestCase {
 
 	/** @test */
 	public function shouldReturnListSetsResponse() {
-		$this->_xpath->assertXPath($this->_response->getBody(), 
+		$this->_xpath->assertXPath($this->_response->getBody(),
 												'//oai:request[@verb="ListSets"]');
 	}
 }
@@ -146,7 +146,7 @@ class OaiControllerListSetsRequestTest extends OaiControllerRequestTestCase {
 
 class OaiControllerGetRecordRequestTest extends OaiControllerRequestTestCase {
 	protected $_xpath;
-	 
+
 	public function setUp() {
 		parent::setUp();
 		$this->dispatch('/opac/oai/request?verb=GetRecord&identifier=zork&metadataPrefix=oai_dc');
@@ -155,7 +155,7 @@ class OaiControllerGetRecordRequestTest extends OaiControllerRequestTestCase {
 
 	/** @test */
 	public function shouldReturnGetRecordResponse() {
-		$this->_xpath->assertXPath($this->_response->getBody(), 
+		$this->_xpath->assertXPath($this->_response->getBody(),
 												'//oai:request[@verb="GetRecord"]');
 	}
 }
@@ -164,7 +164,7 @@ class OaiControllerGetRecordRequestTest extends OaiControllerRequestTestCase {
 
 class OaiControllerUnknownVerbRequestTest extends OaiControllerRequestTestCase {
 	protected $_xpath;
-	 
+
 	public function setUp() {
 		parent::setUp();
 		$this->dispatch('/opac/oai/request?verb=DoASpecialThing');
@@ -229,12 +229,6 @@ class OAIControllerResultatActionTest extends AbstractControllerTestCase  {
 	}
 
 
-	public function tearDown() {
-		Zend_Registry::set('sql', $this->old_sql);
-		parent::tearDown();
-	}
-
-
 	/** @test */
 	public function tdShouldContainsMangezDesPommes() {
 		$this->assertXPathContentContains('//td', 'Mangez des pommes', $this->_response->getBody());
diff --git a/tests/application/modules/opac/controllers/PanierControllerTest.php b/tests/application/modules/opac/controllers/PanierControllerTest.php
index f9d083f55b87757d02548c66ae15e17672f3b9b8..1863f3ee29073e10aa16da31a1f678b62e09e8a6 100644
--- a/tests/application/modules/opac/controllers/PanierControllerTest.php
+++ b/tests/application/modules/opac/controllers/PanierControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'AbstractControllerTestCase.php';
 
@@ -31,7 +31,7 @@ abstract class PanierControllerSimpleLoggedUserTestCase extends AbstractControll
 		Class_PanierNotice::beVolatile();
 		Class_PanierNoticeCatalogue::beVolatile();
 
-		$this->user = Class_Users::newInstanceWithId(23, ['pseudo' => 'zorn', 
+		$this->user = Class_Users::newInstanceWithId(23, ['pseudo' => 'zorn',
 																											 'nom' => 'john',
 																											 'login' => 'jzorn',
 																											 'password' => '123']);
@@ -63,7 +63,7 @@ abstract class PanierControllerTestCase extends AbstractControllerTestCase {
 
 		$this->manon = $this->fixture('Class_Users', [
 			'id' => 23,
-			'pseudo' => 'ManonL', 
+			'pseudo' => 'ManonL',
 			'nom' => 'Afond',
 			'login' => 'man',
 			'password' => '123']);
@@ -108,9 +108,9 @@ abstract class PanierControllerTestCase extends AbstractControllerTestCase {
 			'id' => 10,
 			'titre_principal' => 'Le combat ordinaire',
 			'clef_alpha' => 'COMBAT ORDINAIRE']);
-			
+
 		$blacksad = $this->fixture('Class_Notice', [
-			'id' => 12, 
+			'id' => 12,
 			'titre_principal' => 'Blacksad',
 			'clef_alpha' => 'BLACKSAD']);
 
@@ -132,7 +132,7 @@ abstract class PanierControllerTestCase extends AbstractControllerTestCase {
 
 		$panier_domaine_histoire = Class_PanierNoticeCatalogue::newInstanceWithId(71);
 		$panier_domaine_histoire
-			->setPanierNotice(Class_PanierNotice::newInstanceWithId(38, 
+			->setPanierNotice(Class_PanierNotice::newInstanceWithId(38,
 																															['libelle' => 'selection jeunesse',
 																															 'user' => Class_Users::newInstanceWithId(45, ['nom' => 'Dupont']),
 																															 'date_maj' => '19/01/2013',
@@ -143,14 +143,14 @@ abstract class PanierControllerTestCase extends AbstractControllerTestCase {
 		$panier_domaine_bd = Class_PanierNoticeCatalogue::newInstanceWithId(72);
 		$panier_domaine_bd
 			->setPanierNotice($this->panier_bd)
-			->setCatalogue(Class_Catalogue::newInstanceWithId(199, 
+			->setCatalogue(Class_Catalogue::newInstanceWithId(199,
 																												['libelle' => 'bd',
 																												 'panier_notice_catalogues' => [$panier_domaine_bd]]))->save();
 
 		$panier_domaine_orphelin = Class_PanierNoticeCatalogue::newInstanceWithId(456);
 		$panier_domaine_orphelin
 			->setPanierNotice($this->panier_orphelin)
-			->setCatalogue(Class_Catalogue::newInstanceWithId(1789, 
+			->setCatalogue(Class_Catalogue::newInstanceWithId(1789,
 																												['libelle' => 'orphelin',
 																												 'panier_notice_catalogues' => [$panier_domaine_orphelin]]))->save();
 
@@ -160,6 +160,35 @@ abstract class PanierControllerTestCase extends AbstractControllerTestCase {
 
 
 
+class PanierControllerIndexActionWithTextReplacmentsTest extends PanierControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+		Class_AdminVar::newInstanceWithId('TEXT_REPLACEMENTS',
+																			['valeur' => implode("\n",
+																													['Vos paniers de documents;Votre sélection de documents',
+																													 ' ',
+																													 ' panier ;  sélection;',
+																													 'erreur']
+																				)]);
+		Class_TextReplacements::reset();
+		$this->dispatch('/opac/panier', true);
+	}
+
+
+	/** @test */
+	public function h1ShouldContainsVotreSelectionDeDocuments() {
+		$this->assertXPathContentContains('//h1', 'Votre sélection de documents',
+																			$this->_response->getBody());
+	}
+
+	/** @test */
+	public function spanShouldContainsVousAvezDeuxSelections() {
+		$this->assertXPathContentContains('//span[@class="abonne"]', 'Vous avez 2 sélections');
+	}
+}
+
+
+
 class PanierControllerIndexActionTest extends PanierControllerTestCase {
 	public function setUp() {
 		parent::setUp();
@@ -167,6 +196,18 @@ class PanierControllerIndexActionTest extends PanierControllerTestCase {
 	}
 
 
+	/** @test */
+	public function h1ShouldContainsVosPaniersDeDocuments() {
+		$this->assertXPathContentContains('//h1', 'Vos paniers de documents', $this->_response->getBody());
+	}
+
+
+	/** @test */
+	public function spanShouldContainsVousAvezDeuxPaniers() {
+		$this->assertXPathContentContains('//span[@class="abonne"]', 'Vous avez 2 paniers');
+	}
+
+
 	/** @test */
 	public function actionShouldBeIndex() {
 		$this->assertController('panier');
@@ -210,7 +251,7 @@ class PanierControllerIndexActionTest extends PanierControllerTestCase {
 class PanierControllerIndexActionWithIdNoticeBDTest extends PanierControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);		
+		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 		$this->dispatch('/opac/panier/index/id_panier/38/id_notice/12', true);
 	}
 
@@ -236,19 +277,19 @@ class PanierControllerIndexActionWithIdNoticeBDTest extends PanierControllerTest
 
 	/** @test */
 	public function selectShouldContainsPanierMesRomans() {
-		$this->assertXPathContentContains('//select[@name="id_panier"]//option[@value="15"]', 'Mes Romans');		
+		$this->assertXPathContentContains('//select[@name="id_panier"]//option[@value="15"]', 'Mes Romans');
 	}
 
 
 	/** @test */
 	public function selectShouldContainsSelectedPanierSelectionJeunesse() {
-		$this->assertXPathContentContains('//select[@name="id_panier"]//option[@value="38"][@selected="selected"]', 'selection jeunesse', $this->_response->getBody());		
+		$this->assertXPathContentContains('//select[@name="id_panier"]//option[@value="38"][@selected="selected"]', 'selection jeunesse', $this->_response->getBody());
 	}
 
 
 	/** @test */
 	public function formShouldAllowToChangeTitrePanierNotice() {
-		$this->assertXPath('//form[contains(@action, "panier/majtitrepanier/id_panier/38")]');	
+		$this->assertXPath('//form[contains(@action, "panier/majtitrepanier/id_panier/38")]');
 	}
 }
 
@@ -257,9 +298,9 @@ class PanierControllerIndexActionWithIdNoticeBDTest extends PanierControllerTest
 class PanierControllerAsSimpleUserActionTest extends PanierControllerSimpleLoggedUserTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->user->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);	
+		$this->user->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 		$this->user->save();
-		ZendAfi_Auth::getInstance()->logUser($this->user);	
+		ZendAfi_Auth::getInstance()->logUser($this->user);
 		$panier_bd_user = Class_PanierNotice::newInstanceWithId(200,
 																														 [
 																															'libelle' => 'Mes BD',
@@ -277,7 +318,7 @@ class PanierControllerAsSimpleUserActionTest extends PanierControllerSimpleLogge
 
 	/** @test */
 	public function forInviteShouldContainsOnePanier() {
-		$this->assertXPathCount('//span[contains(text(), "Vous avez 1 panier(s)")]', 1,$this->_response->getBody());
+		$this->assertXPathCount('//span[contains(text(), "Vous avez 1 panier")]', 1);
 	}
 	/** @test */
 	public function panierDomaineSelectionJeunesseShouldNotBeVisibleForSimpleUser() {
@@ -291,7 +332,7 @@ class PanierControllerIndexAsRedacteurActionTest extends PanierControllerTestCas
 	public function setUp() {
 		parent::setUp();
 
-		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);		
+		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 
 		$this->dispatch('/opac/panier', true);
 
@@ -301,8 +342,7 @@ class PanierControllerIndexAsRedacteurActionTest extends PanierControllerTestCas
 	/** @test */
 	public function panierShouldContains2Paniers() {
 		$this->assertXPathContentContains('//span[@class="abonne"]',
-																			'Vous avez 2 panier(s)',
-																			$this->_response->getBody());
+																			'Vous avez 2 paniers');
 	}
 
 	/** @test */
@@ -326,7 +366,7 @@ class PanierControllerIndexWithPanierIdFifteenTest extends PanierControllerTestC
 		$this->dispatch('/panier?id_panier=15', true);
 	}
 
-	
+
 	/** @test */
 	public function actionShouldBeIndex() {
 		$this->assertController('panier');
@@ -353,13 +393,13 @@ class PanierControllerIndexWithPanierIdFifteenTest extends PanierControllerTestC
 
 	/** @test */
 	public function pageShouldContainsLinkToExportUnimarc() {
-		$this->assertXPath('//a[contains(@href, "panier/export-unimarc/id_panier/15")]');		
+		$this->assertXPath('//a[contains(@href, "panier/export-unimarc/id_panier/15")]');
 	}
 
 
 	/** @test */
 	public function pageShouldContainsLinkToExportList() {
-		$this->assertXPath('//a[contains(@href, "panier/export-liste/id_panier/15")]');		
+		$this->assertXPath('//a[contains(@href, "panier/export-liste/id_panier/15")]');
 	}
 
 
@@ -371,7 +411,7 @@ class PanierControllerIndexWithPanierIdFifteenTest extends PanierControllerTestC
 
 	/** @test */
 	public function pageShouldContainsLinkToViewNoticeMontespan() {
-		$this->assertXPath('//a[contains(@href, "recherche/viewnotice/clef/MONTESPAN/id/4/retour_panier/15")]', $this->_response->getBody());	
+		$this->assertXPath('//a[contains(@href, "recherche/viewnotice/clef/MONTESPAN/id/4/retour_panier/15")]', $this->_response->getBody());
 	}
 }
 
@@ -390,7 +430,7 @@ class PanierControllerSupprimerNoticeBlacksadFromBDTest extends PanierController
 		$this->assertEquals('COMBAT ORDINAIRE', $this->panier_bd->getNotices());
 	}
 
-	
+
 	/** @test */
 	public function panierShouldHaveBeenSaved() {
 		$this->assertTrue(Class_PanierNotice::methodHasBeenCalled('save'));
@@ -411,7 +451,7 @@ class PanierControllerSupprimerBDTest extends PanierControllerTestCase {
 		$this->dispatch('/panier/supprimerpanier/id_panier/2', true);
 	}
 
-	
+
 	/** @test */
 	public function panierShouldHaveBeenDeleted() {
 		$this->assertTrue(Class_PanierNotice::methodHasBeenCalled('delete'));
@@ -430,7 +470,7 @@ class PanierControllerSupprimerBDTest extends PanierControllerTestCase {
 class PanierControllerOtherUserSecurityTest extends PanierControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		Class_PanierNotice::newInstanceWithId(39, 
+		Class_PanierNotice::newInstanceWithId(39,
 																					['libelle' => 'panier Markus',
 																					 'user' => Class_Users::newInstanceWithId(98, ['nom' => 'Markus']),
 																					 'date_maj' => '19/01/2013']);
@@ -521,13 +561,13 @@ class PanierControllerAjoutNoticeBlackSadToUndefinedPanierTest extends PanierCon
 
 	/** @test */
 	public function idUserShouldBe23() {
-		$this->assertEquals(23, $this->_new_panier->getIdUser()); 
+		$this->assertEquals(23, $this->_new_panier->getIdUser());
 	}
 
 
 	/** @test */
 	public function idPanierShouldBe088888() {
-		$this->assertEquals('088888', $this->_new_panier->getIdabon()); 
+		$this->assertEquals('088888', $this->_new_panier->getIdabon());
 	}
 
 
@@ -611,7 +651,7 @@ class PanierControllerAjoutUnknownNoticeToPanierMesRomansTest extends PanierCont
 class PanierControllerAjoutNoticeBlackSadToPanierDomaineHistoireTest extends PanierControllerTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);		
+		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 		$this->dispatch('/panier/panierajouternotice/id_panier/38/id_notice/12', true);
 	}
 
@@ -635,7 +675,7 @@ class PanierControllerModifierTitrePanierMesRomansToMesLivresTest extends Panier
 	public function setUp() {
 		parent::setUp();
 
-		$this->postDispatch('/panier/majtitrepanier/id_panier/15', 
+		$this->postDispatch('/panier/majtitrepanier/id_panier/15',
 												['new_libelle' => 'Mes livres'],
 												true);
 	}
@@ -668,7 +708,7 @@ class PanierControllerModifierCataloguePanierTest extends PanierControllerTestCa
 		$this->panier_romans->setCatalogues([]);
 		$this->panier_romans->save();
 
-		$this->postDispatch('/panier/majtitrepanier/id_panier/15', 
+		$this->postDispatch('/panier/majtitrepanier/id_panier/15',
 												['domaine_ids' => '97-199'],
 												true);
 	}
@@ -712,7 +752,7 @@ class PanierControllerModifierCataloguePanierWithoutDomainesTest extends PanierC
 		parent::setUp();
 
 		$this->panier_romans->setCatalogues([Class_Catalogue::find(97)]);
-		$this->postDispatch('/panier/edit/id_panier/15', 
+		$this->postDispatch('/panier/edit/id_panier/15',
 												['new_libelle' => 'Mes supers romans',
 												 'domaine_ids' => ''],
 												true);
@@ -777,7 +817,7 @@ class PanierControllerExportListeTest extends PanierControllerTestCase {
 
 	/** @test */
 	public function bodyShouldReturnListe() {
-		$this->assertContains('Montespan (Le)	Jean Teulテδゥ	Julliard', 
+		$this->assertContains('Montespan (Le)	Jean Teulテδゥ	Julliard',
 													$this->_response->getBody());
 	}
 
@@ -862,11 +902,11 @@ class PanierControllerAjoutAjaxLoggedManonWithoutPanierTest extends PanierContro
 		$this->assertXPath('//form[contains(@action,"panier/creer-panier-ajax")]',$this->_response->getBody());
 	}
 
-	
+
 	/** @test */
 	public function hiddenInputShouldContainsRedirectUrl() {
 		$this->assertXPath('//input[@type="hidden"][@name="redirect"][contains(@value, "/panier/ajout-ajax/id_notice/4")]');
-	}	
+	}
 }
 
 
@@ -883,7 +923,7 @@ class PanierControllerAjoutAjaxLoggedManonWithPanierTest extends PanierControlle
 		$this->dispatch('/panier/ajout-ajax/id_notice/4', true);
 	}
 
-	
+
 	/** @test **/
 	public function actionShouldBeHtml5Valid() {
 		$this->assertHTML5();
@@ -913,7 +953,7 @@ class PanierControllerAjoutAjaxLoggedManonWithPanierTest extends PanierControlle
 		$this->assertXPathContentContains('//strong','Terminator',$this->_response->getBody());
 	}
 
-	
+
 	/** @test **/
 	public function htmlShouldContainsLinkToCreerNouveauPanier() {
 		$this->assertXPath('//a[contains(@href,"panier/creer-panier-ajax/id_notice/4")]');
@@ -994,8 +1034,8 @@ class PanierControllerCreerPanierPostTest extends PanierControllerTestCase {
 								 ->setUser($this->manon)
 								 ->setLibelle('Par ici les bons livres')
 								 ->setIdPanier(1)));
-		
-		
+
+
 		$this->postDispatch('/panier/creer-panier',
 												['titre'=>'Par ici les bons livres']);
 	}
@@ -1044,7 +1084,7 @@ class PanierControllerCreationPanierSuccessTest extends PanierControllerTestCase
 
 
 class PanierControllerPostSelectPanierCourantTest extends PanierControllerTestCase {
-	
+
 	protected $panierBD;
 
 	public function setup() {
@@ -1052,9 +1092,9 @@ class PanierControllerPostSelectPanierCourantTest extends PanierControllerTestCa
 
 		Class_Users::beVolatile();
 		Class_PanierNotice::beVolatile();
-		
+
 		ZendAfi_Auth::getInstance()->logUser($this->manon);
-		
+
 		$_SERVER['HTTP_REFERER'] = '/index';
 
 		$this->panierBD = Class_PanierNotice::newInstanceWIthId(2, ['libelle' => 'Les meilleures BD']);
@@ -1064,7 +1104,7 @@ class PanierControllerPostSelectPanierCourantTest extends PanierControllerTestCa
 		$this->postDispatch('/panier/select-panier-courant', ['id_new_panier' => 2]);
 	}
 
-	
+
 	/** @test **/
 	public function panierCourantShouldBeLesMeilleuresBD() {
 		$this->assertSame($this->panierBD, $this->manon->getPanierCourant());
@@ -1075,13 +1115,13 @@ class PanierControllerPostSelectPanierCourantTest extends PanierControllerTestCa
 	public function postShouldRedirectToReferer() {
 		$this->assertRedirectTo('/index');
 	}
-	
+
 }
 
 
 
 class PanierControllerGetSelectPanierCourantWithIdPanierTest extends PanierControllerTestCase {
-	
+
 	protected $panierBD;
 
 
@@ -1100,7 +1140,7 @@ class PanierControllerGetSelectPanierCourantWithIdPanierTest extends PanierContr
 		$this->postDispatch('/panier/select-panier-courant/id_panier/2',[]);
 	}
 
-	
+
 	/** @test **/
 	public function panierCourantShouldNotContainsLesMeilleuresBD() {
 		$this->assertNotSame($this->panierBD, $this->manon->getPanierCourant());
@@ -1137,7 +1177,7 @@ class PanierControllerSupprimerNoticeBlacksadFromBDAndRedirectToRefererTest exte
 		$this->assertEquals('COMBAT ORDINAIRE', $this->panier_bd->getNotices());
 	}
 
-	
+
 	/** @test */
 	public function afterDeletePanierShouldHaveBeenSaved() {
 		$this->assertTrue(Class_PanierNotice::methodHasBeenCalled('save'));
@@ -1153,7 +1193,7 @@ class PanierControllerSupprimerNoticeBlacksadFromBDAndRedirectToRefererTest exte
 
 
 class PanierControllerAjouterNoticeDansBoitePanierTest extends AbstractControllerTestCase {
-	
+
 	public function setUp() {
 		parent::setUp();
 		Class_Users::beVolatile();
@@ -1161,26 +1201,26 @@ class PanierControllerAjouterNoticeDansBoitePanierTest extends AbstractControlle
 		Class_Notice::beVolatile();
 		Class_PanierNotice::beVolatile();
 		Class_PanierNoticeCatalogue::beVolatile();
-		$this->manon = Class_Users::newInstanceWithId(2377, ['pseudo' => 'ManonL', 
+		$this->manon = Class_Users::newInstanceWithId(2377, ['pseudo' => 'ManonL',
 																											 'nom' => 'Afond',
 																											 'login' => 'man',
 																											 'password' => '123']);
 
-		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);	
+		$this->manon->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 		$this->manon->save();
 
 		ZendAfi_Auth::getInstance()->logUser($this->manon);
-		$_SERVER['HTTP_REFERER'] = '/index'; 
+		$_SERVER['HTTP_REFERER'] = '/index';
 
 		$cfg_accueil = ['modules' => ['1' => ['division' => 1,
-																					'type_module' => 'PANIER', 
+																					'type_module' => 'PANIER',
 																					'preferences' => 	['titre' => 'Mon panier']]]];
 
 		$notice = Class_Notice::newInstanceWithId(4,
 																		['titre_principal' => 'Le Montespan',
 																		 'auteur_principal' => 'Jean Teulテゥ',
 																		 'clef_alpha' => 'MONTESPAN']);
-																	
+
 		$notice->save();
 		$this->postDispatch('/panier/ajout-ajax/id_notice/4',  ['id_panier' => '0']);
 
@@ -1205,17 +1245,17 @@ class PanierControllerAjoutAjaxSuccessTest extends PanierControllerSimpleLoggedU
 	public function setup() {
 		parent::setup();
 		$this->initNoticeBlackSad();
-		$panier =Class_PanierNotice::newInstanceWithId(39, 
+		$panier =Class_PanierNotice::newInstanceWithId(39,
 																					['libelle' => 'panier Markus',
 																					 'user' => Class_Users::newInstanceWithId(98, ['nom' => 'Markus']),
 																					 'date_maj' => '19/01/2013']);
 		$panier->save();
 
 		$this->_xpath = new Storm_Test_XPath();
-	
+
 	}
 
-	
+
 	/** @test **/
 	public function responseShouldContainsScriptBoitePanierReload() {
 		$this->dispatch('/panier/ajout-ajax-success/id_notice/12/id_panier/39',true);
@@ -1227,7 +1267,7 @@ class PanierControllerAjoutAjaxSuccessTest extends PanierControllerSimpleLoggedU
 	/** @test **/
 	public function reponseShouldExecuteReloadBoiteIdTwo() {
 		$cfg_accueil = ['modules' => ['2' => ['division' => 1,
-																					'type_module' => 'PANIER', 
+																					'type_module' => 'PANIER',
 																					'preferences' => 	['titre' => 'Mon panier']]]];
 
 		Class_Profil::getCurrentProfil()->setCfgAccueil($cfg_accueil);
@@ -1271,7 +1311,7 @@ class PanierControllerEditActionAsAbonneTest extends AbstractControllerTestCase
 		Class_Users::beVolatile();
 		Class_PanierNotice::beVolatile();
 
-		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL', 
+		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL',
 																											 'nom' => 'plou',
 																											 'login' => 'man',
 																											 'password' => '123']);
@@ -1284,7 +1324,7 @@ class PanierControllerEditActionAsAbonneTest extends AbstractControllerTestCase
 		$mes_livres->save();
 
 		ZendAfi_Auth::getInstance()->logUser($roger);
-		
+
 		$this->dispatch('/panier/edit/id_panier/465',true);
 	}
 
@@ -1313,7 +1353,7 @@ class PanierControllerEditActionAsAbonneTest extends AbstractControllerTestCase
 class PanierControllerEditActionAsAdminTest extends AbstractControllerTestCase {
 	public function setup() {
 		parent::setup();
-	  
+
 		Class_Users::beVolatile();
 		Class_PanierNotice::beVolatile();
 
@@ -1321,21 +1361,21 @@ class PanierControllerEditActionAsAdminTest extends AbstractControllerTestCase {
 			->whenCalled('findAllWithCatalogue')
 			->answers([]);
 
-		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL', 
+		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL',
 																								 'nom' => 'plou',
 																								 'login' => 'man',
 																								 'password' => '123']);
 
-		$roger->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);	
+		$roger->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
 		$roger->save();
-		
+
 		$mes_livres = Class_PanierNotice::newInstanceWithId(465,['libelle' => 'Mes Livres',
 																														 'date_maj' => '10/02/2011',
 																														 'user' => $roger]);
 		$mes_livres->save();
 
 		ZendAfi_Auth::getInstance()->logUser($roger);
-		
+
 		$this->dispatch('/panier/edit/id_panier/465');
 	}
 
@@ -1363,7 +1403,7 @@ class PanierControllerEditActionAsAdminTest extends AbstractControllerTestCase {
 class PanierControllerEditActionAsContributeurWithOutRightForAccessDomaineTest extends AbstractControllerTestCase {
 	public function setup() {
 		parent::setup();
-	  
+
 		Class_Users::beVolatile();
 		Class_PanierNotice::beVolatile();
 		Class_UserGroup::beVolatile();
@@ -1372,22 +1412,22 @@ class PanierControllerEditActionAsContributeurWithOutRightForAccessDomaineTest e
 			->whenCalled('findAllWithCatalogue')
 			->answers([]);
 
-		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL', 
+		$roger = Class_Users::newInstanceWithId(23, ['pseudo' => 'RogerL',
 																								 'nom' => 'plou',
 																								 'login' => 'man',
 																								 'password' => '123']);
 
-		$roger->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_BIB);	
+		$roger->changeRoleTo(ZendAfi_Acl_AdminControllerRoles::MODO_BIB);
 		$roger->setUserGroups([]);
 		$roger->save();
-		
+
 		$mes_livres = Class_PanierNotice::newInstanceWithId(465,['libelle' => 'Mes Livres',
 																														 'date_maj' => '10/02/2011',
 																														 'user' => $roger]);
 		$mes_livres->save();
 
 		ZendAfi_Auth::getInstance()->logUser($roger);
-		
+
 		$this->dispatch('/panier/edit/id_panier/465');
 	}
 
@@ -1418,7 +1458,7 @@ class PanierControllerCreerPanierAjaxActionTest extends AbstractControllerTestCa
 		$this->dispatch('panier/creer-panier-ajax/id_notice/4',true);
 	}
 
-	
+
 	/** @test **/
 	public function creerPanierAjaxShouldContainsInputNewLibelle() {
 		$this->assertXPath('//input[@name="new_libelle"]');
@@ -1445,8 +1485,8 @@ class PanierControllerCreerPanierAjaxPostActionTest extends AbstractControllerTe
 		$this->postDispatch('panier/creer-panier-ajax',['new_libelle'=>'Mes livres']);
 		$this->assertEquals('Mes livres',Class_Users::getIdentity()->getPanierCourant()->getLibelle());
 	}
-	
-	
+
+
 	/** @test **/
 	public function postMesLivreCreerPanierAjaxDomainesShoulContainsDomaines() {
 
@@ -1543,16 +1583,16 @@ class PanierControllerChangePanierAjaxPostRenderPopupTest extends PanierControll
 
 	/** @test */
 	public function responseShouldBeARedirectWithJavascript() {
-		$this->_xpath->assertXPathContentContains($this->_json->content, 
-																							'//script', 
+		$this->_xpath->assertXPathContentContains($this->_json->content,
+																							'//script',
 																							'window.location="opac/index"');
 	}
 
 
 	/** @test */
 	public function responseShouldContainsVeuillezPatienter() {
-		$this->_xpath->assertXPathContentContains($this->_json->content, 
-																							'//p', 
+		$this->_xpath->assertXPathContentContains($this->_json->content,
+																							'//p',
 																							'Veuillez patienter');
 	}
 
@@ -1562,5 +1602,5 @@ class PanierControllerChangePanierAjaxPostRenderPopupTest extends PanierControll
 	}
 
 }
-	
+
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
index 02713bb5f0dd75247153cc61204f3b4d6114f8d3..c7bbd9a59da1871cb40e7255dbeddd90bd8b43b6 100644
--- a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
+++ b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
@@ -1956,6 +1956,8 @@ abstract class ProfilOptionsControllerProfilBoiteCalendarWithFilterTestCase exte
 			'events_only' => true,
 			'event_date' => '2050-03',
 			'id_bib' => 0,
+      'id_lieu' => '',
+      'custom_fields' => [],
 			'published' => true,
 			'event_end_after' => '2050-03-01'])
 			->answers([$article_mars])
@@ -1965,6 +1967,8 @@ abstract class ProfilOptionsControllerProfilBoiteCalendarWithFilterTestCase exte
 			'events_only' => true,
 			'event_date' => '2050-03',
 			'id_bib' => 0,
+      'id_lieu' => '',
+      'custom_fields' => [],
 			'published' => true])
 			->answers([$article_mars])
 
@@ -1974,6 +1978,8 @@ abstract class ProfilOptionsControllerProfilBoiteCalendarWithFilterTestCase exte
 			'events_only' => true,
 			'event_date' => '',
 			'id_bib' => 0,
+      'id_lieu' => '',
+      'custom_fields' => [],
 			'published' => true,
 			'event_start_after' => '2050-03',
 			'event_end_after' => '',
@@ -2051,4 +2057,41 @@ class ProfilOptionsControllerProfilBoiteCalendarWithNoFilterTest extends ProfilO
 		$this->assertXPath('//article//header//a[contains(text(), "News from October")]');
 	}
 }
+
+
+
+class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUseAjaxLink extends ProfilOptionsControllerProfilBoiteCalendarWithFilterTestCase {
+
+	public function setUp() {
+		parent::setUp();
+
+		$cfg_accueil = ['modules' => ['45' => ['division' => '1',
+																					 'type_module' => 'CALENDAR',
+																					 'preferences' => ['display_calendar' => '1',
+																														 'mode-affichage' => 'simple',
+																														 'display_event_info' => 'bib',
+																														 'display_full_page' => 0]]]];
+
+		$this->profil_with_calendar = Class_Profil::getCurrentProfil()
+			->setBrowser('opac')
+			->setTitreSite('Test Calendar')
+			->setLibelle('Profil Portail')
+			->setCfgAccueil($cfg_accueil);
+
+		$this->dispatch('/opac');
+
+	}
+
+
+	/** @test */
+	public function calendarTtleMonthClickableShouldBeAjax() {
+		$this->assertXPathCount(3, '//tr[@class="calendar_title_month"]//a[contains(@href, "render/ajax")]');
+	}
+
+
+	/** @test */
+	public function articleViewByDateShouldNotBePresent() {
+		$this->assertNotXPath('//table[@class="calendar_main"]//a[contains(@href, "articleviewbydate")]');
+	}
+}
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/opac/controllers/RechercheControllerTest.php b/tests/application/modules/opac/controllers/RechercheControllerTest.php
index f60e03c5f71300a94c35af62ef464e78a3b82109..444d201894502f18afbec75994147b6ec497a886 100644
--- a/tests/application/modules/opac/controllers/RechercheControllerTest.php
+++ b/tests/application/modules/opac/controllers/RechercheControllerTest.php
@@ -125,7 +125,7 @@ class RechercheControllerPagerTest extends RechercheControllerNoticeTestCase {
 		$notice = $this->fixture('Class_Notice', ['id' => 34, 'clef_oeuvre' => '']);
 		$this->onLoaderOfModel('Class_Notice')
 				 ->whenCalled('findAllByRequeteRecherche')
-				 ->with("Select id_notice,MATCH(alpha_titre) AGAINST(' POMME') as rel1, MATCH(alpha_auteur) AGAINST(' POMME') as rel2 from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE) order by (rel1 * 1.5)+(rel2) desc",
+				 ->with("Select id_notice, MATCH(alpha_titre) AGAINST(' POMME') as rel1, MATCH(alpha_auteur) AGAINST(' POMME') as rel2 from notices Where MATCH(titres, auteurs, editeur, collection, matieres, dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE) order by (rel1 * 1.5) + (rel2) desc",
 								10, 1)
 				 ->answers([$notice])
 
@@ -134,13 +134,14 @@ class RechercheControllerPagerTest extends RechercheControllerNoticeTestCase {
 
 		$mock_sql = $this->mock()
 										 ->whenCalled('fetchOne')
-										 ->with("Select count(*) from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE)")
+										 ->with("Select count(*) from notices Where MATCH(titres, auteurs, editeur, collection, matieres, dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE)")
 										 ->answers(45)
 
 										 ->whenCalled('fetchAll')
-										 ->with("Select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE) limit 15000")
+										 ->with("Select id_notice, type_doc, facettes from notices Where MATCH(titres, auteurs, editeur, collection, matieres, dewey) AGAINST('+(POMME POMMES POM)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+T3' IN BOOLEAN MODE) limit 15000")
 										 ->answers([])
-			;
+
+										 ->beStrict();
 
 		Zend_Registry::set('sql', $mock_sql);
 
@@ -419,10 +420,19 @@ abstract class RechercheControllerViewNoticeTestCase extends RechercheController
 
 
 
+
 class RechercheControllerViewNoticeClefAlphaTest extends RechercheControllerViewNoticeTestCase {
 	public function setUp() {
 		parent::setUp();
 
+		$mock_sql = $this->mock()
+										 ->whenCalled('execute')->answers('')
+										 ->whenCalled('fetchOne')->answers(null)
+										 ->whenCalled('fetchOne')
+										 ->with("Select count(*) from notices Where MATCH(titres, auteurs, editeur, collection, matieres, dewey) AGAINST('+(MILLENIUM MILLENIUMS MILENIUM)' IN BOOLEAN MODE)")
+										 ->answers(7);
+		Zend_Registry::set('sql', $mock_sql);
+
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
 			->whenCalled('findAllBy')
 			->with(['clef_alpha' => 'TESTINGALPHAKEY---101'])
@@ -648,6 +658,18 @@ class RechercheControllerSimpleActionWithDefaultConfigTest extends RechercheCont
 		$this->assertXPath('//select[@name="tri"]//option[@value="alpha_auteur"][@selected="selected"]');
 
 	}
+
+
+	/** @test */
+	public function facetteWidgetTitleShouldBeAsExpected() {
+		$this->assertXPathContentContains('//div[@class="facette_outer"]/h2', 'Affiner le résultat...');
+	}
+
+
+	/** @test */
+	public function tagsCloudWidgetTitleShouldBeAsExpected() {
+		$this->assertXPathContentContains('//div[contains(@class,"nuage_outer")]/h2', 'Elargir la recherche...');
+	}
 }
 
 
@@ -1375,8 +1397,6 @@ class RechercheControllerGuideeWithFiltersSelectedTest extends RechercheControll
 
 
 class RechercheControllerWithPanierTest extends RechercheControllerNoticeTestCase {
-	protected $_original_sql;
-
 	public function setUp() {
 		parent::setUp();
 
@@ -1391,16 +1411,15 @@ class RechercheControllerWithPanierTest extends RechercheControllerNoticeTestCas
 			->setCfgModules(['recherche' => ['resultatsimple' => ['liste_nb_par_page' => 1]]]);
 
 
-		$this->_original_sql = Zend_Registry::get('sql');
 		$mock_sql = Storm_Test_ObjectWrapper::mock();
 		Zend_Registry::set('sql', $mock_sql);
 		$mock_sql
 			->whenCalled('fetchOne')
-			->with("Select count(*) from notices Where notices.clef_alpha in('COMBAT ORDINAIRE','BLACKSAD')")
+			->with("Select count(*) from notices Where notices.clef_alpha in('COMBAT ORDINAIRE', 'BLACKSAD')")
 			->answers(2)
 
 			->whenCalled('fetchAll')
-			->with("Select id_notice,type_doc,facettes from notices Where notices.clef_alpha in('COMBAT ORDINAIRE','BLACKSAD') limit 15000")
+			->with("Select id_notice, type_doc, facettes from notices Where notices.clef_alpha in('COMBAT ORDINAIRE', 'BLACKSAD') limit 15000")
 			->answers([
 								 ['id_notice' => 1,
 									'type_doc' => 1,
@@ -1419,11 +1438,6 @@ class RechercheControllerWithPanierTest extends RechercheControllerNoticeTestCas
 		$this->dispatch('/recherche/simple/id_panier/2/retour_panier/2', true);
 	}
 
-	public function tearDown() {
-		Zend_Registry::set('sql', $this->_original_sql);
-		parent::tearDown();
-	}
-
 
 	/** @test */
 	public function retourRechercheInitialeShouldLinkToPanierAbonne() {
diff --git a/tests/application/modules/opac/controllers/SitoControllerTest.php b/tests/application/modules/opac/controllers/SitoControllerTest.php
index 4f3239e8da56b55b002b0ffce5a91ce590981d8d..37c819e79bddfee0f8b804ba61d38fb5c3fd3092 100644
--- a/tests/application/modules/opac/controllers/SitoControllerTest.php
+++ b/tests/application/modules/opac/controllers/SitoControllerTest.php
@@ -136,4 +136,18 @@ class SitoControllerSitoViewIdTest extends SitoControllerTestCase {
 	}
 }
 
+
+
+class SitoControllerSitoWebThumbnailUrl extends SitoControllerTestCase {
+	public function setup() {
+		parent::setUp();
+
+		 $this->dispatch('/sito/webthumbnail?url=http://linuxfr.org');
+	}
+
+
+	/** @test */	public function siteLinuxThumbnailUrlShouldBelinuxfrOrgDotJpg() {
+		$this->assertRedirectTo(BASE_URL.'/userfiles/web_thumbnails/linuxfr_org.jpg');
+	}
+}
 ?>
diff --git a/tests/application/modules/telephone/controllers/AuthControllerTest.php b/tests/application/modules/telephone/controllers/AuthControllerTest.php
index e0a3d5ceba0a1ad5310bbbdc237b71ebb9e2adff..ffb0e68113d88e976d86dac90e1ffb98a64b9f30 100644
--- a/tests/application/modules/telephone/controllers/AuthControllerTest.php
+++ b/tests/application/modules/telephone/controllers/AuthControllerTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'TelephoneAbstractControllerTestCase.php';
 
@@ -64,12 +64,9 @@ class AuthControllerTelephoneBoiteLoginTest extends AuthControllerTelephoneWitho
 class AuthControllerTelephoneLoginTest extends AuthControllerTelephoneWithoutCommSIGBTestCase {
 	public function setUp() {
 		parent::setUp();
-		Class_Profil::getCurrentProfil()
-			->setCfgAccueil(array());
+		Class_Profil::getCurrentProfil()->setCfgAccueil([]);
 
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
-			->whenCalled('hasIdentity')
-			->answers(false);
+		ZendAfi_Auth::getInstance()->clearIdentity();
 
 		$this->dispatch('auth/login', true);
 	}
@@ -77,7 +74,7 @@ class AuthControllerTelephoneLoginTest extends AuthControllerTelephoneWithoutCom
 
 	/** @test */
 	public function pageShouldContainsLoginInput() {
-		$this->assertXPath('//form//input[@name="username"]');
+		$this->assertXPath('//form//input[@name="username"]', $this->_response->getBody());
 	}
 
 
@@ -92,7 +89,7 @@ class AuthControllerTelephoneLoginTest extends AuthControllerTelephoneWithoutCom
 class AuthControllerTelephoneLoginReservationTest extends AuthControllerTelephoneWithoutCommSIGBTestCase {
 	public function setUp() {
 		parent::setUp();
-		
+
 		$this->fixture('Class_Profil', [
 										 'id' => 1,
 										 'cfg_accueil' => [
@@ -107,7 +104,7 @@ class AuthControllerTelephoneLoginReservationTest extends AuthControllerTelephon
 																 'type_module' => 'LOGIN',
 																 'preferences' => ['identifiant_exemple' => 'identity',
 																									 'mot_de_passe_exemple' => 'password']]]]]);
-		
+
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Users')
 			->whenCalled('hasIdentity')
 			->answers(false);
@@ -133,7 +130,7 @@ class AuthControllerTelephoneLoginReservationTest extends AuthControllerTelephon
 		$this->assertXPath('//form//input[@placeholder="identity"]',$this->_response->getBody());
 	}
 
-	
+
 	/** @test */
 	public function pageShouldContainsPlaceHollderPasswordIdentity() {
 		$this->assertXPath('//form//input[@placeholder="password"]', $this->_response->getBody());
diff --git a/tests/application/modules/telephone/controllers/CasServerControllerTest.php b/tests/application/modules/telephone/controllers/CasServerControllerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b0ce0404d8839fdc41f2fb2df9fbe46fafe5e89
--- /dev/null
+++ b/tests/application/modules/telephone/controllers/CasServerControllerTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright (c) 2012, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * AFI-OPAC 2.0 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * AFI-OPAC 2.0 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * along with AFI-OPAC 2.0; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
+ */
+require_once 'TelephoneAbstractControllerTestCase.php';
+
+
+class Telephone_CasServerControllerLoggedTest extends TelephoneAbstractControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+		$user = new StdClass();
+		$user->ID_USER=300;
+		Class_Users::newInstanceWithId(300,
+		                               ['login' => '87364',
+																	  'pseudo' => 'georges']);
+		Zend_Registry::get('cache')->save('300',
+																			md5(Zend_Session::getId().'300'));
+
+	}
+
+	/** @test */
+	public function requestWithValidTicketResponseShouldContainsValidXML() {
+		$this->dispatch('/telephone/cas-server/validate?ticket='.md5(Zend_Session::getId().'300').'&service=http://test.com', true);
+		$this->assertContains('<cas:user>300</cas:user>', $this->_response->getBody());
+	}
+
+
+	/** @test */
+	public function requestOnV10WithValidTicketResponseShouldContainsGeorges87364() {
+		$this->dispatch('/telephone/cas-server-v10/validate?ticket='.md5(Zend_Session::getId().'300').'&service=http://test.com', true);
+		$this->assertContains('georges|87364', $this->_response->getBody());
+	}
+
+
+	/** @test */
+	public function loginOnCasOneZeroShouldRedirectToServiceWithTicket() {
+		$this->dispatch('/telephone/cas-server-v10/login?service=http://test.com', true);
+		$this->assertRedirectTo(
+			'http://test.com?ticket='.(new Class_CasTicket())->getTicketForCurrentUser(),
+			$this->getResponseLocation());
+	}
+}
+
+
+
+class Telephone_CasServerControllerNotLoggedTest extends TelephoneAbstractControllerTestCase {
+	public function setUp() {
+		parent::setUp();
+		ZendAfi_Auth::getInstance()->clearIdentity();
+	}
+
+
+	/** @test */
+	public function pageAuthLoginWithServiceShouldIncludeHiddenService() {
+		$this->dispatch('/telephone/auth/login?service=http://monurlservice',true);
+		$this->assertXPath('//input[@name="service"][@type="hidden"][@value="http://monurlservice"]',$this->_response->getBody());
+	}
+}
+
+?>
diff --git a/tests/bootstrap_frontcontroller.php b/tests/bootstrap_frontcontroller.php
index d4eb60250a4f6427dc8f022767ac7f391c1c8357..4846a3aa3fce0fe63e619cbe6cb9683ecb068831 100644
--- a/tests/bootstrap_frontcontroller.php
+++ b/tests/bootstrap_frontcontroller.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 /* Regénère un nouveau front controller pour chaque test,
@@ -37,7 +37,8 @@ $controller = Zend_Controller_Front::getInstance()
 	->registerPlugin(new ZendAfi_Controller_Plugin_SelectionBib())
 	->registerPlugin(new ZendAfi_Controller_Plugin_System())
 	->registerPlugin(new ZendAfi_Controller_Plugin_TogetherJS())
-	->registerPlugin(new ZendAfi_Controller_Plugin_CustomFields());
+	->registerPlugin(new ZendAfi_Controller_Plugin_CustomFields())
+	->registerPlugin(new ZendAfi_Controller_Plugin_Lectura());
 
 $_SESSION["selection_bib"]=array("message" => 'selection bib sucks',
 																 "nb_notices" => 12345,
diff --git a/tests/js/SliderNavigationTest.php b/tests/js/SliderNavigationTest.php
index 7925d26ac752d119186dca0f5a23a4aa3beea337..a4962092c7897c9ca514a016eeac42fcd9009f6c 100644
--- a/tests/js/SliderNavigationTest.php
+++ b/tests/js/SliderNavigationTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
@@ -28,10 +28,18 @@ class SliderNavigationTest extends PHPUnit_Framework_TestCase {
 		$this->assertEquals(0, $result, implode("\n", $output));
 	}
 
+
   /** @test */
 	public function agendaSliderJStestShouldSuccess() {
 		exec('phantomjs ' . ROOT_PATH . 'tests_js/lib/qunit-phantomjs-runner/runner.js ' . ROOT_PATH . 'public/opac/java/slider_navigation/tests/agenda_slider.html', $output, $result);
 		$this->assertEquals(0, $result, implode("\n", $output));
 	}
+
+
+	/** @test */
+	public function sliderWithPreviewJSTestShouldSucced() {
+		exec('phantomjs ' . ROOT_PATH . 'tests_js/lib/qunit-phantomjs-runner/runner.js ' . ROOT_PATH . 'public/opac/java/slider_navigation/tests/preview_slider.html', $output, $result);
+		$this->assertEquals(0, $result, implode("\n", $output));
+	}
 }
 ?>
\ No newline at end of file
diff --git a/tests/library/Class/AlbumCategorieTest.php b/tests/library/Class/AlbumCategorieTest.php
index 0c4a487bad5801daa3b162e1ccf07eb9c22b77b0..57d2b16a0a5728fb4b98a999a8db597f9e8302e0 100644
--- a/tests/library/Class/AlbumCategorieTest.php
+++ b/tests/library/Class/AlbumCategorieTest.php
@@ -16,46 +16,46 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class AlbumCategorieRootTest extends ModelTestCase {
 	public function setUp() {
-		$this->root = new Class_AlbumCategorie;
-		$this->root
-			->setId(0)
-			->setLibelle('ROOT')
-			->setSousCategories(array());
-			
-		$this->cat_jeunesse = Class_AlbumCategorie::getLoader()
-			->newInstanceWithId(23)
-			->setLibelle('Jeunesse')
-			->setSousCategories(array())
-			->setParentCategorie($this->root);
 
-		$this->root->addSousCategorie($this->cat_jeunesse);
+		$this->cat_jeunesse = $this->fixture('Class_AlbumCategorie',
+																				 ['id' => 23,
+																					'libelle' => 'Jeunesse',
+																					'sous_categories' => []]);
+
+		$this->album_tintin = $this->fixture('Class_Album',
+																				 ['id' => 5,
+																					'titre' => 'Tintin',
+																					'categorie' => $this->cat_jeunesse]);
+
+		$this->album_lagaffe = $this->fixture('Class_Album',
+																					['id' => 9,
+																					 'titre' => 'Gaston Lagaffe',
+																					 'categorie' => $this->cat_jeunesse]);
 
-		$this->album_tintin = Class_Album::getLoader()
-			->newInstanceWithId(5)
-			->setLibelle('Tintin')
-			->setCategorie($this->cat_jeunesse);
+		Class_AlbumCategorie::clearCache();
+		Class_Album::clearCache();
+		$this->cat_jeunesse = Class_AlbumCategorie::find(23);
 
-		$this->album_lagaffe = Class_Album::getLoader()
-			->newInstanceWithId(9)
-			->setLibelle('Gaston Lagaffe')
-			->setCategorie($this->cat_jeunesse);
 
-		$this->cat_jeunesse
-			->setAlbums(array($this->album_tintin,
-												$this->album_lagaffe));
+		$this->root = $this->fixture('Class_AlbumCategorie',
+																 ['id' => 0,
+																	'libelle' => 'ROOT']);
+		$this->root->addSousCategorie($this->cat_jeunesse);
+		$this->cat_jeunesse->setParentCategorie($this->root);
 	}
 
 
+
 	/** @test */
 	public function shouldNotHaveParentCategory() {
 		$this->assertFalse($this->root->hasParentCategorie());
 	}
-	
+
 
 	/** @test */
 	public function libelleShouldBeRoot() {
@@ -65,33 +65,37 @@ class AlbumCategorieRootTest extends ModelTestCase {
 
 	/** @test */
 	public function getSousCategoriesShouldReturnAnArrayWithAlbumJeunesse() {
-		$this->assertEquals(array($this->cat_jeunesse), $this->root->getSousCategories());
+		$this->assertEquals(['Jeunesse'],
+												array_map(function($c) {return $c->getLibelle();},
+																	$this->root->getSousCategories()));
 	}
 
 	/** @test */
   public function catJeunesseGetAlbumsShouldReturnLagaffeAndTintin() {
-		$this->assertEquals(array($this->album_tintin, $this->album_lagaffe),
-												$this->cat_jeunesse->getAlbums());
+		$this->assertEquals(['Gaston Lagaffe', 'Tintin'],
+												array_map(function($a) {return $a->getTitre();},
+																	$this->cat_jeunesse->getAlbums()));
 	}
 
 
 	/** @test */
   public function albumTintinCategorieShouldBeCatJeunesse() {
-		$this->assertEquals($this->cat_jeunesse->getId(), 
+		$this->assertEquals($this->cat_jeunesse->getId(),
 												$this->album_tintin->getCategorie()->getId());
 	}
 
 
 	/** @test */
 	public function albumTintinHierarchyShouldIncludeCatJeunesseAndRoot() {
-		$this->assertEquals(array($this->cat_jeunesse, $this->root), 
-												$this->album_tintin->getHierarchy());
+		$this->assertEquals(['Jeunesse', 'ROOT'],
+												array_map(function($c) {return $c->getLibelle();},
+																	Class_Album::find(5)->getHierarchy()));
 	}
 
 
 	/** @test */
 	public function catJeunesseHierarchyShouldIncludeRoot() {
-		$this->assertEquals(array($this->root), 
+		$this->assertEquals(array($this->root),
 												$this->cat_jeunesse->getHierarchy());
 	}
 
diff --git a/tests/library/Class/AlbumRessourceTest.php b/tests/library/Class/AlbumRessourceTest.php
index 53a7cd7b1c8a61b98ef6c5b8ebfe4825c67fb616..acb6969326a3d968ea5d0f34673f2b3650907429 100644
--- a/tests/library/Class/AlbumRessourceTest.php
+++ b/tests/library/Class/AlbumRessourceTest.php
@@ -16,37 +16,22 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 abstract class AlbumRessourceFileUploadTestCase extends ModelTestCase {
 	/** @var Class_AlbumRessource */
 	protected $_resource;
 
-	/** @var Storm_Test_ObjectWrapper */
-	protected $_wrapper;
-
-	/** @var PHPUnit_Framework_MockObject_MockObject */
-	protected $_handler;
-
 
 	protected function setUp() {
 		parent::setUp();
 
-		$this->_resource = Class_AlbumRessource::getLoader()
-												->newInstance()
-												->setAlbum(
-													Class_Album::getLoader()
-														->newInstanceWithId(999)
-														->setTitre('Harlock')
-												);
-
-		$this->_wrapper = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_AlbumRessource')
-												->whenCalled('save')->answers(true)->getWrapper()
-												->whenCalled('delete')->answers(null)->getWrapper();
-
-		$this->_handler = $this->getMockBuilder('Class_MultiUpload')
-											->disableOriginalConstructor()
-											->getMock();;
+		$this->_resource = $this
+			->fixture('Class_AlbumRessource',
+								['id' => 1,
+								 'album' => $this->fixture('Class_Album',
+																					 ['id' => 999,
+																						'titre' => 'Harlock'])]);
 	}
 }
 
@@ -54,66 +39,56 @@ abstract class AlbumRessourceFileUploadTestCase extends ModelTestCase {
 
 
 class AlbumRessourceInitializationTest extends AlbumRessourceFileUploadTestCase {
-	/** @test */
 	public function initializeShouldSaveInstance() {
-		$this->_handler->expects($this->any())
-									->method('getError')
-									->will($this->returnValue(null));
+		$handler = $this->mock()
+										->whenCalled('getError')->answers(null)
+										->whenCalled('handleUpload')->answers(true);
 
-		$this->_handler->expects($this->any())
-									->method('handleUpload')
-									->will($this->returnValue(true));
+		$wrapper = $this->onLoaderOfModel('Class_AlbumRessource');
 
-		$this->_resource->setMultiUploadHandler($this->_handler)
+		$this->_resource->setMultiUploadHandler($handler)
 										->initializeWith(null);
 
-		$this->assertTrue($this->_wrapper->methodHasBeenCalled('save'));
+		$this->assertTrue($wrapper->methodHasBeenCalled('save'));
 	}
 
 
 	/** @test */
 	public function whenHandlerHasErrorShouldReturnErrorArray() {
-		$this->_handler->expects($this->any())
-										->method('getError')
-										->will($this->returnValue('Error message'));
-
-		$this->assertEquals(
-			array(
-				'success' => 'false',
-				'error' => 'Error message'
-			),
-			$this->_resource->setMultiUploadHandler($this->_handler)
-												->initializeWith(null)
-		);
+		$handler = $this->mock()
+										->whenCalled('getError')->answers('Error message')
+										->whenCalled('handleUpload')->answers(false);
+
+		$result = $this->_resource->setMultiUploadHandler($handler)
+															->initializeWith(null);
+
+		$this->assertEquals(['success' => 'false', 'error' => 'Error message'],
+												$result);
 	}
 
 
 	/** @test */
 	public function whenHandlerHasErrorShouldCallDelete() {
-		$this->_handler->expects($this->any())
-										->method('getError')
-										->will($this->returnValue('Error message'));
+		$handler = $this->mock()
+										->whenCalled('getError')->answers('Error message')
+										->whenCalled('handleUpload')->answers(false);
 
-		$this->_resource->setMultiUploadHandler($this->_handler)
-										->initializeWith(null);
+		$result = $this->_resource->setMultiUploadHandler($handler)
+															->initializeWith(null);
 
-		$this->assertTrue($this->_wrapper->methodHasBeenCalled('delete'));
+		$this->assertNull(Class_AlbumRessource::find(1));
 	}
 
 
 	/** @test */
 	public function whenHandlerHasNoErrorShouldReturnSuccessArray() {
-		$this->_handler->expects($this->any())
-									->method('getError')
-									->will($this->returnValue(null));
+		$handler = $this->mock()
+										->whenCalled('getError')->answers(null)
+										->whenCalled('handleUpload')->answers(true)
+										->whenCalled('getSavedFileName')->answers('toto.jpg');
 
-		$this->_handler->expects($this->any())
-									->method('handleUpload')
-									->will($this->returnValue(true));
-
-		$this->assertEquals(
-			array('success' => 'true'),
-			$this->_resource->setMultiUploadHandler($this->_handler)
+		$this->assertEquals(['success' => 'true'],
+												$this->_resource->setMultiUploadHandler($handler)
 												->initializeWith(null)
 		);
 	}
@@ -130,7 +105,8 @@ class AlbumRessourceInitializationTest extends AlbumRessourceFileUploadTestCase
 
 	/** @test */
 	public function defaultTilesGeneratorShouldBeAnInstanceOfAlbumRessourceLeafletTilesGenerator() {
-		$this->assertInstanceOf('Class_AlbumRessource_LeafletTilesGenerator', $this->_resource->getTilesGenerator());
+		$this->assertInstanceOf('Class_AlbumRessource_LeafletTilesGenerator',
+														$this->_resource->getTilesGenerator());
 	}
 }
 
@@ -138,15 +114,6 @@ class AlbumRessourceInitializationTest extends AlbumRessourceFileUploadTestCase
 
 
 class AlbumRessourceReceivingFileTest extends AlbumRessourceFileUploadTestCase {
-	protected function setUp() {
-		parent::setUp();
-
-		$this->_handler = $this->getMockBuilder('Class_Upload')
-											->disableOriginalConstructor()
-											->getMock();;
-	}
-
-
 	/** @test */
 	public function withNoFileShouldReturnTrue() {
 		$_FILES['fichier']['size'] = 0;
@@ -157,17 +124,12 @@ class AlbumRessourceReceivingFileTest extends AlbumRessourceFileUploadTestCase {
 	/** @test */
 	public function withUploadErrorShouldReturnFalse() {
 		$_FILES['fichier']['size'] = 1;
-		$this->_handler
-			->expects($this->once())
-			->method('receive')
-			->will($this->returnValue(false));
+		$handler = $this->mock()
+										->whenCalled('receive')->answers(false)
+										->whenCalled('getError')->answers('');
+		$handler->whenCalled('resetError')->answers($handler);
 
-		$this->_handler
-			->expects($this->once())
-			->method('resetError')
-			->will($this->returnValue($this->_handler));
-
-		$this->assertFalse($this->_resource->setUploadHandlerFor($this->_handler, 'fichier')
+		$this->assertFalse($this->_resource->setUploadHandlerFor($handler, 'fichier')
 			                                 ->receiveFile());
 	}
 }
@@ -176,19 +138,14 @@ class AlbumRessourceReceivingFileTest extends AlbumRessourceFileUploadTestCase {
 
 
 class AlbumRessourceLoaderTest extends ModelTestCase {
-
-	protected function setUp() {
-		parent::setUp();
+	/** @test */
+	public function withHarlockGetNextOrderShouldFilterOnHarlock() {
 		$this->fixture('Class_AlbumRessource', ['id'=> 998,
 																						'id_album' => 999,
 																						'ordre' => 6]);
-	}
 
-
-	/** @test */
-	public function withHarlockGetNextOrderShouldFilterOnHarlock() {
-		$album=$this->fixture('Class_Album', ['id' => 999]);
-		$this->assertEquals(7,Class_AlbumRessource::getLoader()->getNextOrderFor($album));
+		$album = $this->fixture('Class_Album', ['id' => 999]);
+		$this->assertEquals(7,Class_AlbumRessource::getNextOrderFor($album));
 	}
 
 }
@@ -329,7 +286,7 @@ class AlbumRessourceTypeMOVTest extends ModelTestCase {
 	function isImageShouldReturnFalse() {
 		$this->assertFalse($this->resource->isImage());
 	}
-	
+
 
 	/** @test */
 	function isVideoShouldReturnTrue() {
@@ -359,7 +316,7 @@ abstract class AlbumRessourceThumbnailTestCase extends ModelTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		
+
 		$this->_ressource = Class_AlbumRessource::getLoader()
 			->newInstanceWithId(1)
 			->setFichier('1.jpg')
@@ -425,7 +382,7 @@ class AlbumRessourceThumbnailResizeHundredPerHundredTwentyTest extends AlbumRess
 		$im = $this->_buildTestImage();
 		$im->cropImage(47, 8, 2, 1);
 		$im->resizeImage(100, 120, Imagick::FILTER_LANCZOS, 1);
-		$this->assertEquals($im->getImageBlob(), 
+		$this->assertEquals($im->getImageBlob(),
 												$this->_ressource->getImage()->getImageBlob());
 	}
 
@@ -461,7 +418,7 @@ class AlbumRessourceThumbnailResizeNoParamTest extends AlbumRessourceThumbnailTe
 	/** @test */
 	public function imageShouldNotBeCropped() {
 		$im = $this->_buildTestImage();
-		$this->assertEquals($im->getImageBlob(), 
+		$this->assertEquals($im->getImageBlob(),
 												$this->_ressource->getImage()->getImageBlob());
 	}
 
@@ -477,7 +434,7 @@ class AlbumRessourceThumbnailResizeNoWidthButCropParamTest extends AlbumRessourc
 		$im = $this->_buildTestImage();
 		$im->cropImage(48, 10, 0, 0);
 		$im->resizeImage(100, 0, Imagick::FILTER_LANCZOS, 1);
-		$this->assertEquals($im->getImageBlob(), 
+		$this->assertEquals($im->getImageBlob(),
 												$this->_ressource->getImage()->getImageBlob());
 	}
 }
diff --git a/tests/library/Class/ArticleLoaderTest.php b/tests/library/Class/ArticleLoaderTest.php
index 33adb182eabfd3b4aa2ead928d28c9e2eca9b577..300a0d58e271f8a5bd2a3b69145f008e138c663e 100644
--- a/tests/library/Class/ArticleLoaderTest.php
+++ b/tests/library/Class/ArticleLoaderTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class ArticleLoaderGetArticlesByPreferencesTest extends ModelTestCase {
@@ -233,6 +233,31 @@ class ArticleLoaderGetArticlesByPreferencesTest extends ModelTestCase {
 	}
 
 
+
+	/** @test */
+	function withArticleAndPlaceSelectionSqlShouldIncludeIdLieu() {
+		$articles = $this->getArticles(array('display_order' => 'EventDebut',
+																				 'id_lieu' => '2',
+																				 'id_categorie' => '4',
+																				 'nb_aff' => 3));
+		$this->assertSelect(sprintf("WHERE %s AND (ID_LIEU=2) AND (`cms_article`.ID_CAT in (4)) ORDER BY FIELD(`cms_article`.ID_CAT, 4) ASC",
+																self::WHERE_VISIBLE_CLAUSE));
+	}
+
+
+
+	/** @test */
+	function withArticleAndCustomFieldValueSelectionSqlShouldFilterByCustomField() {
+		$articles = $this->getArticles(array('display_order' => 'EventDebut',
+																				 'custom_fields' => [5 => 'value1',
+																														 12 => 'value2'],
+																				 'id_categorie' => '4',
+																				 'nb_aff' => 3));
+		$expected = sprintf("INNER JOIN `custom_field_values` AS `cfv5` ON cms_article.ID_ARTICLE = cfv5.model_id AND cfv5.custom_field_id = 5 INNER JOIN `custom_field_values` AS `cfv12` ON cms_article.ID_ARTICLE = cfv12.model_id AND cfv12.custom_field_id = 12 WHERE %s AND (cfv5.value = 'value1') AND (cfv12.value = 'value2') AND (`cms_article`.ID_CAT in (4)) ORDER BY FIELD(`cms_article`.ID_CAT, 4) ASC", self::WHERE_VISIBLE_CLAUSE);
+		$this->assertSelect($expected);
+	}
+
+
 	/** @test */
 	public function withSelectionShouldBeOrderedByDateCreation() {
 		$articles = $this->getArticles(array('display_order' => 'DateCreationDesc',
diff --git a/tests/library/Class/CatalogueTest.php b/tests/library/Class/CatalogueTest.php
index 697ec42109093c174a50239f4968a03d887cea1b..a845f937f7913e016d6a288c588d9dfcca22d36f 100644
--- a/tests/library/Class/CatalogueTest.php
+++ b/tests/library/Class/CatalogueTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'ModelTestCase.php';
 
@@ -61,7 +61,7 @@ class CatalogueTestGetRequetesPanierWithIdUserAndIdPanier extends ModelTestCase
 
 
 	public function testRequeteFacettes() {
-		$this->assertEquals("select id_notice,type_doc,facettes from notices where notices.clef_alpha in('STARWARS','JAMESBOND')  and url_vignette > '' and url_vignette != 'NO' LIMIT 0,3",
+		$this->assertEquals("select id_notice, type_doc, facettes from notices where notices.clef_alpha in('STARWARS','JAMESBOND') and url_vignette > '' and url_vignette != 'NO' LIMIT 0,3",
 												$this->requetes['req_facettes']);
 	}
 }
@@ -70,9 +70,9 @@ class CatalogueTestGetRequetesPanierWithIdUserAndIdPanier extends ModelTestCase
 class CatalogueTestGetRequetesPanierWithIdUserAndIdPanierUsedForId extends Storm_Test_ModelTestCase {
 	public function setUp() {
 		parent::setUp();
-		
-		Class_PanierNotice::newInstanceWithId(3, ['id_user' => 3, 
-																							'id_panier' => 10, 
+
+		Class_PanierNotice::newInstanceWithId(3, ['id_user' => 3,
+																							'id_panier' => 10,
 																							'notices' => ';STARWARS;JAMESBOND']);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_PanierNotice')
@@ -203,28 +203,28 @@ class CatalogueTestGetSelectionFacette extends ModelTestCase {
 
 	/** @test */
 	public function withTypeAndValuesShouldReturnThemConcatened() {
-		$this->assertEquals(' +(A18 A78 A8 A3)', 
+		$this->assertEquals(' +(A18 A78 A8 A3)',
 												Class_Catalogue::getLoader()->getSelectionFacette('A', '18;78;8;3'));
 	}
 
 
 	/** @test */
 	public function withTypeAndValuesAndNoSigneShouldNotAddPlus() {
-		$this->assertEquals(' A18 A78 A8 A3', 
+		$this->assertEquals(' A18 A78 A8 A3',
 												Class_Catalogue::getLoader()->getSelectionFacette('A', '18;78;8;3', false, false));
 	}
 
 
 	/** @test */
 	public function withDescendantShouldAddWildCard() {
-		$this->assertEquals(' +(A18* A78* A8* A3*)', 
+		$this->assertEquals(' +(A18* A78* A8* A3*)',
 												Class_Catalogue::getLoader()->getSelectionFacette('A', '18;78;8;3', true));
 	}
 
 
 	/** @test */
 	public function withMatersShouldConcatenateThem() {
-		$this->assertEquals(' +(M18 M78 M8 M3)', 
+		$this->assertEquals(' +(M18 M78 M8 M3)',
 												Class_Catalogue::getLoader()->getSelectionFacette('M', '18;78;8;3'));
 	}
 
@@ -239,7 +239,7 @@ class CatalogueTestGetSelectionFacette extends ModelTestCase {
 			->with(array('where' => 'libelle LIKE \'Parc animalier : %\''))
 			->answers(array(Class_Matiere::getLoader()->newInstanceWithId(78)));
 
-		$this->assertEquals(' +(M18 M78)', 
+		$this->assertEquals(' +(M18 M78)',
 												Class_Catalogue::getLoader()->getSelectionFacette('M', '18', true));
 	}
 }
@@ -396,7 +396,7 @@ class CatalogueTestGetPagedNotices extends ModelTestCase {
 		Class_Catalogue::getLoader()->loadNoticesFor($this->_catalogue, 5, 3);
 	}
 
-	
+
 	/** @test */
 	public function withCatalogForAllShouldQueryOneEgalOne() {
 		$this->_expectNoticeFindAllBy('1=1');
@@ -435,26 +435,27 @@ class CatalogueTestGetRequetesWithFacettesAndNoCatalogue extends ModelTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		$this->_requetes = Class_Catalogue::getLoader()->getRequetes(array('id_catalogue' => 0,
-																										 'facettes' => 'T1, Y1'));
+		$this->_requetes = Class_Catalogue::getLoader()
+			->getRequetes(['id_catalogue' => 0,
+										 'facettes' => 'T1, Y1']);
 	}
 
 
 	/** @test */
 	public function requeteListeShouldEqualsSelectStarWhereFacettesFromNotices() {
-		$this->assertEquals('select * from notices  where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE) order by alpha_titre  LIMIT 5000', $this->_requetes['req_liste']);
+		$this->assertEquals('select * from notices where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE) order by alpha_titre  LIMIT 5000', $this->_requetes['req_liste']);
 	}
 
 
 	/** @test */
 	public function requeteComptageShouldBeSelectCount() {
-		$this->assertEquals('select count(*) from notices  where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE)', $this->_requetes['req_comptage']);
+		$this->assertEquals('select count(*) from notices where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE)', $this->_requetes['req_comptage']);
 	}
 
 
 	/** @test */
 	public function requeteFacettesShouldBeSelectIdNoticeTypeDocFacet() {
-		$this->assertEquals('select notices.id_notice, type_doc, facettes from notices  where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE) LIMIT 5000', $this->_requetes['req_facettes']);
+		$this->assertEquals('select notices.id_notice, type_doc, facettes from notices where MATCH(facettes) AGAINST(\' +(T1, Y1)\' IN BOOLEAN MODE) LIMIT 5000', $this->_requetes['req_facettes']);
 	}
 }
 
@@ -516,7 +517,7 @@ class CatalogueTestGetNoticesByPreferences extends ModelTestCase {
 
 		$this->mock_sql
 			->whenCalled('fetchAll')
-			->with("select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre from notices  order by alpha_titre  LIMIT 0,25",
+			->with("select notices.id_notice, notices.editeur, notices.annee, notices.date_creation, notices.date_maj, notices.facettes, notices.clef_oeuvre from notices order by alpha_titre  LIMIT 0,25",
 						 false)
 			->answers([['id_notice' => 23, 'editeur' => 'dargaud', 'annee' => 1975, 'date_creation' => '2011-02-23',
 					'date_maj' => '2011-02-25', 'facettes' => '', 'clef_oeuvre' => 'JEUNE FILLE'],])
@@ -580,7 +581,7 @@ class CatalogueTestGetNoticesByPreferences extends ModelTestCase {
 
 
 		/* this test will fail when Class_Catalogue::_default_attribute_values change */
-		$this->mock_cache 
+		$this->mock_cache
 			->whenCalled('load')
 			->with('ab95a4588a206a1b8f977d509d5cf8bc')
 			->answers(serialize(array('test')))
@@ -596,13 +597,13 @@ class CatalogueTestGetNoticesByPreferences extends ModelTestCase {
 	public function getNoticesWithCachePresentButUserAdminShouldCallThem() {
 		$account = new stdClass();
 		$account->username     = 'AutoTest' . time();
-		$account->password     = md5( 'password' );		
+		$account->password     = md5( 'password' );
 		$account->ID_USER      = 2;
 		$account->ROLE_LEVEL   = ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL;
 		$account->confirmed    = true;
 		$account->enabled      = true;
 		ZendAfi_Auth::getInstance()->getStorage()->write($account);
-		
+
 		Class_Users::getLoader()->newInstanceWithId($account->ID_USER)->setRoleLevel($account->ROLE_LEVEL);
 		$notices = Class_Catalogue::getLoader()->getNoticesByPreferences(array('id_catalogue' => 666,
 																																'aleatoire' => 1,
@@ -617,11 +618,11 @@ class CatalogueParentTest extends Storm_Test_ModelTestCase {
 	public function setUp() {
 		parent::setUp();
 		$this->_histoire = Class_Catalogue::newInstanceWithId(100, [ 'libelle' => 'Histoire',
-																																 'parent_id' => 0]);	
+																																 'parent_id' => 0]);
 		$this->_jeux = Class_Catalogue::newInstanceWithId(600, [ 'libelle' => 'Jeux>',
-																																 'parent_id' => 0]);	
+																																 'parent_id' => 0]);
 		$this->_politique = Class_Catalogue::newInstanceWithId(200, [ 'libelle' => 'Politique',
-																																'parent_id' => 100]);	
+																																'parent_id' => 100]);
 		$this->_moyenage = Class_Catalogue::newInstanceWithId(300, [ 'libelle'=>'Moyen-age',
 																															 'parent_id' => 100]);
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
@@ -651,8 +652,8 @@ class CatalogueParentTest extends Storm_Test_ModelTestCase {
 	public function politiqueShouldHaveHistoireAsDomaineParent() {
 		$this->assertEquals('Histoire', $this->_politique->getDomaineParent()->getLibelle());
 	}
-	
-	
+
+
   /** @test */
 	public function histoireShouldHaveSousDomainesPolitiqueEtMoyenAge() {
 		$this->assertEquals([ $this->_politique, $this->_moyenage],$this->_histoire->getSousDomaines());
@@ -705,7 +706,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 
 		$this->_politique = Class_Catalogue::newInstanceWithId(8, [ 'libelle' => 'Politique',
 																																'type_doc' => '1;4',
-																																'matiere' => '21859;21860']);	
+																																'matiere' => '21859;21860']);
 		$this->_dvd = Class_Matiere::newInstanceWithId(21859, [ 'libelle' => 'DVD']);
 
 		$this->_cd = Class_Matiere::newInstanceWithId(21860, [ 'libelle' => 'CD']);
@@ -725,7 +726,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 		->whenCalled('findAllBy')
 		->with(['id' => 21860])
 		->answers( $this->_cd)
-	
+
 		->whenCalled('findAllBy')
 		->with([ 'where' => "libelle LIKE 'DVD : %'"] )
 		->answers([ $this->_subdvd])
@@ -735,21 +736,21 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 		->answers([]);
 
 		$profil = Class_Profil::getLoader()->newInstanceWithId(26);
-		Class_Profil::setCurrentProfil($profil);	
+		Class_Profil::setCurrentProfil($profil);
 	}
 
 
 	/** @test */
 	public function politiqueShouldHaveCritereTypeDocAsFiltre() {
-		$this->assertEquals('T1;T4;-M21859;M888;M21860;', 
+		$this->assertEquals('T1;T4;-M21859;M888;M21860;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
-	
+
 
   /** @test */
 	public function politiqueShouldHaveCriterePcdm4AsFiltre() {
 		$this->_politique->setPcdm4('45;48');
-		$this->assertEquals('T1;T4;-M21859;M888;M21860;P45*;P48*;', 
+		$this->assertEquals('T1;T4;-M21859;M888;M21860;P45*;P48*;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
 
@@ -758,7 +759,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 	public function politiqueShouldHaveCritereDeweyAsFiltre() {
 		$this->_politique->setPcdm4('');
 		$this->_politique->setDewey('333;222');
-		$this->assertEquals('T1;T4;-M21859;M888;M21860;D333*;D222*;', 
+		$this->assertEquals('T1;T4;-M21859;M888;M21860;D333*;D222*;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
 
@@ -767,7 +768,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 	public function politiqueShouldHaveCritereAuteurAsFiltre() {
 		$this->_politique->setDewey('');
 		$this->_politique->setAuteur('321;234');
-		$this->assertEquals('T1;T4;-A321;A234;M21859;M888;M21860;', 
+		$this->assertEquals('T1;T4;-A321;A234;M21859;M888;M21860;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
 
@@ -778,7 +779,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 		$this->_politique->setAuteur('');
 		$this->_politique->setInteret('99;23');
 		$this->_politique->setTags('111');
-		$this->assertEquals('T1;T4;-Z111;F99;F23;M21859;M888;M21860;', 
+		$this->assertEquals('T1;T4;-Z111;F99;F23;M21859;M888;M21860;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
 
@@ -788,7 +789,7 @@ class CatalogueBuildCriteresRechercheTest extends Storm_Test_ModelTestCase {
 		$this->_politique->setCoteDebut('R233.48');
 		$this->_politique->setCoteFin('Z888.22');
 		$this->_politique->setTags('');
-		$this->assertEquals('T1;T4;-M21859;M888;M21860;', 
+		$this->assertEquals('T1;T4;-M21859;M888;M21860;',
 												$this->_politique->buildCriteresRecherche(['titre' => 'des nouveautés'])['filtres']);
 	}
 }
@@ -829,14 +830,14 @@ class CatalogueAddOrCreateTest extends CatalogueParentTest {
 		$this->assertEquals('YYYY0001', $this->_histoire->saveThesaurus()->getIdThesaurus());
 	}
 
-	
+
 	/** @test */
 	public function saveCataloguePolitiqueShouldCreateThesaurus() {
 		Class_CodifThesaurus::getLoader()
 			->whenCalled('findNextThesaurusChildId')
 			->with('YYYY0001')
 			->answers('YYYY00010001')
-			
+
 			->whenCalled('findThesaurusForCatalogue')
 			->with(200)
 			->answers(null)
@@ -854,7 +855,7 @@ class CatalogueAddOrCreateTest extends CatalogueParentTest {
 			->whenCalled('findNextThesaurusChildId')
 			->with('YYYY0001')
 			->answers('YYYY00010001')
-			
+
 			->whenCalled('findThesaurusForCatalogue')
 			->answers(null);
 		$this->assertEquals('YYYY00010001',$this->_moyenage->saveThesaurus()->getIdThesaurus());
@@ -867,7 +868,7 @@ class CatalogueAddOrCreateTest extends CatalogueParentTest {
 			->whenCalled('findNextThesaurusChildId')
 			->with('YYYY0001')
 			->answers('YYYY00010001')
-			
+
 			->whenCalled('findThesaurusForCatalogue')
 			->answers(null);
 		$this->_politique->setParentId($this->_moyenage->getId());
@@ -884,7 +885,7 @@ class CatalogueAddOrCreateTest extends CatalogueParentTest {
 
 			->whenCalled('deleteAllWithIdOrigineAndCode')
 			->answers(null)
-		
+
 			->whenCalled('findThesaurusForCatalogue')
 			->with(300)
 			->answers(Class_CodifThesaurus::newInstanceWithId(100)->setIdThesaurus('YYYYHIST0003'))
@@ -972,7 +973,7 @@ class CatalogueGetAllNoticesIdsForDomaineTest extends Storm_Test_ModelTestCase {
 	public function queryWithNb5Page10() {
 		$this->mock_sql
 			->whenCalled('fetchAll')
-			->with('select id_notice from notices  where MATCH(facettes) AGAINST(\' +(T1)\' IN BOOLEAN MODE) order by alpha_titre  limit 50,5')
+			->with('select id_notice from notices where MATCH(facettes) AGAINST(\' +(T1)\' IN BOOLEAN MODE) order by alpha_titre  limit 50,5')
 			->answers([ ['id_notice' => 23, 'titre' => 'POTTER'],
 									['id_notice' => 45, 'titre' => 'POTTER2'],
 									])
@@ -985,7 +986,7 @@ class CatalogueGetAllNoticesIdsForDomaineTest extends Storm_Test_ModelTestCase {
 	public function queryWithNb1Page2() {
 		$this->mock_sql
 			->whenCalled('fetchAll')
-			->with('select id_notice from notices  where MATCH(facettes) AGAINST(\' +(T1)\' IN BOOLEAN MODE) order by alpha_titre  limit 2,1')
+			->with('select id_notice from notices where MATCH(facettes) AGAINST(\' +(T1)\' IN BOOLEAN MODE) order by alpha_titre  limit 2,1')
 			->answers([])
 			->beStrict();
 		$this->assertEquals([], $this->_catalogue->getAllNoticeIdsForDomaine(1, 2));
diff --git a/tests/library/Class/ListesNoticesTest.php b/tests/library/Class/ListesNoticesTest.php
index ca29e3997f7a761ee1bb2a407419d2c0254383b4..0127a7871b56ce13567c2b274e72d007ae331c9b 100644
--- a/tests/library/Class/ListesNoticesTest.php
+++ b/tests/library/Class/ListesNoticesTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 class ListesNoticesTest extends Storm_Test_ModelTestCase {
@@ -24,30 +24,23 @@ class ListesNoticesTest extends Storm_Test_ModelTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		
-		$this->mock_cache = Storm_Test_ObjectWrapper::mock();
-		Storm_Cache::setDefaultZendCache($this->mock_cache);
-		$this->mock_cache
-			->whenCalled('load')->answers(false)
-			->whenCalled('save')->answers(true);		
-
-		$this->_original_sql = Zend_Registry::get('sql');
-		$this->_mock_sql = $this->mock();
-		Zend_Registry::set('sql', $this->_mock_sql);
-
-		$this->_mock_sql->whenCalled('fetchAllByColumn')
-			->with(Class_Notice::selectIdsFromRequest('select * from notices'))
-			->answers([4,10,23 ]);
 
+		Storm_Cache::beVolatile();
 
+		$this->_original_sql = Zend_Registry::get('sql');
+		$this->_mock_sql = $this->mock()
+														->whenCalled('fetchAllByColumn')
+														->with('select * from notices')
+														->answers([4, 10, 23])
+														->beStrict();
 
+		Zend_Registry::set('sql', $this->_mock_sql);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
 			->whenCalled('findAllBy')
 			->with(['id_notice' => [4, 10, 23],
 							'order' => 'FIELD(id_notice, 4,10,23)'])
 			->answers('notices');
-		
 	}
 
 
@@ -59,25 +52,17 @@ class ListesNoticesTest extends Storm_Test_ModelTestCase {
 
 	/** @test */
 	public function noticeShouldBeFetchInRightOrder() {
-			$this->assertEquals('notices', 
-												Class_Notice::findAllByRequeteRecherche('select * from notices',10));
+		$this->assertEquals('notices',
+												Class_Notice::findAllByRequeteRecherche('select * from notices',
+																																10));
 	}
 
-	
+
 	/** @test */
 	public function noticeIdsShouldBeCached () {
-		Class_Notice::findAllByRequeteRecherche('select * from notices',10);
+		Class_Notice::findAllByRequeteRecherche('select * from notices', 10);
 		$this->_mock_sql->clearAllRedirections();
-
-		$this->mock_cache
-			->whenCalled('load')
-			->with(md5(serialize(['local',[Class_Notice::selectIdsFromRequest('select * from notices'),'NoticeLoader','getNoticeIdsByRequeteRecherche']])))
-			->answers($this->mock_cache->getFirstAttributeForLastCallOn('save'));
-
-		$this->assertEquals('notices', 
+		$this->assertEquals('notices',
 												Class_Notice::findAllByRequeteRecherche('select * from notices',10));
-		
 	}
-}
-
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/tests/library/Class/MoteurRechercheTest.php b/tests/library/Class/MoteurRechercheTest.php
index 990583835e6f42a7e606fd7e8d6d020623da818f..50e9848c84f20a1214316bd6138b8e0b1bc7e7b0 100644
--- a/tests/library/Class/MoteurRechercheTest.php
+++ b/tests/library/Class/MoteurRechercheTest.php
@@ -16,15 +16,15 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 abstract class MoteurRechercheAbstractTest extends Storm_Test_ModelTestCase {
-	protected 
+	protected
 		$mock_sql,
 		$_original_sql,
 		$expected_date = '2012-05-03';
-	
+
 
 	public function setUp() {
 		parent::setUp();
@@ -62,15 +62,34 @@ abstract class MoteurRechercheAbstractTest extends Storm_Test_ModelTestCase {
 									]);
 		$profil = Class_Profil::getLoader()->newInstanceWithId(26)
 			->setTypeDoc('1');
-		
+
 		if (isset($params['selection_annexe']))
 			$profil->setSelAnnexe($params['selection_annexe']);
+
 		if (isset($params['selection_bib']))
 			$profil->setIdSite($params['selection_bib']);
+
 		if (isset($params['selection_sections']))
 			$profil->setSelSection($params['selection_sections']);
+
 		Class_Profil::setCurrentProfil($profil);
-		
+	}
+
+
+	protected function listSqlWith($where, $order=null) {
+		return sprintf('Select id_notice from notices Where %s%s',
+									 $where, $order ? ' order by ' . $order : '');
+	}
+
+
+	protected function countSqlWith($where) {
+		return sprintf('Select count(*) from notices Where %s', $where);
+	}
+
+
+	protected function facetSqlWith($where) {
+		return sprintf('Select id_notice, type_doc, facettes from notices Where %s limit 15000',
+									 $where);
 	}
 }
 
@@ -79,98 +98,121 @@ abstract class MoteurRechercheAbstractTest extends Storm_Test_ModelTestCase {
 
 class MoteurRechercheAvanceeTest extends MoteurRechercheAbstractTest {
 	public function expectedSql() {
-		return 		[
-			[['rech_auteurs' => 'Foucault', 'operateur_auteurs' => 'and', 'type_recherche' => 'fulltext', 'pertinence' => false, 'tri' => 'alpha_auteur'] ,
-			 'req_notices' => "Select id_notice from notices Where MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE) order by alpha_auteur",
-			 'req_comptage' => "Select count(*) from notices Where MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE)",
-			 'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE) limit 15000"
-				],
-				
-		
-
-			[ ['rech_auteurs' => 'Bourdieu', 'operateur_auteurs' => 'and', 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where auteurs like 'BOURDIEU%' order by alpha_titre",
-				'req_comptage' => "Select count(*) from notices Where auteurs like 'BOURDIEU%'",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where auteurs like 'BOURDIEU%' limit 15000"
-				]  ,
-
-			[ ['rech_auteurs' => 'Clastres', 'operateur_auteurs' => 'and', 
-				 'annexe' => 'MED1',
-				 'selection_annexe' => 'TUN;TAP',
-				 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_comptage' => "Select count(*) from notices Where auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-			[ ['rech_matieres' => 'Philosophie', 'operateur_matieres' => 'and not',
-				 'facette' => "T1",
-				 'annee_debut' => '1960',
-				 'annee_fin' => '2013',
-				 'nouveaute' => '12',
-				 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE) order by alpha_titre",
-				                  
-				'req_comptage' => "Select count(*) from notices Where not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-
-			[ [
-					'rech_titres' => 'Les nouveaux chiens de garde', 'operateur_titres' => 'and',
-					'rech_editeur' => 'Raisons d\'agir', 'operateur_editeur' => 'or',
-					'selection_bib'=> 4,
-					'nouveaute' => '3',
-					'type_recherche' => 'nimportequoi', 'pertinence' => false, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE) order by alpha_titre",
-
-				'req_comptage' => "Select count(*) from notices Where MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE) limit 15000"
-				],
+		$list_sql = 'Select id_notice from notices Where %s order by %s';
+		$count_sql = 'Select count(*) from notices Where %s';
+		$facet_sql = 'Select id_notice, type_doc, facettes from notices Where %s limit 15000';
 
-			[ ['rech_auteurs' => 'Stiegler', 'operateur_auteurs' => 'and', 
-				 'annexe' => 'MED1',
-				 'facettes' => 'G23-A345', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'selection_sections' => '1;12;9',
-				 'geo_zone' => 2,
-				 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_comptage' => "Select count(*) from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-			[ ['rech_titres' => 'Les décisions absurdes', 'operateur_auteurs' => 'and', 
-				 'annexe' => 'MED1',
-				 'facettes' => 'M4669', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'section' => 1,
-				 'geo_zone' => 2,
-				 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_comptage' => "Select count(*) from notices Where titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE) limit 15000"
-				],
-
-			[ ['rech_auteurs' => 'Stiegler', 'operateur_auteurs' => 'and', 
-				 'annexe' => 'MED1',
-				 'facettes' => 'G23-A345', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'selection_sections' => '1;12;9',
-				 'geo_bib' => 3,
-				 'type_recherche' => 'commence', 'pertinence' => true, 'tri' => 'alpha_titre'] ,
-				'req_notices' => "Select id_notice from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_comptage' => "Select count(*) from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE) limit 15000"
-				],
-
-			];
+		return [
+						[['rech_auteurs' => 'Foucault',
+							'operateur_auteurs' => 'and',
+							'type_recherche' => 'fulltext',
+							'pertinence' => false,
+							'tri' => 'alpha_auteur'] ,
+						 'req_notices' => $this->listSqlWith("MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE)",
+																								 'alpha_auteur'),
+						 'req_comptage' => $this->countSqlWith("MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(auteurs) AGAINST('+(FOUCAULT FOUCAULTS FOUKOLT)' IN BOOLEAN MODE)")],
+
+						[['rech_auteurs' => 'Bourdieu',
+							'operateur_auteurs' => 'and',
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith("auteurs like 'BOURDIEU%'",
+																								 "alpha_titre"),
+						 'req_comptage' => $this->countSqlWith("auteurs like 'BOURDIEU%'"),
+						 'req_facettes' => $this->facetSqlWith("auteurs like 'BOURDIEU%'")],
+
+						[['rech_auteurs' => 'Clastres',
+							'operateur_auteurs' => 'and',
+							'annexe' => 'MED1',
+							'selection_annexe' => 'TUN;TAP',
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith(	"auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)",
+																								 'alpha_titre'),
+						 'req_comptage' => $this->countSqlWith("auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("auteurs like 'CLASTRES%' and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)")],
+
+						[['rech_matieres' => 'Philosophie',
+							'operateur_matieres' => 'and not',
+							'facette' => "T1",
+							'annee_debut' => '1960',
+							'annee_fin' => '2013',
+							'nouveaute' => '12',
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith("not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE)",
+																								 "alpha_titre"),
+						 'req_comptage' => $this->countSqlWith("not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("not matieres like 'PHILOSOPHIE%' and annee >='1960' and annee <='2013' and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+T1' IN BOOLEAN MODE)")],
+
+						[['rech_titres' => 'Les nouveaux chiens de garde',
+							'operateur_titres' => 'and',
+							'rech_editeur' => 'Raisons d\'agir',
+							'operateur_editeur' => 'or',
+							'selection_bib'=> 4,
+							'nouveaute' => '3',
+							'type_recherche' => 'nimportequoi',
+							'pertinence' => false,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith("MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE)",
+																								 'alpha_titre'),
+						 'req_comptage' => $this->countSqlWith("MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(titres) AGAINST('+(NOUVEAU NOUVEAUX NOUVO) +(CHIEN CHIENS CHIN) +(GARDE GARDES GARD)' IN BOOLEAN MODE) or MATCH(editeur) AGAINST('+(RAISON RAISONS RAISON) +(D00 D00S ) +(AGIR AGIRS AJIR)' IN BOOLEAN MODE) and date_creation >'".$this->expected_date."' and MATCH(facettes) AGAINST('+B4' IN BOOLEAN MODE)")],
+
+						[['rech_auteurs' => 'Stiegler',
+							'operateur_auteurs' => 'and',
+							'annexe' => 'MED1',
+							'facettes' => 'G23-A345',
+							'selection_annexe' => 'TUN;TAP',
+							'selection_sections' => '1;12;9',
+							'geo_zone' => 2,
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE)",
+																								 'alpha_titre'),
+						 'req_comptage' => $this->countSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3 B4)' IN BOOLEAN MODE)")],
+
+						[['rech_titres' => 'Les décisions absurdes',
+							'operateur_auteurs' => 'and',
+							'annexe' => 'MED1',
+							'facettes' => 'M4669',
+							'selection_annexe' => 'TUN;TAP',
+							'section' => 1,
+							'geo_zone' => 2,
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'],
+						 'req_notices' => $this->listSqlWith("titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE)",
+																								 'alpha_titre'),
+						 'req_comptage' => $this->countSqlWith("titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("titres like 'LES DECISIONS ABSURDES%' and MATCH(facettes) AGAINST('+S1 +YMED1 +M4669 +(YTUN YTAP)  +(B3 B4)' IN BOOLEAN MODE)")],
+
+						[['rech_auteurs' => 'Stiegler',
+							'operateur_auteurs' => 'and',
+							'annexe' => 'MED1',
+							'facettes' => 'G23-A345',
+							'selection_annexe' => 'TUN;TAP',
+							'selection_sections' => '1;12;9',
+							'geo_bib' => 3,
+							'type_recherche' => 'commence',
+							'pertinence' => true,
+							'tri' => 'alpha_titre'] ,
+						 'req_notices' => $this->listSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE)",
+																								 'alpha_titre'),
+						 'req_comptage' => $this->countSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("auteurs like 'STIEGLER%' and MATCH(facettes) AGAINST('+YMED1 +G23 +A345 +(YTUN YTAP)  +(S1 S12 S9)  +(B3)' IN BOOLEAN MODE)")]];
 	}
 
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheAvanceeShouldBe($params, $req_notices, $req_comptage ,$req_facettes) {
 		$this->mockReqProfilAndZone($req_comptage,$params);
@@ -191,91 +233,79 @@ class MoteurRechercheAvanceeTest extends MoteurRechercheAbstractTest {
 
 class MoteurRechercheSimpleTest extends MoteurRechercheAbstractTest {
 	public function expectedSql() {
-		return 		[
+		$match_axes = 'MATCH(titres, auteurs, editeur, collection, matieres, dewey)';
+		$count_sql = 'Select count(*) from notices Where ' . $match_axes . ' AGAINST(%s IN BOOLEAN MODE)';
+		$facet_sql = 'Select id_notice, type_doc, facettes from notices Where %s limit 15000';
+		return [
 			[['expressionRecherche' => 'Bakounine'],
 			 'nb_mots' => 1,
-			 'req_comptage' => "Select count(*) from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(BAKOUNINE BAKOUNINES BAKOUNIN)' IN BOOLEAN MODE)",
-			 'req_liste' => "Select id_notice,MATCH(alpha_titre) AGAINST(' BAKOUNINE') as rel1, MATCH(alpha_auteur) AGAINST(' BAKOUNINE') as rel2 from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(BAKOUNINE BAKOUNINES BAKOUNIN)' IN BOOLEAN MODE) order by (rel1 * 1.5)+(rel2) desc",
-	
-			 'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(BAKOUNINE BAKOUNINES BAKOUNIN)' IN BOOLEAN MODE) limit 15000"
-				],
-
-			[ ['expressionRecherche' => 'Slavoj Zizek',  'tri' => 'alpha_titre'] ,
-				'nb_mots' => 2,
-				'req_comptage' => "Select count(*) from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)' IN BOOLEAN MODE) limit 15000"
-
-				]  ,
-
-			[ ['expressionRecherche' => 'La commune de Paris',
-				 'annexe' => 'MED1',
-				 'selection_annexe' => 'TUN;TAP',
-				 'tri' => 'alpha_titre'] ,
-				'nb_mots' => 2,
-				'req_comptage' => "Select count(*) from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-			[ ['expressionRecherche' => '2-7427-3315-9',
-				 'geo_zone' => 2,
-				 'tri' => 'alpha_auteur'] ,
-				'nb_mots'=> null,
-				'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE) order by alpha_auteur",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE) limit 15000"
-
-				]  ,
-
-			[ ['expressionRecherche' => '2-7427-3315-9',
-				 'geo_bib' => 3,
-				 'tri' => 'alpha_auteur'] ,
-				'nb_mots'=> null,
-				'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE) order by alpha_auteur",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-
-			[ [ 'expressionRecherche' => '9782742761579' ] ,
-				'nb_mots'=> null,
-				'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9')",
-				'req_liste' => "Select id_notice from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9')",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') limit 15000"
-				],
-
-
-			[ [ 'expressionRecherche' => '9782742761579', 'selection_bib'=> 1 ] ,
-				'nb_mots'=> null,
-				'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE) limit 15000"
-				],
-
-			
-			[ ['expressionRecherche' => 'logo',
-			
-				 'annexe' => 'MED1',
-				 'facettes' => 'M52291-A15067', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'selection_sections' => '1;12;9'
-					] ,
-				'nb_mots'=> 1,
-				'req_comptage' => "Select count(*) from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice,MATCH(alpha_titre) AGAINST(' LOGO') as rel1, MATCH(alpha_auteur) AGAINST(' LOGO') as rel2 from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE) order by (rel1 * 1.5)+(rel2) desc",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(titres,auteurs,editeur,collection,matieres,dewey) AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE) limit 15000"  
-				]
-			];
+			 'req_comptage' => sprintf($count_sql, "'+(BAKOUNINE BAKOUNINES BAKOUNIN)'"),
+			 'req_liste' => "Select id_notice, MATCH(alpha_titre) AGAINST(' BAKOUNINE') as rel1, MATCH(alpha_auteur) AGAINST(' BAKOUNINE') as rel2 from notices Where ". $match_axes ." AGAINST('+(BAKOUNINE BAKOUNINES BAKOUNIN)' IN BOOLEAN MODE) order by (rel1 * 1.5) + (rel2) desc",
+			 'req_facettes' => sprintf($facet_sql, $match_axes ." AGAINST('+(BAKOUNINE BAKOUNINES BAKOUNIN)' IN BOOLEAN MODE)")],
+
+			[['expressionRecherche' => 'Slavoj Zizek',
+				'tri' => 'alpha_titre'] ,
+			 'nb_mots' => 2,
+			 'req_comptage' => sprintf($count_sql, "'+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)'"),
+			 'req_liste' => "Select id_notice from notices Where " . $match_axes . " AGAINST('+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)' IN BOOLEAN MODE) order by alpha_titre",
+			 'req_facettes' => sprintf($facet_sql, $match_axes . " AGAINST('+(SLAVOJ SLAVOJS SLAVOJ) +(ZIZEK ZIZEKS ZIZEK)' IN BOOLEAN MODE)")],
+
+			[['expressionRecherche' => 'La commune de Paris',
+				'annexe' => 'MED1',
+				'selection_annexe' => 'TUN;TAP',
+				'tri' => 'alpha_titre'] ,
+			 'nb_mots' => 2,
+			 'req_comptage' => sprintf($count_sql, "'+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)'"),
+			 'req_liste' => "Select id_notice from notices Where " . $match_axes . " AGAINST('+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE) order by alpha_titre",
+			 'req_facettes' => sprintf($facet_sql, $match_axes . " AGAINST('+(COMMUNE COMMUNES KOMUN) +(PARI PARIS PARI)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +(YTUN YTAP)' IN BOOLEAN MODE)")],
+
+			[['expressionRecherche' => '2-7427-3315-9',
+				'geo_zone' => 2,
+				'tri' => 'alpha_auteur'] ,
+			 'nb_mots'=> null,
+			 'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE)",
+			 'req_liste' => "Select id_notice from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE) order by alpha_auteur",
+			 'req_facettes' => "Select id_notice, type_doc, facettes from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3 B4)' IN BOOLEAN MODE) limit 15000"],
+
+			[['expressionRecherche' => '2-7427-3315-9',
+				'geo_bib' => 3,
+				'tri' => 'alpha_auteur'] ,
+			 'nb_mots'=> null,
+			 'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE)",
+			 'req_liste' => "Select id_notice from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE) order by alpha_auteur",
+			 'req_facettes' => "Select id_notice, type_doc, facettes from notices Where (isbn='2-7427-3315-9' or isbn='978-2-7427-3315-6') and MATCH(facettes) AGAINST('+(B3)' IN BOOLEAN MODE) limit 15000"]  ,
+
+			[['expressionRecherche' => '9782742761579'],
+			 'nb_mots'=> null,
+			 'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9')",
+			 'req_liste' => "Select id_notice from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9')",
+			 'req_facettes' => "Select id_notice, type_doc, facettes from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') limit 15000"],
+
+			[['expressionRecherche' => '9782742761579',
+				'selection_bib'=> 1],
+			 'nb_mots'=> null,
+			 'req_comptage' => "Select count(*) from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE)",
+			 'req_liste' => "Select id_notice from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE)",
+			 'req_facettes' => "Select id_notice, type_doc, facettes from notices Where (isbn='2-7427-6157-8' or isbn='978-2-7427-6157-9') and MATCH(facettes) AGAINST('+B1' IN BOOLEAN MODE) limit 15000"],
+
+			[['expressionRecherche' => 'logo',
+				'annexe' => 'MED1',
+				'facettes' => 'M52291-A15067',
+				'selection_annexe' => 'TUN;TAP',
+				'selection_sections' => '1;12;9'],
+			 'nb_mots'=> 1,
+			 'req_comptage' => sprintf($count_sql, "'+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)'"),
+			 'req_liste' => "Select id_notice, MATCH(alpha_titre) AGAINST(' LOGO') as rel1, MATCH(alpha_auteur) AGAINST(' LOGO') as rel2 from notices Where " . $match_axes . " AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE) order by (rel1 * 1.5) + (rel2) desc",
+			 'req_facettes' => sprintf($facet_sql, $match_axes . " AGAINST('+(LOGO LOGOS LOGO)' IN BOOLEAN MODE) and MATCH(facettes) AGAINST('+YMED1 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)")]];
 	}
 
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheSimpleShouldBe($params, $nb_mots,$req_comptage ,$req_notices ,$req_facettes) {
-		$this->mockReqProfilAndZone($req_comptage,$params);				
+		$this->mockReqProfilAndZone($req_comptage,$params);
 		$this->criteres_recherche->setParams($params);
 		$retour = $this->moteur_recherche->lancerRecherche( $this->criteres_recherche);
 		$this->assertEquals(['nombre' => 10,
@@ -292,27 +322,22 @@ class MoteurRechercheSimpleTest extends MoteurRechercheAbstractTest {
 
 class MoteurRechercheSerieTest extends MoteurRechercheAbstractTest {
 	public function expectedSql() {
-		return 		[
-			[
-				['expressionRecherche' => 'Geo',
-				 'serie'=> 'GEO',
-					'tri' => 'date_creation desc'],
-
-				'req_comptage' =>'Select count(*) from notices Where clef_chapeau="GEO" ',
-				'req_liste' => 'Select id_notice from notices Where clef_chapeau="GEO"  order by tome_alpha desc',
-	
-			 'req_facettes' => 'Select id_notice,type_doc,facettes from notices Where clef_chapeau="GEO"  limit 15000'
-				],
-			];
+		return [
+						[['expressionRecherche' => 'Geo',
+							'serie'=> 'GEO',
+							'tri' => 'date_creation desc'],
+						 'req_comptage' =>'Select count(*) from notices Where clef_chapeau="GEO" ',
+						 'req_liste' => 'Select id_notice from notices Where clef_chapeau="GEO"  order by tome_alpha desc',
+						 'req_facettes' => 'Select id_notice, type_doc, facettes from notices Where clef_chapeau="GEO"  limit 15000']];
 
 			}
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheSerieShouldBe($params, $req_comptage ,$req_notices ,$req_facettes) {
-		$this->mockReqProfilAndZone($req_comptage,$params);				
+		$this->mockReqProfilAndZone($req_comptage,$params);
 		$this->criteres_recherche->setParams($params);
 		$retour = $this->moteur_recherche->lancerRecherche($this->criteres_recherche);
 		$this->assertEquals(['nombre' => 10,
@@ -322,136 +347,109 @@ class MoteurRechercheSerieTest extends MoteurRechercheAbstractTest {
 												 'req_facettes' => $req_facettes],
 												$retour);
 	}
-
 }
-class MoteurRechercheRebondTest extends MoteurRechercheAbstractTest {
-	public function expectedSql() {
-		return 		[
-			[
-				['expressionRecherche' => 'pomme',
-				 'code_rebond'=> 'A774'],
 
-			 'req_comptage' =>"Select count(*) from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)",
-			 'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)",
-	
-			 'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE) limit 15000"
-				],
-
-
-
-			[
-				['expressionRecherche' => 'pomme',
-				 'code_rebond'=> 'A774',
-				 'id_catalogue' => 5,
-				 'id_panier' => 4],
-
-			 'req_comptage' =>"Select count(*) from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)",
-			 'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)",
-	
-			 'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE) limit 15000"
-				],
 
 
-			[ ['expressionRecherche' => 'Tom Cora',  
-				 'tri' => 'alpha_titre',
-				 'code_rebond' => 'A888',
-				 'geo_zone' => 2] ,
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-
-			[ ['expressionRecherche' => 'Tom Cora',  
-				 'tri' => 'alpha_titre',
-				 'code_rebond' => 'A888',
-				 'geo_bib' => 3] ,
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-
-			[ ['rech_auteurs' => 'Fred Frith',  
-				 'tri' => 'alpha_titre',
-				 'code_rebond' => 'A888',
-				 'annexe' => 'MEDIAT',
-				 'type_doc' => '1'
-					] ,
-		
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE) limit 15000"
-
-				]  ,
-
-			[ ['rech_auteurs' =>  'The Ex',
-				 'operateur_auteurs' => 'or',
-				 'code_rebond' => 'A111',
-				 'selection_annexe' => 'TUN;TAP',
-				 'tri' => 'alpha_titre'] ,
-		
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE) limit 15000"
-				]  ,
-
-			[ ['expressionRecherche' => '2-7427-3315-9',
-				 'code_rebond' => 'A91919',
-				 'tri' => 'alpha_auteur'] ,
-			
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE) order by alpha_auteur",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE) limit 15000"
-
-				]  ,
-			[ ['expressionRecherche' => 'Getatchew Mekurva',
-				 'code_rebond' => 'A92929',
-				 'facettes' => 'M52291-A15067', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'selection_sections' => '1;12;9'
-					] ,
-		
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE) limit 15000"
-				],
-
-			[	['expressionRecherche' => 'Biologie et structure',  
-				 'tri' => 'alpha_titre',
-				 'fil' => ';X1',
-				 'code_rebond' => 'A888',
-				 'rubrique' =>'P4',
-				 'selection_annexe' => ' ',
-				 'geo_zone' => 2] ,
-
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)",
-				'req_liste' =>"Select id_notice from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE) limit 15000"
-				],
-
-			[	['expressionRecherche' => 'Biologie et structure',  
-				 'tri' => 'alpha_titre',
-				 'fil' => ';X1',
-				 'code_rebond' => 'A888',
-				 'rubrique' =>'P4',
-				 'selection_annexe' => ' ',
-				 'geo_bib' => 3] ,
-
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)",
-				'req_liste' =>"Select id_notice from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE) order by alpha_titre",
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE) limit 15000"
-				]  			
-			];
+class MoteurRechercheRebondTest extends MoteurRechercheAbstractTest {
+	public function expectedSql() {
+		return [
+						[['expressionRecherche' => 'pomme',
+							'code_rebond'=> 'A774'],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => 'pomme',
+							'code_rebond'=> 'A774',
+							'id_catalogue' => 5,
+							'id_panier' => 4],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A774' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => 'Tom Cora',
+							'tri' => 'alpha_titre',
+							'code_rebond' => 'A888',
+							'geo_zone' => 2] ,
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)")],
+
+
+						[['expressionRecherche' => 'Tom Cora',
+							'tri' => 'alpha_titre',
+							'code_rebond' => 'A888',
+							'geo_bib' => 3] ,
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)")],
+
+
+						[['rech_auteurs' => 'Fred Frith',
+							'tri' => 'alpha_titre',
+							'code_rebond' => 'A888',
+							'annexe' => 'MEDIAT',
+							'type_doc' => '1'],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A888' IN BOOLEAN MODE)")],
+
+						[['rech_auteurs' =>  'The Ex',
+							'operateur_auteurs' => 'or',
+							'code_rebond' => 'A111',
+							'selection_annexe' => 'TUN;TAP',
+							'tri' => 'alpha_titre'],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A111 +(YTUN YTAP)' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => '2-7427-3315-9',
+							'code_rebond' => 'A91919',
+							'tri' => 'alpha_auteur'],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE)", "alpha_auteur"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A91919' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => 'Getatchew Mekurva',
+							'code_rebond' => 'A92929',
+							'facettes' => 'M52291-A15067',
+							'selection_annexe' => 'TUN;TAP',
+							'selection_sections' => '1;12;9'],
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A92929 +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => 'Biologie et structure',
+							'tri' => 'alpha_titre',
+							'fil' => ';X1',
+							'code_rebond' => 'A888',
+							'rubrique' =>'P4',
+							'selection_annexe' => ' ',
+							'geo_zone' => 2] ,
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A888 +(B3 B4)' IN BOOLEAN MODE)")],
+
+						[['expressionRecherche' => 'Biologie et structure',
+							'tri' => 'alpha_titre',
+							'fil' => ';X1',
+							'code_rebond' => 'A888',
+							'rubrique' =>'P4',
+							'selection_annexe' => ' ',
+							'geo_bib' => 3] ,
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)", "alpha_titre"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+A888 +(B3)' IN BOOLEAN MODE)")]];
 	}
 
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheRebondShouldBe($params, $req_comptage ,$req_notices ,$req_facettes) {
-		$this->mockReqProfilAndZone($req_comptage,$params);				
+		$this->mockReqProfilAndZone($req_comptage,$params);
 		$this->criteres_recherche->setParams($params);
 		$retour = $this->moteur_recherche->lancerRecherche($this->criteres_recherche);
 		$this->assertEquals(['nombre' => 10,
@@ -469,48 +467,37 @@ class MoteurRechercheRebondTest extends MoteurRechercheAbstractTest {
 class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstractTest {
 	public function expectedSql() {
 		return [
-			[
-				[
-					'rubrique' =>'D6',
-					'fil' => 'X1'],
-				  'fil_ariane' => 'X1;D6',
-				  'req_comptage' =>"Select count(*) from notices Where MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE)",
-					'req_liste' =>"Select id_notice from notices Where MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE)",
-
-					'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE) limit 15000",
-					'req_allcodif' => "select * from codif_dewey where id_dewey like '6%' and LENGTH(id_dewey)=2 order by id_dewey"
-			],
-
-			[
-				['expressionRecherche' => 'La nouvelle grille',
-				 'fil' => 'X1',
-				 'facettes' => 'M52291-A15067', 
-				 'selection_annexe' => 'TUN;TAP',
-				 'selection_sections' => '1;12;9',
-				 'rubrique' =>'D4'
-				] ,
-				'fil_ariane' => 'X1;D4',
-				'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)",
-				'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)",
-				
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE) limit 15000",
-				'req_allcodif' => "select * from codif_dewey where id_dewey like '4%' and LENGTH(id_dewey)=2 order by id_dewey"//"select * from codif_pcdm4 where id_pcdm4 like '4%' and LENGTH(id_pcdm4)=2 order by id_pcdm4"
-				],
-				
-
-		];
+						[['rubrique' =>'D6',
+							'fil' => 'X1'],
+						 'fil_ariane' => 'X1;D6',
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+D6*' IN BOOLEAN MODE)"),
+						 'req_allcodif' => "select * from codif_dewey where id_dewey like '6%' and LENGTH(id_dewey)=2 order by id_dewey"],
+
+						[['expressionRecherche' => 'La nouvelle grille',
+							'fil' => 'X1',
+							'facettes' => 'M52291-A15067',
+							'selection_annexe' => 'TUN;TAP',
+							'selection_sections' => '1;12;9',
+							'rubrique' =>'D4'],
+						 'fil_ariane' => 'X1;D4',
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+D4* +M52291 +A15067 +(YTUN YTAP)  +(S1 S12 S9)' IN BOOLEAN MODE)"),
+						 'req_allcodif' => "select * from codif_dewey where id_dewey like '4%' and LENGTH(id_dewey)=2 order by id_dewey"]];
 	}
 
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheGuideeShouldBe($params,$fil_ariane, $req_comptage, $req_liste,$req_facettes,$req_allcodif) {
 		$this->mockReqProfilAndZone($req_comptage,$params);
 
 		Class_CodifDewey::newInstanceWithId($params['rubrique'][1], ['libelle' => 'un libelle']);
-	
+
 		$this->mock_sql
 			->whenCalled('fetchAll')
 			->with($req_allcodif)
@@ -518,7 +505,7 @@ class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstra
 			->beStrict();
 
 		$bib='';
-		if (isset($params['selection_bib'])) 
+		if (isset($params['selection_bib']))
 			$bib=$params['selection_bib'];
 
 
@@ -533,7 +520,7 @@ class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstra
 													 'action' => 'guidee']];
 
 		$prev_url='/opac/recherche/simple';
-		
+
 		$liens[]=$home_url;
 		$prev_url= ['controller' => 'recherche',
 								'action' => 'simple',
@@ -544,7 +531,7 @@ class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstra
 
 		$liens[]=['libelle' => 'DEWEY',
 							'url' =>$prev_url];
-		
+
 		if ($params['rubrique']!='X1') {
 			$url_rubrique  =['controller' => 'recherche',
 											 'action' => 'simple',
@@ -565,11 +552,11 @@ class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstra
 												 'fil_ariane' => ['fil'=> $fil_ariane,
 																					'rubriques' => [],
 																					'liens' => $liens],
-														
+
 												 'req_liste' => $req_liste,
 												 'req_facettes' => $req_facettes,
 												 'statut' => ''],
-													 
+
 												$retour);
 	}
 }
@@ -579,33 +566,25 @@ class MoteurRechercheGuideeWithOneSubCategorieTest extends MoteurRechercheAbstra
 
 class MoteurRechercheGuideeWithTwoSubCategorieTest extends MoteurRechercheAbstractTest {
 	public function expectedSql() {
-		return 
-			[
-				[
-					[
-					 'facettes' => 'M123-A989', 
-					 'bib_select'=> '1,2,3',
-					 'fil' => 'X2;D3',
-					 'rubrique' =>'D30'
-						] ,
-
-					'fil_ariane' => 'X2;D3;D30',
-					'req_comptage' => "Select count(*) from notices Where MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE)",
-					'req_liste' => "Select id_notice from notices Where MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE)",
-
-					'req_facettes' => "Select id_notice,type_doc,facettes from notices Where MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE) limit 15000",
-					'req_allcodif' => "select * from codif_dewey where id_dewey like '30%' and LENGTH(id_dewey)=3 order by id_dewey"
-					]
-				];
+		return [
+						[['facettes' => 'M123-A989',
+							'bib_select'=> '1,2,3',
+							'fil' => 'X2;D3',
+							'rubrique' =>'D30'],
+						 'fil_ariane' => 'X2;D3;D30',
+						 'req_comptage' => $this->countSqlWith("MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE)"),
+						 'req_liste' => $this->listSqlWith("MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE)"),
+						 'req_facettes' => $this->facetSqlWith("MATCH(facettes) AGAINST('+D30* +M123 +A989 +(B1 B2 B3)' IN BOOLEAN MODE)"),
+						 'req_allcodif' => "select * from codif_dewey where id_dewey like '30%' and LENGTH(id_dewey)=3 order by id_dewey"]];
 	}
 
-	
-	/** 
+
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheGuideeShouldBe($params, $fil_ariane, $req_comptage, $req_liste, $req_facettes, $req_allcodif) {
-		$this->mockReqProfilAndZone($req_comptage,$params);			
+		$this->mockReqProfilAndZone($req_comptage,$params);
 
 		Class_CodifDewey::newInstanceWithId(3, ['libelle' => 'un libelle']);
 		Class_CodifDewey::newInstanceWithId(30, ['libelle' => 'une sous categorie']);
@@ -637,7 +616,7 @@ class MoteurRechercheGuideeWithTwoSubCategorieTest extends MoteurRechercheAbstra
 												 'rubrique' => 'D3',
 												 'facettes' => 'M123-A989',
 												 'bib_select' => '1,2,3']],
-		
+
 							['libelle' =>'une sous categorie',
 							 'url' => ['controller' => 'recherche',
 												 'action' => 'simple',
@@ -645,7 +624,7 @@ class MoteurRechercheGuideeWithTwoSubCategorieTest extends MoteurRechercheAbstra
 												 'rubrique' => 'D30',
 												 'facettes' => 'M123-A989',
 												 'bib_select' => '1,2,3']]];
-		
+
 
 		$retour = $this->moteur_recherche->lancerRecherche($this->criteres_recherche);
 		$this->assertEquals(['nombre' => 10,
@@ -675,7 +654,7 @@ class MoteurRechercheCatalogueTest extends MoteurRechercheAbstractTest {
 		$this->_politique = Class_Catalogue::newInstanceWithId(8, [ 'libelle' => 'Dernières news',
 																																'nouveaute' => 1,
 																																'type_doc' => '1;4'
-																																]);	
+																																]);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
 			->whenCalled('findAllBy')
@@ -689,7 +668,7 @@ class MoteurRechercheCatalogueTest extends MoteurRechercheAbstractTest {
 		$this->_parutions = Class_Catalogue::newInstanceWithId(9, [ 'libelle' => 'Dernières parutions',
 																																'annee_debut' => '1997',
 																																'cote_debut' => 'N222.77',
-																																'cote_fin' => 'V222.77']);	
+																																'cote_fin' => 'V222.77']);
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
 			->whenCalled('findAllBy')
@@ -700,14 +679,14 @@ class MoteurRechercheCatalogueTest extends MoteurRechercheAbstractTest {
 
 	public function expectedSql() {
 		return [
-			[ 
+			[
 				[ 'id_catalogue' => 8	],
 
 				'req_comptage' =>  "Select count(*) from notices Where date_creation >'". $this->expected_date."' and MATCH(facettes) AGAINST('+(T1 T4)' IN BOOLEAN MODE)",
 				'req_libelle' => "select libelle from codif_dewey where id_dewey='3'",
 				'req_liste' => "Select id_notice from notices Where date_creation >'". $this->expected_date ."' and MATCH(facettes) AGAINST('+(T1 T4)' IN BOOLEAN MODE)",
-						
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where date_creation >'". $this->expected_date ."' and MATCH(facettes) AGAINST('+(T1 T4)' IN BOOLEAN MODE) limit 15000"
+
+				'req_facettes' => "Select id_notice, type_doc, facettes from notices Where date_creation >'". $this->expected_date ."' and MATCH(facettes) AGAINST('+(T1 T4)' IN BOOLEAN MODE) limit 15000"
 
 				],
 
@@ -717,20 +696,20 @@ class MoteurRechercheCatalogueTest extends MoteurRechercheAbstractTest {
 				'req_comptage' =>  "Select count(*) from notices Where  cote >='N222.77' and  cote <= 'V222.77' and annee >='1997'",
 				'req_libelle' => "select libelle from codif_dewey where id_dewey='3'",
 				'req_liste' => "Select id_notice from notices Where  cote >='N222.77' and  cote <= 'V222.77' and annee >='1997'",
-						
-				'req_facettes' => "Select id_notice,type_doc,facettes from notices Where  cote >='N222.77' and  cote <= 'V222.77' and annee >='1997' limit 15000"
+
+				'req_facettes' => "Select id_notice, type_doc, facettes from notices Where  cote >='N222.77' and  cote <= 'V222.77' and annee >='1997' limit 15000"
 
 				]
 			];
 	}
 
 
-	/** 
+	/**
 	 * @dataProvider expectedSql
-	 * @test 
+	 * @test
 	 */
 	public function lancerRechercheCatalogueWithNouveauteShouldBe($params,$req_comptage ,$req_libelle,$req_liste,$req_facettes) {
-		$this->mockReqProfilAndZone($req_comptage,$params);			
+		$this->mockReqProfilAndZone($req_comptage,$params);
 		$this->mock_sql
 			->whenCalled('fetchOne')
 			->with($req_libelle)
@@ -741,19 +720,19 @@ class MoteurRechercheCatalogueTest extends MoteurRechercheAbstractTest {
 			->whenCalled('fetchOne')
 			->with(	"select libelle from codif_dewey where id_dewey='30'")
 			->answers("une sous categorie");
-		
+
 		$bib='';
-		if (isset($params['selection_bib'])) 
+		if (isset($params['selection_bib']))
 			$bib=$params['selection_bib'];
 		$this->_translate = Zend_Registry::get('translate');
 		$this->criteres_recherche->setParams($params);
-	
+
 		$prev_url= ['controller' => 'recherche',
 								'action' => 'simple',
 								'rubrique' => 'X2'];
 
 		$retour = $this->moteur_recherche->lancerRecherche($this->criteres_recherche);
-															 
+
 		$this->assertEquals(['nombre' => 10,
 												 'nb_mots' => 0,
 												 'req_liste' => $req_liste,
diff --git a/tests/library/Class/WebService/SIGB/OpsysServiceTest.php b/tests/library/Class/WebService/SIGB/OpsysServiceTest.php
index 05bdac979d91f2a46a640b5e03c7f5e13d6cf3e0..a1e0ae8c64bcc55290ad70c004cbddf0b4ad9f6e 100644
--- a/tests/library/Class/WebService/SIGB/OpsysServiceTest.php
+++ b/tests/library/Class/WebService/SIGB/OpsysServiceTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 include_once('Class/WebService/SIGB/Opsys/Service.php');
@@ -62,8 +62,8 @@ abstract class OpsysServiceFactoryWithCatalogueWebTestCase extends Storm_Test_Mo
 class OpsysServiceFactoryWithCatalogueWebTest extends OpsysServiceFactoryWithCatalogueWebTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->_service = Class_WebService_SIGB_Opsys::getService(array('url_serveur' => "http://localhost:8088/mockServiceRechercheSoap?WSDL",
-																																		'catalogue_web' => '1'));
+		$this->_service = Class_WebService_SIGB_Opsys::getService(['url_serveur' => "http://localhost:8088/mockServiceRechercheSoap?WSDL",
+																															 'catalogue_web' => '1']);
 	}
 
 
@@ -77,6 +77,12 @@ class OpsysServiceFactoryWithCatalogueWebTest extends OpsysServiceFactoryWithCat
 	public function catalogClientShouldBeAnInstanceOfStupSoapClient() {
 		$this->assertInstanceOf('StubSoapClient', $this->_service->getCatalogClient());
 	}
+
+
+	/** @test */
+	public function optionReserverRetraitBibAbonneShouldBeFalse() {
+		$this->assertFalse($this->_service->isReserverRetraitBibAbonne());
+	}
 }
 
 
@@ -85,8 +91,9 @@ class OpsysServiceFactoryWithCatalogueWebTest extends OpsysServiceFactoryWithCat
 class OpsysServiceFactoryWithoutCatalogueWebTest extends OpsysServiceFactoryWithCatalogueWebTestCase {
 	public function setUp() {
 		parent::setUp();
-		$this->_service = Class_WebService_SIGB_Opsys::getService(array('url_serveur' => "http://localhost:8088/mockServiceRechercheSoap?WSDL",
-																																		'catalogue_web' => '0'));
+		$this->_service = Class_WebService_SIGB_Opsys::getService(['url_serveur' => "http://localhost:8088/mockServiceRechercheSoap?WSDL",
+																															 'catalogue_web' => '0',
+																															 'reserver_retrait_bib_abonne' => '1']);
 	}
 
 
@@ -94,6 +101,11 @@ class OpsysServiceFactoryWithoutCatalogueWebTest extends OpsysServiceFactoryWith
 	public function catalogClientShouldBeAnInstanceOfNullCatalogClient() {
 		$this->assertInstanceOf('NullCatalogSoapClient', $this->_service->getCatalogClient());
 	}
+
+	/** @test */
+	public function optionReserverRetraitBibAbonneShouldBeTrue() {
+		$this->assertTrue($this->_service->isReserverRetraitBibAbonne());
+	}
 }
 
 
@@ -219,6 +231,7 @@ class Class_WebService_SIGB_OpsysServiceTestProxy extends Storm_Test_ModelTestCa
 			->with(
 						 $this->equalTo('opsys.wsdl'),
 						 $this->equalTo(true),
+						 $this->equalTo(false),
 						 $this->equalTo( array(
 																	 'proxy_host' => '192.168.2.2',
 																	 'proxy_port' => '3128',
@@ -244,6 +257,7 @@ class Class_WebService_SIGB_OpsysServiceTestProxy extends Storm_Test_ModelTestCa
 			->with(
 						 $this->equalTo('afi.wsdl'),
 						 $this->equalTo(true),
+						 $this->equalTo(false),
 						 $this->equalTo( array(
 																	 'proxy_host' => '10.0.0.5',
 																	 'proxy_port' => '8080',
@@ -458,7 +472,7 @@ class OpsysServiceEmprAuthentifierErreurTestCreateEmprunteur extends OpsysServic
 		$entite_infos_response_error->EmprListerEntiteResult->ErreurService = new WebSrvErreur();
 		$entite_infos_response_error->EmprListerEntiteResult->ErreurService->CodeErreur = '1';
 
-		$this->search_client			
+		$this->search_client
 			->whenCalled('EmprAuthentifier')->answers($auth_response_error)
 			->whenCalled('EmprListerEntite')->answers($entite_infos_response_error);
 
@@ -481,7 +495,7 @@ class OpsysServiceEmprAuthentifierNoCommunicationTest extends OpsysServiceWithSe
 	public function setUp() {
 		parent::setUp();
 
-		$this->search_client			
+		$this->search_client
 			->whenCalled('EmprAuthentifier')
 			->willDo(function() {throw new SoapFault('Communication', 'error');});
 
@@ -540,7 +554,7 @@ class OpsysServiceEmprAuthentifierTestCreateEmprunteur extends OpsysServiceWithS
 		$this->assertEquals('Tin', $this->emprunteur->getPrenom());
 	}
 
-	
+
 	/** @test */
 	public function emprunteurBirthDayShouldBe10_12_2012() {
 		$this->assertEquals('1983-12-10', $this->emprunteur->getDateNaissance());
@@ -578,30 +592,30 @@ class OpsysServiceEmprAuthentifierTestCreateEmprunteur extends OpsysServiceWithS
 	}
 
 
-	/** 
-	 * @test 
+	/**
+	 * @test
 	 * @depends updateUser
 	 */
 	public function updatedUserTelephoneShouldBe23456789($user) {
-		$this->assertEquals('23 45 67 89', $user->getTelephone());		
+		$this->assertEquals('23 45 67 89', $user->getTelephone());
 	}
 
 
-	/** 
-	 * @test 
+	/**
+	 * @test
 	 * @depends updateUser
 	 */
 	public function updatedUserIsContactMailShouldBeTrue($user) {
-		$this->assertTrue($user->getIsContactMail());		
+		$this->assertTrue($user->getIsContactMail());
 	}
 
 
-	/** 
-	 * @test 
+	/**
+	 * @test
 	 * @depends updateUser
 	 */
 	public function updatedUserIsContactSmsShouldBeTrue($user) {
-		$this->assertTrue($user->getIsContactSms());		
+		$this->assertTrue($user->getIsContactSms());
 	}
 
 
@@ -638,7 +652,7 @@ class OpsysServiceEmprAuthentifierTestCreateEmprunteur extends OpsysServiceWithS
 
 		$this->search_client
 			->whenCalled('EmprListerEntite')
-			->willDo(function() use ($liste_prets, $liste_retards) { 
+			->willDo(function() use ($liste_prets, $liste_retards) {
 					$this->search_client
 						->whenCalled('EmprListerEntite')
 						->answers($liste_retards);
@@ -951,8 +965,8 @@ class OpsysServiceTestProlongerPret extends OpsysServiceWithSessionTestCase {
 																->setPassword('pass'),
 															'pret_12'
 														);
-		$this->assertEquals(array('statut' => 0, 
-															'erreur' => 'La prolongation de ce document est impossible'), 
+		$this->assertEquals(array('statut' => 0,
+															'erreur' => 'La prolongation de ce document est impossible'),
 												$result);
 	}
 
@@ -968,8 +982,8 @@ class OpsysServiceTestProlongerPret extends OpsysServiceWithSessionTestCase {
 																->setPassword('pass'),
 															'pret_12'
 														);
-		$this->assertEquals(array('statut' => 0, 
-															'erreur' => 'La prolongation de ce document est impossible'), 
+		$this->assertEquals(array('statut' => 0,
+															'erreur' => 'La prolongation de ce document est impossible'),
 												$result);
 	}
 
@@ -1068,9 +1082,10 @@ abstract class OpsysServiceNoticeAbstractTest extends Storm_Test_ModelTestCase {
 
 		$this->response = $rsp;
 	}
+}
+
 
 
-}
 class OpsysServiceRecupererNoticeResponseTestCreateNotice extends OpsysServiceNoticeAbstractTest {
 	public function setUp() {
 		parent::setUp();
@@ -1132,7 +1147,7 @@ class OpsysServiceRecupererNoticeResponseTestCreateNotice extends OpsysServiceNo
 
 class OpsysServicePiegesTest extends OpsysServiceNoticeAbstractTest{
 	public function setUp() {
-		parent::setUp(); 
+		parent::setUp();
 
 		$trapb = new DonneeFille();
 		$trapb->NomDonnee = "piegeb";
@@ -1141,7 +1156,7 @@ class OpsysServicePiegesTest extends OpsysServiceNoticeAbstractTest{
 		$trapa = new DonneeFille();
 		$trapa->NomDonnee = "piegea";
 		$trapa->ValeurDonnee = "Exclu du pret";
-		
+
 		$dispo_empty = new DonneeFille();
 		$dispo_empty->NomDonnee = "Disponibilité";
 		$dispo_empty->ValeurDonnee = "Non disponible";
@@ -1157,12 +1172,12 @@ class OpsysServicePiegesTest extends OpsysServiceNoticeAbstractTest{
 
 	/** @test */
 	public function scrapShouldDisplayConsultationSurPlace() {
-		$this->assertEquals("Non disponible<span>(Consultation sur place)</span>", $this->scrap->getDisponibilite());		
+		$this->assertEquals("Non disponible<span>(Consultation sur place)</span>", $this->scrap->getDisponibilite());
 	}
 
 	/** @test */
 	public function scrapShouldNotBeReservable() {
-		$this->assertFalse($this->scrap->isReservable());		
+		$this->assertFalse($this->scrap->isReservable());
 	}
 }
 
@@ -1474,7 +1489,7 @@ class OpsysServiceEmprunteurTestPretsEnRetard extends Storm_Test_ModelTestCase {
 
 
 
-class OpsysServiceTestReserverExemplaire extends OpsysServiceWithSessionTestCase {
+class OpsysServiceTestReserverExemplaireTest extends OpsysServiceWithSessionTestCase {
 	public function setUp() {
 		parent::setUp();
 		$reserverResponse = new EmprReserverResponse();
@@ -1506,6 +1521,43 @@ class OpsysServiceTestReserverExemplaire extends OpsysServiceWithSessionTestCase
 
 
 
+class OpsysServiceTestReserverExemplaireWithOptionReserverRetraitBibAbonne extends OpsysServiceWithSessionTestCase {
+	public function setUp() {
+		parent::setUp();
+
+		$this->opsys = new Class_WebService_SIGB_Opsys_Service($this->search_client,
+																													 $this->catalog_client,
+																													 '1');
+
+		$reserverResponse = new EmprReserverResponse();
+		$reserverResponse->EmprReserverResult = new RspEmprAction();
+		$reserverResponse->EmprReserverResult->Reussite = "true";
+
+		$this->search_client
+			->whenCalled('EmprReserver')
+			->with(new EmprReserver('guid_12345', 'id_ex_344', ''))
+			->answers($reserverResponse);
+
+		$notice_sigb = (new Class_WebService_SIGB_Notice('ido344'))
+			              ->addExemplaire((new Class_WebService_SIGB_Exemplaire('id_ex_344'))
+																		->setCodeBarre('cb344'));
+
+		$this->opsys->getNoticeCache()->cacheNotice($notice_sigb);
+	}
+
+
+	public function testReserverSuccessful() {
+		$result = $this->opsys->reserverExemplaire(
+			Class_Users::newInstance(['login' => 'tintin', 'password' => 'pass']),
+			Class_Exemplaire::newInstanceWithId(12, ['id_origine' => 'ido344', 'code_barres' => 'cb344']),
+			'melun');
+
+		$this->assertEquals(['statut' => 1, 'erreur' => ''], $result);
+	}
+}
+
+
+
 
 class OpsysServiceTestEntiteEmprWithPret extends Storm_Test_ModelTestCase {
 	public function setUp() {
@@ -1517,7 +1569,7 @@ class OpsysServiceTestEntiteEmprWithPret extends Storm_Test_ModelTestCase {
 			->answers(Class_Exemplaire::getLoader()->newInstanceWithId(34));
 
 
-		
+
 		$entite = new EntiteEmp();
 		$entite->LibelleDonnee = new StdClass();
 		$entite->LibelleDonnee->string = array('No Prêt',
@@ -1568,8 +1620,8 @@ class OpsysServiceTestEntiteEmprWithPret extends Storm_Test_ModelTestCase {
 	}
 
 
-	/** 
-	* @test 
+	/**
+	* @test
 	* @depends empruntsShouldHaveSizeOfOne
 	*/
 	public function dateRetourShouldBe27_06_2012($emprunt) {
@@ -1577,8 +1629,8 @@ class OpsysServiceTestEntiteEmprWithPret extends Storm_Test_ModelTestCase {
 	}
 
 
-	/** 
-	* @test 
+	/**
+	* @test
 	* @depends empruntsShouldHaveSizeOfOne
 	*/
 	public function bibliothequeShouldBeAstro($emprunt) {
@@ -1595,7 +1647,7 @@ class OpsysServiceEmprAuthentifierParamsTest extends OpsysServiceWithSessionTest
 		$this->auth_response_dummy = new EmprAuthentifierResponse();
 		$this->auth_response_dummy->EmprAuthentifierResult = new RspEmprAuthentifier();
 
-		$this->search_client			
+		$this->search_client
 			->whenCalled('EmprAuthentifier')
 			->willDo(
 				function($auth_request) {
@@ -1608,9 +1660,9 @@ class OpsysServiceEmprAuthentifierParamsTest extends OpsysServiceWithSessionTest
 	/** @test */
 	public function withLoginAndNoIdAbonAuthentifierShouldUseLogin() {
 		$this->opsys->getEmprunteur(
-			Class_Users::newInstance(['login' => 'tintin', 
+			Class_Users::newInstance(['login' => 'tintin',
 																'password' => '1234']));
-		
+
 		$this->assertEquals('tintin', $this->auth_request->Param->IDEmprunteur);
 	}
 
@@ -1618,10 +1670,10 @@ class OpsysServiceEmprAuthentifierParamsTest extends OpsysServiceWithSessionTest
 	/** @test */
 	public function withLoginAndIdAbonAuthentifierShouldUseIdabon() {
 		$this->opsys->getEmprunteur(
-			Class_Users::newInstance(['login' => 'tintin', 
+			Class_Users::newInstance(['login' => 'tintin',
 																'password' => '1234',
 																'idabon' => 'vol777']));
-		
+
 		$this->assertEquals('vol777', $this->auth_request->Param->IDEmprunteur);
 	}
 }
@@ -1634,8 +1686,8 @@ class OpsysServiceDisconnectTest extends OpsysServiceWithSessionTestCase {
 
 	public function setUp() {
 		parent::setUp();
-		
-		$this->search_client			
+
+		$this->search_client
 			->whenCalled('FermerSession')
 			->willDo(
 				function($fs) {
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
index d866eb135d66e21b36609539892e686ba62e35de..9156054cbf0e7dd519e4a1836a3d6903e1f12c2f 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 require_once 'library/ZendAfi/View/Helper/ViewHelperTestCase.php';
 
@@ -87,6 +87,7 @@ abstract class CalendarWithEmptyPreferencesTestCase extends CalendarViewHelperTe
 
 		$time_source = new TimeSourceForTest('2013-08-19 09:00:00');
 		ZendAfi_View_Helper_CalendarContent::setTimeSource($time_source);
+		ZendAfi_View_Helper_Calendar_Months::setTimeSource($time_source);
 
 		$this->nanook2
 			->setEventsDebut('2013-08-17')
@@ -125,6 +126,8 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes
 							 'event_end_after' => '2013-08-19',
 							 'events_only' => true,
 							 'id_bib' => 0,
+							 'id_lieu' => '',
+							 'custom_fields' => [],
 							 'published' => true])
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
 
@@ -135,6 +138,8 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes
 							 'event_date' => '2013-08',
 							 'events_only' => true,
 							 'id_bib' => 0,
+							 'id_lieu' => '',
+							 'custom_fields' => [],
 							 'published' => true])
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
 
@@ -155,8 +160,8 @@ class CalendarViewTodayWithEmptyPreferencesTest extends CalendarViewTodayTestCas
 	/** @test */
 	public function cacheKeyShouldContainsParams() {
 		$params = [2,
-							 Class_Profil::getCurrentProfil()->getId(), 
-							 Zend_Registry::get('translate')->getLocale(), 
+							 Class_Profil::getCurrentProfil()->getId(),
+							 Zend_Registry::get('translate')->getLocale(),
 							 $this->helper->getPreferences()];
 		$this->assertEquals(md5(serialize($params)), md5(serialize($this->helper->getCacheKey())));
 	}
@@ -164,8 +169,8 @@ class CalendarViewTodayWithEmptyPreferencesTest extends CalendarViewTodayTestCas
 
 	/** @test */
 	public function titreShouldBeAgendaAndLinkToArticleViewByDate() {
-		$this->assertXPathContentContains($this->html, 
-																			'//a[contains(@href, "/cms/articleviewbydate/id_module/2/id_profil/2")]', 
+		$this->assertXPathContentContains($this->html,
+																			'//a[contains(@href, "/cms/articleviewbydate/id_module/2/id_profil/2")]',
 																			'Agenda');
 	}
 
@@ -253,7 +258,7 @@ class CalendarViewTodayWithEmptyPreferencesTest extends CalendarViewTodayTestCas
 class CalendarViewTodayWithFriseChronoTest extends CalendarViewTodayTestCase {
 	public function setUp() {
 		parent::setUp();
-				
+
 		$params = ['division' => '1',
 							 'type_module' => 'CALENDAR',
 							 'preferences' => ['titre' => 'Calendrier',
@@ -261,7 +266,7 @@ class CalendarViewTodayWithFriseChronoTest extends CalendarViewTodayTestCase {
 																 'id_categorie' => '',
 																 'nb_events' => 1,
 																 'display_calendar' => 2]];
-		
+
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
 			->whenCalled('getArticlesByPreferences')
 			->answers([]);
@@ -305,7 +310,7 @@ class CalendarViewTodayWithFriseChronoTest extends CalendarViewTodayTestCase {
 	/** @test */
 	public function monthsShouldBeSeparatedByGreaterThan() {
 		$this->assertContains('</a><span>&gt;</span><a', $this->html);
-																			
+
 	}
 
 
@@ -335,6 +340,8 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference
 									 'event_end_after' => '2013-08-19',
 									 'event_date' => '2013-08',
 									 'id_bib' => 0,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true))
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
@@ -345,10 +352,12 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference
 									 'id_categorie' => '',
 									 'event_date' => '2013-08',
 									 'id_bib' => 0,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true))
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
-		
+
 			->beStrict();
 
 
@@ -400,7 +409,10 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturned Extends Calendar
 									 'display_order' => 'EventDebut',
 									 'id_categorie' => '',
 									 'event_date' => '2013-08',
+									 'event_end_after' => '2013-08-19',
 									 'id_bib' => 0,
+                   'id_lieu' => '',
+                   'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true))
 			->answers([$this->nanook2, $this->opac4])
@@ -411,6 +423,8 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturned Extends Calendar
 									 'id_categorie' => '',
 									 'event_start_after' => '2013-09',
 									 'id_bib' => 0,
+                   'id_lieu' => '',
+                   'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true))
 			->answers(array($this->amber));
@@ -468,13 +482,25 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
 									 'id_categorie' => '12-3',
 									 'event_date' => '2011-03',
 									 'id_bib' => 5,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
+									 'events_only' => true,
+									 'published' => false))
+			->answers(array($this->nanook2, $this->opac4, $this->amber))
+			->whenCalled('getArticlesByPreferences')
+			->with(array(
+									 'display_order' => 'EventDebut',
+									 'id_categorie' => '12-3',
 									 'events_only' => true,
+									 'event_date' => '2011-03-17',
+									 'id_bib' => 5,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'published' => false))
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
 
 			->beStrict();
 
-
 		$this->html = $helper->getBoite();
 	}
 
@@ -490,7 +516,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
 	/** @test */
 	function titleMonthFirstLinkShouldGoToFebruary() {
 		$this->assertXPath($this->html,
-					'//td[@class="calendar_title_month"]//a[1][contains(@href, "cms/calendar/date/2011-02/id_module/2/id_profil/2/select_id_categorie/all")]',
+					'//td[@class="calendar_title_left_arrow"]//a[1][contains(@href, "cms/calendar/date/2011-02/id_module/2/id_profil/2/select_id_categorie/all")]',
 					$this->html);
 	}
 
@@ -498,7 +524,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
 	/** @test */
 	function titleMonthSecondLinkShouldLinkToArticleViewByDate() {
 		$this->assertXPath($this->html,
-					'//td[@class="calendar_title_month"]//a[2][contains(@href, "cms/articleviewbydate/d/2011-03/id_module/2/id_profil/2/select_id_categorie/all")]',
+					'//td[@class="calendar_title_month"]//a[1][contains(@href, "cms/articleviewbydate/d/2011-03/id_module/2/id_profil/2/select_id_categorie/all")]',
 					$this->html);
 	}
 
@@ -506,7 +532,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
 	/** @test */
 	function titleMonthLastLinkShouldGoToApril() {
 		$this->assertXPath($this->html,
-					'//td[@class="calendar_title_month"]//a[3][contains(@href, "cms/calendar/date/2011-04/id_module/2/id_profil/2/select_id_categorie/all")]',
+					'//td[@class="calendar_title_right_arrow"]//a[1][contains(@href, "cms/calendar/date/2011-04/id_module/2/id_profil/2/select_id_categorie/all")]',
 					$this->html);
 	}
 
@@ -558,6 +584,8 @@ class CalendarWithWorkFlowStatusTest  extends CalendarWithEmptyPreferencesTestCa
 									 'event_end_after' => '2013-08-19',
 									 'event_date' => '2013-08',
 									 'id_bib' => 0,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true
 									 ])
@@ -569,6 +597,8 @@ class CalendarWithWorkFlowStatusTest  extends CalendarWithEmptyPreferencesTestCa
 									 'id_categorie' => '',
 									 'event_date' => '2013-08',
 									 'id_bib' => 0,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => true
 									 ])
@@ -583,14 +613,16 @@ class CalendarWithWorkFlowStatusTest  extends CalendarWithEmptyPreferencesTestCa
 							 'event_end_after' => '',
 							 'events_only' => true,
 							 'id_bib' => 0,
+							 'id_lieu' => '',
+							 'custom_fields' => [],
 							 'limit' => 3,
 							 'published' => true
 							 ])
-			->answers([$this->nanook2,$this->opac4, $this->amber]) 
+			->answers([$this->nanook2,$this->opac4, $this->amber])
 			->beStrict();
 
 		$this->html = $this->helper->getBoite();
-		
+
 	}
 
 	/** @test */
@@ -610,7 +642,7 @@ class CalendarWithWorkFlowStatusTest  extends CalendarWithEmptyPreferencesTestCa
 
 }
 
-	
+
 class CalendarWithCategorySelectorAndRssPreferencesTest extends CalendarViewHelperTestCase {
 	public function setUp() {
 		parent::setUp();
@@ -634,10 +666,26 @@ class CalendarWithCategorySelectorAndRssPreferencesTest extends CalendarViewHelp
 									 'id_categorie' => '12',
 									 'event_date' => '2011-12',
 									 'id_bib' => 0,
+									 'id_lieu' => '',
+									 'custom_fields' => [],
 									 'events_only' => true,
 									 'published' => false))
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
-		
+
+			->whenCalled('getArticlesByPreferences')
+			->with([
+							'display_order' => 'EventDebut',
+							'id_categorie' => '12',
+							'events_only' => true,
+							'event_date' => '2011-12-25',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'events_only' => true,
+							'published' => false])
+			->answers(array($this->nanook2, $this->opac4, $this->amber))
+
+
 			->beStrict();
 
 		$this->html = $helper->getBoite();
@@ -655,7 +703,7 @@ class CalendarWithCategorySelectorAndRssPreferencesTest extends CalendarViewHelp
 	/** @test */
 	function titleMonthLastLinkShouldGoToJanuary2012Categorie12() {
 		$this->assertXPath($this->html,
-					'//td[@class="calendar_title_month"]//a[3][contains(@href, "cms/calendar/date/2012-01/id_module/2/id_profil/2/select_id_categorie/12")]',
+					'//td[@class="calendar_title_right_arrow"]//a[contains(@href, "cms/calendar/date/2012-01/id_module/2/id_profil/2/select_id_categorie/12")]',
 					$this->html);
 	}
 
@@ -701,13 +749,32 @@ extends CalendarViewHelperTestCase {
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
 			->whenCalled('getArticlesByPreferences')
-			->with(array('display_order' => 'EventDebut',
-									 'id_categorie' => '',
-									 'event_date' => '2011-12',
-									 'id_bib' => 0,
-									 'events_only' => true,
-									 'published' => false))
+			->with([
+				'display_order' => 'EventDebut',
+				'id_categorie' => '',
+				'event_date' => '2011-12',
+				'id_bib' => 0,
+				'id_lieu' => '',
+				'custom_fields' => [],
+				'events_only' => true,
+				'published' => false
+			])
+			->answers(array($this->nanook2, $this->opac4, $this->amber))
+
+			->whenCalled('getArticlesByPreferences')
+			->with([
+							'display_order' => 'EventDebut',
+							'id_categorie' => '',
+							'events_only' => true,
+							'event_date' => '2011-12-25',
+							'id_bib' => 0,
+							'id_lieu' => '',
+							'custom_fields' => [],
+							'events_only' => true,
+							'published' => false
+			])
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
+
 			->getWrapper()
 			->beStrict();
 
@@ -791,15 +858,17 @@ class CalendarOnJanuaryTest extends CalendarViewHelperTestCase {
 
 		$article_loader = Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
 			->whenCalled('getArticlesByPreferences')
-			->with(array(
-									 'display_order' => 'EventDebut',
-									 'id_categorie' => '',
-									 'event_date' => '2012-01',
-									 'id_bib' => 0,
-									 'events_only' => true,
-									 'published' => false))
+			->with([
+				'display_order' => 'EventDebut',
+				'id_categorie' => '',
+				'events_only' => true,
+				'event_date' => '2012-01',
+				'id_bib' => 0,
+				'id_lieu' => '',
+				'custom_fields' => [],
+				'published' => false
+			])
 			->answers(array($this->nanook2, $this->opac4, $this->amber))
-			->getWrapper()
 			->beStrict();
 
 		$this->html = $helper->getBoite();
@@ -817,8 +886,7 @@ class CalendarOnJanuaryTest extends CalendarViewHelperTestCase {
 	/** @test */
 	function titleMonthPreviousLinkShouldGoToDecember2011() {
 		$this->assertXPath($this->html,
-					'//td[@class="calendar_title_month"]//a[1][contains(@href, "cms/calendar/date/2011-12/id_module/2/id_profil/2/select_id_categorie/all")]',
-					$this->html);
+					'//tr[@class="calendar_title"]//a[contains(@href, "cms/calendar/date/2011-12/id_module/2/id_profil/2/select_id_categorie/all")]');
 	}
 
 
@@ -835,28 +903,30 @@ class CalendarOnJanuaryTest extends CalendarViewHelperTestCase {
 
 
 
-
-class CalendarHelperWithDiaporamaNavigationModeTest extends CalendarViewHelperTestCase {
-	protected $_head_script;
+abstract class CalendarHelperDisplayModeTestCase extends CalendarViewHelperTestCase {
+	protected
+		$_head_script,
+		$_article_bokeh;
 
 	public function setUp() {
 		parent::setUp();
 
+		$time_source = new TimeSourceForTest('2014-07-19 09:00:00');
+		ZendAfi_View_Helper_Calendar_Months::setTimeSource($time_source);
+
+		$this->_article_bokeh = $this->fixture('Class_Article',
+																					 [ 'id' => 8,
+																						'titre' => 'Bokeh en prod !',
+																						'events_debut' => '2013-08-21',
+																						'events_fin' => '2013-09-01',
+																						'categorie' => '',
+																						'contenu' => 'toto'
+																					 ]);
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
 			->whenCalled('getArticlesByPreferences')
-			->answers([$this->fixture('Class_Article', 
-									 [ 'id' => 8,
-										 'titre' => 'Bokeh en prod !',
-										 'events_debut' => '2013-08-21',
-										 'events_fin' => '2013-09-01',
-										 'categorie' => '',
-										 'contenu' => 'toto'
-										 ])]);
+			->answers([$this->_article_bokeh]);
 
-
-
-		
-		$params = ['type_module' => 'CALENDRIER',
+		$params = ['type_module' => 'CALENDAR',
 							 'division' => 2,
 							 'preferences' => ['titre' => 'Agenda',
 																 'rss_avis' => false,
@@ -869,17 +939,29 @@ class CalendarHelperWithDiaporamaNavigationModeTest extends CalendarViewHelperTe
 																 'display_cat_select' => '',
 																 'id_categorie' => '',
 																 'mode-affichage' => 'diaporama_navigation',
-																 'op_navigation_window_width' => '350', 
+																 'op_navigation_window_width' => '350',
 																 'op_navigation_window_height' => '250',
 																 'op_navigation_mode' => 'next_previous']];
-		
+
+		$this->setupParams($params);
 		$helper = new ZendAfi_View_Helper_Accueil_Calendar(12, $params);
 		$helper->setView(new ZendAfi_Controller_Action_Helper_View());
 		$this->html = $helper->getBoite();
 		$this->_head_script = Class_ScriptLoader::getInstance()->html();
+	}
+
+
+	abstract public function setupParams(&$params);
+}
+
 
+
+
+class CalendarHelperWithDiaporamaNavigationModeTest extends CalendarHelperDisplayModeTestCase {
+	public function setupParams(&$params) {
+		$params['preferences']['mode-affichage'] = 'diaporama_navigation';
 	}
- 
+
 
 	/** @test */
 	public function javascriptForSlideshowShouldBeLoaded() {
@@ -887,12 +969,12 @@ class CalendarHelperWithDiaporamaNavigationModeTest extends CalendarViewHelperTe
 											 '//script[contains(@src, "java/slider_navigation/slider_navigation.js")]');
 	}
 
-	
+
 	/** @test **/
 	public function sliderNavigationShouldBeCallForWidget12() {
-		$this->assertXPathContentContains($this->_head_script, 
+		$this->assertXPathContentContains($this->_head_script,
 																			'//script[@type="text/javascript"]',
-																			'$(function(){$("#boite_12").slider_navigation("' . BASE_URL . '" ,350,250,"next_previous");});',
+																			'$(function(){$("#boite_12").slider_navigation({"width":"350","height":"250","strategy":"next_previous","cycle":0});});',
 																			$this->_head_script);
 	}
 
@@ -910,56 +992,18 @@ class CalendarHelperWithDiaporamaNavigationModeTest extends CalendarViewHelperTe
 
 
 
-class CalendarHelperWithWallNavigationModeTest extends CalendarViewHelperTestCase {
-	protected $_head_script;
-
-	public function setUp() {
-		parent::setUp();
-
-		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
-			->whenCalled('getArticlesByPreferences')
-			->answers([$this->fixture('Class_Article', 
-									 [ 'id' => 8,
-										 'titre' => 'Bokeh en prod !',
-										 'events_debut' => '2013-08-21',
-										 'events_fin' => '2013-09-01',
-										 'categorie' => '',
-										 'contenu' => 'toto'
-										 ])]);
-
+class CalendarHelperWithWallNavigationModeTest extends CalendarHelperDisplayModeTestCase {
+	public function setupParams(&$params) {
+		$params['preferences']['mode-affichage'] = 'wall';
+	}
 
 
-		
-		$params = ['type_module' => 'CALENDRIER',
-							 'division' => 2,
-							 'preferences' => ['titre' => 'Agenda',
-																 'rss_avis' => false,
-																 'nb_events' => 3,
-																 'rss_avis' => 0,
-																 'display_calendar' => 0,
-																 'display_event_info' => 'bib',
-																 'display_mode' => 'Summary',
-																 'display_order' => 'EventDebut',
-																 'display_cat_select' => '',
-																 'id_categorie' => '',
-																 'mode-affichage' => 'wall',
-																 'op_navigation_window_width' => '350', 
-																 'op_navigation_window_height' => '250',
-																 'op_navigation_mode' => 'next_previous']];
-		
-		$helper = new ZendAfi_View_Helper_Accueil_Calendar(12, $params);
-		$helper->setView(new ZendAfi_Controller_Action_Helper_View());
-		$this->html = $helper->getBoite();
-		$this->_head_script = Class_ScriptLoader::getInstance()->html();
-
-	}
- 
 	/** @test */
 	public function shouldDisplayArticle() {
 		$this->assertXPath($this->html,
 											 '//article',
 											 $this->html
-			);
+		);
 	}
 
 
@@ -967,7 +1011,7 @@ class CalendarHelperWithWallNavigationModeTest extends CalendarViewHelperTestCas
 	public function shouldContainsDaySelector() {
 		$this->assertXPath( $this->html,
 												"//span[contains(@class,'event_start_date_day')]"
-	
+
 			);
 	}
 
@@ -977,10 +1021,110 @@ class CalendarHelperWithWallNavigationModeTest extends CalendarViewHelperTestCas
 	public function shouldContainsMonthSelector() {
 		$this->assertXPath( $this->html,
 												"//span[contains(@class,'event_start_date_month')]"
-	
+
 			);
 	}
 
 
+	/** @test */
+	public function divCalendarFiltersShouldNotBePresent() {
+		$this->assertNotXPath($this->html, '//ul[@class="filters"]');
+	}
+}
+
+
+
+
+class CalendarHelperWithFiltersTest extends CalendarHelperDisplayModeTestCase {
+	public function setupParams(&$params) {
+		$this->fixture('Class_Lieu', [
+			'id' => 1,
+			'libelle' => 'Place 1',
+		]);
+
+		$this->fixture('Class_Lieu', [
+			'id' => 2,
+			'libelle' => 'Place 2',
+		]);
+
+		Class_CustomField_Meta::beVolatile();
+		$theme = $this->fixture('Class_CustomField',
+														['id' => 2,
+														 'priority' => 3,
+														 'label' => 'Theme',
+														 'field_type' => Class_CustomField_Meta::SELECT,
+														 'options_list' => 'music;theater;movie',
+														 'model' => 'Article']);
+
+		$this->fixture('Class_CustomField_Value',
+									 ['id' => 24,
+										'custom_field_id' => $theme->getId(),
+										'model' => $this->_article_bokeh,
+										'value' => 'music']);
+
+		$this->fixture('Class_CustomField_Value',
+									 ['id' => 25,
+										'custom_field_id' => $theme->getId(),
+										'model' => $this->nanook2,
+										'value' => 'dream theater']);
+
+		$params['preferences']['enabled_filters'] = ';date;place;custom_field_2';
+	}
+
+
+	/** @test */
+	public function divCalendarFiltersShouldBePresent() {
+		$this->assertXPath($this->html, '//ul[@class="filters"]');
+	}
+
+
+	/** @test */
+	public function filtersShouldContainsThreeUL() {
+		$this->assertXPathCount($this->html, '//ul[@class="filters"]//ul', 3, $this->html);
+	}
+
+
+	/** @test */
+	public function dateFilterShouldContainsAllMonths() {
+		$this->assertXPathCount($this->html,
+			'//ul[@class="filters"]/li[@class="date"]//li', 12, $this->html);
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="date"]//li[1]/a[contains(@href, "date/2014-07")]', 'Juillet', $this->html);
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="date"]//li[12]/a[contains(@href, "date/2015-06")]', 'Juin');
+	}
+
+	/** @test */
+	public function PlaceFilterShouldContainsAllPlaces() {
+		$this->assertXPathCount($this->html,
+			'//ul[@class="filters"]/li[@class="place"]//li', 3);
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="place"]//li[1]/a[not(contains(@href, "place"))]', 'Tous');
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="place"]//li[2]', 'Place 1');
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="place"]//li[3]', 'Place 2');
+	}
+
+	/** @test */
+	public function CustomField2FilterShouldContainsAllCustomField2Values() {
+		$this->assertXPathCount($this->html,
+			'//ul[@class="filters"]/li[@class="custom_field_2"]//li', 3, $this->html);
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="custom_field_2"]//li[1]/a[not(contains(@href, "custom_field_2"))]', 'Tous');
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="custom_field_2"]//li[2]/a[contains(@href, "custom_field_2/music")]', 'music');
+
+		$this->assertXPathContentContains($this->html,
+			'//ul[@class="filters"]/li[@class="custom_field_2"]//li[3]/a[contains(@href, "custom_field_2/dream+theater")]', 'dream theater');
+	}
 }
+
 ?>
\ No newline at end of file
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/KiosqueTest.php b/tests/library/ZendAfi/View/Helper/Accueil/KiosqueTest.php
index c1bce55ee9ce84502bbc07cc68810cbf53418d0f..cf12b7466c8c682991ccbd83fec78918f74e8228 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/KiosqueTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/KiosqueTest.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with AFI-OPAC 2.0; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 
 
@@ -29,7 +29,7 @@ abstract class ZendAfi_View_Helper_Accueil_KiosqueTestCase extends ViewHelperTes
 		$this->_helper = new ZendAfi_View_Helper_Accueil_Kiosque(3, $this->getPreferences());
 		$this->_helper->setView(new ZendAfi_Controller_Action_Helper_View());
 
-		
+
 		$this->_notices = [Class_Notice::newInstanceWithId(2,
 																											 ['unimarc' => "00627nam0 22002291  450 00100080000001000180000802100070002610000410003310100130007410500390008720000690012621000360019521500290023122500230026067600060028368600100028970000290029983000270032883500060035593000140036193200220037500028922  a2-07-052818-9  aFR  a20010130         d   0frea01      ba1 afreceng  1[2001-01-30-00.00.00.000000][][][]1 aHarry Potter et le prisonnier d'AzkabanfJoanne Kathleen Rowling  aPariscGallimard jeunessed2000  a465 p.3465cill.d18 cm 2aFolio juniorv1006  10  aR ROW1 aRowlingbJoanne Kathleen  1A32A partir de 10 ans  aJ  aRomans4R  aSorcier-Sorcière",
 																												'url_vignette' => 'hp.png',
@@ -71,7 +71,7 @@ abstract class ZendAfi_View_Helper_Accueil_KiosqueMurTestCase extends ZendAfi_Vi
 																				 $this->getExtraPreferences())];
 	}
 
-	
+
 	abstract public function getExtraPreferences();
 }
 
@@ -89,7 +89,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueMurWithCatalogueTest extends ZendAfi_Vi
 	public function firstNoticeTitleShouldLinkToNotice2WithIdCatalogue12() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="notice"]//span/a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/1/id_catalogue/12")]',
-											 $this->_html);		
+											 $this->_html);
 	}
 
 
@@ -97,7 +97,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueMurWithCatalogueTest extends ZendAfi_Vi
 	public function firstNoticeImgShouldLinkToNotice2WithIdCatalogue12() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="notice"]//a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/1/id_catalogue/12")]//img',
-											 $this->_html);		
+											 $this->_html);
 	}
 }
 
@@ -116,14 +116,14 @@ class ZendAfi_View_Helper_Accueil_KiosqueVignettesWithCatalogueTest extends Zend
 	public function firstNoticeTitleShouldLinkToNotice2WithIdCatalogue12() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="vignette_titre"]//a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/1/id_catalogue/12")]',
-											 $this->_html);		
+											 $this->_html);
 	}
 
 	/** @test */
 	public function firstNoticeImgShouldLinkToNotice2WithIdCatalogue12() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="vignette_img"]//a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/1/id_catalogue/12")]//img',
-											 $this->_html);		
+											 $this->_html);
 	}
 }
 
@@ -187,7 +187,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueMurWithPanierAndTriTest extends ZendAfi
 	public function firstNoticeTitleShouldLinkToNotice2WithIdPanier15() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="notice"]//span/a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/date_creation+desc/id_panier/15")]',
-											 $this->_html);		
+											 $this->_html);
 	}
 
 
@@ -195,7 +195,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueMurWithPanierAndTriTest extends ZendAfi
 	public function firstNoticeImgShouldLinkToNotice2WithIdPanier15() {
 		$this->assertXPath($this->_html,
 											 '//div[@class="notice"]//a[contains(@href, "recherche/viewnotice/clef/POTTER/id/2/tri/date_creation+desc/id_panier/15")]//img',
-											 $this->_html);		
+											 $this->_html);
 	}
 }
 
@@ -250,26 +250,26 @@ abstract class ZendAfi_View_Helper_Accueil_KiosqueRequetesTestCase extends ZendA
 			->answers(10)
 
 			->whenCalled('fetchAllByColumn')
-			->with("Select inner_table.id_notice   from ( select * from notices where notices.clef_alpha in('BB') and url_vignette > '' and url_vignette != 'NO'  order by date_creation DESC  ) inner_table")
-			->answers([ 2,45])
+			->with("select notices.id_notice from notices where notices.clef_alpha in('BB') and url_vignette > '' and url_vignette != 'NO'  order by date_creation DESC ")
+			->answers([2, 45])
 			->beStrict();
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Notice')
 			->whenCalled('findAllBy')
-			->with(['id_notice' => [2,45], 'order' => 'FIELD(id_notice, 2,45)'])
+			->with(['id_notice' => [2, 45],
+							'order' => 'FIELD(id_notice, 2,45)'])
 			->answers($this->_notices);
 
-		Class_AdminVar::newInstanceWithId('CACHE_ACTIF', ['valeur'=>0 ]);
+		Class_AdminVar::newInstanceWithId('CACHE_ACTIF', ['valeur' => 0]);
 	}
 
-	
+
 	public function tearDown() {
 		Zend_Registry::set('sql', $this->old_sql);
 		parent::tearDown();
 	}
 
 
-
 	public function getPreferences() {
 		return ['type_module' => 'KIOSQUE',
 						'division' => 3,
@@ -327,27 +327,30 @@ class ZendAfi_View_Helper_Accueil_KiosqueRequetesAsRedacteurTest extends ZendAfi
 class ZendAfi_View_Helper_Accueil_KiosqueRequetesWithCacheEnabledTest extends ZendAfi_View_Helper_Accueil_KiosqueRequetesTestCase {
 	public function setUp() {
 		parent::setUp();
+		Storm_Cache::beVolatile();
+		Class_AdminVar::newInstanceWithId('CACHE_ACTIF', ['valeur' => 1]);
+	}
 
-		$this->mock_cache = Storm_Test_ObjectWrapper::mock();
-		Storm_Cache::setDefaultZendCache($this->mock_cache);		
 
-		Class_AdminVar::newInstanceWithId('CACHE_ACTIF', ['valeur'=>1]);
-		$this->mock_cache
-			->whenCalled('load')->answers(false)
-			->whenCalled('save')->answers(true);		
+	public function tearDown() {
+		Storm_Cache::setDefaultZendCache(null);
+		parent::tearDown();
+	}
 
 
+	/** @test */
+	public function notFoundInCacheShouldDisplayIt() {
 		$this->_html = $this->_helper->getBoite();
 		$this->assertXPathContentContains($this->_html, '//a', 'Harry Potter et le prisonnier d\'Azkaban');
 	}
 
 
 	/** @test */
-	public function findAllByRequeteRechercheQueryWithCacheEnabled() {
-		$this->mock_cache->whenCalled('load')->answers($this->_html);
-	
+	public function foundInCacheShouldDiplayIt() {
+		$this->_helper->getBoite();
+		$this->_helper = new ZendAfi_View_Helper_Accueil_Kiosque(3, $this->getPreferences());
+		$this->_helper->setView(new ZendAfi_Controller_Action_Helper_View());
 		$this->mock_sql->clearAllRedirections();
-
 		$this->_html = $this->_helper->getBoite();
 		$this->assertXPathContentContains($this->_html, '//a', 'Harry Potter et le prisonnier d\'Azkaban');
 	}
@@ -356,7 +359,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueRequetesWithCacheEnabledTest extends Ze
 
 
 class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAfi_View_Helper_Accueil_KiosqueMurTestCase{
-	
+
 	public function getExtraPreferences() {
 		return ['id_panier' => 15,
 						'tri' => '2',
@@ -387,10 +390,10 @@ class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAf
 
 		$mes_bd = Class_PanierNotice::newInstanceWithId(47, ['libelle' => 'Mes BD',
 																												 'date_maj' => '09/10/2013']);
-		
+
 		$mes_partitions = Class_PanierNotice::newInstanceWithId(65, ['libelle' => 'Mes partitions',
 																																 'date_maj' => '08/10/2013']);
-		
+
 		$mes_jeux = Class_PanierNotice::newInstanceWithId(18, ['libelle' => 'Mes jeux',
 																													 'date_maj' => '07/10/2013']);
 
@@ -399,11 +402,11 @@ class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAf
 
 		$redacteur = Class_Users::newInstanceWithId(54)
 			->beModoBib()
-			->setPaniers([$mes_livres, 
-										$mes_musiques, 
-										$mes_partitions, 
-										$mes_recettes, 
-										$mes_jeux, 
+			->setPaniers([$mes_livres,
+										$mes_musiques,
+										$mes_partitions,
+										$mes_recettes,
+										$mes_jeux,
 										$mes_bd]);
 
 		$domaine_printemps = Class_Catalogue::newInstanceWithId(1338, ['libelle' => 'Catalogue pour le printemps']);
@@ -414,18 +417,18 @@ class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAf
 
 		$domaine_hiver = Class_Catalogue::newInstanceWithId(1341, ['libelle' => 'Catalogue pour l\'hiver']);
 
-		$catalogue_saison = Class_Catalogue::newInstanceWithId(1337, 
+		$catalogue_saison = Class_Catalogue::newInstanceWithId(1337,
 																													 ['libelle' => 'Catalogue pour chaque saison'])
 			->setSousDomaines([$domaine_printemps,
-												 $domaine_ete, 
-												 $domaine_automne, 
+												 $domaine_ete,
+												 $domaine_automne,
 												 $domaine_hiver])
 			->setPanierNotices([$series,
 													$photos,
 													$custom_roms,
 													$custom_kernels]);
 
-		
+
 
 
 		ZendAfi_Auth::getInstance()->logUser($redacteur);
@@ -443,7 +446,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAf
 			->whenCalled('find')
 			->with(15)
 			->answers($panier_du_kiosque)
-			
+
 			->beStrict();
 
 		Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Catalogue')
@@ -453,7 +456,7 @@ class ZendAfi_View_Helper_Accueil_KiosqueChangeSelectRequetesTest extends ZendAf
 			->whenCalled('findAllBy')
 			->answers($catalogue_saison->getSousDomaines())
 			;
-		
+
 		$this->_html = $this->_helper->getChangeKiosqueData();
 	}
 
@@ -488,10 +491,10 @@ class ZendAfi_View_Helper_Accueil_KiosqueTitle extends ViewHelperTestCase {
 	}
 
 	/** @test */
-	public function titleShouldContainEncodedSlashesInUrl() {
+	public function titleShouldRemoveSlashesInUrl() {
 		$this->assertContains(
-			'/recherche/simple/titre/Title+with+%2F+slash/style_liste/mur/nb_notices/20/only_img/1/aleatoire/1/tri/date_creation+desc/nb_analyse/50/op_hauteur_img/0/op_transition//op_largeur_img/0/op_auto/0/op_scroll/1/rss_avis/1/id_catalogue/0/id_panier/0">Title with / slash</a>',
-			$this->_helper->getTitre());
+													'/recherche/simple/titre/Title+with+++slash/style_liste/mur',
+													$this->_helper->getTitre());
 	}
 
 }
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php b/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
index 60045956d2e82f2b1dd644abc70fde19c1960b7f..44df708a859bc2d076032d7e07bfc5ae0b408b52 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/NewsTest.php
@@ -529,7 +529,7 @@ class NewsHelperWithThreeArticlesInDiaporamaNavigationModeTest extends NewsHelpe
 	public function sliderNavigationShouldBeCallForWidget12() {
 		$this->assertXPathContentContains($this->_head_script,
 																			'//script[@type="text/javascript"]',
-																			'$(function(){$("#boite_12").slider_navigation("' . BASE_URL . '" ,350,250,"buttons");});',
+																			'$(function(){$("#boite_12").slider_navigation({"width":"350","height":"250","strategy":"buttons","cycle":0});});',
 																			$this->_head_script);
 	}
 
@@ -538,7 +538,7 @@ class NewsHelperWithThreeArticlesInDiaporamaNavigationModeTest extends NewsHelpe
 	public function sliderNavigationShouldBeCallWithDefaultWidthAndHeight() {
 		$this->assertXPathContentContains($this->_head_script,
 																			'//script[@type="text/javascript"]',
-																			'$(function(){$("#boite_12").slider_navigation("' . BASE_URL . '" ,350,250,"buttons");});',
+																			'$(function(){$("#boite_12").slider_navigation({"width":"350","height":"250","strategy":"buttons","cycle":0});});',
 																			$this->_head_script);
 	}
 }
@@ -579,7 +579,7 @@ class NewsHelperWithThreeArticlesInDiaporamaNavigationModeNextPreviousTest exten
 	public function sliderNavigationShouldBeCallWithNextPreviousStrategy() {
 		$this->assertXPathContentContains($this->_head_script,
 																			'//script[@type="text/javascript"]',
-																			'$(function(){$("#boite_12").slider_navigation("' . BASE_URL . '" ,350,250,"next_previous");});',
+																			'$(function(){$("#boite_12").slider_navigation({"width":"350","height":"250","strategy":"next_previous","cycle":0});});',
 																			$this->_head_script);
 	}
 }
diff --git a/tests/library/ZendAfi/View/Helper/Notice/MurTest.php b/tests/library/ZendAfi/View/Helper/Notice/MurTest.php
index dc6f7dcde35a425af71fc290d33056488809d4ea..a247f3a61ec4ee4bb08420b2609debad1d019354 100644
--- a/tests/library/ZendAfi/View/Helper/Notice/MurTest.php
+++ b/tests/library/ZendAfi/View/Helper/Notice/MurTest.php
@@ -109,23 +109,23 @@ class ZendAfi_View_Helper_Notice_MurForSiteTest extends ZendAfi_View_Helper_Noti
 															 ]);
 
 		$notice->beSite();
-		$bluga = Storm_Test_ObjectWrapper::mock();
-		$bluga->whenCalled('fetchUrlToFile')
-			->with('http://www.abes.fr/',
-						 '..'.BASE_URL.'/userfiles/web_thumbnails/www_abes_fr_.jpg')
-			->answers(true)
-			->beStrict();
 
 		$file_writer = Storm_Test_ObjectWrapper::mock()
 			->whenCalled('dirExists')
+			->answers(true)
+			->whenCalled('fileExists')
 			->answers(true);
 
-		ZendAfi_View_Helper_WebThumbnail::setThumbnailer($bluga);
 		ZendAfi_View_Helper_WebThumbnail::setFileWriter($file_writer);
 
 		$this->_html = $this->_helper->notice_Mur($notice);
 	}
 
+	public function tearDown() {
+		ZendAfi_View_Helper_WebThumbnail::setFileWriter(null);
+		parent::tearDown();
+	}
+
 
 	/** @test */
 	public function divShouldNotContainsWebserviceVignette() {
diff --git a/tests/library/ZendAfi/View/Helper/WebThumbnailTest.php b/tests/library/ZendAfi/View/Helper/WebThumbnailTest.php
index 97d8c88e3c56901cba11109760cc6efc4182372d..a92227bed323926c21696d429d9310e2d14a17f8 100644
--- a/tests/library/ZendAfi/View/Helper/WebThumbnailTest.php
+++ b/tests/library/ZendAfi/View/Helper/WebThumbnailTest.php
@@ -33,6 +33,7 @@ abstract class ViewHelperWebThumbnailTestCase extends ViewHelperTestCase {
 
 	public function tearDown() {
 		$this->helper->setThumbnailer(null);
+		$this->helper->setFileWriter(null);
 		parent::tearDown();
 	}
 }
@@ -44,7 +45,13 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 		parent::setUp();
 		$this->thumbnailer = $this->mock();
 		$this->helper->setThumbnailer($this->thumbnailer);
-		$this->google_thumbnail_path = USERFILESPATH.'/web_thumbnails/www_google_com.jpg';
+		
+		$this->_file_writer = Storm_Test_ObjectWrapper::mock()
+			->whenCalled('fileExists')->answers(false)
+			->whenCalled('dirExists')->answers(true);
+		$this->helper->setFileWriter($this->_file_writer);
+
+$this->google_thumbnail_path = USERFILESPATH.'/web_thumbnails/www_google_com.jpg';
 	}
 
 
@@ -63,14 +70,17 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 			->answers(true);
 
 		$url = $this->helper->webThumbnail('http://www.google.com');
-		$this->assertEquals(BASE_URL . '/userfiles/web_thumbnails/www_google_com.jpg',
+		$this->assertEquals(BASE_URL . '/sito/webthumbnail?url=http://www.google.com',
 												$url);
 	}
 
 
 	/** @test */
 	public function googleDotComThumbnailUrlWithExistingFile() {
-		touch($this->google_thumbnail_path);
+		$this->_file_writer
+			->whenCalled('fileExists')
+			->with($this->google_thumbnail_path)
+      ->answers(true);
 
 		$this->assertFalse($this->thumbnailer->methodHasBeenCalled('fetchUrlToFile'));
 
@@ -82,6 +92,11 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 
 	/** @test */
 	public function subpageUrlWithParams() {
+		$this->_file_writer
+			->whenCalled('fileExists')
+			->with(USERFILESPATH.'/web_thumbnails/www_google_fr_search_sourceid_chrome_ie_UTF-8_q_harry_potter.jpg')
+      ->answers(true);
+
 		$this->thumbnailer
 			->whenCalled('fetchUrlToFile')
 			->with('http://www.google.fr/search?sourceid=chrome&ie=UTF-8&q=harry+potter', 
@@ -96,6 +111,11 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 
 	/** @test */
 	public function subpageUrlWithSpacesAndHTMLEntites() {
+		$this->_file_writer 
+			->whenCalled('fileExists')
+			->with(USERFILESPATH.'/web_thumbnails/astrolabe_fr_my_search.jpg')
+      ->answers(true);
+
 		$this->thumbnailer
 			->whenCalled('fetchUrlToFile')
 			->with('https://astrolabe.fr/my%20search', 
@@ -110,6 +130,11 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 
 	/** @test */
 	public function thumbnailerCannotFetchImageReturnsEmptyUrl() {
+		$this->_file_writer
+			->whenCalled('fileExists')
+			->with($this->google_thumbnail_path)
+      ->answers(false);
+
 		$this->thumbnailer
 			->whenCalled('fetchUrlToFile')
 			->with('http://www.google.com', 
@@ -117,11 +142,13 @@ class ViewHelperWebThumbnailTestReturnedUrl extends ViewHelperWebThumbnailTestCa
 			->answers(false);
 
 		$url = $this->helper->webThumbnail('http://www.google.com');
-		$this->assertEquals('',	$url);
+		$this->assertEquals(BASE_URL.'/sito/webthumbnail?url=http://www.google.com',	$url);
 	}
 }
 
 
+
+
 class ViewHelperWebThumbnailTestThumbnailer extends ViewHelperWebThumbnailTestCase {
 	/** @test */
 	public function thumbnailerDefaultsToBluga() {