Add seminar + version 00.05
authorymh@caf4f556-3d62-0410-8435-a86758001935
Fri, 13 Mar 2009 17:04:58 +0000
changeset 11 553f788214d5
parent 10 69ad5eacfee5
child 12 6b054e859160
Add seminar + version 00.05
web/index.en.html
web/index.fr.html
web/seminaires/culture2.php
web/seminaires/desirtechnologie.php
web/seminaires/experiences.php
web/seminaires/figure_amateur.php
web/seminaires/footer.php
web/seminaires/header.php
web/seminaires/ihm.php
web/seminaires/imagesvisages.php
web/seminaires/jugement.php
web/seminaires/jugementfull.php
web/seminaires/lecturessignees.php
web/seminaires/modernites.php
web/seminaires/museologie.php
web/seminaires/museologie2007.php
web/seminaires/nanotechnologies.php
web/seminaires/nanotechnologies2008.php
web/seminaires/nouveau_monde.php
web/seminaires/nv_monde_en.php
web/seminaires/pratiquejugement.php
web/seminaires/regardssignes.php
web/seminaires/res/flash/mp3player.swf
web/seminaires/res/flash/mp3playerFMS.swf
web/seminaires/res/img/consulter_doc.png
web/seminaires/res/img/culturerecherche.jpg
web/seminaires/res/img/cultureweb.png
web/seminaires/res/img/experiences_theoriques.png
web/seminaires/res/img/imagesvisages.png
web/seminaires/res/img/jugement.png
web/seminaires/res/img/lecturessignees.png
web/seminaires/res/img/modernites.png
web/seminaires/res/img/museologie.png
web/seminaires/res/img/nanotechnologies.png
web/seminaires/res/img/pdf.gif
web/seminaires/res/img/pratiquesjugement.png
web/seminaires/res/img/regards_signes.png
web/seminaires/res/img/titre_iri.gif
web/seminaires/res/img/titre_iri.png
web/seminaires/res/inc/functions.php
web/seminaires/res/js/builder.js
web/seminaires/res/js/controls.js
web/seminaires/res/js/dragdrop.js
web/seminaires/res/js/effects.js
web/seminaires/res/js/prototype.js
web/seminaires/res/js/scriptaculous.js
web/seminaires/res/js/slider.js
web/seminaires/res/js/swfobject.js
web/seminaires/res/js/unittest.js
web/seminaires/res/media/AtelierIHM-IrcamAPM.pdf
web/seminaires/res/media/Biblio_Marmottan.pdf
web/seminaires/res/media/Flyer_DesirTechnologies.pdf
web/seminaires/res/media/Flyer_Nanotechnologies-2007.pdf
web/seminaires/res/media/Flyer_Nanotechnologies-2007_08.pdf
web/seminaires/res/media/Flyer_Nanotechnologies-2009.pdf
web/seminaires/res/media/IHM07Workshop-EESI.pdf
web/seminaires/res/media/IHM07Workshop-GRAME.pdf
web/seminaires/res/media/IHM07Workshop-IRCAM.pdf
web/seminaires/res/media/IHM07Workshop-IRI.pdf
web/seminaires/res/media/IHM07Workshop-LIRIS.pdf
web/seminaires/res/media/Programme_seminaire_IRI-Politiques_Amateur.pdf
web/seminaires/res/media/WorkshopIHM07-Musique_Cinema.pdf
web/seminaires/res/media/culture2.0_presentation.pdf
web/seminaires/res/media/prgrfinal.pdf
--- a/web/index.en.html	Wed Mar 11 16:01:02 2009 +0000
+++ b/web/index.en.html	Fri Mar 13 17:04:58 2009 +0000
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<!-- Version 00.04 -->
+<!-- Version 00.05 -->
 <html>
 
   <head>
--- a/web/index.fr.html	Wed Mar 11 16:01:02 2009 +0000
+++ b/web/index.fr.html	Fri Mar 13 17:04:58 2009 +0000
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Version 00.04 -->
+<!-- Version 00.05 -->
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/culture2.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,102 @@
+<?
+
+include("header.php");
+?>
+        <a name="culture2">
+              <h1><img src="res/img/cultureweb.png" alt="Culture 2.0" /></h1>
+            </a>
+       <div><a href="res/media/culture2.0_presentation.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Consulter la présentation</a></div>
+            <p><b>Résumé :</b>
+            <p>Internet et la mutation numérique travaillent en profondeur le champ culturel.</p>
+
+           <p>L'attention s'est focalisée, dans un premier temps, sur l'impact des phénomènes de numérisation et de dématérialisation sur les industries culturelles : gains de
+productivité, phénomènes de « convergence », concurrence et coopération entre les acteurs traditionnels des filières culturelles et les acteurs issus du numérique,
+déstabilisation des modes de valorisation, d'exploitation et de distribution des 1/2uvres, exploration de nouveaux modèles économiques. </p>
+
+           <p>        L'attention tend à se déplacer désormais vers les usages numériques culturels eux mêmes, sinon vers les « contenus ». </p>
+
+           <p>        Ce changement de perspective amène à sinterroger sur la manière dont les logiciels, les services en ligne, les compétences et savoir-faire « numériques » des «
+usagers » informent les pratiques culturelles. </p>
+
+           <p>        L'objectif de ce séminaire est de dégager les lignes de force qui travaillent tant l'offre  culturelle que les pratiques culturelles. </p>
+
+           <p>         Le séminaire se propose d'explorer avec des chercheurs et des praticiens les  problématiques d'usages émergents.  Il portera une attention  particulière aux usages
+liés à l'univers du « Web 2.0 ». </p>
+
+           <p>         Plutôt que de passer en revue l'impact du numérique sur chacune des grandes filières culturelles (l'audiovisuel, l'écrit, la photographie  ou la musique), le parti a
+été retenu d'organiser le séminaire autour de quelques grandes thématiques d'usage  transversales aux filières. </p>
+
+           <p>         Ce séminaire s'adresse aux agents du DEPS : il est ouvert  aux responsables  des différentes directions du ministère de la Culture. </p>
+
+           <p>         Les travaux du séminaire s'appuieront sur un état bibliographique et donneront lieu à une synthèse. (Le détail des intervenants ultérieurs sera communiqué très
+prochainement).</p>
+
+           <p>         La séance inaugurale aura lieu le 17 octobre, à 15h Salle «Vivant Denon», Ministère de la Culture, 182 rue Saint Honoré.</p>
+
+<p>         Sauf indication différente, le séminaire se tiendra ensuite les mardi de 14h30 à 17h30.</p>
+<p>         Salle Colette.  Ministère de la Culture. 182, rue Saint-Honoré Paris   7ème étage. </p>
+<p>         Des séances auront lieu au Centre G. Pompidou. </p>
+<p>         Après le mois de février, ce séminaire se poursuivra par une suite de manifestations ouvertes au public, à linitiative de lIRI / Centre G. Pompidou.</p>
+
+
+            <p><b>Programme et horaires </b>:</p>
+            <div id="horaires">
+              <p><b>Contact </b> Y. Maignien (0140157975) et J. Beaudoin-Glandières. (0140157917)</p>
+              <p><b>Lieu</b> : Salle Colette.  Ministère de la Culture : 182, rue Saint-Honoré Paris   7ème étage. (excepté séance inaugurale)</p>
+
+              <p><b>Horaires</b> : les mardi de 14h30 à 17h30</p>
+              <p><b>Dates</b> :
+              <ul>
+        <li class="old">
+        Mardi 17 octobre 14h30
+        Ouverture du séminaire
+        Objectifs
+        Paysage technologique
+        Les convergences (informatique-audiovisuel-télécoms, fixe-mobile, image-son etc |)
+        La prééminence du logiciel
+        Le Web 2.0
+        </li>
+        <li class="old">
+        Mardi 7 novembre
+        Publier, s'exprime r,|
+        Médias personnels, nano-publication
+        Nouvelles lignes de partage entre le public et le privé
+        </li>
+        <li class="old">
+        Mardi 21  novembre
+        Rechercher, conserver, archiver, classer, indexer, taguer, annoter, géolocaliser
+        Les nouvelles pratiques documentaires : moteurs de recherche, « indexation sociale », folksonomies, « recherche communautaire ». Les nouvelles bibliothèques.
+</li>
+<li class="old">    Mardi 5 décembre
+        Commenter, juger, évaluer, coopérer, co-produire, collaborer, partager
+        Co-création et communautés</li>
+<li class="old">    Mardi 9 janvier
+        Echanger, distribuer, communiquer, accéder, faire suivre, reproduire|
+        L'Internet comme architecture
+        La neutralité technologique
+        Logiques pull et push, RSS, Web 2.0
+        Agrégation de contenus et assemblage de systèmes, mash up</li>
+<li class="old">    Mardi 23 janvier
+        Citer, emprunter, recycler, réutiliser, remixer
+        La révolution modulaire dans la musique (Culture « remix ») et dans le logiciel
+        Les nouvelles licences</li>
+<li class="old">    Mardi 6 février
+        Jouer, simuler, modéliser
+        Le jeu video : un foyer d'innovations, un « attracteur» pour les industries culturelles
+        Les nouvelles articulations virtuel-réel</li>
+<li class="old">    Mardi 20 février
+        Natifs et immigrants numériques
+        Cultures jeunes, cultures urbaines, culture numériques
+        (Mobilité, nomadisme, « culture de l'écran »)</li>
+<li>
+        Synthèse publique
+        Typologie des usages numériques culturels
+        Figures de l'usager, du consommateur, du bricoleur, de l'amateur et du pro-am (amateur-professionnel).
+        Synthèse des problématiques prospective
+</li>
+              </ul>
+            </div>
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/desirtechnologie.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,89 @@
+<?
+include("header.php");
+?>
+<a name="desirtechnologie">
+  <h2>Désir et technologies</h2><br />
+</a>
+<div id="abstract">
+  <h4>Destins du désir / devenirs de l'amateur : adolescence, subjectivations, addictions, dans le contexte des industries culturelles</h4>
+  <p>Séminaire de l'Institut de recherche et d'innovation du Centre Pompidou, organisé avec la collaboration de <a href="http://www.hopital-marmottan.fr">l'Hôpital Marmottan</a> et de <a href="http://www.ed-psycha.org">L'Ecole Doctorale de Recherche en Psychanalyse (CEPP) de l'Université Paris VII.</a></p>
+  <p>Sous la direction de <b>Mathilde Girard</b> (psychologue-psychothérapeute et philosophe).</p>
+  <p>
+    A partir des figures de l'enfant et de l'adolescent aujourd'hui investies par une multiplicité de discours - sociologiques, philosophiques, psychologiques, mais politiques et médiatiques également -, il s'agirait ici de revenir sur ce que représentent ces catégories de la population au regard du processus de « modernisation », et sur la fonction politique de leur singularisation. Entre les parts de marché qu'elles représentent (l'exemple de la création de la nouvelle chaîne télévisée Baby first est de ce point de vue très éloquent), les interrogations et les inquiétudes qu'elles soulèvent dans le champ social et les enjeux psychanalytiques qu'elles recouvrent, comment distinguer les repères anthropologiques propres à la construction de la subjectivité des pathologies spécifiquement contemporaines ? Comment comprendre et analyser, avec les outils de la métapsychologie, les formes actuelles de désorganisation psychique des sujets au contact d'une machine capitalistique dévorante et destructrice ? Si par exemple l'opposition, le refus, pouvaient être identifiées comme des modalités d'expression et d'apparition de subjectivités avec lesquelles il nous faut toujours en découdre, comment le « trouble oppositionnel avec provocation » (TOP) est-il devenu un « trouble des conduites » suivant les résultats de l'enquête menée par L'Inserm en 2005 ? Si l'enfance et l'adolescence font symptôme, il convient de s'attarder sur les déterminants de ces manifestations, leur origine et leur valeur d'usage.<br />
+    Dans le cadre d'une réflexion sur les industries culturelles, et à l'aide des développements critiques que propose la philosophie contemporaine, il s'agirait d'élaborer les enjeux politiques posés par l'enfant et l'adolescent dans leur rapport aux objets, aux nouvelles technologies, quand ceux-ci en font des consommateurs abusifs, captifs, ou lorsqu'ils engagent au contraire des capacités de jugement et des processus de subjectivation inédits.<br />
+    Nous proposerons ainsi de mobiliser l'actualité de la notion de jeu, à partir des écrits sur l'enfance de Benjamin, de Baudelaire, de Bataille et des analyses plus récentes de Deleuze et Agamben ; il s'agirait de mettre en évidence la fonction inaugurale du jeu, de la manipulation des objets par l'enfant dans l'activité créatrice, l'expérience esthétique et la sublimation. Le jeu apparaissant comme fondateur d'une relation transitionnelle d'un sujet aux objets qui l'environnent, au travers de différentes étapes de cette relation : saisir l'objet, le regarder, l'ouvrir, le casser, le perdre, le retrouver...<br />
+    Des passerelles pourront se tisser entre ces expériences philosophiques et la théorie psychanalytique qui fit du jeu le moment premier de la symbolisation et de la capacité d'imaginer ; la scène du fort/da décrite par Freud dans Au Delà du principe de plaisir, ainsi que les caractéristiques de l'objet transitionnel « créé-trouvé » déployées par Winnicott étayeront notre élaboration.<br />
+    A partir de la distinction établie par Winnicott entre play et game, nous avancerons vers la problématique adolescente et les nouveaux modes de relation qu'elle met en place avec l'objet, dans le cas des addictions (le jeu pathologique), des pathologies dites « narcissiques », des conduites ordaliques, entre autres. Partant de l'analyse de ces comportements, à la jointure de la psychopathologie et de la sociopathologie, nous tenterons de mettre en évidence les différents processus de subjectivation que recouvrent ces expressions de l'adolescence, qu'ils soient positifs ou négatifs, en établissant des liens avec leurs manifestations sociales et politiques. C'est alors plus largement sur la possibilité d'aborder l'adolescence sous l'angle de l'événement, de l'expérience et de la transmission que nous souhaitons nous pencher.<br />
+    Au cours de cette réflexion, où la question du désir, de ses définitions, de son caractère intempestif, seront un repère essentiel, nous avancerons dans un dialogue entre concepts psychanalytiques et philosophiques : ainsi, la symbolisation, la sublimation, n'iront pas sans une élaboration politique de la mémoire, de l'expérience, et de l'histoire ; c'est ensemble que nous tenterons de penser les modalités disciplinaires, biopolitiques, psychologiques, par lesquelles s'exerce le pouvoir (B.Stiegler invite ainsi à penser la notion de « psychopouvoir ») et les pratiques de soi, les subjectivations et résistances qui en découlent ou s'en émancipent.<br /> 
+    Nous tenterons de mobiliser ces questions par le développement de la figure l'amateur, par opposition à celle du consommateur (de télévision, de ritaline) dans le contexte des industries culturelles et de la médicalisation de la société.<br />
+    Dans le cadre d'une organisation associant l'Institut de recherche et d'rnnovation du Centre Pompidou, l'Hôpital Marmottan, L'Ecole Doctorale de Recherche en Psychanalyse (CEPP) de l'Université Paris VII et travaillant à la préparation d'un colloque sur la question du désir prévu en 2010, le séminaire se propose d'agencer des interventions théoriques et cliniques à partir de différents axes de travail :<br /> 
+  
+  <div style="margin-left:30px">
+    <u>L'enfant et l'objet aux origines de la symbolisation</u><br />
+    <ul>
+      <li>L'objet - l'espace transitionnel</li>
+      <li>L'utilisation de l'objet, la créativité et la symbolisation</li>
+      <li>L'objet/ la technique</li>
+      <li>Du play au game</li>
+    </ul>
+    
+    
+    <u>Destins de l'objet et du désir à l'adolescence</u><br />
+    <ul>
+      <li>Addictions et pathologies narcissiques</li>
+      <li>Le jeu pathologique</li>
+      <li>Conduites ordaliques</li>
+      <li>Le contact des images</li>
+      <li>Le cas de la pornographie</li>
+    </ul>
+    
+    <u>L'enfance et l'adolescence : nouvelles catégories à risques</u><br />
+    <ul>
+      <li>De la psychopathologie à la sociopathologie : quels enjeux politiques ?</li>
+      <li>Retour sur « les troubles du comportement » et l'étude de l'INSERM en 2005.</li>
+      <li>L'adolescent, le passage à l'acte : clinique du fait divers</li>
+      <li>L'adolescent et l'événement : retour sur le soulèvement des banlieues en novembre 2005.</li>
+    </ul>
+    
+    <u>Subjectivations - Désir et technique</u><br />
+    <ul>
+      <li>Processus de subjectivation à l'adolescence</li>
+      <li>L'avenir de l'amateur : du désir dans la culture ?</li>
+      <li>Actualité des enjeux capitalistiques dans l'économie libidinale</li>
+    </ul>
+    
+    <u>La mémoire, l'archive et la transmission</u><br />
+    <ul>
+      <li>Expérience et mémoire</li>
+      <li>Hypomnemata</li>
+      <li>Technologies de l'Esprit</li>
+      <li>Appareils</li>
+    </ul>
+  </div>
+  </p>
+  <p>
+    <a href="res/media/Biblio_Marmottan.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Bibliographie sur le jeu et le jeu pathologique par Clotilde Carrandié de l'hôpital Marmottan</a>
+  </p>
+</div>
+
+<div id="horaires">
+    <p><b>Accès</b> Sur invitation: contact(at)iri.centrepompidou.fr</p>
+    <p><b>Lieux</b>: Salle du collège</p>
+    <p><b>Dates et horaires </b>: de 18h à 20h, les jeudis suivants:</p>
+    <ul>
+        <li>17 janvier 2008&nbsp;: ouverture du séminaire par Mathilde Girard&nbsp;: « Enfance et politique du jeu à partir de <i>Dr  Mabuse, le joueur</i> de Fritz Lang ».</li>
+        <li>31 janvier 2008&nbsp;: Bernard Stiegler: «&nbsp;Considérations sur l'amateur d'un point de vue pharmacologique&nbsp;»; interviendront également François Richard, Marc Valleur et l'équipe de l'Hôpital Marmottan.</li>
+        <li>21 février 2008&nbsp;: Tristan Garcia-Fons (pédopsychiatre et psychanalyste)&nbsp;: «&nbsp;La fabrique du trouble de l'enfant et de l'adolescent&nbsp;», Philippe Bazin (photographe)&nbsp;: «&nbsp;Larry Clark - le corps du délit&nbsp;» et Georges Didi-Huberman (philosophe et historien de l'art).</li>
+        <li>13 mars 2008&nbsp;: Stéphane Nadaud (pédopsychiatre, praticien hospitalier et philosophe, rédacteur en chef de la revue Chimères)&nbsp;: «&nbsp;L'adolescence comme nouveau paradigme du travail institutionnel en clinique hospitalière&nbsp;» et Philippe Giesberger (infirmier et cadre de santé, secteur i03 de Ville-Evrard)&nbsp;: «&nbsp;Rencontre avec des adolescents en pédopsychiatrie en direct de l'unité adolescents 93&nbsp;». <span style="color: red;">SALLE STRAVINSKY, IRCAM</span></li>
+        <li>3 avril 2008&nbsp;: Christiane Vollaire (philosophe, enseignante en philosophie et membre du comité de rédaction des revues Drôle d'époque et Pratiques)&nbsp;: «&nbsp;Puissances de reproduction&nbsp;».</li>
+        <li>17 avril 2008&nbsp;: Alain Brossat (philosophe, professeur de philosophie à l'Université Paris VIII et membre du comité de rédaction des revues Lignes et Drôle d'époque)&nbsp;: à partir d'Orange Mécanique de Stanley Kubrick, «&nbsp;Le grand jeu d'Alex&nbsp;» et Eric Toubiana (psychanalyste, maître de conférence à l'Université Paris VII Denis Diderot et psychothérapeute hospitalier)&nbsp;: «&nbsp;Le Divan électrique&nbsp;».</li>
+        <li>15 mai 2008&nbsp;: Marc Valleur, Eric Toubiana, Paul-Laurent Assoun&nbsp;: «&nbsp;Addictions et pratiques ordaliques&nbsp;».</li>
+        <li>22 mai 2008&nbsp;: Jean-Louis D&eacute;otte (philosophe et professeur de philosophie à Paris VIII) : « Les Immat&eacute;riaux  de Jean-François Lyotard et le Double Plateau de Daniel Buren », Emine Sarikartale (doctorante en philosophie &agrave; Paris VIII) : « Enfance et postmodernit&eacute; chez Lyotard », et Marta Hernandez (doctorante en philosophie à Paris VIII) : « La question de la kh&ocirc;ra dans Les Immat&eacute;riaux ».</li>
+        <li>5 juin 2008&nbsp;: Elisabeth Belmas (historienne du jeu)&nbsp;: « La question des jeux d'argent ».</li>
+        <li> 26 juin 2008&nbsp;: Elisabeth Rossé (psychologue), Thomas Gaon, Serge Tisseron (psychiatre et psychanalyste)&nbsp;: «&nbsp;Autour des jeux vidéos&nbsp;».</li>
+    </ul>
+</div>
+
+<p>
+  <a href="res/media/Flyer_DesirTechnologies.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Flyer du séminaire</a>
+</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/experiences.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,49 @@
+<?php
+
+include("header.php");
+?>
+    <a name="theorie"><h3><img src="res/img/experiences_theoriques.png" alt="Experiences theoriques" /> </h3></a>
+
+            <p><b>Abstract</b> : Le Groupe de Recherches Théoriques se propose de mettre en relation des chercheurs de disciplines et de provenances diverses, dans le but de 
+parvenir à une écoute réciproque attentive et, si possible, au tracé de croisements utiles.</p>
+            <p>Le programme de cette année d'ouverture ( 2006-2007 : « Expériences théoriques »), se donne deux objectifs. En premier lieu, des chercheurs sont invités à 
+présenter, en dehors de leur communauté de travail coutumière, l'expérience actuelle de leur recherche : non pas un exposé de résultats acquis, mais une introduction à un 
+mouvement en cours, quand celui-ci approche un de ses points de plus grande incertitude ou instabilité. On voudrait tenter d'entrevoir dans, chaque cas, la ligne, la frontière du clair et de l'obscur, du connu et de l'énigme. Mais par là-même, et en second lieu, il sagirait pour chacun dinterroger ce quil en est des fonctions et utilités du théorique comme 
+tel : en quoi et comment «la théorie» (dispositifs et appareils critiques, construction de modèles formels) ouvre des voies ou fait obstacle à la poursuite d'un chemin 
+d'expérience (expérience de recherche, de travail, voire de vie individuelle ou partagée). </p>
+            <p>Les « Expériences théoriques » pourraient essayer ainsi de poser un jalon pour une redéfinition de l'enjeu de la pensée formelle, et de sa nécessité (ou pas) dans 
+la formulation des questions que nous adresse le monde qui se reconfigure devant nous, et en nous.</p>
+            <p>Cette visée contribue en cela directement aux objectifs de l'IRI, en particulier là où, à travers sa pensée des appareils critiques, et en particulier des 
+appareils technologiques dans leurs rapports aux appareils physiologiques et sociaux, il tente de poser à nouveaux frais les questions de l'analyse et de la synthèse, c'est-à-dire d'une nouvelle théorie du jugement, qui puisse  accompagner les démarches empiriques de ses divers ateliers, par exemple celui qui est actuellement conduit autour 
+des <i>Lignes de temps</i> sous le nom de <i>Regards signés.</i></p>
+            <p>Le Groupe propose pour cette première année deux sortes de séances : une série de conférences publiques, alternant avec des réunions de travail sur inscriptions. 
+Les séances ont lieu en Sorbonne, à 19h, les deuxième et quatrième mardis de chaque mois, à l'exception des périodes de vacances scolaires ou universitaires. Les lieux sont 
+indiqués ci-dessous.</p>
+
+            <p><b>Programme des Conférences publiques</b> :</p>
+            <br />
+            <div id="horaires">
+              <p><b>Lieu</b> : en Sorbonne, amphithéâtre Milne-Edwards, 17 rue de la Sorbonne, escalier B, 3ème étage.</p>
+              <p><b>Horaires</b> : 19 heures</p>
+             <p><b>Accès</b> : dans la limite des places disponibles</p>
+             <p><b>Dates</b> :
+
+              <ul>
+                <li class="old">26 septembre : Denis Guénoun (Paris-Sorbonne), <i>Dramaturgie du football et question nationale</i></li>
+                <li class="old">24 octobre :        Marcello Vitali Rosati (Pise) : <i>Réflexions pour une resémantisation du concept de virtuel</i></li>
+                <li class="old">28 novembre : Bernard Stiegler (Centre Georges Pompidou), <i>Critique et théorie</i></li>
+                <li class="old"> 9 janvier : Sarah Kay (Princeton), <i>Poésie, vérité, et le sujet supposé savoir</i></li>
+                <li class="old"> 13 février : Thomas Dommange (Montréal), <i>Pourquoi une théorie de l'espace musical ?</i></li>
+
+                <li class="old"> 13 mars, Jean-Baptiste Brenet (Paris X - Nanterre),<i> L'averroïsme difficile : intellect, morale et politique</i></li>
+                <li class="old"> 24 avril : Michel Deguy (Paris VIII et revue Poésie), <i>Une poétique est-elle une théorie ?</i></li>
+                <li> 22 mai, Judith Butler (Berkeley), <i>Geste, performativité, critique</i></li>
+              </ul>
+              </p>
+              <p>Direction : <b>Denis Guénoun</b></p>
+              <p>Coordination : <b>Johann Holland</b> : <a href="mailto:information.grt@gmail.com">information.grt@gmail.com</a></p>
+            </div>
+
+<?php
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/figure_amateur.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,29 @@
+<?
+include("header.php");
+?>
+<a name="figure_amateur">
+  <h2>Les figures de l'amateur</h2><br />
+</a>
+<div id="abstract">
+  <p>Sous la direction de <b>Jacqueline Lichtenstein</b>, Université Paris IV.</p>
+  <p align="right"><a href="http://web.iri.centrepompidou.fr/fonds/seminaires/seminaire/detail/1">Les figures de l'amateur dans <i>Lignes de temps</i></a></p>
+  <p>
+    Le terme d'amateur a perdu le sens précis qu'il avait dans la langue du XVIIème et du XVIIIème siècles. Des « particuliers », qui n'étaient ni peintres ni sculpteurs, pouvaient être élus à l'Académie royale de peinture et de sculpture en raison du goût qu'ils professaient pour les arts ; ils y siégeaient au rang d' « amateurs ». L'usage du terme s'est depuis considérablement élargi et n'est plus aujourd'hui limité au seul domaine de l'art : on peut être amateur de bons vins comme d'opéras. Mais il s'est également déplacé du champ du goût à celui des activités. Il désigne en effet ces activités auxquelles on s'adonne par plaisir, parce qu'on aime ça, et non pour des raisons professionnelles. On peut faire du théâtre, de la peinture ou de la musique en amateur, mais aussi pratiquer le rugby ou le vélo en appartenant à une équipe d'amateurs. A la distinction ancienne entre amateurs et artistes, qui n'était pas une distinction hiérarchique puisque tous portaient le titre d'académiciens, s'est substituée l'opposition entre amateurs et professionnels qui implique une image socialement dévalorisée et dévalorisante de l'amateur, toujours suspecté de faire preuve d'amateurisme ! Nous nous proposons dans ce séminaire d'étudier la constitution puis la transformation de cette figure de l'amateur dans le champ de l'art, afin d'en saisir les raisons et les enjeux, à la fois artistiques, philosophiques, politiques et sociaux.
+  </p>
+</div>
+
+<div id="horaires">
+    <p><b>Accès</b>: Sur invitation</p>
+    <p><b>Contact séminaire</b>: Yves-Marie L'Hour à l'adresse contact(at)iri.centrepompidou.fr</p>
+    <p><b>Lieux</b>: Salle du collège</p>
+    <p><b>Dates et horaires </b>: de 17h à 19h, les mardis suivants :</p>
+    <ul>
+        <li>22 janvier 2008</li>
+        <li>26 février 2008</li>
+        <li>25 mars 2008</li>
+        <li>8 avril 2008</li>
+        <li>13 mai 2008</li>
+        <li>17 Juin 2008</li>
+    </ul>
+</div>
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/footer.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,7 @@
+  
+  </div>
+          </div>
+
+  </body>
+</html>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/header.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,24 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- Johmathe : CVS  johan mathe le ven fév 17 03:12:11 CET 2006 -->
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta name="description" content="Institut de rechcerche et d'innovation" />
+    <meta name="author" content="Johan MATHE" />
+    <title>Institut de Recherche et d'innovation</title>
+    <link href="../res/css/style.css" rel="stylesheet" type="text/css" />
+	<script type="text/javascript" src="res/js/prototype.js"></script>
+	<script type="text/javascript" src="res/js/scriptaculous.js?load=effects,controls"></script>
+ </head>
+
+  <body>
+    <div>
+      <a href="http://www.iri.centrepompidou.fr"><img src="../res/img/logo-iri-petit.png" class="logo" alt="Logo Iri" /></a>
+    </div>
+    
+    <div id="layer1">
+      <div id="layer2">
+
+        <h1><img src="../res/img/titre_iri.png" alt="Institut de recherche et d'innovation" /></h1>
+        <br /><br />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/ihm.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,88 @@
+<?php
+include("header.php");
+?>
+
+
+<h3>IHM 2007</h3>
+<div>
+  <p><small>13-15 novembre 2007
+    Ircam </small><a href="http://ihm07.ircam.fr/" title="Site Officiel IHM 2007" target="_blank">(site officiel) </a></p>
+</div>
+
+
+<h4>abstract</h4>
+
+
+Interfaces pour l&rsquo;annotation et la manipulation d&rsquo;objets temporels : une comparaison des outils et des paradigmes dans le domaine musical et cin&eacute;matographique
+<br/>
+<h5>Organisateurs :</h5>
+<br/>
+<ul>
+	<li>
+	IRI (Institut de Recherche et d&rsquo;Innovation/Centre Pompidou)
+	Vincent Puig, Xavier Sirven, Thibaut Cavali&eacute;
+	http://www.iri.centrepompidou.fr
+	contact : vincent.puig@centrepompidou.fr
+	</li>
+	<li>
+	LIRIS
+	Yannick Pri&eacute;, Olivier Aubert
+	http://liris.cnrs.fr
+	</li>
+	<li>
+	&eacute;ESI (&eacute;cole Europ&eacute;enne Sup&eacute;rieure de l&rsquo;Image)
+	Jean Marie Dallet, Fr&eacute;d&eacute;ric Curien
+	http://www.eesi.eu
+	</li>
+	<li>
+	IRCAM (&eacute;quipes Analyse des pratiques musicales et Analyse Synthèse)
+	Nicolas Donin, Samuel Goldszmidt, Geoffroy Peeters
+	http://www.ircam.fr
+	</li>
+	<li>
+	GRAME
+	Yann Orlarey
+	http://www.grame.fr
+	</li>
+</ul>
+</div>
+
+<br/>
+
+<p>
+Cet atelier se propose d&rsquo;&eacute;tudier de façon d&eacute;taill&eacute;e, diff&eacute;rentes IHM d&eacute;velopp&eacute;es pour l&rsquo;annotation et la manipulation d&rsquo;objets temporels dans le domaine cin&eacute;matographique comme dans le champ musical. L&rsquo;objectif &eacute;tant de croiser les motivations et m&eacute;thodologies qui ont abouties au design d&rsquo;interfaces innovantes dans le domaine et de d&eacute;gager de possibles paradigmes communs.
+
+L&rsquo;atelier s&rsquo;articulera autour de pr&eacute;sentations d&rsquo;outils d&rsquo;annotation et de manipulation de documents  musicaux et cin&eacute;matographiques en consid&eacute;rant les dimensions suivantes:
+<ul>
+	<li>IHM pour l&rsquo;analyse et la segmentation des flux temporels (discrimination d&rsquo;unit&eacute;s de sens par m&eacute;thodes d&rsquo;extraction automatique ou manuelles)</li>
+	<li>IHM pour la symbolisation/repr&eacute;sentation/description des unit&eacute;s de sens (probl&eacute;matiques de niveau s&eacute;mantique, langages, notations)</li>
+	<li>IHM pour la manipulation et le traitement des &eacute;l&eacute;ments annot&eacute;s (probl&eacute;matiques de masse de donn&eacute;es, contextes de publication et de partage, interaction live ou temps diff&eacute;r&eacute;).</li>
+</ul>
+<br/>
+</p>
+<br/>
+<p>
+Une dimension transversale est celle de la pr&eacute;sentation et de l&rsquo;interaction avec les unit&eacute;s de description des documents temporels.
+<br/>
+La pr&eacute;sentation s&rsquo;appuiera notamment sur des exemples d&rsquo;IHM issus des outils en cours de d&eacute;veloppement chez les participants de l&rsquo;atelier, à savoir le logiciel Lignes de temps pour l&rsquo;annotation cin&eacute;matographique d&eacute;velopp&eacute; par l&rsquo;IRI - Centre Pompidou, le logiciel Advene du LIRIS pour l&rsquo;analyse et l&rsquo;annotation de documents temporels et la r&eacute;alisation d&rsquo;hypervid&eacute;o, le logiciel SLIDERS pour la performance temps r&eacute;el sur base de donn&eacute;es audio visuelles et les outils. Pour la partie musicale seront pr&eacute;sent&eacute;s des outils d&rsquo;annotation de la musique d&eacute;velopp&eacute;s dans l&rsquo;&eacute;quipe Analyse des pratiques musicales de l&rsquo;Ircam en collaboration avec l&rsquo;&eacute;quipe Analyse Synthèse (outil de visualisation de segmentation automatique, segmentation en unit&eacute;s s&eacute;miotiques temporelles, projet RNTL Scenari, outil pour la publication de parcours dans une oeuvre, description s&eacute;mantique de la partition à base de formes g&eacute;om&eacute;triques) ainsi que des outils d&rsquo;annotation à vis&eacute;e p&eacute;dagogique d&eacute;velopp&eacute;s par le GRAME dans le cadre du projet europ&eacute;en VEMUS.
+<br/><br/>
+L&rsquo;IRI et le LIRIS collaborent à l&rsquo;exp&eacute;rimentation de nouvelles formes de pratiques cin&eacute;philiques et p&eacute;dagogiques dans le cadre du projet RIAM Cin&eacute; Lab (Annotation de films et partage d&rsquo;annotation sur postes de travail, sites Web et dispositifs mobiles).
+SLIDERS est un laboratoire de recherche artistique au sein de l&rsquo;&eacute;ESI ; il b&eacute;n&eacute;ficie du soutien du Ministère de la Culture et de la Communication, DAP, Direction de la Recherche et de l&rsquo;Innovation.
+<br/><br/>
+Nous invitons d&rsquo;autres contributeurs à nous soumettre des propositions de pr&eacute;sentation courte (10 minutes) d&rsquo;outils d&rsquo;annotation d&rsquo;objets temporels en envoyant une proposition et si possible un accès au logiciel à l&rsquo;adresse : <a href="mailto:contact@iri.centrepompidou.fr">contact@iri.centrepompidou.fr</a>
+</p>
+<br/>
+<br/>
+
+<p>
+	<a href="res/media/WorkshopIHM07-Musique_Cinema.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Interfaces pour l'annotation et la manipulation d'objets temporels</a><br />
+    <a href="res/media/IHM07Workshop-EESI.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />EESI : SLIDERS, tentative de cinéma interactif collectif</a><br />
+    <a href="res/media/IHM07Workshop-GRAME.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />GRAME : L'annotation de partitions musicales à des fins pédagogiques : l'exemple de Vemus</a><br />
+    <a href="res/media/IHM07Workshop-IRCAM.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />IRCAM : Interface de navigation musicale par le contenu</a><br />
+    <a href="res/media/IHM07Workshop-IRI.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />IRI : Lignes de temps, une plateforme collaborative pour l'annotation de films et d'objets temporels.</a><br />
+    <a href="res/media/IHM07Workshop-LIRIS.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />LIRIS : Annotations de documents audiovisuels Temporalisation et spatialisation</a><br />
+    <a href="res/media/AtelierIHM-IrcamAPM.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />IRCAM : Annoter la musique : de la segmentation de fichiers audio à la publication d'articles multimédia</a><br />
+</p>
+<?php
+include("footer.php");
+?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/imagesvisages.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,56 @@
+<?
+
+include("header.php");
+?>
+
+        <a name="imagesvisages"> </a>
+        <h3><img src="res/img/imagesvisages.png" alt="Séminaire images et visages" />
+	<font size=4 color=red>Seminaire report&eacute;</font></h3>
+        <div id="abstract">
+          <p>
+          <b>abstract</b> : Artistes &amp; Associés et l'Institut de Recherche et d'Innovation du Centre Pompidou, proposent à l'initiative de Bernard Stiegler, un dispositif 
+visuel et intellectuel dont l'enjeu est d'inscrire dans le temps une réflexion sur les images. Ce dispositif prend appui sur l'expérience d'une récente rencontre à Biarritz 
+dans le cadre de la manifestation Grande Plage # 1. Rencontre marquée par l'image en mouvement d'un visage d'enfant qui regarde une image, et sur le regard de qui nos premières 
+réflexions en commun se sont esquissées.</p>
+
+          <p>Il s'agit de réunir pendant une saison, à intervalles réguliers de deux mois, <i>Christian Caujolle</i>, <i>Pascal Convert</i>, <i>Georges Didi-Huberman</i> et 
+<i>Bernard Stiegler</i> à qui, chaque fois, seront proposés par Artistes &amp; Associés de brefs moments d'images susceptibles de faire lever une problématique. La forme du 
+feuilleton devrait permettre un véritable travail, c'est-à-dire une façon d'approfondir le regard par répétitions et variations successives. </p>
+
+          <p>Il s'agit aussi d'un dispositif visuel, voire télévisuel et diffusable. Les membres d'Artistes &amp; Associés filment la manifestation avec plusieurs caméras, de 
+façon à ne pas séparer les images regardées sur l'écran des visages qui les regardent. À ne pas séparer non plus les visages - et les réactions - des auditeurs et ceux des 
+intervenants. On espère ainsi, en ne séparant pas images et visages, biaiser le rapport spectaculaire standard (rapport standard qui perdure lorsqu'on assiste au «| spectacle| 
+» d'intellectuels en train de parler, en public ou devant une caméra).</p>
+
+          <p>La rencontre des problématiques des uns et des autres semble, pour le moment, privilégier la question de la fabrique de l'image et du sort esthétique - mais 
+politique tout aussi bien - qui est fait à ceux qui, d'ordinaire, ne sont pas «| acteurs| » mais «| figurants| » de l'Histoire. Comment représente-t-on, comment 
+photographie-t-on, comme filme-t-on - dignement s'entend - ceux qui n'ont ni la parole ni l'autorité pour se mettre en scène| ? C'est encore une question de visage et 
+d'envisagement.</p>
+
+          <p><b>Modalités pratiques</b></p>
+
+          <p>Les séances de projection sont enregistrées puis débattues à la séance suivante. Ce séminaire s'inscrit dans l'axe de recherche «| Jugement| » mené par l'Institut 
+de Recherche et d'Innovation.</p>
+          <p><font color="red" size=4><b>En raison d'un retard dans les travaux de r&eacute;novation de la Salle de l'IRI, la suite du s&eacute;minaire "Images et Visages" est report&eacute;e &agrave; l'automne 2007.</b></font></p>
+	  <div id="horaires">
+            <p><b>Lieu</b> : Centre Pompidou, petite salle (niveau -1)</p>
+            <p><b>Accès</b> : Chercheurs, étudiants et professionnels sur inscription.</p>
+            <p><b>Dates et horaires </b> : de 18h à 20h, les mardis suivants :</p>
+
+            <ul>
+              <li class="old">24 octobre </li>
+              <li class="old">14 novembre </li>
+              <li class="old">26 janvier (Séance publique au FIPA Biarritz)</li>
+              <li class="old">13 mars<font color=orange> (report&eacute;)</font></li>
+	      <li>15 mai<font color=orange> (report&eacute;)</font></li>
+	    </ul>
+                 <p><b>Inscriptions</b> : <a href="mailto:contact@iri.centrepompidou.fr">contact@iri.centrepompidou.fr</a></p>
+
+          </div>
+
+
+
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/jugement.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,61 @@
+<?
+
+include("header.php");
+?>
+            <a name="jugement">
+
+              <h3><img src="res/img/jugement.png" alt="Séminaire Jugement" /></h3>
+              <h4>Sur la faculté de jouer</h4>
+            </a>
+            <div id="abstract">
+              <p>
+              <b>Abstract </b>:
+
+              Le séminaire interrogera la question du jugement qui est au coeur des préoccupations de l'IRI en se donnant, dans un premier temps, un objet circonscrit : 
+tenter danalyser la différence entre le jugement de goût, qui est supposé qualifier depuis les modernes la position de spectateur, et les jugements qui se forment chez des 
+praticiens de la scène pendant le jeu.</p>
+<p>           Dans ce but, on se propose de réfléchir sur des textes ou sur des pratiques qui ont voulu développer lidée dun théâtre fait pour ceux qui le jouent : théâtre 
+imaginé non pas pour le bénéfice ou le plaisir des spectateurs appelés à le voir, mais dont la raison dêtre principale se cherche dans leffet à produire chez les acteurs qui 
+(se) le présentent. On pense en particulier au théâtre pédagogique des Jésuites, dont la représentation nétait pas exclue mais qui se donnait comme finalité principale de 
+contribuer à la formation (morale, théologique, humaine) des acteurs amateurs, au sens moderne du mot; aux fictions diderotiennes dun théâtre sans spectateurs ; au 
+théâtre didactique de Brecht, parfois interdit à la représentation publique, et ne valant que comme exercice pour les comédiens ; aux exercices de Grotowski et de ses 
+continuateurs.</p>
+<p>           Dans un deuxième temps, le séminaire tentera dutiliser les acquis de cette analyse pour aborder plus largement les questions liées au jugement : concepts, 
+appareils, programmation, pratiques critiques dans le but de contribuer de façon plus directe à la préparation du colloque sur le jugement prévu pour décembre 2007.</p>
+            </div>
+
+            <div id="horaires">
+              <p><b>Accès </b>: limité et sur inscription</p>
+              <p><b>Dates </b>:</p>
+              <ul>
+                <li class="old">Jeudi 19 octobre, 10h-12h| :        Présentation générale| : Denis Guénoun.</li>
+                <li class="old">Jeudi 9 novembre, 10h-12h| :        Sur le théâtre pédagogique des Jésuites| : avec la participation de Jean-Marie Valentin (Les Jésuites et le théâtre, 
+Desjonquères, 2001).</li>
+                <li class="old">Jeudi 23 novembre, 10h-12h| :       Sur le théâtre  à la «| Maison de Saint Louis à Saint-Cyr| », avec la participation de Georges Forestier (Jean Racine, 
+Gallimard, 2005).</li>
+                <li class="old">Jeudi 7 décembre, 10h-12h| :        Sur les Entretiens sur le fils Naturel, de Diderot, avec la participation de Pierre Frantz (Lesthétique du tableau dans 
+le théâtre du XVIIIème siècle, PUF,| 1998).</li>
+                <li class="old">Jeudi 21 décembre, 10h-12h| :       A propos de la lecture de Diderot par Eisenstein («| Diderot a parlé de cinéma| », dans Le Mouvement de lart, Cerf, 
+1980).      </li>
+                <li class="old">Jeudi 11 janvier, 10h-12h| :        (programme en cours) </li>
+
+                <li class="old">Lundi 5 février, 14h30-16h30| :     A propos des ateliers de Jerzy  Grotowski| : avec la participation de Georges Banu (Exercices daccompagnement, 
+lEntretemps, 2002).</li>
+                <li class="old">Lundi 19 février, 14h30-16h30| : A propos dune expérience contemporaine| : lAtelier de recherche théâtrale (dirigé par Emmanuel Ostrovski)</li>
+                <li class="old">Lundi 5 mars, 14h30-16h30| :        Sur le théâtre didactique de Brecht| : avec la participation dHervé Loichemol (metteur en scène).</li>
+
+                <li class="old">Lundi 19 mars, 14h30-16h30| : (programme communiqué ultérieurement)</li>
+                <li class="old">Lundi 30 avril, 14h30-16h30| : (programme communiqué ultérieurement)</li>
+                <li class="old">Lundi 14 mai, 14h30-16h30: (programme communiqué ultérieurement)</li>
+                <li>Lundi 4 juin, 14h30-16h30: (programme communiqué ultérieurement) </li>
+                <li>Lundi 18 juin, 14h30-16h30| : (programme communiqué ultérieurement)</li>
+                </ul>
+                <p>Coordination du séminaire : <b>Denis Guénoun, Julien Abriel</b> </p>
+                <p><a href="mailto:facdejouer@gmail.com">facdejouer@gmail.com</a></p>
+              </ul>
+            </div>
+
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/jugementfull.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,153 @@
+<?
+
+include("header.php");
+?>
+<h1>La pratique peut-elle être une instance de jugement aujourdhui ?</h1>
+<h2>Ethique foucaldienne et art contemporain</h2>
+<br/>
+<p align="justify">Ce nouveau séminaire 
+aura pour objet l&rsquo;articulation de la pratique artistique et du jugement 
+critique. Il prendra appui sur un séminaire engagé en 2006 à Paris 
+X, consacré aux impasses formalistes auxquelles s&rsquo;est confronté 
+l&rsquo;art conceptuel et néo-conceptuel. En nous appuyant sur les écrits 
+de Jeff Wall, nous avions étudié comment l&rsquo;interrogation de l&rsquo;institution 
+par les pratiques conceptuelles et néo-conceptuelles de l&rsquo;art avaient 
+succombé à une institutionnalisation de ces pratiques, et un mouvement 
+de retour à des positions formalistes plus ou moins explicites, et, 
+par voie de conséquence, au renforcement de la lecture greenbergienne 
+de l&rsquo;histoire de l&rsquo;art moderne. <br/></p>
+<p align="justify">      Ces 
+analyses nous ont amené à reposer l&rsquo;importance pour l&rsquo;art, pour 
+sa production comme pour sa réception, de la notion d&rsquo;expérience 
+sans contenu. « L&rsquo;expérience esthétique nous forme, modifie nos 
+sentiments et nous transforme : c&rsquo;est pourquoi, selon Kant, on a besoin 
+d&rsquo;art ». (Jeff Wall, Ecrits et entretiens, p.29). La critique doit 
+passer « par » nous, si nous voulons en devenir les agents. Ce que Kant 
+appelle « jugement » dans la Troisième Critique est l&rsquo;appréciation 
+« sentimentale » de cette formation par l&rsquo;expérience esthétique. 
+L&rsquo;exercice du jugement s&rsquo;oriente à partir du « jeu des facultés » 
+et suppose que ce jeu puisse être appréhendé dans ses accords comme 
+dans ses désaccords, comme plaisir ou comme déplaisir. Mais cette 
+appréhension n&rsquo;est pas intuitive : elle doit être réfléchie à 
+partir d&rsquo;une forme « une » que Kant identifie à la forme de l&rsquo;entendement. <br/>
+</p>
+
+<p align="justify">      Tout 
+en conservant l&rsquo;essentiel de cette notion d&rsquo;expérience esthétique, 
+la modernité a contesté  que cette forme « une » puisse être 
+donnée a priori. Comme le montre l&rsquo;histoire de la forme-tableau au 
+moins depuis Manet, elle a montré et travaillé le caractère historique 
+et artificiel de cette forme. Mais surtout elle a montré qu&rsquo;elle 
+devait être pratiquée pour donner lieu à expérience. La modernité 
+a ainsi insisté sur la force non seulement formative mais transformatrice 
+de l&rsquo;expérience esthétique. Ce qui a donné lieu, du côté de la 
+production, à l&rsquo;abandon « du » medium pour l&rsquo;expérimentation des 
+media, et, du côté de la réception, à la problématisation de la 
+forme-musée. C&rsquo;est ainsi que le jugement s&rsquo;est élargi jusqu&rsquo;à 
+inclure la pratique comme une de ses dimensions. </p>
+<p align="justify">      L&rsquo;articulation 
+du jugement et de la pratique est au coeur de l&rsquo;expérience artistique 
+moderne, qu&rsquo;on la considère du point de vue de la réception ou de 
+la production. Elle pourrait être définie par le mot de « justesse » 
+qui ajoute aux deux premières, jugement et pratique, la notion fondamentale 
+de « balance » ou de critique. La justesse désigne la manière dont 
+la transmission artistique de l&rsquo;expérience peut transformer les données 
+esthétiques de cette expérience.  <br/></p>
+<p align="justify">      Le 
+séminaire à venir partira de ces formulations et reformulations de 
+la modernité et les reprendra à la lumière du discours philosophique 
+de Michel Foucault et de son analyse de la modernité comme « réflexion 
+du présent » telle qu&rsquo;elle est proposée dans les différentes versions 
+de l&rsquo;essai de 1984 Was ist Aufklärung. Foucault relance dans ce texte 
+le projet kantien de modernité critique, à ceci près que le sujet 
+de la réflexion n&rsquo;est pas le sujet de l&rsquo;entendement et ses capacités 
+de schématisation mais ce qu&rsquo;il appelle les savoirs, c&rsquo;est-à-dire 
+les formules épistémologiques qui en s&rsquo;effectuant sous la forme 
+de techniques opérent, sans l&rsquo;intervention précisément d&rsquo;aucun 
+jugement, le contrôle des modes d&rsquo;individuation. Comment dénouer 
+le lien fatal entre maîtrise technologique et domination bio-politique ? 
+ou encore comment déconnecter la « croissance des capacités et l&rsquo;intensification 
+des relations de pouvoir » ? Telle est la question à laquelle se trouvent 
+confrontées les Lumières contemporaines. <br/></p>
+<p align="justify">      Dans 
+ce contexte, Michel Foucault réintroduit la fonction du « jugement » 
+à partir de l&rsquo;expérimentation des pouvoirs conférés aux savoirs 
+par les techniques. L&rsquo;expérimentation par exemple des pouvoirs sur 
+les corps conférés aux théories sociales occidentales par les techniques 
+d&rsquo;administration de la vie et de la mort. Conduite dans un esprit 
+de transgression méthodique, cette expérimentation des moyens non 
+plus en vue de leurs fins « propres » mais indépendamment de ces fins, 
+voire contre  elles, « autorise » une réflexion de ces moyens, 
+et, avec elle, l&rsquo;invention de formules épistémologiques neuves. 
+Le jugement désigne dans ce contexte la « conduite » de la transgression. 
+Pour que la transgression puisse donner lieu à des modes d&rsquo;individuation 
+qui excèdent les « programmes de contrôle »  sans pour autant 
+sortir du terrain de l&rsquo;expérimentation partageable, voire universalisable, 
+-ce en quoi Foucault demeure un Aufklärer- elle doit en effet être 
+dirigée. Cette conduite, direction ou pratique relève d&rsquo;un art du 
+jugement ou ethos que Michel Foucault réfère aux techniques de soi 
+antiques et chrétiennes. Et tout particulièrement aux arts de la mémoire. 
+Le jugement devient dans sa pensée « souci de soi ».  <br/>
+</p>
+<p align="justify">      Qu&rsquo;en 
+est-il aujourd&rsquo;hui de cet art du jugement, autrement dit de la possibilité 
+de conduire l&rsquo;expérimentation des modes de contrôle impliqués par 
+les technologies contemporaines dans le sens de la transgression de 
+telle manière qu&rsquo;elle puissent servir de nouvelles formules épistémologiques 
+et des modes d&rsquo;individuation inédits ?  <br/></p>
+
+<p align="justify">      Michel 
+Foucault lègue cette question ; il n&rsquo;y répond pas, s&rsquo;étant consacré 
+à l&rsquo;articuler dans le contexte de savoirs médiatisés par les techniques 
+de production et d&rsquo;administration du 19<sup>ème</sup> siècle. C&rsquo;est 
+pourquoi sa théorie a pu être mise au service de la défense des identités 
+et récupérée par des épistémologisations à vocation identitaire, 
+ce qui n&rsquo;était assurément pas son propos. Pourtant son intérêt 
+pour les arts de la mémoire sur lesquels reposent les techniques de 
+soi traditionnelles est de première importance pour la compréhension 
+de ce que peut être une pratique transgressive de nos outils. <br/>
+</p>
+<p align="justify">      L&rsquo;articulation 
+savoirs/pouvoirs passe aujourd&rsquo;hui par les technologies de reproduction 
+et d&rsquo;archivage, et le contrôle politique des sociétés s&rsquo;exerce 
+par l&rsquo;intermédiaire des appareils collectifs de mémorisation.  
+Avant de s&rsquo;exercer sur les individus, les pouvoirs des systèmes de 
+programmation s&rsquo;exercent sur l&rsquo;information elle-même. La question 
+est donc de savoir ce que signifient dans ce contexte nouveau et au-delà 
+du pragmatisme ambiant les concepts de réflexion, de transgression, 
+de jugement.  <br/></p>
+<p align="justify">      La 
+nouvelle forme de la relation de pouvoir est aujourd&rsquo;hui l&rsquo;information. 
+Cette information se réfléchit automatiquement en s&rsquo;archivant. Pour 
+que cette réflexion automatique devienne matière à expérimentation 
+il est nécessaire que cet archivage émancipe l&rsquo;information du programme 
+qui l&rsquo;a produite et la connecte avec d&rsquo;autres programmes. C&rsquo;est 
+le modèle rhyzomatique de l&rsquo;archive conçu par Gilles Deleuze « pour » 
+Michel Foucault, modèle actuellement pratiqué par de nombreux artistes. 
+Mais à quelle condition cette expérimentation est-elle transgression au 
+sens où Foucault l&rsquo;entend ? A condition qu&rsquo;elle émancipe l&rsquo;information 
+non seulement de « son » programme, mais de sa fonction de communication 
+soluble dans l&rsquo;opération de sa transmission, et que sa réflexion 
+ne soit pas simplement formelle mais réelle : qu&rsquo;elle produise non 
+seulement de la connectivité mais de l&rsquo;individuation. L&rsquo;information 
+est réfléchie sur un mode pratique dès lors qu&rsquo;elle est lue. Lue, 
+interprétée, documentée. L&rsquo;opération du jugement intervient ici 
+avec l&rsquo;intervention de la lecture, partie intégrante des techniques 
+de soi et des arts de la mémoire. <br/></p>
+<p align="justify">      Nous 
+pourrons alors faire retour vers l&rsquo;art contemporain, pour envisager 
+les modes de lecture, de réinscription et d&rsquo;archivage qu&rsquo;il met 
+en oeuvre comme autant d&rsquo;actualisations de la réflexion de Michel 
+Foucault. On s&rsquo;intéressera dans cette perspective à l&rsquo;oeuvre de 
+Chris Marker, de Pierre Huyghe et de Tatiana Trouvé. Il s&rsquo;agira au 
+cours de cette étape de proposer des représentations du jugement aujourd&rsquo;hui 
+tel qu&rsquo;il s&rsquo;exerce dans la production/réception artistique de manière 
+à pouvoir élargir ce concept de « lecture ». » <br/> <br/>
+
+ <br/> <br/> <br/></p>
+            
+	    </div>
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/lecturessignees.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,41 @@
+<?php
+include("header.php");
+?>
+
+
+
+<a name="lecturessignees"><h3><img src="res/img/lecturessignees.png" alt="Atelier Lectures Signées" /></h3></a>
+<p><b>abstract</b> : Cet atelier s'inscrit dans le cadre des recherches de l'IRI sur les appareils critiques et bénéficie des travaux déjà entrepris sur le cinéma dans le cadre de l'Atelier Regards signés. L'atelier aborde la question de l'annotation de textes en partant d'enregistrements de conférences et séminaires organisés par le DDC/Forum de société/Revues parlées ou plus récemment par l'IRI.</p>
+
+<div id="horaires">
+	<p><b>Accès</b> : Résidents et conseillers de l'IRI.</p>
+
+	<p><b>Dates</b> : le vendredi de 10h à 12h</p>
+	<ul>
+	<li class="old">13 octobre</li>
+	<li class="old">3 novembre</li>
+	<li class="old">15 décembre </li>
+	<li class="old">2  Février </li>
+	<li class="old">16 Février </li>
+	<li class="old">2 Mars </li>
+	<li > Vendredi 1er juin </li>
+	<li > Vendredi 22 juin </li>
+
+	</ul>
+</div>
+
+<div id="doc_tchg">
+<p><b>Textes de Bernard Stiegler à télécharger</b> :
+	<ul>
+		<li><img src="../res/img/page_word.png"/>&nbsp;<a href="../documents/ANNOTATION_NAVIGATION_EDITION_ELECTRONIQUE_1993.doc">ANNOTATION, NAVIGATION, EDITION ELECTRONIQUE, 1993</a></li>
+		<li><img src="../res/img/page_word.png"/>&nbsp;<a href="../documents/GIS_MEMOIRES_EXTERNES.doc">GIS MEMOIRES EXTERNES, 1994</a></li>
+		<li><img src="../res/img/page_word.png"/>&nbsp;<a href="../documents/MACHINES_A_ECRIRE_ET_MATIERES_A_PENSER_1994.doc">MACHINES A ECRIRE ET MATIERES A PENSER, 1994</a></li>
+	</ul>
+</p>
+
+</div>
+
+
+<?php
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/modernites.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,92 @@
+<?
+
+include("header.php");
+?>
+       <a name="modernites">
+            <h1><img src="res/img/modernites.png" alt="Séminaire Modernités" /></h1>
+            </a>
+            <p>Sous la direction de <b>Pierre-Damien Huyghe</b>, philosophe Paris I  Panthéon-Sorbonne</p>
+
+
+<p>         <b>abstract</b> :
+
+
+            <p>Le Centre Pompidou fêtera son trentième anniversaire en 2007 et il organisera à cette occasion un colloque : MODERNITÉS / Postmodernités, hypermodernités, 
+antimodernités. </p>
+<p>         La naissance du Centre Pompidou, consécutive aux mouvements sociaux de 1968, voulut être une affirmation exemplaire de la modernité française. Ce qui veut dire 
+aussi que 1968 fut ainsi interprété comme un refus de la modernité.</p>
+<p>         Qu'en est-il aujourd'hui de la modernité du Centre Pompidou, et au Centre Pompidou ? Qu'en est-il de la modernité aujourd'hui en général, et dans le monde entier ? 
+En quoi fait-elle ou ne fait-elle pas tout autrement question qu'en 1977 ?</p>
+<p>         Limportance de ce colloque oblige à un travail préparatoire en amont. Celui-ci prendra la forme dun séminaire dont la conduite a été confiée à Pierre-Damien Huyghe, 
+qui précise dans ces quelques lignes son propos| :</p>
+
+<p>         «| Caractériser la phase historique où nous nous trouvons à l'aide de termes comme «| post-moderne » ou « post-industriel » ne nous aide pas fondamentalement à 
+comprendre et à repérer ce qui se passe. La réception et l'usage de ces termes donne tout de même une indication sur le fait que nous ne pouvons plus considérer le « moderne » 
+et l'« industriel » comme allant de soi. Faut-il que nous revenions définitivement sur les illusions du progrès ? N'avons-nous pas plutôt affaire à une sorte de mise à nu de la 
+modernisation, à son « désenchantement » ? Autre hypothèse encore : est-ce la nature même des processus en cours qui change de registre ? Ou qui se déplace ? Le processus 
+industriel contemporain qui se dé-localise et se re-localise, qui change d'objets et de domaines de valorisation n'est-il pas lui-même aujourd'hui « déplacé » et incapable 
+d'organiser la « sociation » ?</p>
+
+<p>         Nous avons à comprendre une situation véritablement complexe. Le moderne, certes, gagne des espaces. Mais pas de façon univoque. Il est exigé dans certaines de ses 
+formes, refusé pour d'autres, critiqué par certains aspects. Le propos du séminaire sera, avant toute affirmation concernant les singularités de notre époque, d'en mettre en 
+question le principe même. Nous présupposerons paradoxalement que, s'il existe différentes phases, époques ou états de l'avancée du moderne dans le monde, il existe aussi une 
+sorte de constance de cette avancée. Il y a des répétitions. Etudiant ces répétitions, empruntant à des strates historiques à des champs variés (sciences, techniques, arts mais 
+aussi politique, économie, urbanité), nous dégagerons l'idée que la modernisation est un processus  une poussée des conditions sociales par les techniques  qui manque à la 
+figuration et à la représentation. Cette affaire touche à la possibilité même du politique.</p>
+
+<p>         Nous procéderons en trois temps. Nous nous demanderons d'abord si une société et une culture « modernes » peuvent être autre chose qu'une société et une culture « 
+déplacées » par les modalités des inventions qui s'y produisent. Quelles sont les formes de cette inventivité, les sources et les procédures de ce déplacement ? Nous nous 
+attacherons ensuite à définir quelques champs et formes des affects modernes de l'esprit, notamment ceux de la violence et de la mémoire. Nous nous intéresserons à 
+l'élaboration de ces affects dans les champs de l'économie et de la politique. Enfin, toutes ces propositions constituant essentiellement des hypothèses à discuter, nous 
+chercherons à en organiser la critique possible en les soumettant à l'examen des participants et de quelques invités. Une procédure de travail commun et « d'intelligence 
+collective » passant par l'enregistrement, l'annotation et la publication sur site web des séances sera mise en place.| »</p>
+
+            <div id="horaires">
+              <p><b>Lieu </b>:
+              </p>
+
+              <p><b>Accès</b> : Sur inscription : <a href="mailto: contact@iri.centrepompidou.fr">contact@iri.centrepompidou.fr</a></p>
+
+              <p><b>Horaires</b> : les lundis : 18h-20h</p>
+
+              <p><b>Dates et lieux </b>:
+              <ul>
+
+<li class="old">          23 octobre, Pierre-Damien Huyghe, Paris 1  IRI, « Les formes de
+              l'invention »
+              Salle du Collège (Piazza Beaubourg).</li>
+
+<li class="old">          06 novembre, Pierre-Damien Huyghe, Paris 1  IRI, « Du moderne à la
+              modernité, la représentation en question »
+              Salle Messiaen, Ircam.</li>
+
+<li class="old">          20 novembre, Pierre-Damien Huyghe, Paris 1  IRI, « Les fondements de
+              l'urbanité : entre violence souveraine et poussées productives. »
+              Salle Messiaen, Ircam.</li>
+
+<li class="old">          04 décembre, Pierre-Damien Huyghe, Paris 1  IRI, « Expérience vécue et
+              expérience enregistrée, la double mémoire des modernes. »
+              Salle Messiaen, Ircam.</li>
+
+<li class="old">          18 décembre, Bernard Stiegler, titre à déterminer.
+              Salle Messiaen, Ircam.</li>
+
+<li class="old">          15 janvier, Salle Messiaen, IRCAM.</li>
+
+<li class="old">          29 janvier, Salle Messiaen, IRCAM.</lI>
+
+<li class="old">          12 février, Salle Messiaen de l'Ircam.<font color="red"><b>ANNULEE</b></font></li>
+
+<li class="old">          26 février, Salle Messiaen de l'Ircam.</li>
+
+<li class="old">          12 mars, Pierre-Damien Huyghe et Bernard Stiegler : conclusion du séminaire.
+              Salle Messiaen de l'Ircam</li>
+
+
+              </ul>
+              </p>
+            </div>
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/museologie.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,111 @@
+<?php
+include("header.php");
+
+?>
+
+
+<a name="museologie"><h3><img src="res/img/museologie.png" alt="Seminaire mus&eacute;ologie" /></h3></a>
+<p align="right"><a href="museologie2007.php">Archives 2007</a><br/>
+<a href="http://web.iri.centrepompidou.fr/fonds/seminaires/seminaire/detail/6">Mus&eacute;ologie 2007 dans <i>Lignes de temps</i></a></p>
+<p><a href="http://www.culture.gouv.fr/culture/editions/r-cr.htm" target="_blank"><img src="res/img/culturerecherche.jpg"/></a></p>
+<ul>
+<li><div id="lienacces" onclick="new Effect.ScrollTo('horaires',{duration:1, transition:Effect.Transitions.slowstop});" class="hand"> acces / horaires</div></li>
+</ul>
+
+<h4>Abstract</h4>
+
+Le Minist&egrave;re de la culture et de la communication (Mission de la Recherche et de la Technologie/D&eacute;l&eacute;gation au D&eacute;veloppement et aux Affaires Internationales) et le Centre de recherche du Ch&acirc;teau de Versailles ont organis&eacute; le 8 novembre 2006 un s&eacute;minaire national sur le th&egrave;me &laquo; Lieux culturels et nouvelles pratiques num&eacute;riques &raquo;. De mars &agrave; juin 2007, l&rsquo;Institut de recherche et d&rsquo;innovation du Centre Pompidou (IRI) a organis&eacute; pour le compte de la MRT, un s&eacute;minaire sur le th&egrave;me <i>Mus&eacute;ologie, Mus&eacute;ographie et nouvelles formes d&rsquo;adresse au public</i> qui a pris la forme d'une s&eacute;rie de huit s&eacute;ances ouvertes aux &eacute;tudiants de l&rsquo;Ecole du Louvre (4&egrave;me ann&eacute;e, Master I) ainsi qu&rsquo;aux agents du Minist&egrave;re de la culture et de la communication, aux &eacute;tablissements culturels et aux professionnels qui en ont fait la demande.
+<h4>Le S&eacute;miniaire</h4>
+Dans le cadre de son programme de recherche sur les nouvelles technologies culturelles et &eacute;ducatives et sur les nouvelles formes d'adresse au public, 
+l'IRI propose de focaliser les axes de r&eacute;flexion de ce s&eacute;minaire pour 2008-2009 sur les technologies collaboratives en collaboration avec 
+le projet ADONIS/CNRS Anthroponet (acc&egrave;s et valorisation des archives mus&eacute;ales) et le projet THD Cap Digital (Pratiques culturelles sur les r&eacute;seaux haut d&eacute;bit). 
+Le principe de ce s&eacute;minaire est de confronter exp&eacute;riences mus&eacute;ales et r&eacute;flexions th&eacute;orique et scientifique en analysant &agrave; chaque s&eacute;ance 
+l'impact des nouveaux dispositifs d'adresse au public sur les pratiques mus&eacute;ales. Cette ann&eacute;e, le s&eacute;minaire est plus particuli&egrave;rement ouvert 
+aux &eacute;tudiants de l'Ecole du Louvre (Master I), de l'Institut national du patrimoine (INP) et de l'Ecole des Chartes, ainsi qu'aux professionnels du secteur culturel.
+
+<div id="horaires">
+<a name="acces"></a>
+        <p>Inscription obligatoire aupr&egrave;s d&rsquo;Anne-Sophie Fran&ccedil;ois, Charg&eacute;e de mission de l&rsquo;Institut de recherche et d&rsquo;innovation/Centre Pompidou :<br />
+          <a href="mailto:anne-sophie.francois@centrepompidou.fr">anne-sophie.francois@centrepompidou.fr</a><br />
+        Tel : 01 44 78 49 11
+        <p>
+        
+        <ul type="square">
+  <li><strong>S&eacute;ance 1 : </strong>mardi 14 octobre 2008, de 16h &agrave; 18h, amphith&eacute;&acirc;tre D&uuml;rer &agrave; l&rsquo;Ecole du Louvre<br />
+      <strong>Th&egrave;me : Les espaces critiques collaboratifs</strong><br />
+  </li>
+</ul>
+        <p>On s&rsquo;accorde aujourd&rsquo;hui &agrave; consid&eacute;rer comme une caract&eacute;ristique du Web 3.0, la conjonction d&rsquo;un 
+          point de vue &eacute;ditorial et de contributions des visiteurs. En ing&eacute;nierie sociale, on parle aussi de 
+          combiner une approche &laquo; top-down &raquo; et de l&rsquo;innovation ascendante de type &laquo; bottom-up &raquo;. Cette 
+          s&eacute;ance introduira et mettra en d&eacute;bat cette notion, sans ignorer les effets de &laquo; viralisation &raquo; tant 
+          recherch&eacute;s par les industries culturelles, et montrera par des exp&eacute;riences concr&egrave;tes comment les 
+          mus&eacute;es r&eacute;ussissent ou &eacute;chouent &agrave; combiner singularit&eacute; d&rsquo;un point de vue sur les oeuvres et contribution des visiteurs.
+  <ul>
+    <li type="circle">Introduction : Bernard Stiegler, IRI/Centre Pompidou : Le mus&eacute;e augment&eacute; comme &laquo; th&eacute;&acirc;tre d'individuation &raquo; , Elisabeth Caillet/Mus&eacute;e de l&rsquo;homme : M&eacute;diation et TIC,</li>
+    <li type="circle">Jacqueline Eidelman et S&eacute;verine Dessajan, CERLIS (Centre de recherche sur les liens sociaux) - Universit&eacute; Paris Descartes et CNRS : <i>Mus&eacute;ologie intrusive ou collaborative : les comit&eacute;s de visiteurs</i>,</li>
+    <li type="circle">Peter Samis, Associate Curator of Education and Program Manager for Interactive Educational Technologies, SFMOMA : <i>Content and comment : is there a place for democracy in the art museum ?</i>.</li>
+  </ul>
+  <p>&nbsp;</p>
+  <ul type="square">
+    <li><strong>S&eacute;ance 2 : </strong>mercredi 17 d&eacute;cembre 2008, de 17h &agrave; 19h, salle du Coll&egrave;ge au Centre Pompidou<br />
+        <strong>Th&egrave;me : Articuler le mus&eacute;e et les r&eacute;seaux sociaux</strong><br />
+    </li>
+  </ul>
+  <p>Un mus&eacute;e peut-il s&rsquo;articuler avec des r&eacute;seaux sociaux et des sites collaboratifs existants (type FaceBook, Flickr, YouTube, Daily Motion&hellip;) ? Dans ce cas, de quelle marge de manoeuvre dispose-t-il pour le choix des m&eacute;tadonn&eacute;es et leur r&eacute;cup&eacute;ration pour enrichir son fonds ? Doit-il cr&eacute;er int&eacute;gralement son propre r&eacute;seau social ?</p>
+  <ul>
+    <li type="circle">Philippe Bouquillon, MSH Paris Nord (Paris VIII et XIII),</li>
+    <li type="circle">Martin Rogard, Daily Motion,</li>
+    <li type="circle">Elisabeth Gautier-Desvaux, Conservateur g&eacute;n&eacute;ral du patrimoine, Directrice des Archives des Yvelines,</li>
+  </ul>
+  <p>&nbsp;</p>
+  <ul type="square">
+    <li><strong>S&eacute;ance 3 : </strong>mercredi 21 janvier 2009, de 17h &agrave; 19h, salle du Coll&egrave;ge au Centre Pompidou<br />
+        <strong>Th&egrave;me : Les objets communicants : un lien entre l&rsquo;espace du mus&eacute;e et les espaces num&eacute;riques</strong><br />
+    </li>
+  </ul>
+  <p>Les technologies de la mobilit&eacute;, utiles &agrave; la personnalisation des visites, constituent aussi un lien &laquo; pervasif &raquo; avec les espaces num&eacute;riques. Reste &agrave; penser de nouvelles formes d&rsquo;adresse au public 
+    (d&eacute;bats, approfondissements, jeux&hellip;) pour que l&rsquo;objet communicant devienne un v&eacute;ritable instrument 
+  critique.</p>
+  <ul>
+    <li type="circle">Jo&euml;lle Le Marec, Professeur des universit&eacute;s, ENS LSH,</li>
+    <li type="circle">Yves-Armel Martin, Directeur de la Mission technologie et information / Centre informatique Erasme, D&eacute;partement Informatique du D&eacute;partement du Rh&ocirc;ne, et Elisabeth Shimmels, Charg&eacute;e de projets « Espaces d&eacute;couvertes » / Service des publics du Mus&eacute;e des Confluences,</li>
+    <li type="circle">Vincent Puig et C&eacute;cilia Jauniau, IRI/Centre Pompidou, Pr&eacute;sentation du dispositif et &eacute;tude du public lors des exp&eacute;rimentations sur l'exposition <em>Traces du sacr&eacute;</em>.</li>
+  </ul>
+  <p>&nbsp;</p>
+  <ul type="square">
+    <li><strong>S&eacute;ance 4 : </strong>mercredi 11 f&eacute;vrier 2009, de 17h &agrave; 19h, salle du Coll&egrave;ge au Centre Pompidou<br />
+        <strong>Th&egrave;me : Enjeux des instruments de perception dans les programmes &eacute;ducatifs du monde 
+      num&eacute;rique</strong><br />
+    </li>
+  </ul>
+  <p>Le contexte &eacute;ducatif est dans les mus&eacute;es particuli&egrave;rement propice &agrave; l&rsquo;exp&eacute;rimentation, on y mesure 
+    sans doute plus pr&eacute;cis&eacute;ment l&rsquo;importance d&rsquo;une &laquo; instrumentation &raquo; de la perception et du jugement. 
+  On abordera &eacute;galement dans cette s&eacute;ance la probl&eacute;matique des adolescents.</p>
+  <ul>
+    <li type="circle">Stephan Schwan, IWM/KMRC T&uuml;bingen (Allemagne),</li>
+    <li type="circle">Vincent Maestracci, Doyen des enseignements artistiques, Inspection G&eacute;n&eacute;rale, Minist&egrave;re 
+    de l&rsquo;Education Nationale,</li>
+    <li type="circle">Nancy Proctor, Smithsonian American Art Museum (Etats-Unis),</li>
+  </ul>
+  <p>&nbsp;</p>
+  <ul type="square">
+    <li><strong>S&eacute;ance 5 : </strong>mercredi 11 mars 2009, de 17h &agrave; 19h, au Centre Pompidou<br />
+        <strong>Th&egrave;me : Les mod&egrave;les &eacute;conomiques et le tourisme</strong><br />
+    </li>
+  </ul>
+  <p>Quelle nouvelle organisation de la cr&eacute;ation de la valeur se dessine dans le contexte du Web 
+    collaboratif, des r&eacute;seaux sociaux, de la mobilit&eacute; et de l&rsquo;acc&egrave;s aux r&eacute;seaux haut d&eacute;bit ? Comment 
+  repenser l&rsquo;articulation entre services culturels et tourisme ?</p>
+  <ul>
+    <li type="circle">Table ronde anim&eacute;e par Jean-Pierre Dalb&eacute;ra, Charg&eacute; de mission aupr&egrave;s du cabinet du ministre pour le projet de centre national de conservation du patrimoine, 
+    avec Philippe Fabry (Odit France), Laurianne Barbier (Voyazine - Voyages-sncf.com) et Jacques Naves (ViaMichelin)</li>
+    <li type="circle">Philippe Dub&eacute; du Laboratoire LAMIC (Laboratoire de mus&eacute;ologie et d'ing&eacute;nierie de la culture, Qu&eacute;bec)</li>
+  </ul>
+</div>
+
+
+
+<?php
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/museologie2007.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,247 @@
+<?php
+include("header.php");
+include("res/inc/functions.php");
+
+if(isset($_GET['dir'])){
+
+    $BASE = rawurldecode($_GET['dir']);
+    /*SECURITE*/
+    if(!strstr($BASE, 'audio')) 
+        $BASE = "/home/www/documents/audio/museologieMuseographie";
+    /* SECURITE (evite de parcourir les repertoire en remontant via les .. */
+    if(ereg('[..]',$BASE)) 
+        $BASE = "/home/www/documents/audio/museologieMuseographie";
+
+
+}
+else{
+	/* racine */
+    $BASE = "/home/www/documents/audio/museologieMuseographie";
+    $descrip = '';
+}
+
+
+?>
+
+<script type="text/javascript" src="res/js/swfobject.js"></script>
+<script type="text/javascript">
+   // <![CDATA[
+
+      // get our flash movie object
+      var flashMovie;
+      function init() {
+         if (document.getElementById) {
+            flashMovie = document.getElementById("mymovie");
+         }
+      }
+
+      // wait for the page to fully load before initializing
+      window.onload = init;
+
+      // for updating media in the player
+      function switchMedia(rep) {
+         if (flashMovie) {
+            var url = 'http://www.iri.centrepompidou.fr/documents/audio/'+rep;
+            flashMovie.switchMedia(url, true);
+         }
+      }
+
+
+   // ]]>
+</script><title>S&eacute;minaire Mus&eacute;ologie 2007 - Institut de recherche et d'innovation - Centre Pompidou&lt;/title&gt;</title>
+
+
+<a name="museologie"><h3><img src="res/img/museologie.png" alt="Seminaire mus&eacute;ologie" /></h3></a>
+<p align="right"><a href="museologie.php">Programme 2008</a></p>
+<ul>
+<li><div id="lienacces" onclick="new Effect.ScrollTo('horaires',{duration:1, transition:Effect.Transitions.slowstop});" class="hand"> acces / horaires</div></li>
+<li><div id="lienaudio" onclick="new Effect.ScrollTo('ecoute',{duration:1, transition:Effect.Transitions.exponential});" class="hand"> consulter les enregistrements audios</div></li>
+<li><a href="http://web.iri.centrepompidou.fr/fonds/seminaires/seminaire/detail/6">consulter les enregistrements audios dans <i>Lignes de temps</i></a></li>
+</ul>
+
+<h4>abstract</h4>
+
+Le Minist&egrave;re de la Culture (Mission de la Recherche et de la
+Technologie/D&eacute;l&eacute;gation au
+D&eacute;veloppement et aux Affaires Internationales) et le Centre de
+recherche du Ch&acirc;teau de
+Versailles ont organis&eacute; le 8 novembre 2006 un s&eacute;minaire
+national sur le th&egrave;me &laquo; Lieux
+culturels et nouvelles pratiques num&eacute;riques &raquo;.
+Parall&egrave;lement, l&#8217;Institut de Recherche et
+d&#8217;Innovation du Centre Pompidou (IRI), cr&eacute;&eacute; en avril
+2006, a mis en place un programme
+de recherche et une s&eacute;rie de s&eacute;minaires sur la
+probl&eacute;matique g&eacute;n&eacute;rale de l&#8217;adresse au
+public dans le contexte culturel. Sur cette base, il est propos&eacute;
+&agrave; la MRT de prolonger
+l&#8217;exp&eacute;rience du colloque de Versailles dans le cadre d&#8217;un
+s&eacute;minaire.
+
+<h4>Le Seminiaire</h4>
+Objectifs et modalit&eacute;s du s&eacute;minaire
+Le s&eacute;minaire, sur le th&egrave;me &laquo; Mus&eacute;ologie,
+Mus&eacute;ographie et nouvelles formes d&#8217;adresse au
+public &raquo;, prendrait la forme d'une s&eacute;rie de huit
+s&eacute;ances ouvertes aux &eacute;tudiants de l&#8217;Ecole
+du Louvre (4&egrave;me ann&eacute;e, Master I) ainsi qu&#8217;aux agents du
+Minist&egrave;re de la Culture, aux
+Etablissements culturels et aux professionnels qui en feraient la
+demande.<br>
+Dans le cadre du programme de recherche de l&#8217;IRI sur le
+d&eacute;veloppement de nouveaux
+dispositifs critiques pouvant favoriser l&#8217;&eacute;mergence d&#8217;une
+nouvelle figure de &laquo; l&#8217;amateur &raquo;,
+il est propos&eacute; de confronter exp&eacute;riences mus&eacute;ales
+et r&eacute;flexions th&eacute;orique et scientifique
+en analysant &agrave; chaque s&eacute;ance l&#8217;impact des nouveaux
+dispositifs d&#8217;adresse au public sur
+les pratiques culturelles. L&#8217;objectif th&eacute;orique qui sous-tend le
+s&eacute;minaire consiste &agrave;
+r&eacute;inscrire les &#339;uvres pr&eacute;sent&eacute;es dans le cadre de
+&laquo; s&eacute;ries &raquo; ou monographies
+permettant d&#8217;articuler de nouvelles formes de rendus tenant compte
+notamment du
+contexte esth&eacute;tique, culturel et historique.<br>
+
+<h4>Esquisse du programme 2007</h4>
+
+Le principe du programme du s&eacute;minaire est de partir en amont de
+l&#8217;analyse des outils
+d&#8217;ing&eacute;nierie des connaissances en tant qu&#8217;ils peuvent &ecirc;tre
+mis au service d&#8217;une strat&eacute;gie
+de publication et de pr&eacute;sentation des &#339;uvres. Les
+exp&eacute;riences de gestion documentaire
+seront ensuite abord&eacute;es notamment lorsqu&#8217;elles visent &agrave;
+produire des contenus
+d&eacute;clinables selon les publics et selon les supports. On
+&eacute;tudiera ensuite le champ de la
+repr&eacute;sentation et des dispositifs de rendus, notamment les
+nouveaux dispositifs en cours
+de d&eacute;veloppement dans les laboratoires de recherche. Enfin, les
+derni&egrave;res s&eacute;ances seront
+consacr&eacute;es &agrave; l&#8217;enjeu de la participation et de la
+personnalisation dans les lieux culturels
+mais &eacute;galement sur Internet et en situation de mobilit&eacute;.<br>
+<br>
+
+
+
+<div id="horaires">
+<a name="acces"></a>
+        <p><b>Acc&egrave;s</b> :  sur inscription (dans la limite des places disponibles) aux :
+<ul>
+        <li> professionnels du secteur des mus&eacute;es (conservateurs, service des publics, service audiovisuel et informatique)</li>
+
+        <li> personnel du Minist&egrave;re de la Culture et de la Communication et des &eacute;tablissements sous tutelle</li>
+
+<li> &eacute;tudiants (mus&eacute;ologie, action culturelle, Ecole du Louvre, Institut National du patrimoine)</li>
+</ul>
+
+<p><b>Inscriptions</b> : contact@iri.centrepompidou.fr</p>
+<p><b>Dates</b> : le mercredi de 17h &agrave; 20h au Centre Pompidou</p>
+<ul type="square" class="old">
+  <li><strong>21 mars&nbsp;: Ing&eacute;nierie des connaissances </strong></li>
+</ul>
+Comment indexer, documenter et articuler les  contenus en fonction d&rsquo;un public donn&eacute;&nbsp;? Comment constituer un r&eacute;servoir d&rsquo;expertises mobilisable en  amont pour concevoir des parcours&nbsp;?
+<ul type="square" class="old">
+  <li><span dir="ltr"><strong>4 avril&nbsp;:  Ing&eacute;nierie documentaire</strong></span></li>
+</ul>
+<p>Comment num&eacute;riser, indexer  et valoriser en restant ind&eacute;pendant des formats et en adaptant les contenus aux  diff&eacute;rents publics&nbsp;? La base de donn&eacute;es peut-elle servir directement la  production de l&rsquo;exposition&nbsp;? Cha&icirc;nes de production&nbsp;: comment passer  des &oelig;uvres num&eacute;ris&eacute;es &agrave; l&rsquo;&eacute;dition num&eacute;rique&nbsp;? Syst&egrave;me d&rsquo;information&nbsp;:  comment r&eacute;cup&eacute;rer les &eacute;l&eacute;ments documentaires de l&rsquo;exposition pour une r&eacute;&eacute;dition  ou une version en ligne&nbsp;?</p>
+<ul type="square" class="old">
+  <li><span dir="ltr"><strong>2 mai&nbsp;: Les  utopies sc&eacute;nographiques&nbsp;: repr&eacute;sentation, reproduction, visualisation et  rendus</strong></span></li>
+</ul>
+<p>Interaction, visualisation  3D, avatars&nbsp;: au service de quel propos artistique&nbsp;? Nouveau statut  de l&rsquo;&oelig;uvre d&rsquo;art &agrave; l&rsquo;heure de la reproductibilit&eacute; num&eacute;rique. Valeur ajout&eacute;e au  contenu dans le contexte num&eacute;rique&nbsp;?</p>
+<ul type="square" class="old">
+  <li><strong>9 mai&nbsp;: Participation       du public / personnalisation</strong></li>
+</ul>
+<p>Mesure et analyse du public,  recueil des r&eacute;actions, parcours personnalis&eacute;s, intervention d&rsquo;artistes, jeux de  r&ocirc;les/jeux vid&eacute;o.</p>
+<ul type="square" class="old">
+  <li class="old"><span dir="ltr"><strong>30 mai&nbsp;: Les  galeries virtuelles&nbsp;: r&eacute;alit&eacute; virtuelle, r&eacute;alit&eacute; augment&eacute;e, multimodalit&eacute;</strong></span></li>
+</ul>
+<p>Comment mobiliser tous les  sens&nbsp;? Dans quel contexte l&rsquo;immersion se justifie-t-elle&nbsp;? Comment  articuler bases de donn&eacute;es documentaires et outils de visualisation  avanc&eacute;s&nbsp;? Outils de cartographie.</p>
+<ul type="square" class="old">
+  <li><strong>6 juin&nbsp;: Dispositifs       de mobilit&eacute;</strong></li>
+</ul>
+<p>Comment accompagner et  prolonger la visite&nbsp;? Quels usages innovants de la mobilit&eacute; dans le contexte  culturel&nbsp;? Comment concevoir des syst&egrave;mes/r&eacute;seaux/appareils adapt&eacute;s pour  les mus&eacute;es&nbsp;?</p>
+<ul type="square" class="old">
+  <li><strong>13 juin&nbsp;: Le mus&eacute;e       en ligne</strong></li>
+</ul>
+<p>Comment pr&eacute;parer et  compl&eacute;ter la visite&nbsp;? Mise en r&eacute;seau de bases de donn&eacute;es. Impact des  technologies Web 2.0. Espaces personnels et sites &eacute;ducatifs.</p>
+<ul type="square" class="old">
+  <li><span dir="ltr"><strong>27 juin&nbsp;:  Annotation, enrichissement des contenus par le visiteur, parcours  p&eacute;dagogiques&nbsp;: vers des communaut&eacute;s d&rsquo;amateurs</strong></span></li>
+</ul>
+<p>Dans un contexte  participatif et d&rsquo;&eacute;change, quels outils pour favoriser une meilleure  appropriation et un enrichissement des contenus par le public lui-m&ecirc;me&nbsp;?  Quelles p&eacute;dagogies d&eacute;velopper avec ces nouveaux outils&nbsp;?</p>
+</div>
+<div id="ecoute">
+<a name="audio"></a>
+<div id="titre"><h2><img src="res/img/consulter_doc.png" alt="Consulter les fonds"/></h2><br/><br/></div>
+<table cellspacing="0" cellpadding="10" width="100%" style="border:1px solid #cccccc; font-size:12px;">
+
+<?php
+/* lien sur la racine */
+if(!$dir) {
+
+
+    $navig = substr($BASE,26);
+    $navtab = explode('/', $navig);
+
+
+    if($navtab[0] != '') 
+        $navLinked  = '<a href="javascript:history.go(-'.(count($navtab)).')">..</a> / ';
+
+    $cpt=0;
+    
+    foreach($navtab as $link):
+
+        $link = deInterCaps($link);
+        $link = UtoWS($link);
+
+   	    if($cpt+1 == count($navtab)):
+            $navLinked .= $link;
+        else:
+            $navLinked .='<a href="javascript:history.go(-'.(count($navtab)-1).')">'.trim($link).'</a>';
+        endif;
+        
+        if($cpt != (count($navtab)-1)) 
+            $navLinked .= ' / ';
+        
+        $cpt++;
+    endforeach;
+
+   echo "<tr><td colspan='2'><h3>".$navLinked."</h3></td></tr>";
+}
+
+?>
+
+<tr>
+  <td style="vertical-align:top">
+
+
+<?php
+list_dir($BASE, rawurldecode($dir), 2);
+
+/* répertoire initial à lister */
+if(!$dir) {
+  $dir = $BASE;
+}
+
+list_file(rawurldecode($dir));
+?>
+
+    <td width="30%" align="center"  rowspan="2" style="vertical-align:top"><div id="flashcontent"></div></td>
+</tr>
+</table>
+<script type="text/javascript">
+	var so = new SWFObject("res/flash/mp3player.swf", "mymovie", "340", "157", "8.0.5", "#ffffff", true);
+	so.addParam("quality", "high");
+	so.addParam("salign", "lt");
+	so.addVariable("extDrag", false);
+	so.write("flashcontent");
+</script>
+</div>
+
+
+<?php
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/nanotechnologies.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,68 @@
+<?
+
+include("header.php");
+?>
+ <a name="nano">
+<h1><img src="res/img/nanotechnologies.png" alt="Nanotechnologies" /></h1>
+</a>
+
+<p>Séminaire « Enjeux anthropologiques, culturels et philosophiques des nanosciences et nanotechnologies ». Séminaire organisé par X. Guchet (Paris I) et S. Loeve (Paris X). Institut de Recherche et d'Innovation, 2007-2009</p>
+<p align="right"><a href="nanotechnologies2008.php">archive 2008</a></p>
+<!--<ul>-->
+
+<p>
+Le séminaire <i>Enjeux anthropologiques, culturels et philosophiques des nanotechnologies</i> sera
+consacré cette troisième et dernière année à l'examen des dynamiques sociales associées aux
+innovations en micro- et nanotechnologies. La question sera traitée du point de vue de la construction
+d'une « société européenne de la connaissance », considérée comme une priorité depuis la conférence
+de Lisbonne en 2000. Comme l'indique clairement le rapport d'un groupe de travail mandaté par la
+Commission européenne, les nanotechnologies et plus généralement les technologies convergentes
+doivent être considérées comme une opportunité pour construire une société européenne de la
+connaissance, c'est-à-dire une société dans laquelle les connaissances n'émanent pas des seuls
+scientifiques et experts mais sont « co-construites » par l'ensemble parties prenantes, notamment le
+public. Comment ce programme de construction d'une société de la connaissance s'articule-t-il aux
+dynamiques de recherche et d'innovation en micro- et nanotechnologies ? Que signifie « coconstruire
+» des connaissances ? Comment le public est-il invité à « co-construire » des
+connaissances ? Quel rôle pour les sciences humaines et sociales dans ce contexte et quel type de
+connaissance produisent-elles ? Le séminaire se focalisera sur le cas grenoblois.
+</p>
+
+
+<div id="horaires">
+
+<b>Dates en 2009</b>
+<ul>
+  <li>
+    <b>Jeudi 15 janvier de 17h à 19h</b> : intervention d'Isabelle BRUNO (sciences politiques, Université Lille 2), auteur d'un ouvrage sur la notion de « société de la connaissance ».
+  </li>
+  <li>
+    <b>Jeudi 26 février de 17h à 19h</b> : intervention d'Aurélie DELEMARLE (gestion, ESIEE), auteur d'une thèse sur l'émergence de MINATEC.
+  </li>
+  <li>
+    <b>Jeudi 26 mars de 17h à 19h</b> : intervention de Dominique VINCK (sociologie, Université Pierre Mendès-France, Grenoble), sur les dynamiques de la recherche en micro- et nanotechnologies.
+  </li>
+  <li>
+    <b>Jeudi 9 avril de 17h à 19h</b> : intervention de Céline VERCHERE (sociologie, CEA-LID, Grenoble), sur les usages anticipés des micro- et nanotechnologies.
+  </li>
+  <li>
+    <b>Jeudi 14 mai de 17h à 19h</b> : intervention d'Alain KAUFMANN (sociologie, Université de Lausanne), sur les débats publics autour des nanotechnologies.
+  </li>
+  <li>
+    <b>Jeudi 18 juin de 17h à 19h</b> : intervention de Xavier GUCHET et Sacha LOEVE. Clôture du séminaire.
+  </li>
+</ul>
+</p>
+<p><b>Lieu </b>: salle du Collège sur la Piazza Beaubourg.</p>
+<p><b>Coordination </b>: Xavier Guchet, Sacha Loeve</p>
+
+</div>
+
+<p>
+  <a href="res/media/Flyer_Nanotechnologies-2009.pdf" target="_blank"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Flyer du séminaire 2009</a>
+</p>
+<br />
+<br />
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/nanotechnologies2008.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,60 @@
+<?
+
+include("header.php");
+?>
+ <a name="nano">
+            <h1><img src="res/img/nanotechnologies.png" alt="Nanotechnologies" /></h1>
+            </a>
+
+<p>Séminaire « Enjeux anthropologiques, culturels et philosophiques des nanosciences et nanotechnologies ». Séminaire organisé par X. Guchet (Paris I) et S. Loeve (Paris X). Institut de Recherche et d'Innovation, 2007-2008</p>
+
+<p align="right"><a href="nanotechnologies.php">Programme 2009</a></p>
+<ul>
+<p><u>Nanosciences et philosophies de la nature</u></p>
+
+<p>
+L'intention générale de ce séminaire, commencé l'an passé, est de stimuler une approche critique des nanosciences et nanotechnologies (NST), non pas au sens d'une mise en accusation systématique des sciences et des techniques, mais au sens d'une analyse des effets que leur développement aura sur les conditions de l'expérience et de la connaissance humaines. Il s'agit par conséquent d'abandonner toute position de survol pour s'enfoncer dans la fabrique des représentations et des concepts, au plus près du travail des scientifiques en NST.<br /> 
+Le séminaire de l'an passé, sur les représentations du nanomonde, a montré qu'il n'est pas possible de réduire la recherche en NST à des considérations strictement utilitaires. Les recherches dans les domaines de l'électronique et de la mécanique moléculaires, pourtant propices à suggérer une orientation purement utilitaire des recherches en NST, apparaissent au contraire sinon exclusivement, du moins prioritairement motivées par des intérêts de connaissance. Or, ce constat ne peut pas manquer d'avoir des incidences sur la, ou les, conception(s) de la nature que les recherches en NST font émerger. On veut en effet dans ce séminaire défendre l'idée que les NST ne font pas qu'intensifier ce rapport de pure exploitation à la nature qui est supposé définir la modernité technoscientifique, mais qu'elles font aussi émerger une vraie pensée de la nature. En parodiant Merleau-Ponty parlant de la cybernétique à la fin des années 50, on peut dire qu'on ne peut pas aujourd'hui penser la nature sans parler des nanosciences. C'est cette pensée de la nature que l'on voudrait interroger cette année. Si le séminaire de l'an passé a permis d'en donner un aperçu par l'examen des artifices fabriqués en laboratoire, le séminaire de cette année sera consacré à expliciter plus précisément cette pensée et avant tout à en montrer la diversité (il n'y a pas une mais plusieurs conceptions de la nature dans les NST). On entend pour cela s'appuyer sur des pensées philosophiques de la nature, celles de Whitehead et de Simondon en particulier, en faisant l'hypothèse qu'elles sont susceptibles de fournir des concepts permettant de mieux caractériser cette pensée de la nature qui se forge au coeur de la recherche en NST.
+Les NST, considérées comme le fleuron de la créativité opératoire des technosciences contemporaines, semblent inaugurer l'ère d'une processualité pure dans laquelle le devenir aurait destitué l'être. L'idée même d'une nature extérieure à nos activités technoscientifiques achèverait sa décomposition et ferait place à une perspective massive d'instrumentalisation des processus matériels, considérés dans leur ensemble comme des « dispositifs pour ». Peut-on en rester là ? Cette question servira de fil conducteur aux réflexions de ce séminaire 2007-2008.
+</p>
+
+<div id="horaires">
+
+
+<b>dates en 2008 : </b>
+<ul>
+  <li>
+    <b>mardi 29 janvier</b> : V. Bontems, sur le thème "Nanosciences et relations d'échelle"
+  </li>
+  <li>
+    <b>mardi 19 février</b> : Xavier Guchet, sur le thème "Les nanosciences à la lumière de la philosophie de la nature et de la technique de G. Simondon"
+  </li>
+  <li>
+    <b>mardi 18 mars</b> : Bernard Stiegler, sur le thème "Ontologie des nanosciences"
+  </li>
+  <li>
+    <b>mardi 15 avril</b> : D. Debaise, sur le thème "Les nanosciences à la lumière de la philosophie de la nature de Whitehead"
+  </li>
+  <li>
+    <b>mardi 13 mai</b> : Jean-Pierre Dupuy, sur le thème "Nanosciences et théories de la complexité". 
+  </li>
+  <li>
+    <b>mardi 10 juin </b> : Bernard Stiegler, sur le thème "Ontologie des nanosciences".
+  </li>
+</ul>
+</p>
+<p><b>Coordination </b>: Xavier Guchet, Sacha Loeve</p>
+
+</div>
+<p>
+  <a href="res/media/Flyer_Nanotechnologies-2007_08.pdf" target="_blank"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Flyer du séminaire 2008</a><br/>
+  <a href="res/media/Flyer_Nanotechnologies-2007.pdf" target="_blank"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Flyer du séminaire 2007</a>
+</p>
+<a href="res/media/prgrfinal.pdf"><img src="../res/img/pdf.gif" alt="format pdf" class="image" />Programme de l'atelier : Pour une évaluation critique des bionanotechnologies
+(25-26 janvier 2008, ENS)</a>
+<br />
+<br />
+
+<?
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/nouveau_monde.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,52 @@
+<?php
+include("header.php");
+?>
+
+<h3>Entretiens du nouveau monde industriel</h3>
+
+<p>
+Cette première édition des entretiens du nouveau monde industriel organisée
+par l'IRI/Centre Pompidou, l'ENSCI et Cap Digital a pour objectif d'ouvrir
+un espace de réflexion sur les enjeux du design et de la conception
+industrielle à l'époque où les technologies numériques se généralisent
+(comme les technologies cognitives et technologies culturelles) et où émergent
+les technologies transformationnelles (comme les biotechnologies et
+nanotechnologies).
+</p>
+
+<p>
+Les mutations qui en résultent, et les contradictions qu'elles génèrent,
+imposent de repenser les pratiques du design et de la recherche &
+développement, et leurs implications du point de vue social et économique.
+</p>
+
+<p>
+Une nouvelle relation entre conception industrielle et pratiques
+quotidiennes de l'existence est en cours de définition. Veiller sur cette nouveauté 
+et tenter d'en prendre collectivement soin seront les thématiques consacrées 
+à ces entretiens qui ambitionnent de renouveler la relation entre
+savoir et industrie pour esquisser les contours de nouvelles industries
+culturelles numériques.
+</p>
+
+<a href="../res/img/Flyer_Entretiens.jpg"><img src="../res/img/Flyer_Entretiens.jpg" height="400px" /></a>
+
+<p>
+Information, inscriptions, programme :<br />
+<a href="http://www.digitallyours.fr">http://www.digitallyours.fr</a>
+</p>
+
+<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
+  <tr>
+  <td><a href="http://www.capdigital.com" title="Cap Digital"><img src="../res/img/header_logo.jpg" width="150px" /></a></td>
+  <td><a href="http://www.ensci.com" title="ENSCI"><img src="../res/img/logo_ENSCI.png" width="150px" /></a></td>
+  </tr>
+</table>
+
+<br />
+En collaboration avec : <br /><br />
+<img src="../res/img/logo-France_Culture.png" width="150px" />
+
+<?php
+include("footer.php");
+?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/nv_monde_en.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,45 @@
+<?php
+include("header.php");
+?>
+
+<h3>New Industrial World Forum</h3>
+
+<p>
+    The goal of this first New Industrial World Forum is to create a focused discussion on design and 
+    industrial design and capture this pivotal moment marked by digital technologies becoming increasingly 
+    widespread (as with cognitive and cultural technologies) and transformational technologies 
+    (in bio and nanotechnologies) proliferating.
+</p>
+
+<p>
+    Profound changes and contradictions ensue, forcing us to rethink practices in design and 
+    research & development, as well as their socio and economic implications. 
+</p>
+
+<p>
+    A new relationship between industrial design and everyday practice is being defined. 
+    By monitoring this development and trying to collectively respond to these issues, 
+    the forum aims to refresh the relationship between knowledge and industry, drawing the outline of new digital culture industries.
+</p>
+
+<a href="../res/img/Flyer_Entretiens.jpg"><img src="../res/img/Flyer_Entretiens.jpg" height="400px" /></a>
+
+<p>
+    Information, registration, program: 
+    <a href="http://www.digitallyours.fr">http://www.digitallyours.fr</a>
+</p>
+
+<table width="400" border="0" align="center" cellpadding="0" cellspacing="0">
+  <tr>
+  <td><a href="http://www.capdigital.com" title="Cap Digital"><img src="../res/img/header_logo.jpg" width="150px" /></a></td>
+  <td><a href="http://www.ensci.com" title="ENSCI"><img src="../res/img/logo_ENSCI.png" width="150px" /></a></td>
+  </tr>
+</table>
+
+<br />
+In collaboration with : <br /><br />
+<img src="../res/img/logo-France_Culture.png" width="150px" />
+
+<?php
+include("footer.php");
+?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/pratiquejugement.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,49 @@
+<?php
+include("header.php");
+?>
+<a name="pratiquejugement">
+            <h1><img src="res/img/pratiquesjugement.png" alt="Séminaire pratique et jugement" /></h1>
+            </a>
+            <p>
+            <p>Sous la direction de <b>Catherine Perret</b>, Paris 10 Nanterre</p>
+            <b>abstract</b> :
+<p>
+« L&rsquo;articulation du jugement et de la pratique est au coeur de l&rsquo;expérience artistique moderne, qu&rsquo;on la considère du point de vue de la réception ou de la production. Elle pourrait être définie par le mot de « justesse » qui ajoute aux deux premières, jugement et pratique, la notion fondamentale de « balance » ou de critique. La justesse désigne la manière dont la transmission artistique de l&rsquo;expérience peut transformer les données esthétiques de cette expérience.
+Le séminaire à venir partira de ces formulations et reformulations de la modernité et les reprendra à la lumière du discours philosophique de Michel Foucault et de son analyse de la modernité comme « réflexion du présent » telle qu&rsquo;elle est proposée dans les différentes versions de l&rsquo;essai de 1984 Was ist Aufklärung. Foucault relance dans ce texte le projet kantien de modernité critique, à ceci près que le sujet de la réflexion n&rsquo;est pas le sujet de l&rsquo;entendement et ses capacités de schématisation mais ce qu&rsquo;il appelle les savoirs, c&rsquo;est-à-dire les formules épistémologiques qui en s&rsquo;effectuant sous la forme de techniques opérent, sans l&rsquo;intervention précisément d&rsquo;aucun jugement, le contrôle des modes d&rsquo;individuation. Comment dénouer le lien fatal entre maîtrise technologique et domination bio-politique ? ou encore comment déconnecter la « croissance des capacités et l&rsquo;intensification des relations de pouvoir » ? Telle est la question à laquelle se trouvent confrontées les Lumières contemporaines. »
+</p>
+<p>
+« Dans ce contexte, Michel Foucault réintroduit la fonction du « jugement » à partir de l&rsquo;expérimentation des pouvoirs conférés aux savoirs par les techniques. L&rsquo;expérimentation par exemple des pouvoirs sur les corps conférés aux théories sociales occidentales par les techniques d&rsquo;administration de la vie et de la mort. Conduite dans un esprit de transgression méthodique, cette expérimentation des moyens non plus en vue de leurs fins « propres » mais indépendamment de ces fins, voire contre  elles, « autorise » une réflexion de ces moyens, et, avec elle, l&rsquo;invention de formules épistémologiques neuves. Le jugement désigne dans ce contexte la « conduite » de la transgression. Pour que la transgression puisse donner lieu à des modes d&rsquo;individuation qui excèdent les « programmes de contrôle »  sans pour autant sortir du terrain de l&rsquo;expérimentation partageable, voire universalisable, -ce en quoi Foucault demeure un Aufklärer- elle doit en effet être dirigée. Cette conduite, direction ou pratique relève d&rsquo;un art du jugement ou ethos que Michel Foucault réfère aux techniques de soi antiques et chrétiennes. Et tout particulièrement aux arts de la mémoire. Le jugement devient dans sa pensée « souci de soi ».
+</p>
+
+<p>
+Qu&rsquo;en est-il aujourd&rsquo;hui de cet art du jugement, autrement dit de la possibilité de conduire l&rsquo;expérimentation des modes de contrôle impliqués par les technologies contemporaines dans le sens de la transgression de telle manière qu&rsquo;elle puissent servir de nouvelles formules épistémologiques et des modes d&rsquo;individuation inédits ? »
+</p>
+
+
+<a href="jugementfull.php">ici, renvoi au texte entier </a>
+  <div id="horaires">
+    <p><b>Accès</b> Sur invitation</p>
+    <p><b>Dates </b>: à partir du mois de mars </p>
+    <p><b>Lieux</b>: Salle du collège</p>
+    <p><b>Dates et horaires </b>: de 14h30 à 17h30, les vendredi suivants :</p>
+    <ul>
+        <li class="old">9 mars</li>
+        <li class="old"> 16 mars</li>
+        <li class="old"> 23 mars</li>
+        <li class="old"> 30 mars</lI>
+        <li class="old"> 6 avril</li>
+        <li class="old"> 27 avril</li>
+        <li class="old"> 4 mai</li>
+        <li class="old"> 11 mai </li>
+        <li> 18 mai</li>
+        <li> 25 mai</li>
+        <li> 1er juin</li>
+        <li> 8 juin</li>
+        <li> 15 juin</li>
+    </ul>
+  </div>
+
+
+<?php
+include("footer.php");
+?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/regardssignes.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,47 @@
+<?
+
+include("header.php");
+?>
+
+          <a name="regards"></a>
+          <h3><img src="../titres/regards_signes.png" alt="Séminaire Regards Signés (Appareil critique cinématographique)" /></h3>
+          <div id="abstract">
+            <p>
+            <b>Abstract :</b> Ce séminaire se tient sous la forme d'un atelier à la fois théorique et pratique qui associe des professionnels de la critique cinématographique
+et les ingénieurs de l'IRI pour concevoir, prototyper et développer
+            le logiciel Lignes de temps, qui permet de réaliser des regards signés, cest à dire des appareils critiques (outils d'annotation, d'écriture, de publication) aussi
+bien que doutiller des cercles damateurs| ; Lignes de temps sert alors de collecticiel pour la formation de jugements critiques sur un film. Latelier-séminaire a pour but de
+définir des fonctionnalités du logiciel correspondant aux besoins des critiques professionnels aussi bien que des amateurs de cinéma, et par là de favoriser l'émergence de
+nouvelles pratiques culturelles autour du cinéma. En 2006, ce séminaire se focalisera principalement - mais pas exclusivement - sur l'exposition <i>Erice - Kiarostami :
+Correspondances</i>.
+            <div id="horaires">
+              <p><b>Lieu </b>: Atelier de L'IRI, 111 rue Saint Martin</p>
+
+              <p><b>Accès</b> : résidents de l'Institut et professionnels uniquement sur invitation.</p>
+
+              <p><b>Horaires</b> : Les mardis de 10 heures à 13 heures</p>
+
+              <p><b>Dates</b> :</p>
+              <ul>
+                <li class="old">12 septembre</li>
+                <li class="old">26 septembre</li>
+                <li class="old">24 octobre</li>
+                <li class="old">7 novembre</li>
+                <li class="old">21 novembre</li>
+                <li class="old">12 décembre</li>
+		        <li class="old">30 janvier</li>
+                <li class="old">13 février</li>
+                <li class="old">6 mars</li>
+                <li class="old">24 avril</li>
+                <li>22 mai</li>
+                <li>5 juin</li>
+                <li>19 juin</li>
+              </ul>
+            </div>
+
+
+
+
+<?
+include("footer.php");
+?>
Binary file web/seminaires/res/flash/mp3player.swf has changed
Binary file web/seminaires/res/flash/mp3playerFMS.swf has changed
Binary file web/seminaires/res/img/consulter_doc.png has changed
Binary file web/seminaires/res/img/culturerecherche.jpg has changed
Binary file web/seminaires/res/img/cultureweb.png has changed
Binary file web/seminaires/res/img/experiences_theoriques.png has changed
Binary file web/seminaires/res/img/imagesvisages.png has changed
Binary file web/seminaires/res/img/jugement.png has changed
Binary file web/seminaires/res/img/lecturessignees.png has changed
Binary file web/seminaires/res/img/modernites.png has changed
Binary file web/seminaires/res/img/museologie.png has changed
Binary file web/seminaires/res/img/nanotechnologies.png has changed
Binary file web/seminaires/res/img/pdf.gif has changed
Binary file web/seminaires/res/img/pratiquesjugement.png has changed
Binary file web/seminaires/res/img/regards_signes.png has changed
Binary file web/seminaires/res/img/titre_iri.gif has changed
Binary file web/seminaires/res/img/titre_iri.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/inc/functions.php	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,164 @@
+<?php
+
+/* liste des dossiers */
+function list_dir($base, $cur, $level=0) {
+
+	global $PHP_SELF, $BASE;
+
+	if ($dir = opendir($base)) {
+    $tab = array();
+    while($entry = readdir($dir)) {
+      if(is_dir($base."/".$entry) && !in_array($entry, array(".",".."))) {
+        $tab[] = $entry;
+      }
+    }
+
+   	if(ereg("([0-9]{1,2})[_]([0-9]{1,2})[_]([0-9]{4})",$tab[0])){
+   		$timestamp=array();
+   		foreach($tab as $val):
+   			list($day, $month, $year) = explode('_',$val);
+   			$timestamp[] = mktime(0,0,0,$month, $day, $year);
+   		endforeach;
+
+   		sort($timestamp,SORT_NUMERIC);
+
+   		$tab=array();
+   		foreach($timestamp as $ts):
+   			$tab[] = date('d_m_Y', $ts);
+   		endforeach;
+
+
+   	}else{
+
+	    natcasesort($tab);
+   	}
+    //natsort($tab);
+
+    foreach($tab as $entry) {
+      /* chemin relatif � la racine */
+      $file = $base."/".$entry;
+
+      /* marge gauche
+      for($i=1; $i<=(4*$level); $i++) {
+        echo "&nbsp;";
+      }
+      */
+
+      /* l'entrée est-elle le dossier courant */
+      if($file == $cur) {
+        echo "<img src=\"http://www.iri.centrepompidou.fr/seminaires/img/folder.png\" />&nbsp;".$entry."<br />\n";
+      } else {
+
+      	$display = deInterCaps($entry);
+        $display = UtoWS($display);
+
+      	echo "<img src=\"http://www.iri.centrepompidou.fr/seminaires/img/folder.png\" />&nbsp; <a href=\"$PHP_SELF?dir=".rawurlencode($file)."#audio\">".trim($display)."</a><br/>\n";
+
+
+
+      }
+      /* l'entrée est-elle dans la branche dont le dossier courant est la feuille */
+      if(ereg($file."/",$cur."/")) {
+        list_dir($file, $cur, $level+1);
+      }
+    }
+    closedir($dir);
+  }
+}
+
+/* liste des fichiers */
+function list_file($cur) {
+global $PHP_SELF, $BASE;
+  if ($dir = opendir($cur)) {
+    /* tableaux */
+    $tab_dir = array();
+    $tab_file = array();
+    /* extraction */
+    while($file = readdir($dir)) {
+      if(is_dir($cur."/".$file)) {
+          $tab_dir[] = $file;
+      } else {
+          $tab_file[] = $file;
+      }
+    }
+
+
+    /* tri */
+
+    sort($tab_dir);
+
+    sort($tab_file);
+
+    /* affichage */
+    if(!empty($tab_file)):
+    foreach($tab_dir as $elem) {
+     if($elem == ".." && isset($_GET['dir'])):
+        echo "<img src=\"http://www.iri.centrepompidou.fr/seminaires/img/folder.png\" />&nbsp;<a href='javascript:history.back()' title='retour'>".$elem."</a><br />\n";
+     else:
+        //echo "<img src=\"dir-close.gif\" />&nbsp;".$elem."<br />\n";
+     endif;
+    }
+    endif;
+
+    $i=0;
+    $tab=array();
+    $path='';
+    $tab = explode("/",$BASE);
+
+    echo '<table width="100%" cellspacing="0" cellpadding="0">';
+    foreach($tab_file as $elem) {
+
+
+        $path='';
+        for($j=5;$j<count($tab);$j++){
+            $path .= $tab[$j]."/";
+        }
+
+        $path .= $elem;
+
+        $temppath = substr($BASE,26);
+      	$temppath .= "/";
+
+        $displayElem = UtoWS($elem);
+      	$iconeInfo = (strstr(strtolower($BASE),"regards"))?'<a href="javascript:void(0)" onclick="document.getElementById(\'moreinfo\').style.display=\'block\'"><img src="http://www.iri.centrepompidou.fr/seminaires/img/information.png" alt="information" title="plus d\'information" class="image"/></a>&nbsp;&nbsp;':'';
+
+
+
+      //gestion du type de fichier
+      	//si mp3 : affichage lien download et ecoute
+      	//si pdf : uniquement download
+      	list($filename, $ext) = explode('.',$elem);
+
+      	if($ext == 'mp3'){
+	      	echo "<tr>";
+	     	echo "<td width='80%'><img src=\"res/img/page_white_cd.png\" border='0'/>&nbsp;<a href=\"javascript:void(0)\" onclick=\"switchMedia('".trim($temppath.$elem)."')\" >".$displayElem."</a></td>";
+	      	echo "<td>".$iconeInfo."<a href=\"javascript:void(0)\" onclick=\"switchMedia('".trim($temppath.$elem)."')\">&nbsp;&nbsp;<img src='res/img/sound.png' border='0' title='ecouter' alt='ecouter' class='image'/></a>&nbsp;&nbsp;<a href=\"http://www.iri.centrepompidou.fr/documents/audio/".$path."\">&nbsp;&nbsp;<img src='http://www.iri.centrepompidou.fr/privatedoc/img/disk.png' border='0' title='télécharger' alt='télécharger' class='image'></a><br/></td>";
+	      	echo '</tr>';
+      	}
+      	elseif($ext == 'pdf'){
+
+      		echo "<tr>";
+	      	echo "<td width='80%'>";
+	      	echo "<img src=\"../res/img/pdf.gif\" border='0'/>&nbsp;<a href=\"http://www.iri.centrepompidou.fr/documents/audio/$path\" >".$displayElem."</a></td>";
+	      	echo "<td>".$iconeInfo."<a href=\"http://www.iri.centrepompidou.fr/documents/audio/".$path."\">&nbsp;&nbsp;<img src='http://www.iri.centrepompidou.fr/seminaires/img/disk.png' border='0' title='télécharger' alt='télécharger' class='image'></a><br/></td>";
+	      	echo '</tr>';
+
+      	}
+    $i++;
+    }
+    echo '</table>';
+    closedir($dir);
+  }
+}
+
+/*remplace une majuscule par un espace*/
+function deInterCaps($var){
+   return ucfirst(strtolower(ereg_replace("[A-Z]"," \\0",$var)));
+}
+
+/*remplace un underscore par un espace*/
+function UtoWS($text){
+
+	return ucfirst(strtolower(ereg_replace("[_]"," ",$text)));
+}
+?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/builder.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,119 @@
+// script.aculo.us builder.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// See scriptaculous.js for full license.
+
+var Builder = {
+  NODEMAP: {
+    AREA: 'map',
+    CAPTION: 'table',
+    COL: 'table',
+    COLGROUP: 'table',
+    LEGEND: 'fieldset',
+    OPTGROUP: 'select',
+    OPTION: 'select',
+    PARAM: 'object',
+    TBODY: 'table',
+    TD: 'table',
+    TFOOT: 'table',
+    TH: 'table',
+    THEAD: 'table',
+    TR: 'table'
+  },
+  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+  //       due to a Firefox bug
+  node: function(elementName) {
+    elementName = elementName.toUpperCase();
+    
+    // try innerHTML approach
+    var parentTag = this.NODEMAP[elementName] || 'div';
+    var parentElement = document.createElement(parentTag);
+    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
+    } catch(e) {}
+    var element = parentElement.firstChild || null;
+      
+    // see if browser added wrapping tags
+    if(element && (element.tagName != elementName))
+      element = element.getElementsByTagName(elementName)[0];
+    
+    // fallback to createElement approach
+    if(!element) element = document.createElement(elementName);
+    
+    // abort if nothing could be created
+    if(!element) return;
+
+    // attributes (or text)
+    if(arguments[1])
+      if(this._isStringOrNumber(arguments[1]) ||
+        (arguments[1] instanceof Array)) {
+          this._children(element, arguments[1]);
+        } else {
+          var attrs = this._attributes(arguments[1]);
+          if(attrs.length) {
+            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+              parentElement.innerHTML = "<" +elementName + " " +
+                attrs + "></" + elementName + ">";
+            } catch(e) {}
+            element = parentElement.firstChild || null;
+            // workaround firefox 1.0.X bug
+            if(!element) {
+              element = document.createElement(elementName);
+              for(attr in arguments[1]) 
+                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+            }
+            if(element.tagName != elementName)
+              element = parentElement.getElementsByTagName(elementName)[0];
+            }
+        } 
+
+    // text, or array of children
+    if(arguments[2])
+      this._children(element, arguments[2]);
+
+     return element;
+  },
+  _text: function(text) {
+     return document.createTextNode(text);
+  },
+  _attributes: function(attributes) {
+    var attrs = [];
+    for(attribute in attributes)
+      attrs.push((attribute=='className' ? 'class' : attribute) +
+          '="' + attributes[attribute].toString().escapeHTML() + '"');
+    return attrs.join(" ");
+  },
+  _children: function(element, children) {
+    if(typeof children=='object') { // array can hold nodes and text
+      children.flatten().each( function(e) {
+        if(typeof e=='object')
+          element.appendChild(e)
+        else
+          if(Builder._isStringOrNumber(e))
+            element.appendChild(Builder._text(e));
+      });
+    } else
+      if(Builder._isStringOrNumber(children)) 
+         element.appendChild(Builder._text(children));
+  },
+  _isStringOrNumber: function(param) {
+    return(typeof param=='string' || typeof param=='number');
+  },
+  dump: function(scope) { 
+    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
+  
+    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
+      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
+      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
+      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
+      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
+      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
+  
+    tags.each( function(tag){ 
+      scope[tag] = function() { 
+        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
+      } 
+    });
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/controls.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,833 @@
+// script.aculo.us controls.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+//  Rob Wills
+// 
+// See scriptaculous.js for full license.
+
+// Autocompleter.Base handles all the autocompletion functionality 
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least, 
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method 
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most 
+// useful when one of the tokens is \n (a newline), as it 
+// allows smart autocompletion after linebreaks.
+
+if(typeof Effect == 'undefined')
+  throw("controls.js requires including script.aculo.us' effects.js library");
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+  baseInitialize: function(element, update, options) {
+    this.element     = $(element); 
+    this.update      = $(update);  
+    this.hasFocus    = false; 
+    this.changed     = false; 
+    this.active      = false; 
+    this.index       = 0;     
+    this.entryCount  = 0;
+
+    if(this.setOptions)
+      this.setOptions(options);
+    else
+      this.options = options || {};
+
+    this.options.paramName    = this.options.paramName || this.element.name;
+    this.options.tokens       = this.options.tokens || [];
+    this.options.frequency    = this.options.frequency || 0.4;
+    this.options.minChars     = this.options.minChars || 1;
+    this.options.onShow       = this.options.onShow || 
+      function(element, update){ 
+        if(!update.style.position || update.style.position=='absolute') {
+          update.style.position = 'absolute';
+          Position.clone(element, update, {
+            setHeight: false, 
+            offsetTop: element.offsetHeight
+          });
+        }
+        Effect.Appear(update,{duration:0.15});
+      };
+    this.options.onHide = this.options.onHide || 
+      function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+    if(typeof(this.options.tokens) == 'string') 
+      this.options.tokens = new Array(this.options.tokens);
+
+    this.observer = null;
+    
+    this.element.setAttribute('autocomplete','off');
+
+    Element.hide(this.update);
+
+    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix && 
+      (navigator.appVersion.indexOf('MSIE')>0) &&
+      (navigator.userAgent.indexOf('Opera')<0) &&
+      (Element.getStyle(this.update, 'position')=='absolute')) {
+      new Insertion.After(this.update, 
+       '<iframe id="' + this.update.id + '_iefix" '+
+       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+      this.iefix = $(this.update.id+'_iefix');
+    }
+    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+  },
+  
+  fixIEOverlapping: function() {
+    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
+    this.iefix.style.zIndex = 1;
+    this.update.style.zIndex = 2;
+    Element.show(this.iefix);
+  },
+
+  hide: function() {
+    this.stopIndicator();
+    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+    if(this.iefix) Element.hide(this.iefix);
+  },
+
+  startIndicator: function() {
+    if(this.options.indicator) Element.show(this.options.indicator);
+  },
+
+  stopIndicator: function() {
+    if(this.options.indicator) Element.hide(this.options.indicator);
+  },
+
+  onKeyPress: function(event) {
+    if(this.active)
+      switch(event.keyCode) {
+       case Event.KEY_TAB:
+       case Event.KEY_RETURN:
+         this.selectEntry();
+         Event.stop(event);
+       case Event.KEY_ESC:
+         this.hide();
+         this.active = false;
+         Event.stop(event);
+         return;
+       case Event.KEY_LEFT:
+       case Event.KEY_RIGHT:
+         return;
+       case Event.KEY_UP:
+         this.markPrevious();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+      }
+     else 
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer = 
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  activate: function() {
+    this.changed = false;
+    this.hasFocus = true;
+    this.getUpdatedChoices();
+  },
+
+  onHover: function(event) {
+    var element = Event.findElement(event, 'LI');
+    if(this.index != element.autocompleteIndex) 
+    {
+        this.index = element.autocompleteIndex;
+        this.render();
+    }
+    Event.stop(event);
+  },
+  
+  onClick: function(event) {
+    var element = Event.findElement(event, 'LI');
+    this.index = element.autocompleteIndex;
+    this.selectEntry();
+    this.hide();
+  },
+  
+  onBlur: function(event) {
+    // needed to make click events working
+    setTimeout(this.hide.bind(this), 250);
+    this.hasFocus = false;
+    this.active = false;     
+  }, 
+  
+  render: function() {
+    if(this.entryCount > 0) {
+      for (var i = 0; i < this.entryCount; i++)
+        this.index==i ? 
+          Element.addClassName(this.getEntry(i),"selected") : 
+          Element.removeClassName(this.getEntry(i),"selected");
+        
+      if(this.hasFocus) { 
+        this.show();
+        this.active = true;
+      }
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+  
+  markPrevious: function() {
+    if(this.index > 0) this.index--
+      else this.index = this.entryCount-1;
+    this.getEntry(this.index).scrollIntoView(true);
+  },
+  
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++
+      else this.index = 0;
+    this.getEntry(this.index).scrollIntoView(false);
+  },
+  
+  getEntry: function(index) {
+    return this.update.firstChild.childNodes[index];
+  },
+  
+  getCurrentEntry: function() {
+    return this.getEntry(this.index);
+  },
+  
+  selectEntry: function() {
+    this.active = false;
+    this.updateElement(this.getCurrentEntry());
+  },
+
+  updateElement: function(selectedElement) {
+    if (this.options.updateElement) {
+      this.options.updateElement(selectedElement);
+      return;
+    }
+    var value = '';
+    if (this.options.select) {
+      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+    } else
+      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+    
+    var lastTokenPos = this.findLastToken();
+    if (lastTokenPos != -1) {
+      var newValue = this.element.value.substr(0, lastTokenPos + 1);
+      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value;
+    } else {
+      this.element.value = value;
+    }
+    this.element.focus();
+    
+    if (this.options.afterUpdateElement)
+      this.options.afterUpdateElement(this.element, selectedElement);
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.firstChild);
+
+      if(this.update.firstChild && this.update.firstChild.childNodes) {
+        this.entryCount = 
+          this.update.firstChild.childNodes.length;
+        for (var i = 0; i < this.entryCount; i++) {
+          var entry = this.getEntry(i);
+          entry.autocompleteIndex = i;
+          this.addObservers(entry);
+        }
+      } else { 
+        this.entryCount = 0;
+      }
+
+      this.stopIndicator();
+      this.index = 0;
+      
+      if(this.entryCount==1 && this.options.autoSelect) {
+        this.selectEntry();
+        this.hide();
+      } else {
+        this.render();
+      }
+    }
+  },
+
+  addObservers: function(element) {
+    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+  },
+
+  onObserverEvent: function() {
+    this.changed = false;   
+    if(this.getToken().length>=this.options.minChars) {
+      this.startIndicator();
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  getToken: function() {
+    var tokenPos = this.findLastToken();
+    if (tokenPos != -1)
+      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+    else
+      var ret = this.element.value;
+
+    return /\n/.test(ret) ? '' : ret;
+  },
+
+  findLastToken: function() {
+    var lastTokenPos = -1;
+
+    for (var i=0; i<this.options.tokens.length; i++) {
+      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+      if (thisTokenPos > lastTokenPos)
+        lastTokenPos = thisTokenPos;
+    }
+    return lastTokenPos;
+  }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+  initialize: function(element, update, url, options) {
+    this.baseInitialize(element, update, options);
+    this.options.asynchronous  = true;
+    this.options.onComplete    = this.onComplete.bind(this);
+    this.options.defaultParams = this.options.parameters || null;
+    this.url                   = url;
+  },
+
+  getUpdatedChoices: function() {
+    entry = encodeURIComponent(this.options.paramName) + '=' + 
+      encodeURIComponent(this.getToken());
+
+    this.options.parameters = this.options.callback ?
+      this.options.callback(this.element, entry) : entry;
+
+    if(this.options.defaultParams) 
+      this.options.parameters += '&' + this.options.defaultParams;
+
+    new Ajax.Request(this.url, this.options);
+  },
+
+  onComplete: function(request) {
+    this.updateChoices(request.responseText);
+  }
+
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+//                    text only at the beginning of strings in the 
+//                    autocomplete array. Defaults to true, which will
+//                    match text at the beginning of any *word* in the
+//                    strings in the autocomplete array. If you want to
+//                    search anywhere in the string, additionally set
+//                    the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+//                   a partial match (unlike minChars, which defines
+//                   how many characters are required to do any match
+//                   at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+//                 Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector' 
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+  initialize: function(element, update, array, options) {
+    this.baseInitialize(element, update, options);
+    this.options.array = array;
+  },
+
+  getUpdatedChoices: function() {
+    this.updateChoices(this.options.selector(this));
+  },
+
+  setOptions: function(options) {
+    this.options = Object.extend({
+      choices: 10,
+      partialSearch: true,
+      partialChars: 2,
+      ignoreCase: true,
+      fullSearch: false,
+      selector: function(instance) {
+        var ret       = []; // Beginning matches
+        var partial   = []; // Inside matches
+        var entry     = instance.getToken();
+        var count     = 0;
+
+        for (var i = 0; i < instance.options.array.length &&  
+          ret.length < instance.options.choices ; i++) { 
+
+          var elem = instance.options.array[i];
+          var foundPos = instance.options.ignoreCase ? 
+            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+            elem.indexOf(entry);
+
+          while (foundPos != -1) {
+            if (foundPos == 0 && elem.length != entry.length) { 
+              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
+                elem.substr(entry.length) + "</li>");
+              break;
+            } else if (entry.length >= instance.options.partialChars && 
+              instance.options.partialSearch && foundPos != -1) {
+              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+                  foundPos + entry.length) + "</li>");
+                break;
+              }
+            }
+
+            foundPos = instance.options.ignoreCase ? 
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+              elem.indexOf(entry, foundPos + 1);
+
+          }
+        }
+        if (partial.length)
+          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+        return "<ul>" + ret.join('') + "</ul>";
+      }
+    }, options || {});
+  }
+});
+
+// AJAX in-place editor
+//
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+  setTimeout(function() {
+    Field.activate(field);
+  }, 1);
+}
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = $(element);
+
+    this.options = Object.extend({
+      okButton: true,
+      okText: "ok",
+      cancelLink: true,
+      cancelText: "cancel",
+      savingText: "Saving...",
+      clickToEditText: "Click to edit",
+      okText: "ok",
+      rows: 1,
+      onComplete: function(transport, element) {
+        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+      },
+      onFailure: function(transport) {
+        alert("Error communicating with the server: " + transport.responseText.stripTags());
+      },
+      callback: function(form) {
+        return Form.serialize(form);
+      },
+      handleLineBreaks: true,
+      loadingText: 'Loading...',
+      savingClassName: 'inplaceeditor-saving',
+      loadingClassName: 'inplaceeditor-loading',
+      formClassName: 'inplaceeditor-form',
+      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+      highlightendcolor: "#FFFFFF",
+      externalControl: null,
+      submitOnBlur: false,
+      ajaxOptions: {},
+      evalScripts: false
+    }, options || {});
+
+    if(!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + "-inplaceeditor";
+      if ($(this.options.formId)) {
+        // there's already a form with that name, don't specify an id
+        this.options.formId = null;
+      }
+    }
+    
+    if (this.options.externalControl) {
+      this.options.externalControl = $(this.options.externalControl);
+    }
+    
+    this.originalBackground = Element.getStyle(this.element, 'background-color');
+    if (!this.originalBackground) {
+      this.originalBackground = "transparent";
+    }
+    
+    this.element.title = this.options.clickToEditText;
+    
+    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+    Event.observe(this.element, 'click', this.onclickListener);
+    Event.observe(this.element, 'mouseover', this.mouseoverListener);
+    Event.observe(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.observe(this.options.externalControl, 'click', this.onclickListener);
+      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  },
+  enterEditMode: function(evt) {
+    if (this.saving) return;
+    if (this.editing) return;
+    this.editing = true;
+    this.onEnterEditMode();
+    if (this.options.externalControl) {
+      Element.hide(this.options.externalControl);
+    }
+    Element.hide(this.element);
+    this.createForm();
+    this.element.parentNode.insertBefore(this.form, this.element);
+    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
+    // stop the event to avoid a page refresh in Safari
+    if (evt) {
+      Event.stop(evt);
+    }
+    return false;
+  },
+  createForm: function() {
+    this.form = document.createElement("form");
+    this.form.id = this.options.formId;
+    Element.addClassName(this.form, this.options.formClassName)
+    this.form.onsubmit = this.onSubmit.bind(this);
+
+    this.createEditField();
+
+    if (this.options.textarea) {
+      var br = document.createElement("br");
+      this.form.appendChild(br);
+    }
+
+    if (this.options.okButton) {
+      okButton = document.createElement("input");
+      okButton.type = "submit";
+      okButton.value = this.options.okText;
+      okButton.className = 'editor_ok_button';
+      this.form.appendChild(okButton);
+    }
+
+    if (this.options.cancelLink) {
+      cancelLink = document.createElement("a");
+      cancelLink.href = "#";
+      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+      cancelLink.onclick = this.onclickCancel.bind(this);
+      cancelLink.className = 'editor_cancel';      
+      this.form.appendChild(cancelLink);
+    }
+  },
+  hasHTMLLineBreaks: function(string) {
+    if (!this.options.handleLineBreaks) return false;
+    return string.match(/<br/i) || string.match(/<p>/i);
+  },
+  convertHTMLLineBreaks: function(string) {
+    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
+  },
+  createEditField: function() {
+    var text;
+    if(this.options.loadTextURL) {
+      text = this.options.loadingText;
+    } else {
+      text = this.getText();
+    }
+
+    var obj = this;
+    
+    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+      this.options.textarea = false;
+      var textField = document.createElement("input");
+      textField.obj = this;
+      textField.type = "text";
+      textField.name = "value";
+      textField.value = text;
+      textField.style.backgroundColor = this.options.highlightcolor;
+      textField.className = 'editor_field';
+      var size = this.options.size || this.options.cols || 0;
+      if (size != 0) textField.size = size;
+      if (this.options.submitOnBlur)
+        textField.onblur = this.onSubmit.bind(this);
+      this.editField = textField;
+    } else {
+      this.options.textarea = true;
+      var textArea = document.createElement("textarea");
+      textArea.obj = this;
+      textArea.name = "value";
+      textArea.value = this.convertHTMLLineBreaks(text);
+      textArea.rows = this.options.rows;
+      textArea.cols = this.options.cols || 40;
+      textArea.className = 'editor_field';      
+      if (this.options.submitOnBlur)
+        textArea.onblur = this.onSubmit.bind(this);
+      this.editField = textArea;
+    }
+    
+    if(this.options.loadTextURL) {
+      this.loadExternalText();
+    }
+    this.form.appendChild(this.editField);
+  },
+  getText: function() {
+    return this.element.innerHTML;
+  },
+  loadExternalText: function() {
+    Element.addClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = true;
+    new Ajax.Request(
+      this.options.loadTextURL,
+      Object.extend({
+        asynchronous: true,
+        onComplete: this.onLoadedExternalText.bind(this)
+      }, this.options.ajaxOptions)
+    );
+  },
+  onLoadedExternalText: function(transport) {
+    Element.removeClassName(this.form, this.options.loadingClassName);
+    this.editField.disabled = false;
+    this.editField.value = transport.responseText.stripTags();
+    Field.scrollFreeActivate(this.editField);
+  },
+  onclickCancel: function() {
+    this.onComplete();
+    this.leaveEditMode();
+    return false;
+  },
+  onFailure: function(transport) {
+    this.options.onFailure(transport);
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+      this.oldInnerHTML = null;
+    }
+    return false;
+  },
+  onSubmit: function() {
+    // onLoading resets these so we need to save them away for the Ajax call
+    var form = this.form;
+    var value = this.editField.value;
+    
+    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
+    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
+    // to be displayed indefinitely
+    this.onLoading();
+    
+    if (this.options.evalScripts) {
+      new Ajax.Request(
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this),
+          asynchronous:true, 
+          evalScripts:true
+        }, this.options.ajaxOptions));
+    } else  {
+      new Ajax.Updater(
+        { success: this.element,
+          // don't update on failure (this could be an option)
+          failure: null }, 
+        this.url, Object.extend({
+          parameters: this.options.callback(form, value),
+          onComplete: this.onComplete.bind(this),
+          onFailure: this.onFailure.bind(this)
+        }, this.options.ajaxOptions));
+    }
+    // stop the event to avoid a page refresh in Safari
+    if (arguments.length > 1) {
+      Event.stop(arguments[0]);
+    }
+    return false;
+  },
+  onLoading: function() {
+    this.saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  showSaving: function() {
+    this.oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    Element.addClassName(this.element, this.options.savingClassName);
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+  },
+  removeForm: function() {
+    if(this.form) {
+      if (this.form.parentNode) Element.remove(this.form);
+      this.form = null;
+    }
+  },
+  enterHover: function() {
+    if (this.saving) return;
+    this.element.style.backgroundColor = this.options.highlightcolor;
+    if (this.effect) {
+      this.effect.cancel();
+    }
+    Element.addClassName(this.element, this.options.hoverClassName)
+  },
+  leaveHover: function() {
+    if (this.options.backgroundColor) {
+      this.element.style.backgroundColor = this.oldBackground;
+    }
+    Element.removeClassName(this.element, this.options.hoverClassName)
+    if (this.saving) return;
+    this.effect = new Effect.Highlight(this.element, {
+      startcolor: this.options.highlightcolor,
+      endcolor: this.options.highlightendcolor,
+      restorecolor: this.originalBackground
+    });
+  },
+  leaveEditMode: function() {
+    Element.removeClassName(this.element, this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+    if (this.options.externalControl) {
+      Element.show(this.options.externalControl);
+    }
+    this.editing = false;
+    this.saving = false;
+    this.oldInnerHTML = null;
+    this.onLeaveEditMode();
+  },
+  onComplete: function(transport) {
+    this.leaveEditMode();
+    this.options.onComplete.bind(this)(transport, this.element);
+  },
+  onEnterEditMode: function() {},
+  onLeaveEditMode: function() {},
+  dispose: function() {
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+    }
+    this.leaveEditMode();
+    Event.stopObserving(this.element, 'click', this.onclickListener);
+    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  }
+};
+
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+  createEditField: function() {
+    if (!this.cached_selectTag) {
+      var selectTag = document.createElement("select");
+      var collection = this.options.collection || [];
+      var optionTag;
+      collection.each(function(e,i) {
+        optionTag = document.createElement("option");
+        optionTag.value = (e instanceof Array) ? e[0] : e;
+        if((typeof this.options.value == 'undefined') && 
+          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
+        if(this.options.value==optionTag.value) optionTag.selected = true;
+        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+        selectTag.appendChild(optionTag);
+      }.bind(this));
+      this.cached_selectTag = selectTag;
+    }
+
+    this.editField = this.cached_selectTag;
+    if(this.options.loadTextURL) this.loadExternalText();
+    this.form.appendChild(this.editField);
+    this.options.callback = function(form, value) {
+      return "value=" + encodeURIComponent(value);
+    }
+  }
+});
+
+// Delayed observer, like Form.Element.Observer, 
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+  initialize: function(element, delay, callback) {
+    this.delay     = delay || 0.5;
+    this.element   = $(element);
+    this.callback  = callback;
+    this.timer     = null;
+    this.lastValue = $F(this.element); 
+    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+  },
+  delayedListener: function(event) {
+    if(this.lastValue == $F(this.element)) return;
+    if(this.timer) clearTimeout(this.timer);
+    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+    this.lastValue = $F(this.element);
+  },
+  onTimerEvent: function() {
+    this.timer = null;
+    this.callback(this.element, $F(this.element));
+  }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/dragdrop.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,970 @@
+// script.aculo.us dragdrop.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
+// 
+// See scriptaculous.js for full license.
+
+/*--------------------------------------------------------------------------*/
+
+if(typeof Effect == 'undefined')
+  throw("dragdrop.js requires including script.aculo.us' effects.js library");
+
+var Droppables = {
+  drops: [],
+
+  remove: function(element) {
+    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null,
+      tree:       false
+    }, arguments[1] || {});
+
+    // cache containers
+    if(options.containment) {
+      options._containers = [];
+      var containment = options.containment;
+      if((typeof containment == 'object') && 
+        (containment.constructor == Array)) {
+        containment.each( function(c) { options._containers.push($(c)) });
+      } else {
+        options._containers.push($(containment));
+      }
+    }
+    
+    if(options.accept) options.accept = [options.accept].flatten();
+
+    Element.makePositioned(element); // fix IE
+    options.element = element;
+
+    this.drops.push(options);
+  },
+  
+  findDeepestChild: function(drops) {
+    deepest = drops[0];
+      
+    for (i = 1; i < drops.length; ++i)
+      if (Element.isParent(drops[i].element, deepest.element))
+        deepest = drops[i];
+    
+    return deepest;
+  },
+
+  isContained: function(element, drop) {
+    var containmentNode;
+    if(drop.tree) {
+      containmentNode = element.treeNode; 
+    } else {
+      containmentNode = element.parentNode;
+    }
+    return drop._containers.detect(function(c) { return containmentNode == c });
+  },
+  
+  isAffected: function(point, element, drop) {
+    return (
+      (drop.element!=element) &&
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &&
+      ((!drop.accept) ||
+        (Element.classNames(element).detect( 
+          function(v) { return drop.accept.include(v) } ) )) &&
+      Position.within(drop.element, point[0], point[1]) );
+  },
+
+  deactivate: function(drop) {
+    if(drop.hoverclass)
+      Element.removeClassName(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(drop.hoverclass)
+      Element.addClassName(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(point, element) {
+    if(!this.drops.length) return;
+    var affected = [];
+    
+    if(this.last_active) this.deactivate(this.last_active);
+    this.drops.each( function(drop) {
+      if(Droppables.isAffected(point, element, drop))
+        affected.push(drop);
+    });
+        
+    if(affected.length>0) {
+      drop = Droppables.findDeepestChild(affected);
+      Position.within(drop.element, point[0], point[1]);
+      if(drop.onHover)
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+      
+      Droppables.activate(drop);
+    }
+  },
+
+  fire: function(event, element) {
+    if(!this.last_active) return;
+    Position.prepare();
+
+    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+      if (this.last_active.onDrop) 
+        this.last_active.onDrop(element, this.last_active.element, event);
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+}
+
+var Draggables = {
+  drags: [],
+  observers: [],
+  
+  register: function(draggable) {
+    if(this.drags.length == 0) {
+      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
+      
+      Event.observe(document, "mouseup", this.eventMouseUp);
+      Event.observe(document, "mousemove", this.eventMouseMove);
+      Event.observe(document, "keypress", this.eventKeypress);
+    }
+    this.drags.push(draggable);
+  },
+  
+  unregister: function(draggable) {
+    this.drags = this.drags.reject(function(d) { return d==draggable });
+    if(this.drags.length == 0) {
+      Event.stopObserving(document, "mouseup", this.eventMouseUp);
+      Event.stopObserving(document, "mousemove", this.eventMouseMove);
+      Event.stopObserving(document, "keypress", this.eventKeypress);
+    }
+  },
+  
+  activate: function(draggable) {
+    if(draggable.options.delay) { 
+      this._timeout = setTimeout(function() { 
+        Draggables._timeout = null; 
+        window.focus(); 
+        Draggables.activeDraggable = draggable; 
+      }.bind(this), draggable.options.delay); 
+    } else {
+      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+      this.activeDraggable = draggable;
+    }
+  },
+  
+  deactivate: function() {
+    this.activeDraggable = null;
+  },
+  
+  updateDrag: function(event) {
+    if(!this.activeDraggable) return;
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    // Mozilla-based browsers fire successive mousemove events with
+    // the same coordinates, prevent needless redrawing (moz bug?)
+    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+    this._lastPointer = pointer;
+    
+    this.activeDraggable.updateDrag(event, pointer);
+  },
+  
+  endDrag: function(event) {
+    if(this._timeout) { 
+      clearTimeout(this._timeout); 
+      this._timeout = null; 
+    }
+    if(!this.activeDraggable) return;
+    this._lastPointer = null;
+    this.activeDraggable.endDrag(event);
+    this.activeDraggable = null;
+  },
+  
+  keyPress: function(event) {
+    if(this.activeDraggable)
+      this.activeDraggable.keyPress(event);
+  },
+  
+  addObserver: function(observer) {
+    this.observers.push(observer);
+    this._cacheObserverCallbacks();
+  },
+  
+  removeObserver: function(element) {  // element instead of observer fixes mem leaks
+    this.observers = this.observers.reject( function(o) { return o.element==element });
+    this._cacheObserverCallbacks();
+  },
+  
+  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
+    if(this[eventName+'Count'] > 0)
+      this.observers.each( function(o) {
+        if(o[eventName]) o[eventName](eventName, draggable, event);
+      });
+    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
+  },
+  
+  _cacheObserverCallbacks: function() {
+    ['onStart','onEnd','onDrag'].each( function(eventName) {
+      Draggables[eventName+'Count'] = Draggables.observers.select(
+        function(o) { return o[eventName]; }
+      ).length;
+    });
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create();
+Draggable._dragging    = {};
+
+Draggable.prototype = {
+  initialize: function(element) {
+    var defaults = {
+      handle: false,
+      reverteffect: function(element, top_offset, left_offset) {
+        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
+          queue: {scope:'_draggable', position:'end'}
+        });
+      },
+      endeffect: function(element) {
+        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
+          queue: {scope:'_draggable', position:'end'},
+          afterFinish: function(){ 
+            Draggable._dragging[element] = false 
+          }
+        }); 
+      },
+      zindex: 1000,
+      revert: false,
+      scroll: false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
+      delay: 0
+    };
+    
+    if(arguments[1] && typeof arguments[1].endeffect == 'undefined')
+      Object.extend(defaults, {
+        starteffect: function(element) {
+          element._opacity = Element.getOpacity(element);
+          Draggable._dragging[element] = true;
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
+        }
+      });
+    
+    var options = Object.extend(defaults, arguments[1] || {});
+
+    this.element = $(element);
+    
+    if(options.handle && (typeof options.handle == 'string')) {
+      var h = Element.childrenWithClassName(this.element, options.handle, true);
+      if(h.length>0) this.handle = h[0];
+    }
+    if(!this.handle) this.handle = $(options.handle);
+    if(!this.handle) this.handle = this.element;
+    
+    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
+      options.scroll = $(options.scroll);
+      this._isScrollChild = Element.childOf(this.element, options.scroll);
+    }
+
+    Element.makePositioned(this.element); // fix IE    
+
+    this.delta    = this.currentDelta();
+    this.options  = options;
+    this.dragging = false;   
+
+    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+    Event.observe(this.handle, "mousedown", this.eventMouseDown);
+    
+    Draggables.register(this);
+  },
+  
+  destroy: function() {
+    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+    Draggables.unregister(this);
+  },
+  
+  currentDelta: function() {
+    return([
+      parseInt(Element.getStyle(this.element,'left') || '0'),
+      parseInt(Element.getStyle(this.element,'top') || '0')]);
+  },
+  
+  initDrag: function(event) {
+    if(typeof Draggable._dragging[this.element] != 'undefined' &&
+      Draggable._dragging[this.element]) return;
+    if(Event.isLeftClick(event)) {    
+      // abort on form elements, fixes a Firefox issue
+      var src = Event.element(event);
+      if(src.tagName && (
+        src.tagName=='INPUT' ||
+        src.tagName=='SELECT' ||
+        src.tagName=='OPTION' ||
+        src.tagName=='BUTTON' ||
+        src.tagName=='TEXTAREA')) return;
+        
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      var pos     = Position.cumulativeOffset(this.element);
+      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+      
+      Draggables.activate(this);
+      Event.stop(event);
+    }
+  },
+  
+  startDrag: function(event) {
+    this.dragging = true;
+    
+    if(this.options.zindex) {
+      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+      this.element.style.zIndex = this.options.zindex;
+    }
+    
+    if(this.options.ghosting) {
+      this._clone = this.element.cloneNode(true);
+      Position.absolutize(this.element);
+      this.element.parentNode.insertBefore(this._clone, this.element);
+    }
+    
+    if(this.options.scroll) {
+      if (this.options.scroll == window) {
+        var where = this._getWindowScroll(this.options.scroll);
+        this.originalScrollLeft = where.left;
+        this.originalScrollTop = where.top;
+      } else {
+        this.originalScrollLeft = this.options.scroll.scrollLeft;
+        this.originalScrollTop = this.options.scroll.scrollTop;
+      }
+    }
+    
+    Draggables.notify('onStart', this, event);
+        
+    if(this.options.starteffect) this.options.starteffect(this.element);
+  },
+  
+  updateDrag: function(event, pointer) {
+    if(!this.dragging) this.startDrag(event);
+    Position.prepare();
+    Droppables.show(pointer, this.element);
+    Draggables.notify('onDrag', this, event);
+    
+    this.draw(pointer);
+    if(this.options.change) this.options.change(this);
+    
+    if(this.options.scroll) {
+      this.stopScrolling();
+      
+      var p;
+      if (this.options.scroll == window) {
+        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+      } else {
+        p = Position.page(this.options.scroll);
+        p[0] += this.options.scroll.scrollLeft;
+        p[1] += this.options.scroll.scrollTop;
+        
+        p[0] += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
+        p[1] += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
+        
+        p.push(p[0]+this.options.scroll.offsetWidth);
+        p.push(p[1]+this.options.scroll.offsetHeight);
+      }
+      var speed = [0,0];
+      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+      this.startScrolling(speed);
+    }
+    
+    // fix AppleWebKit rendering
+    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+    
+    Event.stop(event);
+  },
+  
+  finishDrag: function(event, success) {
+    this.dragging = false;
+
+    if(this.options.ghosting) {
+      Position.relativize(this.element);
+      Element.remove(this._clone);
+      this._clone = null;
+    }
+
+    if(success) Droppables.fire(event, this.element);
+    Draggables.notify('onEnd', this, event);
+
+    var revert = this.options.revert;
+    if(revert && typeof revert == 'function') revert = revert(this.element);
+    
+    var d = this.currentDelta();
+    if(revert && this.options.reverteffect) {
+      this.options.reverteffect(this.element, 
+        d[1]-this.delta[1], d[0]-this.delta[0]);
+    } else {
+      this.delta = d;
+    }
+
+    if(this.options.zindex)
+      this.element.style.zIndex = this.originalZ;
+
+    if(this.options.endeffect) 
+      this.options.endeffect(this.element);
+      
+    Draggables.deactivate(this);
+    Droppables.reset();
+  },
+  
+  keyPress: function(event) {
+    if(event.keyCode!=Event.KEY_ESC) return;
+    this.finishDrag(event, false);
+    Event.stop(event);
+  },
+  
+  endDrag: function(event) {
+    if(!this.dragging) return;
+    this.stopScrolling();
+    this.finishDrag(event, true);
+    Event.stop(event);
+  },
+  
+  draw: function(point) {
+    var pos = Position.cumulativeOffset(this.element);
+    if(this.options.ghosting) {
+      var r   = Position.realOffset(this.element);
+      window.status = r.inspect();
+      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
+    }
+    
+    var d = this.currentDelta();
+    pos[0] -= d[0]; pos[1] -= d[1];
+    
+    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
+      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+    }
+    
+    var p = [0,1].map(function(i){ 
+      return (point[i]-pos[i]-this.offset[i]) 
+    }.bind(this));
+    
+    if(this.options.snap) {
+      if(typeof this.options.snap == 'function') {
+        p = this.options.snap(p[0],p[1],this);
+      } else {
+      if(this.options.snap instanceof Array) {
+        p = p.map( function(v, i) {
+          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+      } else {
+        p = p.map( function(v) {
+          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+      }
+    }}
+    
+    var style = this.element.style;
+    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+      style.left = p[0] + "px";
+    if((!this.options.constraint) || (this.options.constraint=='vertical'))
+      style.top  = p[1] + "px";
+    
+    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+  },
+  
+  stopScrolling: function() {
+    if(this.scrollInterval) {
+      clearInterval(this.scrollInterval);
+      this.scrollInterval = null;
+      Draggables._lastScrollPointer = null;
+    }
+  },
+  
+  startScrolling: function(speed) {
+    if(!(speed[0] || speed[1])) return;
+    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+    this.lastScrolled = new Date();
+    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+  },
+  
+  scroll: function() {
+    var current = new Date();
+    var delta = current - this.lastScrolled;
+    this.lastScrolled = current;
+    if(this.options.scroll == window) {
+      with (this._getWindowScroll(this.options.scroll)) {
+        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+          var d = delta / 1000;
+          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+        }
+      }
+    } else {
+      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
+    }
+    
+    Position.prepare();
+    Droppables.show(Draggables._lastPointer, this.element);
+    Draggables.notify('onDrag', this);
+    if (this._isScrollChild) {
+      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+      if (Draggables._lastScrollPointer[0] < 0)
+        Draggables._lastScrollPointer[0] = 0;
+      if (Draggables._lastScrollPointer[1] < 0)
+        Draggables._lastScrollPointer[1] = 0;
+      this.draw(Draggables._lastScrollPointer);
+    }
+    
+    if(this.options.change) this.options.change(this);
+  },
+  
+  _getWindowScroll: function(w) {
+    var T, L, W, H;
+    with (w.document) {
+      if (w.document.documentElement && documentElement.scrollTop) {
+        T = documentElement.scrollTop;
+        L = documentElement.scrollLeft;
+      } else if (w.document.body) {
+        T = body.scrollTop;
+        L = body.scrollLeft;
+      }
+      if (w.innerWidth) {
+        W = w.innerWidth;
+        H = w.innerHeight;
+      } else if (w.document.documentElement && documentElement.clientWidth) {
+        W = documentElement.clientWidth;
+        H = documentElement.clientHeight;
+      } else {
+        W = body.offsetWidth;
+        H = body.offsetHeight
+      }
+    }
+    return { top: T, left: L, width: W, height: H };
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+  initialize: function(element, observer) {
+    this.element   = $(element);
+    this.observer  = observer;
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onStart: function() {
+    this.lastValue = Sortable.serialize(this.element);
+  },
+  
+  onEnd: function() {
+    Sortable.unmark();
+    if(this.lastValue != Sortable.serialize(this.element))
+      this.observer(this.element)
+  }
+}
+
+var Sortable = {
+  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
+  
+  sortables: {},
+  
+  _findRootElement: function(element) {
+    while (element.tagName != "BODY") {  
+      if(element.id && Sortable.sortables[element.id]) return element;
+      element = element.parentNode;
+    }
+  },
+
+  options: function(element) {
+    element = Sortable._findRootElement($(element));
+    if(!element) return;
+    return Sortable.sortables[element.id];
+  },
+  
+  destroy: function(element){
+    var s = Sortable.options(element);
+    
+    if(s) {
+      Draggables.removeObserver(s.element);
+      s.droppables.each(function(d){ Droppables.remove(d) });
+      s.draggables.invoke('destroy');
+      
+      delete Sortable.sortables[s.element.id];
+    }
+  },
+
+  create: function(element) {
+    element = $(element);
+    var options = Object.extend({ 
+      element:     element,
+      tag:         'li',       // assumes li children, override with tag: 'tagname'
+      dropOnEmpty: false,
+      tree:        false,
+      treeTag:     'ul',
+      overlap:     'vertical', // one of 'vertical', 'horizontal'
+      constraint:  'vertical', // one of 'vertical', 'horizontal', false
+      containment: element,    // also takes array of elements (or id's); or false
+      handle:      false,      // or a CSS class
+      only:        false,
+      delay:       0,
+      hoverclass:  null,
+      ghosting:    false,
+      scroll:      false,
+      scrollSensitivity: 20,
+      scrollSpeed: 15,
+      format:      this.SERIALIZE_RULE,
+      onChange:    Prototype.emptyFunction,
+      onUpdate:    Prototype.emptyFunction
+    }, arguments[1] || {});
+
+    // clear any old sortable with same element
+    this.destroy(element);
+
+    // build options for the draggables
+    var options_for_draggable = {
+      revert:      true,
+      scroll:      options.scroll,
+      scrollSpeed: options.scrollSpeed,
+      scrollSensitivity: options.scrollSensitivity,
+      delay:       options.delay,
+      ghosting:    options.ghosting,
+      constraint:  options.constraint,
+      handle:      options.handle };
+
+    if(options.starteffect)
+      options_for_draggable.starteffect = options.starteffect;
+
+    if(options.reverteffect)
+      options_for_draggable.reverteffect = options.reverteffect;
+    else
+      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+        element.style.top  = 0;
+        element.style.left = 0;
+      };
+
+    if(options.endeffect)
+      options_for_draggable.endeffect = options.endeffect;
+
+    if(options.zindex)
+      options_for_draggable.zindex = options.zindex;
+
+    // build options for the droppables  
+    var options_for_droppable = {
+      overlap:     options.overlap,
+      containment: options.containment,
+      tree:        options.tree,
+      hoverclass:  options.hoverclass,
+      onHover:     Sortable.onHover
+      //greedy:      !options.dropOnEmpty
+    }
+    
+    var options_for_tree = {
+      onHover:      Sortable.onEmptyHover,
+      overlap:      options.overlap,
+      containment:  options.containment,
+      hoverclass:   options.hoverclass
+    }
+
+    // fix for gecko engine
+    Element.cleanWhitespace(element); 
+
+    options.draggables = [];
+    options.droppables = [];
+
+    // drop on empty handling
+    if(options.dropOnEmpty || options.tree) {
+      Droppables.add(element, options_for_tree);
+      options.droppables.push(element);
+    }
+
+    (this.findElements(element, options) || []).each( function(e) {
+      // handles are per-draggable
+      var handle = options.handle ? 
+        Element.childrenWithClassName(e, options.handle)[0] : e;    
+      options.draggables.push(
+        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+      Droppables.add(e, options_for_droppable);
+      if(options.tree) e.treeNode = element;
+      options.droppables.push(e);      
+    });
+    
+    if(options.tree) {
+      (Sortable.findTreeElements(element, options) || []).each( function(e) {
+        Droppables.add(e, options_for_tree);
+        e.treeNode = element;
+        options.droppables.push(e);
+      });
+    }
+
+    // keep reference
+    this.sortables[element.id] = options;
+
+    // for onupdate
+    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+  },
+
+  // return all suitable-for-sortable elements in a guaranteed order
+  findElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.tag);
+  },
+  
+  findTreeElements: function(element, options) {
+    return Element.findChildren(
+      element, options.only, options.tree ? true : false, options.treeTag);
+  },
+
+  onHover: function(element, dropon, overlap) {
+    if(Element.isParent(dropon, element)) return;
+
+    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+      return;
+    } else if(overlap>0.5) {
+      Sortable.mark(dropon, 'before');
+      if(dropon.previousSibling != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, dropon);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    } else {
+      Sortable.mark(dropon, 'after');
+      var nextElement = dropon.nextSibling || null;
+      if(nextElement != element) {
+        var oldParentNode = element.parentNode;
+        element.style.visibility = "hidden"; // fix gecko rendering
+        dropon.parentNode.insertBefore(element, nextElement);
+        if(dropon.parentNode!=oldParentNode) 
+          Sortable.options(oldParentNode).onChange(element);
+        Sortable.options(dropon.parentNode).onChange(element);
+      }
+    }
+  },
+  
+  onEmptyHover: function(element, dropon, overlap) {
+    var oldParentNode = element.parentNode;
+    var droponOptions = Sortable.options(dropon);
+        
+    if(!Element.isParent(dropon, element)) {
+      var index;
+      
+      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
+      var child = null;
+            
+      if(children) {
+        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+        
+        for (index = 0; index < children.length; index += 1) {
+          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+            offset -= Element.offsetSize (children[index], droponOptions.overlap);
+          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+            child = index + 1 < children.length ? children[index + 1] : null;
+            break;
+          } else {
+            child = children[index];
+            break;
+          }
+        }
+      }
+      
+      dropon.insertBefore(element, child);
+      
+      Sortable.options(oldParentNode).onChange(element);
+      droponOptions.onChange(element);
+    }
+  },
+
+  unmark: function() {
+    if(Sortable._marker) Element.hide(Sortable._marker);
+  },
+
+  mark: function(dropon, position) {
+    // mark on ghosting only
+    var sortable = Sortable.options(dropon.parentNode);
+    if(sortable && !sortable.ghosting) return; 
+
+    if(!Sortable._marker) {
+      Sortable._marker = $('dropmarker') || document.createElement('DIV');
+      Element.hide(Sortable._marker);
+      Element.addClassName(Sortable._marker, 'dropmarker');
+      Sortable._marker.style.position = 'absolute';
+      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+    }    
+    var offsets = Position.cumulativeOffset(dropon);
+    Sortable._marker.style.left = offsets[0] + 'px';
+    Sortable._marker.style.top = offsets[1] + 'px';
+    
+    if(position=='after')
+      if(sortable.overlap == 'horizontal') 
+        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
+      else
+        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
+    
+    Element.show(Sortable._marker);
+  },
+  
+  _tree: function(element, options, parent) {
+    var children = Sortable.findElements(element, options) || [];
+  
+    for (var i = 0; i < children.length; ++i) {
+      var match = children[i].id.match(options.format);
+
+      if (!match) continue;
+      
+      var child = {
+        id: encodeURIComponent(match ? match[1] : null),
+        element: element,
+        parent: parent,
+        children: new Array,
+        position: parent.children.length,
+        container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
+      }
+      
+      /* Get the element containing the children and recurse over it */
+      if (child.container)
+        this._tree(child.container, options, child)
+      
+      parent.children.push (child);
+    }
+
+    return parent; 
+  },
+
+  /* Finds the first element of the given tag type within a parent element.
+    Used for finding the first LI[ST] within a L[IST]I[TEM].*/
+  _findChildrenElement: function (element, containerTag) {
+    if (element && element.hasChildNodes)
+      for (var i = 0; i < element.childNodes.length; ++i)
+        if (element.childNodes[i].tagName == containerTag)
+          return element.childNodes[i];
+  
+    return null;
+  },
+
+  tree: function(element) {
+    element = $(element);
+    var sortableOptions = this.options(element);
+    var options = Object.extend({
+      tag: sortableOptions.tag,
+      treeTag: sortableOptions.treeTag,
+      only: sortableOptions.only,
+      name: element.id,
+      format: sortableOptions.format
+    }, arguments[1] || {});
+    
+    var root = {
+      id: null,
+      parent: null,
+      children: new Array,
+      container: element,
+      position: 0
+    }
+    
+    return Sortable._tree (element, options, root);
+  },
+
+  /* Construct a [i] index for a particular node */
+  _constructIndex: function(node) {
+    var index = '';
+    do {
+      if (node.id) index = '[' + node.position + ']' + index;
+    } while ((node = node.parent) != null);
+    return index;
+  },
+
+  sequence: function(element) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[1] || {});
+    
+    return $(this.findElements(element, options) || []).map( function(item) {
+      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+    });
+  },
+
+  setSequence: function(element, new_sequence) {
+    element = $(element);
+    var options = Object.extend(this.options(element), arguments[2] || {});
+    
+    var nodeMap = {};
+    this.findElements(element, options).each( function(n) {
+        if (n.id.match(options.format))
+            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+        n.parentNode.removeChild(n);
+    });
+   
+    new_sequence.each(function(ident) {
+      var n = nodeMap[ident];
+      if (n) {
+        n[1].appendChild(n[0]);
+        delete nodeMap[ident];
+      }
+    });
+  },
+  
+  serialize: function(element) {
+    element = $(element);
+    var options = Object.extend(Sortable.options(element), arguments[1] || {});
+    var name = encodeURIComponent(
+      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+    
+    if (options.tree) {
+      return Sortable.tree(element, arguments[1]).children.map( function (item) {
+        return [name + Sortable._constructIndex(item) + "[id]=" + 
+                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+      }).flatten().join('&');
+    } else {
+      return Sortable.sequence(element, arguments[1]).map( function(item) {
+        return name + "[]=" + encodeURIComponent(item);
+      }).join('&');
+    }
+  }
+}
+
+/* Returns true if child is contained within element */
+Element.isParent = function(child, element) {
+  if (!child.parentNode || child == element) return false;
+
+  if (child.parentNode == element) return true;
+
+  return Element.isParent(child.parentNode, element);
+}
+
+Element.findChildren = function(element, only, recursive, tagName) {    
+  if(!element.hasChildNodes()) return null;
+  tagName = tagName.toUpperCase();
+  if(only) only = [only].flatten();
+  var elements = [];
+  $A(element.childNodes).each( function(e) {
+    if(e.tagName && e.tagName.toUpperCase()==tagName &&
+      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+        elements.push(e);
+    if(recursive) {
+      var grandchildren = Element.findChildren(e, only, recursive, tagName);
+      if(grandchildren) elements.push(grandchildren);
+    }
+  });
+
+  return (elements.length>0 ? elements.flatten() : []);
+}
+
+Element.offsetSize = function (element, type) {
+  if (type == 'vertical' || type == 'height')
+    return element.offsetHeight;
+  else
+    return element.offsetWidth;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/effects.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,983 @@
+// script.aculo.us effects.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+//
+// See scriptaculous.js for full license.
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+  var color = '#';
+  if(this.slice(0,4) == 'rgb(') {
+    var cols = this.slice(4,this.length-1).split(',');
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
+  } else {
+    if(this.slice(0,1) == '#') {
+      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+      if(this.length==7) color = this.toLowerCase();
+    }
+  }
+  return(color.length==7 ? color : (arguments[0] || this));
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue :
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue :
+      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);
+  Element.setStyle(element, {fontSize: (percent/100) + 'em'});
+  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+}
+
+Element.getOpacity = function(element){
+  var opacity;
+  if (opacity = Element.getStyle(element, 'opacity'))
+    return parseFloat(opacity);
+  if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
+    if(opacity[1]) return parseFloat(opacity[1]) / 100;
+  return 1.0;
+}
+
+Element.setOpacity = function(element, value){
+  element= $(element);
+  if (value == 1){
+    Element.setStyle(element, { opacity:
+      (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
+      0.999999 : 1.0 });
+    if(/MSIE/.test(navigator.userAgent) && !window.opera)
+      Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
+  } else {
+    if(value < 0.00001) value = 0;
+    Element.setStyle(element, {opacity: value});
+    if(/MSIE/.test(navigator.userAgent) && !window.opera)
+     Element.setStyle(element,
+       { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
+                 'alpha(opacity='+value*100+')' });
+  }
+}
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+}
+
+Element.childrenWithClassName = function(element, className, findFirst) {
+  var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
+  var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
+    return (c.className && c.className.match(classNameRegExp));
+  });
+  if(!results) results = [];
+  return results;
+}
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+  var args = arguments;
+  this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  tagifyText: function(element) {
+    if(typeof Builder == 'undefined')
+      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
+
+    var tagifyStyle = 'position:relative';
+    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if(child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              character == ' ' ? String.fromCharCode(160) : character),
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if(((typeof element == 'object') ||
+        (typeof element == 'function')) &&
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || {});
+    Effect[element.visible() ?
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {}
+
+Effect.Transitions.linear = Prototype.K;
+
+Effect.Transitions.sinoidal = function(pos) {
+  return (-Math.cos(pos*Math.PI)/2) + 0.5;
+}
+Effect.Transitions.reverse  = function(pos) {
+  return 1-pos;
+}
+Effect.Transitions.flicker = function(pos) {
+  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+}
+Effect.Transitions.wobble = function(pos) {
+  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+}
+Effect.Transitions.pulse = function(pos) {
+  return (Math.floor(pos*10) % 2 == 0 ?
+    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
+}
+Effect.Transitions.none = function(pos) {
+  return 0;
+}
+Effect.Transitions.full = function(pos) {
+  return 1;
+}
+Effect.Transitions.exponential = function(pos) {
+  return 1-Math.pow(1-pos,2);
+}
+Effect.Transitions.slowstop = function(pos) {
+  return 1-Math.pow(0.5,20*pos);
+}
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+  initialize: function() {
+    this.effects  = [];
+    this.interval = null;
+  },
+  _each: function(iterator) {
+    this.effects._each(iterator);
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+
+    var position = (typeof effect.options.queue == 'string') ?
+      effect.options.queue : effect.options.queue.position;
+
+    switch(position) {
+      case 'front':
+        // move unstarted effects after this effect
+        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+            e.startOn  += effect.finishOn;
+            e.finishOn += effect.finishOn;
+          });
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.effects.pluck('finishOn').max() || timestamp;
+        break;
+    }
+
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+
+    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+      this.effects.push(effect);
+
+    if(!this.interval)
+      this.interval = setInterval(this.loop.bind(this), 40);
+  },
+  remove: function(effect) {
+    this.effects = this.effects.reject(function(e) { return e==effect });
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    this.effects.invoke('loop', timePos);
+  }
+});
+
+Effect.Queues = {
+  instances: $H(),
+  get: function(queueName) {
+    if(typeof queueName != 'string') return queueName;
+
+    if(!this.instances[queueName])
+      this.instances[queueName] = new Effect.ScopedQueue();
+
+    return this.instances[queueName];
+  }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+  transition: Effect.Transitions.sinoidal,
+  duration:   1.0,   // seconds
+  fps:        25.0,  // max. 25fps due to Effect.Queue implementation
+  sync:       false, // true for combining
+  from:       0.0,
+  to:         1.0,
+  delay:      0.0,
+  queue:      'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  position: null,
+  start: function(options) {
+    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn + (this.options.duration*1000);
+    this.event('beforeStart');
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ?
+        'global' : this.options.queue.scope).add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        this.event('beforeFinish');
+        if(this.finish) this.finish();
+        this.event('afterFinish');
+        return;
+      }
+      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
+      var frame = Math.round(pos * this.options.fps * this.options.duration);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  render: function(pos) {
+    if(this.state == 'idle') {
+      this.state = 'running';
+      this.event('beforeSetup');
+      if(this.setup) this.setup();
+      this.event('afterSetup');
+    }
+    if(this.state == 'running') {
+      if(this.options.transition) pos = this.options.transition(pos);
+      pos *= (this.options.to-this.options.from);
+      pos += this.options.from;
+      this.position = pos;
+      this.event('beforeUpdate');
+      if(this.update) this.update(pos);
+      this.event('afterUpdate');
+    }
+  },
+  cancel: function() {
+    if(!this.options.sync)
+      Effect.Queues.get(typeof this.options.queue == 'string' ?
+        'global' : this.options.queue.scope).remove(this);
+    this.state = 'finished';
+  },
+  event: function(eventName) {
+    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+    if(this.options[eventName]) this.options[eventName](this);
+  },
+  inspect: function() {
+    return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    this.effects.invoke('render', position);
+  },
+  finish: function(position) {
+    this.effects.each( function(effect) {
+      effect.render(1.0);
+      effect.cancel();
+      effect.event('beforeFinish');
+      if(effect.finish) effect.finish(position);
+      effect.event('afterFinish');
+    });
+  }
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    // make this work on IE on elements without 'layout'
+    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
+      this.element.setStyle({zoom: 1});
+    var options = Object.extend({
+      from: this.element.getOpacity() || 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.element.setOpacity(position);
+  }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      x:    0,
+      y:    0,
+      mode: 'relative'
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Bug in Opera: Opera returns the "real" position of a static element or
+    // relative element that does not have top/left explicitly set.
+    // ==> Always set top and left for position relative elements in your stylesheets
+    // (to 0 if you do not need them)
+    this.element.makePositioned();
+    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
+    if(this.options.mode == 'absolute') {
+      // absolute movement, so we need to calc deltaX and deltaY
+      this.options.x = this.options.x - this.originalLeft;
+      this.options.y = this.options.y - this.originalTop;
+    }
+  },
+  update: function(position) {
+    this.element.setStyle({
+      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
+      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
+    });
+  }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+  return new Effect.Move(element,
+    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({
+      scaleX: true,
+      scaleY: true,
+      scaleContent: true,
+      scaleFromCenter: false,
+      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
+      scaleFrom: 100.0,
+      scaleTo:   percent
+    }, arguments[2] || {});
+    this.start(options);
+  },
+  setup: function() {
+    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+    this.elementPositioning = this.element.getStyle('position');
+
+    this.originalStyle = {};
+    ['top','left','width','height','fontSize'].each( function(k) {
+      this.originalStyle[k] = this.element.style[k];
+    }.bind(this));
+
+    this.originalTop  = this.element.offsetTop;
+    this.originalLeft = this.element.offsetLeft;
+
+    var fontSize = this.element.getStyle('font-size') || '100%';
+    ['em','px','%','pt'].each( function(fontSizeType) {
+      if(fontSize.indexOf(fontSizeType)>0) {
+        this.fontSize     = parseFloat(fontSize);
+        this.fontSizeType = fontSizeType;
+      }
+    }.bind(this));
+
+    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+    this.dims = null;
+    if(this.options.scaleMode=='box')
+      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+    if(/^content/.test(this.options.scaleMode))
+      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+    if(!this.dims)
+      this.dims = [this.options.scaleMode.originalHeight,
+                   this.options.scaleMode.originalWidth];
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.fontSize)
+      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+  },
+  finish: function(position) {
+    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+  },
+  setDimensions: function(height, width) {
+    var d = {};
+    if(this.options.scaleX) d.width = Math.round(width) + 'px';
+    if(this.options.scaleY) d.height = Math.round(height) + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.dims[0])/2;
+      var leftd = (width  - this.dims[1])/2;
+      if(this.elementPositioning == 'absolute') {
+        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+      } else {
+        if(this.options.scaleY) d.top = -topd + 'px';
+        if(this.options.scaleX) d.left = -leftd + 'px';
+      }
+    }
+    this.element.setStyle(d);
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    if(!this.element) throw(Effect._elementDoesNotExistError);
+    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // Prevent executing on elements not in the layout flow
+    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+    // Disable background image during the effect
+    this.oldStyle = {
+      backgroundImage: this.element.getStyle('background-image') };
+    this.element.setStyle({backgroundImage: 'none'});
+    if(!this.options.endcolor)
+      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+    if(!this.options.restorecolor)
+      this.options.restorecolor = this.element.getStyle('background-color');
+    // init color calculations
+    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+  },
+  update: function(position) {
+    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+  },
+  finish: function() {
+    this.element.setStyle(Object.extend(this.oldStyle, {
+      backgroundColor: this.options.restorecolor
+    }));
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    if(this.options.offset) offsets[1] += this.options.offset;
+    var max = window.innerHeight ?
+      window.height - window.innerHeight :
+      document.body.scrollHeight -
+        (document.documentElement.clientHeight ?
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX,
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  var options = Object.extend({
+  from: element.getOpacity() || 1.0,
+  to:   0.0,
+  afterFinishInternal: function(effect) {
+    if(effect.options.to!=0) return;
+    effect.element.hide();
+    effect.element.setStyle({opacity: oldOpacity});
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  element = $(element);
+  var options = Object.extend({
+  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+  to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    effect.element.forceRerendering();
+  },
+  beforeSetup: function(effect) {
+    effect.element.setOpacity(effect.options.from);
+    effect.element.show();
+  }}, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  element = $(element);
+  var oldStyle = {
+    opacity: element.getInlineOpacity(),
+    position: element.getStyle('position'),
+    top:  element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height
+  };
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200,
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+     Object.extend({ duration: 1.0,
+      beforeSetupInternal: function(effect) {
+        Position.absolutize(effect.effects[0].element)
+      },
+      afterFinishInternal: function(effect) {
+         effect.effects[0].element.hide();
+         effect.effects[0].element.setStyle(oldStyle); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  element.makeClipping();
+  return new Effect.Scale(element, 0,
+    Object.extend({ scaleContent: false,
+      scaleX: false,
+      restoreAfterFinish: true,
+      afterFinishInternal: function(effect) {
+        effect.element.hide();
+        effect.element.undoClipping();
+      }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    scaleFrom: 0,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makeClipping();
+      effect.element.setStyle({height: '0px'});
+      effect.element.show();
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.SwitchOff = function(element) {
+  element = $(element);
+  var oldOpacity = element.getInlineOpacity();
+  return new Effect.Appear(element, Object.extend({
+    duration: 0.4,
+    from: 0,
+    transition: Effect.Transitions.flicker,
+    afterFinishInternal: function(effect) {
+      new Effect.Scale(effect.element, 1, {
+        duration: 0.3, scaleFromCenter: true,
+        scaleX: false, scaleContent: false, restoreAfterFinish: true,
+        beforeSetup: function(effect) {
+          effect.element.makePositioned();
+          effect.element.makeClipping();
+        },
+        afterFinishInternal: function(effect) {
+          effect.element.hide();
+          effect.element.undoClipping();
+          effect.element.undoPositioned();
+          effect.element.setStyle({opacity: oldOpacity});
+        }
+      })
+    }
+  }, arguments[1] || {}));
+}
+
+Effect.DropOut = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left'),
+    opacity: element.getInlineOpacity() };
+  return new Effect.Parallel(
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+    Object.extend(
+      { duration: 0.5,
+        beforeSetup: function(effect) {
+          effect.effects[0].element.makePositioned();
+        },
+        afterFinishInternal: function(effect) {
+          effect.effects[0].element.hide();
+          effect.effects[0].element.undoPositioned();
+          effect.effects[0].element.setStyle(oldStyle);
+        }
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.getStyle('top'),
+    left: element.getStyle('left') };
+    return new Effect.Move(element,
+      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
+    new Effect.Move(effect.element,
+      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+        effect.element.undoPositioned();
+        effect.element.setStyle(oldStyle);
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element);
+  element.cleanWhitespace();
+  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
+  var elementDimensions = element.getDimensions();
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    scaleFrom: window.opera ? 0 : 1,
+    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+    restoreAfterFinish: true,
+    afterSetup: function(effect) {
+      effect.element.makePositioned();
+      effect.element.firstChild.makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping();
+      effect.element.setStyle({height: '0px'});
+      effect.element.show(); },
+    afterUpdateInternal: function(effect) {
+      effect.element.firstChild.setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
+    },
+    afterFinishInternal: function(effect) {
+      effect.element.undoClipping();
+      // IE will crash if child is undoPositioned first
+      if(/MSIE/.test(navigator.userAgent) && !window.opera){
+        effect.element.undoPositioned();
+        effect.element.firstChild.undoPositioned();
+      }else{
+        effect.element.firstChild.undoPositioned();
+        effect.element.undoPositioned();
+      }
+      effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SlideUp = function(element) {
+  element = $(element);
+  element.cleanWhitespace();
+  var oldInnerBottom = $(element.firstChild).getStyle('bottom');
+  return new Effect.Scale(element, window.opera ? 0 : 1,
+   Object.extend({ scaleContent: false,
+    scaleX: false,
+    scaleMode: 'box',
+    scaleFrom: 100,
+    restoreAfterFinish: true,
+    beforeStartInternal: function(effect) {
+      effect.element.makePositioned();
+      effect.element.firstChild.makePositioned();
+      if(window.opera) effect.element.setStyle({top: ''});
+      effect.element.makeClipping();
+      effect.element.show(); },
+    afterUpdateInternal: function(effect) {
+      effect.element.firstChild.setStyle({bottom:
+        (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
+    afterFinishInternal: function(effect) {
+      effect.element.hide();
+      effect.element.undoClipping();
+      effect.element.firstChild.undoPositioned();
+      effect.element.undoPositioned();
+      effect.element.setStyle({bottom: oldInnerBottom}); }
+   }, arguments[1] || {})
+  );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+  return new Effect.Scale(element, window.opera ? 1 : 0,
+    { restoreAfterFinish: true,
+      beforeSetup: function(effect) {
+        effect.element.makeClipping(effect.element); },
+      afterFinishInternal: function(effect) {
+        effect.element.hide(effect.element);
+        effect.element.undoClipping(effect.element); }
+  });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.full
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+
+  switch (options.direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0;
+      break;
+    case 'top-right':
+      initialMoveX = dims.width;
+      initialMoveY = moveY = 0;
+      moveX = -dims.width;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = dims.height;
+      moveY = -dims.height;
+      break;
+    case 'bottom-right':
+      initialMoveX = dims.width;
+      initialMoveY = dims.height;
+      moveX = -dims.width;
+      moveY = -dims.height;
+      break;
+    case 'center':
+      initialMoveX = dims.width / 2;
+      initialMoveY = dims.height / 2;
+      moveX = -dims.width / 2;
+      moveY = -dims.height / 2;
+      break;
+  }
+
+  return new Effect.Move(element, {
+    x: initialMoveX,
+    y: initialMoveY,
+    duration: 0.01,
+    beforeSetup: function(effect) {
+      effect.element.hide();
+      effect.element.makeClipping();
+      effect.element.makePositioned();
+    },
+    afterFinishInternal: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+          new Effect.Scale(effect.element, 100, {
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+        ], Object.extend({
+             beforeSetup: function(effect) {
+               effect.effects[0].element.setStyle({height: '0px'});
+               effect.effects[0].element.show();
+             },
+             afterFinishInternal: function(effect) {
+               effect.effects[0].element.undoClipping();
+               effect.effects[0].element.undoPositioned();
+               effect.effects[0].element.setStyle(oldStyle);
+             }
+           }, options)
+      )
+    }
+  });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = Object.extend({
+    direction: 'center',
+    moveTransition: Effect.Transitions.sinoidal,
+    scaleTransition: Effect.Transitions.sinoidal,
+    opacityTransition: Effect.Transitions.none
+  }, arguments[1] || {});
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    height: element.style.height,
+    width: element.style.width,
+    opacity: element.getInlineOpacity() };
+
+  var dims = element.getDimensions();
+  var moveX, moveY;
+
+  switch (options.direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = dims.width;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = dims.height;
+      break;
+    case 'bottom-right':
+      moveX = dims.width;
+      moveY = dims.height;
+      break;
+    case 'center':
+      moveX = dims.width / 2;
+      moveY = dims.height / 2;
+      break;
+  }
+
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+    ], Object.extend({
+         beforeStartInternal: function(effect) {
+           effect.effects[0].element.makePositioned();
+           effect.effects[0].element.makeClipping(); },
+         afterFinishInternal: function(effect) {
+           effect.effects[0].element.hide();
+           effect.effects[0].element.undoClipping();
+           effect.effects[0].element.undoPositioned();
+           effect.effects[0].element.setStyle(oldStyle); }
+       }, options)
+  );
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var oldOpacity = element.getInlineOpacity();
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element,
+    Object.extend(Object.extend({  duration: 3.0, from: 0,
+      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+  element = $(element);
+  var oldStyle = {
+    top: element.style.top,
+    left: element.style.left,
+    width: element.style.width,
+    height: element.style.height };
+  Element.makeClipping(element);
+  return new Effect.Scale(element, 5, Object.extend({
+    scaleContent: false,
+    scaleX: false,
+    afterFinishInternal: function(effect) {
+    new Effect.Scale(element, 1, {
+      scaleContent: false,
+      scaleY: false,
+      afterFinishInternal: function(effect) {
+        effect.element.hide();
+        effect.element.undoClipping();
+        effect.element.setStyle(oldStyle);
+      } });
+  }}, arguments[1] || {}));
+};
+
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
+  function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+  s = effect.gsub(/_/, '-').camelize();
+  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+  new Effect[effect_class](element, options);
+  return $(element);
+};
+
+Element.addMethods();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/prototype.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,2241 @@
+/*  Prototype JavaScript framework, version 1.5.0_rc1
+ *  (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.5.0_rc1',
+  ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+
+  emptyFunction: function() {},
+  K: function(x) {return x}
+}
+
+var Class = {
+  create: function() {
+    return function() {
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (var property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (object == undefined) return 'undefined';
+      if (object == null) return 'null';
+      return object.inspect ? object.inspect() : object.toString();
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({}, object);
+  }
+});
+
+Function.prototype.bind = function() {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this, args = $A(arguments), object = args.shift();
+  return function(event) {
+    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
+  }
+}
+
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    var digits = this.toString(16);
+    if (this < 16) return '0' + digits;
+    return digits;
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  }
+});
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0; i < arguments.length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.callback(this);
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += (replacement(match) || '').toString();
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = count === undefined ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return this;
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = truncation === undefined ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : this;
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
+  },
+
+  toQueryParams: function() {
+    var pairs = this.match(/^\??(.*)$/)[1].split('&');
+    return pairs.inject({}, function(params, pairString) {
+      var pair  = pairString.split('=');
+      var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;
+      params[decodeURIComponent(pair[0])] = value;
+      return params;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  camelize: function() {
+    var oStringList = this.split('-');
+    if (oStringList.length == 1) return oStringList[0];
+
+    var camelizedString = this.indexOf('-') == 0
+      ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
+      : oStringList[0];
+
+    for (var i = 1, len = oStringList.length; i < len; i++) {
+      var s = oStringList[i];
+      camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+    }
+
+    return camelizedString;
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.replace(/\\/g, '\\\\');
+    if (useDoubleQuotes)
+      return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    else
+      return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (typeof replacement == 'function') return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern  = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    return this.template.gsub(this.pattern, function(match) {
+      var before = match[1];
+      if (before == '\\') return match[2];
+      return before + (object[match[3]] || '').toString();
+    });
+  }
+}
+
+var $break    = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != $continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+  },
+
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!(iterator || Prototype.K)(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator) {
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!(iterator || Prototype.K)(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator(value, index));
+    });
+    return results;
+  },
+
+  detect: function (iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.collect(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (result == undefined || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator) {
+    return this.collect(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.collect(Prototype.K);
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) {
+    return iterable.toArray();
+  } else {
+    var results = [];
+    for (var i = 0; i < iterable.length; i++)
+      results.push(iterable[i]);
+    return results;
+  }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse)
+  Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0; i < this.length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != undefined || value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(value && value.constructor == Array ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  indexOf: function(object) {
+    for (var i = 0; i < this.length; i++)
+      if (this[i] == object) return i;
+    return -1;
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function() {
+    return this.inject([], function(array, value) {
+      return array.include(value) ? array : array.concat([value]);
+    });
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  }
+});
+var Hash = {
+  _each: function(iterator) {
+    for (var key in this) {
+      var value = this[key];
+      if (typeof value == 'function') continue;
+
+      var pair = [key, value];
+      pair.key = key;
+      pair.value = value;
+      iterator(pair);
+    }
+  },
+
+  keys: function() {
+    return this.pluck('key');
+  },
+
+  values: function() {
+    return this.pluck('value');
+  },
+
+  merge: function(hash) {
+    return $H(hash).inject($H(this), function(mergedHash, pair) {
+      mergedHash[pair.key] = pair.value;
+      return mergedHash;
+    });
+  },
+
+  toQueryString: function() {
+    return this.map(function(pair) {
+      return pair.map(encodeURIComponent).join('=');
+    }).join('&');
+  },
+
+  inspect: function() {
+    return '#<Hash:{' + this.map(function(pair) {
+      return pair.map(Object.inspect).join(': ');
+    }).join(', ') + '}>';
+  }
+}
+
+function $H(object) {
+  var hash = Object.extend({}, object || {});
+  Object.extend(hash, Enumerable);
+  Object.extend(hash, Hash);
+  return hash;
+}
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+}
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responderToAdd) {
+    if (!this.include(responderToAdd))
+      this.responders.push(responderToAdd);
+  },
+
+  unregister: function(responderToRemove) {
+    this.responders = this.responders.without(responderToRemove);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (responder[callback] && typeof responder[callback] == 'function') {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) {}
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate: function() {
+    Ajax.activeRequestCount++;
+  },
+
+  onComplete: function() {
+    Ajax.activeRequestCount--;
+  }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+  },
+
+  responseIsSuccess: function() {
+    return this.transport.status == undefined
+        || this.transport.status == 0
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  responseIsFailure: function() {
+    return !this.responseIsSuccess();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    var parameters = this.options.parameters || '';
+    if (parameters.length > 0) parameters += '&_=';
+
+    /* Simulate other verbs over post */
+    if (this.options.method != 'get' && this.options.method != 'post') {
+      parameters += (parameters.length > 0 ? '&' : '') + '_method=' + this.options.method;
+      this.options.method = 'post';
+    }
+
+    try {
+      this.url = url;
+      if (this.options.method == 'get' && parameters.length > 0)
+        this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
+
+      Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+      this.transport.open(this.options.method, this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous)
+        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      var body = this.options.postBody ? this.options.postBody : parameters;
+      this.transport.send(this.options.method == 'post' ? body : null);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  setRequestHeaders: function() {
+    var requestHeaders =
+      ['X-Requested-With', 'XMLHttpRequest',
+       'X-Prototype-Version', Prototype.Version,
+       'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
+
+    if (this.options.method == 'post') {
+      requestHeaders.push('Content-type', this.options.contentType);
+
+      /* Force "Connection: close" for Mozilla browsers to work around
+       * a bug where XMLHttpReqeuest sends an incorrect Content-length
+       * header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType)
+        requestHeaders.push('Connection', 'close');
+    }
+
+    if (this.options.requestHeaders)
+      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
+
+    for (var i = 0; i < requestHeaders.length; i += 2)
+      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState != 1)
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  header: function(name) {
+    try {
+      return this.transport.getResponseHeader(name);
+    } catch (e) {}
+  },
+
+  evalJSON: function() {
+    try {
+      return eval('(' + this.header('X-JSON') + ')');
+    } catch (e) {}
+  },
+
+  evalResponse: function() {
+    try {
+      return eval(this.transport.responseText);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  respondToReadyState: function(readyState) {
+    var event = Ajax.Request.Events[readyState];
+    var transport = this.transport, json = this.evalJSON();
+
+    if (event == 'Complete') {
+      try {
+        (this.options['on' + this.transport.status]
+         || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(transport, json);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      if ((this.header('Content-type') || '').match(/^text\/javascript/i))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
+      Ajax.Responders.dispatch('on' + event, this, transport, json);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
+    if (event == 'Complete')
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.containers = {
+      success: container.success ? $(container.success) : $(container),
+      failure: container.failure ? $(container.failure) :
+        (container.success ? null : $(container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function(transport, object) {
+      this.updateContent();
+      onComplete(transport, object);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.responseIsSuccess() ?
+      this.containers.success : this.containers.failure;
+    var response = this.transport.responseText;
+
+    if (!this.options.evalScripts)
+      response = response.stripScripts();
+
+    if (receiver) {
+      if (this.options.insertion) {
+        new this.options.insertion(receiver, response);
+      } else {
+        Element.update(receiver, response);
+      }
+    }
+
+    if (this.responseIsSuccess()) {
+      if (this.onComplete)
+        setTimeout(this.onComplete.bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = {};
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this),
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $() {
+  var results = [], element;
+  for (var i = 0; i < arguments.length; i++) {
+    element = arguments[i];
+    if (typeof element == 'string')
+      element = document.getElementById(element);
+    results.push(Element.extend(element));
+  }
+  return results.reduce();
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+  var children = ($(parentElement) || document.body).getElementsByTagName('*');
+  return $A(children).inject([], function(elements, child) {
+    if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+      elements.push(Element.extend(child));
+    return elements;
+  });
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+  var Element = new Object();
+
+Element.extend = function(element) {
+  if (!element) return;
+  if (_nativeExtensions || element.nodeType == 3) return element;
+
+  if (!element._extended && element.tagName && element != window) {
+    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
+
+    if (element.tagName == 'FORM')
+      Object.extend(methods, Form.Methods);
+    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
+      Object.extend(methods, Form.Element.Methods);
+
+    for (var property in methods) {
+      var value = methods[property];
+      if (typeof value == 'function')
+        element[property] = cache.findOrStore(value);
+    }
+  }
+
+  element._extended = true;
+  return element;
+}
+
+Element.extend.cache = {
+  findOrStore: function(value) {
+    return this[value] = this[value] || function() {
+      return value.apply(null, [this].concat($A(arguments)));
+    }
+  }
+}
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    $(element).style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    $(element).style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, html) {
+    $(element).innerHTML = html.stripScripts();
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  replace: function(element, html) {
+    element = $(element);
+    if (element.outerHTML) {
+      element.outerHTML = html.stripScripts();
+    } else {
+      var range = element.ownerDocument.createRange();
+      range.selectNodeContents(element);
+      element.parentNode.replaceChild(
+        range.createContextualFragment(html.stripScripts()), element);
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    element = $(element);
+    return $A(element.getElementsByTagName('*'));
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    element = $(element);
+    if (typeof selector == 'string')
+      selector = new Selector(selector);
+    return selector.match(element);
+  },
+
+  up: function(element, expression, index) {
+    return Selector.findElement($(element).ancestors(), expression, index);
+  },
+
+  down: function(element, expression, index) {
+    return Selector.findElement($(element).descendants(), expression, index);
+  },
+
+  previous: function(element, expression, index) {
+    return Selector.findElement($(element).previousSiblings(), expression, index);
+  },
+
+  next: function(element, expression, index) {
+    return Selector.findElement($(element).nextSiblings(), expression, index);
+  },
+
+  getElementsBySelector: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  getElementsByClassName: function(element, className) {
+    element = $(element);
+    return document.getElementsByClassName(className, element);
+  },
+
+  getHeight: function(element) {
+    element = $(element);
+    return element.offsetHeight;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return Element.classNames(element).include(className);
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).add(className);
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    Element.classNames(element).remove(className);
+    return element;
+  },
+
+  observe: function() {
+    Event.observe.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  stopObserving: function() {
+    Event.stopObserving.apply(Event, arguments);
+    return $A(arguments).first();
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.match(/^\s*$/);
+  },
+
+  childOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    while (element = element.parentNode)
+      if (element == ancestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var x = element.x ? element.x : element.offsetLeft,
+        y = element.y ? element.y : element.offsetTop;
+    window.scrollTo(x, y);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    var value = element.style[style.camelize()];
+    if (!value) {
+      if (document.defaultView && document.defaultView.getComputedStyle) {
+        var css = document.defaultView.getComputedStyle(element, null);
+        value = css ? css.getPropertyValue(style) : null;
+      } else if (element.currentStyle) {
+        value = element.currentStyle[style.camelize()];
+      }
+    }
+
+    if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+      if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+
+    return value == 'auto' ? null : value;
+  },
+
+  setStyle: function(element, style) {
+    element = $(element);
+    for (var name in style)
+      element.style[name.camelize()] = style[name];
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    if (Element.getStyle(element, 'display') != 'none')
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = '';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = 'none';
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return;
+    element._overflow = element.style.overflow || 'auto';
+    if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  }
+}
+
+// IE is missing .innerHTML support for TABLE-related elements
+if(document.all){
+  Element.Methods.update = function(element, html) {
+    element = $(element);
+    var tagName = element.tagName.toUpperCase();
+    if (['THEAD','TBODY','TR','TD'].indexOf(tagName) > -1) {
+      var div = document.createElement('div');
+      switch (tagName) {
+        case 'THEAD':
+        case 'TBODY':
+          div.innerHTML = '<table><tbody>' +  html.stripScripts() + '</tbody></table>';
+          depth = 2;
+          break;
+        case 'TR':
+          div.innerHTML = '<table><tbody><tr>' +  html.stripScripts() + '</tr></tbody></table>';
+          depth = 3;
+          break;
+        case 'TD':
+          div.innerHTML = '<table><tbody><tr><td>' +  html.stripScripts() + '</td></tr></tbody></table>';
+          depth = 4;
+      }
+      $A(element.childNodes).each(function(node){
+        element.removeChild(node)
+      });
+      depth.times(function(){ div = div.firstChild });
+
+      $A(div.childNodes).each(
+        function(node){ element.appendChild(node) });
+    } else {
+      element.innerHTML = html.stripScripts();
+    }
+    setTimeout(function() {html.evalScripts()}, 10);
+    return element;
+  }
+}
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if (!window.HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  /* Emulate HTMLElement, HTMLFormElement, HTMLInputElement, HTMLTextAreaElement,
+     and HTMLSelectElement in Safari */
+  ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
+    var klass = window['HTML' + tag + 'Element'] = {};
+    klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
+  });
+}
+
+Element.addMethods = function(methods) {
+  Object.extend(Element.Methods, methods || {});
+
+  function copy(methods, destination) {
+    var cache = Element.extend.cache;
+    for (var property in methods) {
+      var value = methods[property];
+      destination[property] = cache.findOrStore(value);
+    }
+  }
+
+  if (typeof HTMLElement != 'undefined') {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Form.Methods, HTMLFormElement.prototype);
+    [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
+      copy(Form.Element.Methods, klass.prototype);
+    });
+    _nativeExtensions = true;
+  }
+}
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content.stripScripts();
+
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      try {
+        this.element.insertAdjacentHTML(this.adjacency, this.content);
+      } catch (e) {
+        var tagName = this.element.tagName.toLowerCase();
+        if (tagName == 'tbody' || tagName == 'tr') {
+          this.insertContent(this.contentFromAnonymousTable());
+        } else {
+          throw e;
+        }
+      }
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.insertContent([this.range.createContextualFragment(this.content)]);
+    }
+
+    setTimeout(function() {content.evalScripts()}, 10);
+  },
+
+  contentFromAnonymousTable: function() {
+    var div = document.createElement('div');
+    div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
+    return $A(div.childNodes[0].childNodes[0].childNodes);
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment, this.element);
+    }).bind(this));
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+
+  insertContent: function(fragments) {
+    fragments.reverse(false).each((function(fragment) {
+      this.element.insertBefore(fragment, this.element.firstChild);
+    }).bind(this));
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.appendChild(fragment);
+    }).bind(this));
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+
+  insertContent: function(fragments) {
+    fragments.each((function(fragment) {
+      this.element.parentNode.insertBefore(fragment,
+        this.element.nextSibling);
+    }).bind(this));
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set(this.toArray().concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set(this.select(function(className) {
+      return className != classNameToRemove;
+    }).join(' '));
+  },
+
+  toString: function() {
+    return this.toArray().join(' ');
+  }
+}
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+  initialize: function(expression) {
+    this.params = {classNames: []};
+    this.expression = expression.toString().strip();
+    this.parseExpression();
+    this.compileMatcher();
+  },
+
+  parseExpression: function() {
+    function abort(message) { throw 'Parse error in selector: ' + message; }
+
+    if (this.expression == '')  abort('empty expression');
+
+    var params = this.params, expr = this.expression, match, modifier, clause, rest;
+    while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+      params.attributes = params.attributes || [];
+      params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+      expr = match[1];
+    }
+
+    if (expr == '*') return this.params.wildcard = true;
+
+    while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+      modifier = match[1], clause = match[2], rest = match[3];
+      switch (modifier) {
+        case '#':       params.id = clause; break;
+        case '.':       params.classNames.push(clause); break;
+        case '':
+        case undefined: params.tagName = clause.toUpperCase(); break;
+        default:        abort(expr.inspect());
+      }
+      expr = rest;
+    }
+
+    if (expr.length > 0) abort(expr.inspect());
+  },
+
+  buildMatchExpression: function() {
+    var params = this.params, conditions = [], clause;
+
+    if (params.wildcard)
+      conditions.push('true');
+    if (clause = params.id)
+      conditions.push('element.id == ' + clause.inspect());
+    if (clause = params.tagName)
+      conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+    if ((clause = params.classNames).length > 0)
+      for (var i = 0; i < clause.length; i++)
+        conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
+    if (clause = params.attributes) {
+      clause.each(function(attribute) {
+        var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
+        var splitValueBy = function(delimiter) {
+          return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+        }
+
+        switch (attribute.operator) {
+          case '=':       conditions.push(value + ' == ' + attribute.value.inspect()); break;
+          case '~=':      conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+          case '|=':      conditions.push(
+                            splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+                          ); break;
+          case '!=':      conditions.push(value + ' != ' + attribute.value.inspect()); break;
+          case '':
+          case undefined: conditions.push(value + ' != null'); break;
+          default:        throw 'Unknown operator ' + attribute.operator + ' in selector';
+        }
+      });
+    }
+
+    return conditions.join(' && ');
+  },
+
+  compileMatcher: function() {
+    this.match = new Function('element', 'if (!element.tagName) return false; \
+      return ' + this.buildMatchExpression());
+  },
+
+  findElements: function(scope) {
+    var element;
+
+    if (element = $(this.params.id))
+      if (this.match(element))
+        if (!scope || Element.childOf(element, scope))
+          return [element];
+
+    scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+    var results = [];
+    for (var i = 0; i < scope.length; i++)
+      if (this.match(element = scope[i]))
+        results.push(Element.extend(element));
+
+    return results;
+  },
+
+  toString: function() {
+    return this.expression;
+  }
+}
+
+Object.extend(Selector, {
+  matchElements: function(elements, expression) {
+    var selector = new Selector(expression);
+    return elements.select(selector.match.bind(selector));
+  },
+
+  findElement: function(elements, expression, index) {
+    if (typeof expression == 'number') index = expression, expression = false;
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    return expressions.map(function(expression) {
+      return expression.strip().split(/\s+/).inject([null], function(results, expr) {
+        var selector = new Selector(expr);
+        return results.inject([], function(elements, result) {
+          return elements.concat(selector.findElements(result || element));
+        });
+      });
+    }).flatten();
+  }
+});
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  }
+};
+
+Form.Methods = {
+  serialize: function(form) {
+    var elements = Form.getElements($(form));
+    var queryComponents = new Array();
+
+    for (var i = 0; i < elements.length; i++) {
+      var queryComponent = Form.Element.serialize(elements[i]);
+      if (queryComponent)
+        queryComponents.push(queryComponent);
+    }
+
+    return queryComponents.join('&');
+  },
+
+  getElements: function(form) {
+    form = $(form);
+    var elements = new Array();
+
+    for (var tagName in Form.Element.Serializers) {
+      var tagElements = form.getElementsByTagName(tagName);
+      for (var j = 0; j < tagElements.length; j++)
+        elements.push(tagElements[j]);
+    }
+    return elements;
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name)
+      return inputs;
+
+    var matchingInputs = new Array();
+    for (var i = 0; i < inputs.length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) ||
+          (name && input.name != name))
+        continue;
+      matchingInputs.push(input);
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.blur();
+      element.disabled = 'true';
+    }
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.disabled = '';
+    }
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    return Form.getElements(form).find(function(element) {
+      return element.type != 'hidden' && !element.disabled &&
+        ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    Field.activate(Form.findFirstElement(form));
+    return form;
+  }
+}
+
+Object.extend(Form, Form.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+}
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+
+    if (parameter) {
+      var key = encodeURIComponent(parameter[0]);
+      if (key.length == 0) return;
+
+      if (parameter[1].constructor != Array)
+        parameter[1] = [parameter[1]];
+
+      return parameter[1].map(function(value) {
+        return key + '=' + encodeURIComponent(value);
+      }).join('&');
+    }
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+
+    if (parameter)
+      return parameter[1];
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    element.focus();
+    if (element.select)
+      element.select();
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.disabled = '';
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = 'true';
+    return element;
+  }
+}
+
+Object.extend(Form.Element, Form.Element.Methods);
+var Field = Form.Element;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+      default:
+        return Form.Element.Serializers.textarea(element);
+    }
+    return false;
+  },
+
+  inputSelector: function(element) {
+    if (element.checked)
+      return [element.name, element.value];
+  },
+
+  textarea: function(element) {
+    return [element.name, element.value];
+  },
+
+  select: function(element) {
+    return Form.Element.Serializers[element.type == 'select-one' ?
+      'selectOne' : 'selectMany'](element);
+  },
+
+  selectOne: function(element) {
+    var value = '', opt, index = element.selectedIndex;
+    if (index >= 0) {
+      opt = element.options[index];
+      value = opt.value || opt.text;
+    }
+    return [element.name, value];
+  },
+
+  selectMany: function(element) {
+    var value = [];
+    for (var i = 0; i < element.length; i++) {
+      var opt = element.options[i];
+      if (opt.selected)
+        value.push(opt.value || opt.text);
+    }
+    return [element.name, value];
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    var elements = Form.getElements(this.element);
+    for (var i = 0; i < elements.length; i++)
+      this.registerCallback(elements[i]);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX +
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY +
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) {
+      event.preventDefault();
+      event.stopPropagation();
+    } else {
+      event.returnValue = false;
+      event.cancelBubble = true;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0; i < Event.observers.length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.attachEvent))
+      name = 'keydown';
+
+    Event._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    element = $(element);
+    useCapture = useCapture || false;
+
+    if (name == 'keypress' &&
+        (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+        || element.detachEvent))
+      name = 'keydown';
+
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      try {
+        element.detachEvent('on' + name, observer);
+      } catch (e) {}
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+  Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        p = Element.getStyle(element, 'position');
+        if (p == 'relative' || p == 'absolute') break;
+      }
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  offsetParent: function(element) {
+    if (element.offsetParent) return element.offsetParent;
+    if (element == document.body) return element;
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return element;
+
+    return document.body;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  page: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent==document.body)
+        if (Element.getStyle(element,'position')=='absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!window.opera || element.tagName=='BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return [valueL, valueT];
+  },
+
+  clone: function(source, target) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || {})
+
+    // find page position of source
+    source = $(source);
+    var p = Position.page(source);
+
+    // find coordinate system to use
+    target = $(target);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(target,'position') == 'absolute') {
+      parent = Position.offsetParent(target);
+      delta = Position.page(parent);
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if(options.setLeft)   target.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if(options.setTop)    target.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if(options.setWidth)  target.style.width = source.offsetWidth + 'px';
+    if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.style.position == 'absolute') return;
+    Position.prepare();
+
+    var offsets = Position.positionedOffset(element);
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';;
+    element.style.left   = left + 'px';;
+    element.style.width  = width + 'px';;
+    element.style.height = height + 'px';;
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.style.position == 'relative') return;
+    Position.prepare();
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+  }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned.  For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+  Position.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return [valueL, valueT];
+  }
+}
+
+Element.addMethods();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/scriptaculous.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,49 @@
+// script.aculo.us scriptaculous.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var Scriptaculous = {
+  Version: '1.6.4',
+  require: function(libraryName) {
+    // inserting via DOM fails in Safari 2.0, so brute force approach
+    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
+  },
+  load: function() {
+    if((typeof Prototype=='undefined') || 
+       (typeof Element == 'undefined') || 
+       (typeof Element.Methods=='undefined') ||
+       parseFloat(Prototype.Version.split(".")[0] + "." +
+                  Prototype.Version.split(".")[1]) < 1.5)
+       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+    
+    $A(document.getElementsByTagName("script")).findAll( function(s) {
+      return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
+    }).each( function(s) {
+      var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
+      var includes = s.src.match(/\?.*load=([a-z,]*)/);
+      (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
+       function(include) { Scriptaculous.require(path+include+'.js') });
+    });
+  }
+}
+
+Scriptaculous.load();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/slider.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,294 @@
+// script.aculo.us slider.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Marty Haught, Thomas Fuchs 
+//
+// See http://script.aculo.us for more info
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if(!Control) var Control = {};
+Control.Slider = Class.create();
+
+// options:
+//  axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+//  onChange(value)
+//  onSlide(value)
+Control.Slider.prototype = {
+  initialize: function(handle, track, options) {
+    var slider = this;
+    
+    if(handle instanceof Array) {
+      this.handles = handle.collect( function(e) { return $(e) });
+    } else {
+      this.handles = [$(handle)];
+    }
+    
+    this.track   = $(track);
+    this.options = options || {};
+
+    this.axis      = this.options.axis || 'horizontal';
+    this.increment = this.options.increment || 1;
+    this.step      = parseInt(this.options.step || '1');
+    this.range     = this.options.range || $R(0,1);
+    
+    this.value     = 0; // assure backwards compat
+    this.values    = this.handles.map( function() { return 0 });
+    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+    this.options.startSpan = $(this.options.startSpan || null);
+    this.options.endSpan   = $(this.options.endSpan || null);
+
+    this.restricted = this.options.restricted || false;
+
+    this.maximum   = this.options.maximum || this.range.end;
+    this.minimum   = this.options.minimum || this.range.start;
+
+    // Will be used to align the handle onto the track, if necessary
+    this.alignX = parseInt(this.options.alignX || '0');
+    this.alignY = parseInt(this.options.alignY || '0');
+    
+    this.trackLength = this.maximumOffset() - this.minimumOffset();
+
+    this.handleLength = this.isVertical() ? 
+      (this.handles[0].offsetHeight != 0 ? 
+        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : 
+      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : 
+        this.handles[0].style.width.replace(/px$/,""));
+
+    this.active   = false;
+    this.dragging = false;
+    this.disabled = false;
+
+    if(this.options.disabled) this.setDisabled();
+
+    // Allowed values array
+    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+    if(this.allowedValues) {
+      this.minimum = this.allowedValues.min();
+      this.maximum = this.allowedValues.max();
+    }
+
+    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+    this.eventMouseMove = this.update.bindAsEventListener(this);
+
+    // Initialize handles in reverse (make sure first handle is active)
+    this.handles.each( function(h,i) {
+      i = slider.handles.length-1-i;
+      slider.setValue(parseFloat(
+        (slider.options.sliderValue instanceof Array ? 
+          slider.options.sliderValue[i] : slider.options.sliderValue) || 
+         slider.range.start), i);
+      Element.makePositioned(h); // fix IE
+      Event.observe(h, "mousedown", slider.eventMouseDown);
+    });
+    
+    Event.observe(this.track, "mousedown", this.eventMouseDown);
+    Event.observe(document, "mouseup", this.eventMouseUp);
+    Event.observe(document, "mousemove", this.eventMouseMove);
+    
+    this.initialized = true;
+  },
+  dispose: function() {
+    var slider = this;    
+    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+    Event.stopObserving(document, "mouseup", this.eventMouseUp);
+    Event.stopObserving(document, "mousemove", this.eventMouseMove);
+    this.handles.each( function(h) {
+      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+    });
+  },
+  setDisabled: function(){
+    this.disabled = true;
+  },
+  setEnabled: function(){
+    this.disabled = false;
+  },  
+  getNearestValue: function(value){
+    if(this.allowedValues){
+      if(value >= this.allowedValues.max()) return(this.allowedValues.max());
+      if(value <= this.allowedValues.min()) return(this.allowedValues.min());
+      
+      var offset = Math.abs(this.allowedValues[0] - value);
+      var newValue = this.allowedValues[0];
+      this.allowedValues.each( function(v) {
+        var currentOffset = Math.abs(v - value);
+        if(currentOffset <= offset){
+          newValue = v;
+          offset = currentOffset;
+        } 
+      });
+      return newValue;
+    }
+    if(value > this.range.end) return this.range.end;
+    if(value < this.range.start) return this.range.start;
+    return value;
+  },
+  setValue: function(sliderValue, handleIdx){
+    if(!this.active) {
+      this.activeHandleIdx = handleIdx || 0;
+      this.activeHandle    = this.handles[this.activeHandleIdx];
+      this.updateStyles();
+    }
+    handleIdx = handleIdx || this.activeHandleIdx || 0;
+    if(this.initialized && this.restricted) {
+      if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+        sliderValue = this.values[handleIdx-1];
+      if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+        sliderValue = this.values[handleIdx+1];
+    }
+    sliderValue = this.getNearestValue(sliderValue);
+    this.values[handleIdx] = sliderValue;
+    this.value = this.values[0]; // assure backwards compat
+    
+    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = 
+      this.translateToPx(sliderValue);
+    
+    this.drawSpans();
+    if(!this.dragging || !this.event) this.updateFinished();
+  },
+  setValueBy: function(delta, handleIdx) {
+    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
+      handleIdx || this.activeHandleIdx || 0);
+  },
+  translateToPx: function(value) {
+    return Math.round(
+      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * 
+      (value - this.range.start)) + "px";
+  },
+  translateToValue: function(offset) {
+    return ((offset/(this.trackLength-this.handleLength) * 
+      (this.range.end-this.range.start)) + this.range.start);
+  },
+  getRange: function(range) {
+    var v = this.values.sortBy(Prototype.K); 
+    range = range || 0;
+    return $R(v[range],v[range+1]);
+  },
+  minimumOffset: function(){
+    return(this.isVertical() ? this.alignY : this.alignX);
+  },
+  maximumOffset: function(){
+    return(this.isVertical() ? 
+      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
+        this.track.style.height.replace(/px$/,"")) - this.alignY : 
+      (this.track.offsetWidth != 0 ? this.track.offsetWidth : 
+        this.track.style.width.replace(/px$/,"")) - this.alignY);
+  },  
+  isVertical:  function(){
+    return (this.axis == 'vertical');
+  },
+  drawSpans: function() {
+    var slider = this;
+    if(this.spans)
+      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+    if(this.options.startSpan)
+      this.setSpan(this.options.startSpan,
+        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+    if(this.options.endSpan)
+      this.setSpan(this.options.endSpan, 
+        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+  },
+  setSpan: function(span, range) {
+    if(this.isVertical()) {
+      span.style.top = this.translateToPx(range.start);
+      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+    } else {
+      span.style.left = this.translateToPx(range.start);
+      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+    }
+  },
+  updateStyles: function() {
+    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+    Element.addClassName(this.activeHandle, 'selected');
+  },
+  startDrag: function(event) {
+    if(Event.isLeftClick(event)) {
+      if(!this.disabled){
+        this.active = true;
+        
+        var handle = Event.element(event);
+        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
+        var track = handle;
+        if(track==this.track) {
+          var offsets  = Position.cumulativeOffset(this.track); 
+          this.event = event;
+          this.setValue(this.translateToValue( 
+           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+          ));
+          var offsets  = Position.cumulativeOffset(this.activeHandle);
+          this.offsetX = (pointer[0] - offsets[0]);
+          this.offsetY = (pointer[1] - offsets[1]);
+        } else {
+          // find the handle (prevents issues with Safari)
+          while((this.handles.indexOf(handle) == -1) && handle.parentNode) 
+            handle = handle.parentNode;
+        
+          this.activeHandle    = handle;
+          this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+          this.updateStyles();
+        
+          var offsets  = Position.cumulativeOffset(this.activeHandle);
+          this.offsetX = (pointer[0] - offsets[0]);
+          this.offsetY = (pointer[1] - offsets[1]);
+        }
+      }
+      Event.stop(event);
+    }
+  },
+  update: function(event) {
+   if(this.active) {
+      if(!this.dragging) this.dragging = true;
+      this.draw(event);
+      // fix AppleWebKit rendering
+      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+      Event.stop(event);
+   }
+  },
+  draw: function(event) {
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    var offsets = Position.cumulativeOffset(this.track);
+    pointer[0] -= this.offsetX + offsets[0];
+    pointer[1] -= this.offsetY + offsets[1];
+    this.event = event;
+    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+    if(this.initialized && this.options.onSlide)
+      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+  },
+  endDrag: function(event) {
+    if(this.active && this.dragging) {
+      this.finishDrag(event, true);
+      Event.stop(event);
+    }
+    this.active = false;
+    this.dragging = false;
+  },  
+  finishDrag: function(event, success) {
+    this.active = false;
+    this.dragging = false;
+    this.updateFinished();
+  },
+  updateFinished: function() {
+    if(this.initialized && this.options.onChange) 
+      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+    this.event = null;
+  }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/swfobject.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,138 @@
+/**
+ * SWFObject v1.4.4: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
+ *
+ * SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
+ *   legal reasons.
+ */
+if(typeof deconcept=="undefined"){var deconcept=new Object();}
+if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}
+if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}
+deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a,_b){if(!document.getElementById){return;}
+this.DETECT_KEY=_b?_b:"detectflash";
+this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);
+this.params=new Object();
+this.variables=new Object();
+this.attributes=new Array();
+if(_1){this.setAttribute("swf",_1);}
+if(id){this.setAttribute("id",id);}
+if(w){this.setAttribute("width",w);}
+if(h){this.setAttribute("height",h);}
+if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}
+this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();
+if(c){this.addParam("bgcolor",c);}
+var q=_8?_8:"high";
+this.addParam("quality",q);
+this.setAttribute("useExpressInstall",_7);
+this.setAttribute("doExpressInstall",false);
+var _d=(_9)?_9:window.location;
+this.setAttribute("xiRedirectUrl",_d);
+this.setAttribute("redirectUrl","");
+if(_a){this.setAttribute("redirectUrl",_a);}};
+deconcept.SWFObject.prototype={setAttribute:function(_e,_f){
+this.attributes[_e]=_f;
+},getAttribute:function(_10){
+return this.attributes[_10];
+},addParam:function(_11,_12){
+this.params[_11]=_12;
+},getParams:function(){
+return this.params;
+},addVariable:function(_13,_14){
+this.variables[_13]=_14;
+},getVariable:function(_15){
+return this.variables[_15];
+},getVariables:function(){
+return this.variables;
+},getVariablePairs:function(){
+var _16=new Array();
+var key;
+var _18=this.getVariables();
+for(key in _18){_16.push(key+"="+_18[key]);}
+return _16;},getSWFHTML:function(){var _19="";
+if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){
+if(this.getAttribute("doExpressInstall")){
+this.addVariable("MMplayerType","PlugIn");}
+_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\"";
+_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";
+var _1a=this.getParams();
+for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}
+var _1c=this.getVariablePairs().join("&");
+if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";
+}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");}
+_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\">";
+_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";
+var _1d=this.getParams();
+for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}
+var _1f=this.getVariablePairs().join("&");
+if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}
+return _19;
+},write:function(_20){
+if(this.getAttribute("useExpressInstall")){
+var _21=new deconcept.PlayerVersion([6,0,65]);
+if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){
+this.setAttribute("doExpressInstall",true);
+this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));
+document.title=document.title.slice(0,47)+" - Flash Player Installation";
+this.addVariable("MMdoctitle",document.title);}}
+if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){
+var n=(typeof _20=="string")?document.getElementById(_20):_20;
+n.innerHTML=this.getSWFHTML();return true;
+}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}
+return false;}};
+deconcept.SWFObjectUtil.getPlayerVersion=function(){
+var _23=new deconcept.PlayerVersion([0,0,0]);
+if(navigator.plugins&&navigator.mimeTypes.length){
+var x=navigator.plugins["Shockwave Flash"];
+if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}
+}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}
+catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}
+catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}
+catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}
+return _23;};
+deconcept.PlayerVersion=function(_27){
+this.major=_27[0]!=null?parseInt(_27[0]):0;
+this.minor=_27[1]!=null?parseInt(_27[1]):0;
+this.rev=_27[2]!=null?parseInt(_27[2]):0;
+};
+deconcept.PlayerVersion.prototype.versionIsValid=function(fv){
+if(this.major<fv.major){return false;}
+if(this.major>fv.major){return true;}
+if(this.minor<fv.minor){return false;}
+if(this.minor>fv.minor){return true;}
+if(this.rev<fv.rev){
+return false;
+}return true;};
+deconcept.util={getRequestParameter:function(_29){
+var q=document.location.search||document.location.hash;
+if(q){var _2b=q.substring(1).split("&");
+for(var i=0;i<_2b.length;i++){
+if(_2b[i].substring(0,_2b[i].indexOf("="))==_29){
+return _2b[i].substring((_2b[i].indexOf("=")+1));}}}
+return "";}};
+deconcept.SWFObjectUtil.cleanupSWFs=function(){if(window.opera||!document.all){return;}
+var _2d=document.getElementsByTagName("OBJECT");
+for(var i=0;i<_2d.length;i++){_2d[i].style.display="none";for(var x in _2d[i]){
+if(typeof _2d[i][x]=="function"){_2d[i][x]=function(){};}}}};
+deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};
+__flash_savedUnloadHandler=function(){};
+if(typeof window.onunload=="function"){
+var _30=window.onunload;
+window.onunload=function(){
+deconcept.SWFObjectUtil.cleanupSWFs();_30();};
+}else{window.onunload=deconcept.SWFObjectUtil.cleanupSWFs;}};
+if(typeof window.onbeforeunload=="function"){
+var oldBeforeUnload=window.onbeforeunload;
+window.onbeforeunload=function(){
+deconcept.SWFObjectUtil.prepUnload();
+oldBeforeUnload();};
+}else{window.onbeforeunload=deconcept.SWFObjectUtil.prepUnload;}
+if(Array.prototype.push==null){
+Array.prototype.push=function(_31){
+this[this.length]=_31;
+return this.length;};}
+var getQueryParamValue=deconcept.util.getRequestParameter;
+var FlashObject=deconcept.SWFObject;
+var SWFObject=deconcept.SWFObject;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/seminaires/res/js/unittest.js	Fri Mar 13 17:04:58 2009 +0000
@@ -0,0 +1,552 @@
+// script.aculo.us unittest.js v1.6.4, Wed Sep 06 11:30:58 CEST 2006
+
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+  var options = Object.extend({
+    pointerX: 0,
+    pointerY: 0,
+    buttons: 0
+  }, arguments[2] || {});
+  var oEvent = document.createEvent("MouseEvents");
+  oEvent.initMouseEvent(eventName, true, true, document.defaultView, 
+    options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 
+    false, false, false, false, 0, $(element));
+  
+  if(this.mark) Element.remove(this.mark);
+  this.mark = document.createElement('div');
+  this.mark.appendChild(document.createTextNode(" "));
+  document.body.appendChild(this.mark);
+  this.mark.style.position = 'absolute';
+  this.mark.style.top = options.pointerY + "px";
+  this.mark.style.left = options.pointerX + "px";
+  this.mark.style.width = "5px";
+  this.mark.style.height = "5px;";
+  this.mark.style.borderTop = "1px solid red;"
+  this.mark.style.borderLeft = "1px solid red;"
+  
+  if(this.step)
+    alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
+  
+  $(element).dispatchEvent(oEvent);
+};
+
+// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
+// You need to downgrade to 1.0.4 for now to get this working
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
+Event.simulateKey = function(element, eventName) {
+  var options = Object.extend({
+    ctrlKey: false,
+    altKey: false,
+    shiftKey: false,
+    metaKey: false,
+    keyCode: 0,
+    charCode: 0
+  }, arguments[2] || {});
+
+  var oEvent = document.createEvent("KeyEvents");
+  oEvent.initKeyEvent(eventName, true, true, window, 
+    options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
+    options.keyCode, options.charCode );
+  $(element).dispatchEvent(oEvent);
+};
+
+Event.simulateKeys = function(element, command) {
+  for(var i=0; i<command.length; i++) {
+    Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
+  }
+};
+
+var Test = {}
+Test.Unit = {};
+
+// security exception workaround
+Test.Unit.inspect = Object.inspect;
+
+Test.Unit.Logger = Class.create();
+Test.Unit.Logger.prototype = {
+  initialize: function(log) {
+    this.log = $(log);
+    if (this.log) {
+      this._createLogTable();
+    }
+  },
+  start: function(testName) {
+    if (!this.log) return;
+    this.testName = testName;
+    this.lastLogLine = document.createElement('tr');
+    this.statusCell = document.createElement('td');
+    this.nameCell = document.createElement('td');
+    this.nameCell.appendChild(document.createTextNode(testName));
+    this.messageCell = document.createElement('td');
+    this.lastLogLine.appendChild(this.statusCell);
+    this.lastLogLine.appendChild(this.nameCell);
+    this.lastLogLine.appendChild(this.messageCell);
+    this.loglines.appendChild(this.lastLogLine);
+  },
+  finish: function(status, summary) {
+    if (!this.log) return;
+    this.lastLogLine.className = status;
+    this.statusCell.innerHTML = status;
+    this.messageCell.innerHTML = this._toHTML(summary);
+  },
+  message: function(message) {
+    if (!this.log) return;
+    this.messageCell.innerHTML = this._toHTML(message);
+  },
+  summary: function(summary) {
+    if (!this.log) return;
+    this.logsummary.innerHTML = this._toHTML(summary);
+  },
+  _createLogTable: function() {
+    this.log.innerHTML =
+    '<div id="logsummary"></div>' +
+    '<table id="logtable">' +
+    '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
+    '<tbody id="loglines"></tbody>' +
+    '</table>';
+    this.logsummary = $('logsummary')
+    this.loglines = $('loglines');
+  },
+  _toHTML: function(txt) {
+    return txt.escapeHTML().replace(/\n/g,"<br/>");
+  }
+}
+
+Test.Unit.Runner = Class.create();
+Test.Unit.Runner.prototype = {
+  initialize: function(testcases) {
+    this.options = Object.extend({
+      testLog: 'testlog'
+    }, arguments[1] || {});
+    this.options.resultsURL = this.parseResultsURLQueryParameter();
+    if (this.options.testLog) {
+      this.options.testLog = $(this.options.testLog) || null;
+    }
+    if(this.options.tests) {
+      this.tests = [];
+      for(var i = 0; i < this.options.tests.length; i++) {
+        if(/^test/.test(this.options.tests[i])) {
+          this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
+        }
+      }
+    } else {
+      if (this.options.test) {
+        this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
+      } else {
+        this.tests = [];
+        for(var testcase in testcases) {
+          if(/^test/.test(testcase)) {
+            this.tests.push(
+               new Test.Unit.Testcase(
+                 this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, 
+                 testcases[testcase], testcases["setup"], testcases["teardown"]
+               ));
+          }
+        }
+      }
+    }
+    this.currentTest = 0;
+    this.logger = new Test.Unit.Logger(this.options.testLog);
+    setTimeout(this.runTests.bind(this), 1000);
+  },
+  parseResultsURLQueryParameter: function() {
+    return window.location.search.parseQuery()["resultsURL"];
+  },
+  // Returns:
+  //  "ERROR" if there was an error,
+  //  "FAILURE" if there was a failure, or
+  //  "SUCCESS" if there was neither
+  getResult: function() {
+    var hasFailure = false;
+    for(var i=0;i<this.tests.length;i++) {
+      if (this.tests[i].errors > 0) {
+        return "ERROR";
+      }
+      if (this.tests[i].failures > 0) {
+        hasFailure = true;
+      }
+    }
+    if (hasFailure) {
+      return "FAILURE";
+    } else {
+      return "SUCCESS";
+    }
+  },
+  postResults: function() {
+    if (this.options.resultsURL) {
+      new Ajax.Request(this.options.resultsURL, 
+        { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
+    }
+  },
+  runTests: function() {
+    var test = this.tests[this.currentTest];
+    if (!test) {
+      // finished!
+      this.postResults();
+      this.logger.summary(this.summary());
+      return;
+    }
+    if(!test.isWaiting) {
+      this.logger.start(test.name);
+    }
+    test.run();
+    if(test.isWaiting) {
+      this.logger.message("Waiting for " + test.timeToWait + "ms");
+      setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
+    } else {
+      this.logger.finish(test.status(), test.summary());
+      this.currentTest++;
+      // tail recursive, hopefully the browser will skip the stackframe
+      this.runTests();
+    }
+  },
+  summary: function() {
+    var assertions = 0;
+    var failures = 0;
+    var errors = 0;
+    var messages = [];
+    for(var i=0;i<this.tests.length;i++) {
+      assertions +=   this.tests[i].assertions;
+      failures   +=   this.tests[i].failures;
+      errors     +=   this.tests[i].errors;
+    }
+    return (
+      (this.options.context ? this.options.context + ': ': '') + 
+      this.tests.length + " tests, " + 
+      assertions + " assertions, " + 
+      failures   + " failures, " +
+      errors     + " errors");
+  }
+}
+
+Test.Unit.Assertions = Class.create();
+Test.Unit.Assertions.prototype = {
+  initialize: function() {
+    this.assertions = 0;
+    this.failures   = 0;
+    this.errors     = 0;
+    this.messages   = [];
+  },
+  summary: function() {
+    return (
+      this.assertions + " assertions, " + 
+      this.failures   + " failures, " +
+      this.errors     + " errors" + "\n" +
+      this.messages.join("\n"));
+  },
+  pass: function() {
+    this.assertions++;
+  },
+  fail: function(message) {
+    this.failures++;
+    this.messages.push("Failure: " + message);
+  },
+  info: function(message) {
+    this.messages.push("Info: " + message);
+  },
+  error: function(error) {
+    this.errors++;
+    this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
+  },
+  status: function() {
+    if (this.failures > 0) return 'failed';
+    if (this.errors > 0) return 'error';
+    return 'passed';
+  },
+  assert: function(expression) {
+    var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
+    try { expression ? this.pass() : 
+      this.fail(message); }
+    catch(e) { this.error(e); }
+  },
+  assertEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEqual";
+    try { (expected == actual) ? this.pass() :
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) + 
+        '", actual "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertEnumEqual: function(expected, actual) {
+    var message = arguments[2] || "assertEnumEqual";
+    try { $A(expected).length == $A(actual).length && 
+      expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
+        this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + 
+          ', actual ' + Test.Unit.inspect(actual)); }
+    catch(e) { this.error(e); }
+  },
+  assertNotEqual: function(expected, actual) {
+    var message = arguments[2] || "assertNotEqual";
+    try { (expected != actual) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertIdentical"; 
+    try { (expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNotIdentical: function(expected, actual) { 
+    var message = arguments[2] || "assertNotIdentical"; 
+    try { !(expected === actual) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + Test.Unit.inspect(actual) + '"'); } 
+    catch(e) { this.error(e); } 
+  },
+  assertNull: function(obj) {
+    var message = arguments[1] || 'assertNull'
+    try { (obj==null) ? this.pass() : 
+      this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertMatch: function(expected, actual) {
+    var message = arguments[2] || 'assertMatch';
+    var regex = new RegExp(expected);
+    try { (regex.exec(actual)) ? this.pass() :
+      this.fail(message + ' : regex: "' +  Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertHidden: function(element) {
+    var message = arguments[1] || 'assertHidden';
+    this.assertEqual("none", element.style.display, message);
+  },
+  assertNotNull: function(object) {
+    var message = arguments[1] || 'assertNotNull';
+    this.assert(object != null, message);
+  },
+  assertType: function(expected, actual) {
+    var message = arguments[2] || 'assertType';
+    try { 
+      (actual.constructor == expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertNotOfType: function(expected, actual) {
+    var message = arguments[2] || 'assertNotOfType';
+    try { 
+      (actual.constructor != expected) ? this.pass() : 
+      this.fail(message + ': expected "' + Test.Unit.inspect(expected) +  
+        '", actual "' + (actual.constructor) + '"'); }
+    catch(e) { this.error(e); }
+  },
+  assertInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertInstanceOf';
+    try { 
+      (actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was not an instance of the expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertNotInstanceOf: function(expected, actual) {
+    var message = arguments[2] || 'assertNotInstanceOf';
+    try { 
+      !(actual instanceof expected) ? this.pass() : 
+      this.fail(message + ": object was an instance of the not expected type"); }
+    catch(e) { this.error(e); } 
+  },
+  assertRespondsTo: function(method, obj) {
+    var message = arguments[2] || 'assertRespondsTo';
+    try {
+      (obj[method] && typeof obj[method] == 'function') ? this.pass() : 
+      this.fail(message + ": object doesn't respond to [" + method + "]"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsTrue: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsTrue';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      m() ? this.pass() : 
+      this.fail(message + ": method returned false"); }
+    catch(e) { this.error(e); }
+  },
+  assertReturnsFalse: function(method, obj) {
+    var message = arguments[2] || 'assertReturnsFalse';
+    try {
+      var m = obj[method];
+      if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
+      !m() ? this.pass() : 
+      this.fail(message + ": method returned true"); }
+    catch(e) { this.error(e); }
+  },
+  assertRaise: function(exceptionName, method) {
+    var message = arguments[2] || 'assertRaise';
+    try { 
+      method();
+      this.fail(message + ": exception expected but none was raised"); }
+    catch(e) {
+      (e.name==exceptionName) ? this.pass() : this.error(e); 
+    }
+  },
+  assertElementsMatch: function() {
+    var expressions = $A(arguments), elements = $A(expressions.shift());
+    if (elements.length != expressions.length) {
+      this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
+      return false;
+    }
+    elements.zip(expressions).all(function(pair, index) {
+      var element = $(pair.first()), expression = pair.last();
+      if (element.match(expression)) return true;
+      this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
+    }.bind(this)) && this.pass();
+  },
+  assertElementMatches: function(element, expression) {
+    this.assertElementsMatch([element], expression);
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  },
+  _isVisible: function(element) {
+    element = $(element);
+    if(!element.parentNode) return true;
+    this.assertNotNull(element);
+    if(element.style && Element.getStyle(element, 'display') == 'none')
+      return false;
+    
+    return this._isVisible(element.parentNode);
+  },
+  assertNotVisible: function(element) {
+    this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
+  },
+  assertVisible: function(element) {
+    this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
+  },
+  benchmark: function(operation, iterations) {
+    var startAt = new Date();
+    (iterations || 1).times(operation);
+    var timeTaken = ((new Date())-startAt);
+    this.info((arguments[2] || 'Operation') + ' finished ' + 
+       iterations + ' iterations in ' + (timeTaken/1000)+'s' );
+    return timeTaken;
+  }
+}
+
+Test.Unit.Testcase = Class.create();
+Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
+  initialize: function(name, test, setup, teardown) {
+    Test.Unit.Assertions.prototype.initialize.bind(this)();
+    this.name           = name;
+    
+    if(typeof test == 'string') {
+      test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
+      test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
+      this.test = function() {
+        eval('with(this){'+test+'}');
+      }
+    } else {
+      this.test = test || function() {};
+    }
+    
+    this.setup          = setup || function() {};
+    this.teardown       = teardown || function() {};
+    this.isWaiting      = false;
+    this.timeToWait     = 1000;
+  },
+  wait: function(time, nextPart) {
+    this.isWaiting = true;
+    this.test = nextPart;
+    this.timeToWait = time;
+  },
+  run: function() {
+    try {
+      try {
+        if (!this.isWaiting) this.setup.bind(this)();
+        this.isWaiting = false;
+        this.test.bind(this)();
+      } finally {
+        if(!this.isWaiting) {
+          this.teardown.bind(this)();
+        }
+      }
+    }
+    catch(e) { this.error(e); }
+  }
+});
+
+// *EXPERIMENTAL* BDD-style testing to please non-technical folk
+// This draws many ideas from RSpec http://rspec.rubyforge.org/
+
+Test.setupBDDExtensionMethods = function(){
+  var METHODMAP = {
+    shouldEqual:     'assertEqual',
+    shouldNotEqual:  'assertNotEqual',
+    shouldEqualEnum: 'assertEnumEqual',
+    shouldBeA:       'assertType',
+    shouldNotBeA:    'assertNotOfType',
+    shouldBeAn:      'assertType',
+    shouldNotBeAn:   'assertNotOfType',
+    shouldBeNull:    'assertNull',
+    shouldNotBeNull: 'assertNotNull',
+    
+    shouldBe:        'assertReturnsTrue',
+    shouldNotBe:     'assertReturnsFalse',
+    shouldRespondTo: 'assertRespondsTo'
+  };
+  Test.BDDMethods = {};
+  for(m in METHODMAP) {
+    Test.BDDMethods[m] = eval(
+      'function(){'+
+      'var args = $A(arguments);'+
+      'var scope = args.shift();'+
+      'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
+  }
+  [Array.prototype, String.prototype, Number.prototype].each(
+    function(p){ Object.extend(p, Test.BDDMethods) }
+  );
+}
+
+Test.context = function(name, spec, log){
+  Test.setupBDDExtensionMethods();
+  
+  var compiledSpec = {};
+  var titles = {};
+  for(specName in spec) {
+    switch(specName){
+      case "setup":
+      case "teardown":
+        compiledSpec[specName] = spec[specName];
+        break;
+      default:
+        var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
+        var body = spec[specName].toString().split('\n').slice(1);
+        if(/^\{/.test(body[0])) body = body.slice(1);
+        body.pop();
+        body = body.map(function(statement){ 
+          return statement.strip()
+        });
+        compiledSpec[testName] = body.join('\n');
+        titles[testName] = specName;
+    }
+  }
+  new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
+};
\ No newline at end of file
Binary file web/seminaires/res/media/AtelierIHM-IrcamAPM.pdf has changed
Binary file web/seminaires/res/media/Biblio_Marmottan.pdf has changed
Binary file web/seminaires/res/media/Flyer_DesirTechnologies.pdf has changed
Binary file web/seminaires/res/media/Flyer_Nanotechnologies-2007.pdf has changed
Binary file web/seminaires/res/media/Flyer_Nanotechnologies-2007_08.pdf has changed
Binary file web/seminaires/res/media/Flyer_Nanotechnologies-2009.pdf has changed
Binary file web/seminaires/res/media/IHM07Workshop-EESI.pdf has changed
Binary file web/seminaires/res/media/IHM07Workshop-GRAME.pdf has changed
Binary file web/seminaires/res/media/IHM07Workshop-IRCAM.pdf has changed
Binary file web/seminaires/res/media/IHM07Workshop-IRI.pdf has changed
Binary file web/seminaires/res/media/IHM07Workshop-LIRIS.pdf has changed
Binary file web/seminaires/res/media/Programme_seminaire_IRI-Politiques_Amateur.pdf has changed
Binary file web/seminaires/res/media/WorkshopIHM07-Musique_Cinema.pdf has changed
Binary file web/seminaires/res/media/culture2.0_presentation.pdf has changed
Binary file web/seminaires/res/media/prgrfinal.pdf has changed