--- 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 : ouverture du séminaire par Mathilde Girard : « Enfance et politique du jeu à partir de <i>Dr Mabuse, le joueur</i> de Fritz Lang ».</li>
+ <li>31 janvier 2008 : Bernard Stiegler: « Considérations sur l'amateur d'un point de vue pharmacologique »; interviendront également François Richard, Marc Valleur et l'équipe de l'Hôpital Marmottan.</li>
+ <li>21 février 2008 : Tristan Garcia-Fons (pédopsychiatre et psychanalyste) : « La fabrique du trouble de l'enfant et de l'adolescent », Philippe Bazin (photographe) : « Larry Clark - le corps du délit » et Georges Didi-Huberman (philosophe et historien de l'art).</li>
+ <li>13 mars 2008 : Stéphane Nadaud (pédopsychiatre, praticien hospitalier et philosophe, rédacteur en chef de la revue Chimères) : « L'adolescence comme nouveau paradigme du travail institutionnel en clinique hospitalière » et Philippe Giesberger (infirmier et cadre de santé, secteur i03 de Ville-Evrard) : « Rencontre avec des adolescents en pédopsychiatrie en direct de l'unité adolescents 93 ». <span style="color: red;">SALLE STRAVINSKY, IRCAM</span></li>
+ <li>3 avril 2008 : Christiane Vollaire (philosophe, enseignante en philosophie et membre du comité de rédaction des revues Drôle d'époque et Pratiques) : « Puissances de reproduction ».</li>
+ <li>17 avril 2008 : 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) : à partir d'Orange Mécanique de Stanley Kubrick, « Le grand jeu d'Alex » et Eric Toubiana (psychanalyste, maître de conférence à l'Université Paris VII Denis Diderot et psychothérapeute hospitalier) : « Le Divan électrique ».</li>
+ <li>15 mai 2008 : Marc Valleur, Eric Toubiana, Paul-Laurent Assoun : « Addictions et pratiques ordaliques ».</li>
+ <li>22 mai 2008 : Jean-Louis Déotte (philosophe et professeur de philosophie à Paris VIII) : « Les Immatériaux de Jean-François Lyotard et le Double Plateau de Daniel Buren », Emine Sarikartale (doctorante en philosophie à Paris VIII) : « Enfance et postmodernité chez Lyotard », et Marta Hernandez (doctorante en philosophie à Paris VIII) : « La question de la khôra dans Les Immatériaux ».</li>
+ <li>5 juin 2008 : Elisabeth Belmas (historienne du jeu) : « La question des jeux d'argent ».</li>
+ <li> 26 juin 2008 : Elisabeth Rossé (psychologue), Thomas Gaon, Serge Tisseron (psychiatre et psychanalyste) : « Autour des jeux vidéos ».</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’annotation et la manipulation d’objets temporels : une comparaison des outils et des paradigmes dans le domaine musical et cinématographique
+<br/>
+<h5>Organisateurs :</h5>
+<br/>
+<ul>
+ <li>
+ IRI (Institut de Recherche et d’Innovation/Centre Pompidou)
+ Vincent Puig, Xavier Sirven, Thibaut Cavalié
+ http://www.iri.centrepompidou.fr
+ contact : vincent.puig@centrepompidou.fr
+ </li>
+ <li>
+ LIRIS
+ Yannick Prié, Olivier Aubert
+ http://liris.cnrs.fr
+ </li>
+ <li>
+ éESI (école Européenne Supérieure de l’Image)
+ Jean Marie Dallet, Frédéric Curien
+ http://www.eesi.eu
+ </li>
+ <li>
+ IRCAM (é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’étudier de façon détaillée, différentes IHM développées pour l’annotation et la manipulation d’objets temporels dans le domaine cinématographique comme dans le champ musical. L’objectif étant de croiser les motivations et méthodologies qui ont abouties au design d’interfaces innovantes dans le domaine et de dégager de possibles paradigmes communs.
+
+L’atelier s’articulera autour de présentations d’outils d’annotation et de manipulation de documents musicaux et cinématographiques en considérant les dimensions suivantes:
+<ul>
+ <li>IHM pour l’analyse et la segmentation des flux temporels (discrimination d’unités de sens par méthodes d’extraction automatique ou manuelles)</li>
+ <li>IHM pour la symbolisation/représentation/description des unités de sens (problématiques de niveau sémantique, langages, notations)</li>
+ <li>IHM pour la manipulation et le traitement des éléments annotés (problématiques de masse de données, contextes de publication et de partage, interaction live ou temps différé).</li>
+</ul>
+<br/>
+</p>
+<br/>
+<p>
+Une dimension transversale est celle de la présentation et de l’interaction avec les unités de description des documents temporels.
+<br/>
+La présentation s’appuiera notamment sur des exemples d’IHM issus des outils en cours de développement chez les participants de l’atelier, à savoir le logiciel Lignes de temps pour l’annotation cinématographique développé par l’IRI - Centre Pompidou, le logiciel Advene du LIRIS pour l’analyse et l’annotation de documents temporels et la réalisation d’hypervidéo, le logiciel SLIDERS pour la performance temps réel sur base de données audio visuelles et les outils. Pour la partie musicale seront présentés des outils d’annotation de la musique développés dans l’équipe Analyse des pratiques musicales de l’Ircam en collaboration avec l’équipe Analyse Synthèse (outil de visualisation de segmentation automatique, segmentation en unités sémiotiques temporelles, projet RNTL Scenari, outil pour la publication de parcours dans une oeuvre, description sémantique de la partition à base de formes géométriques) ainsi que des outils d’annotation à visée pédagogique développés par le GRAME dans le cadre du projet européen VEMUS.
+<br/><br/>
+L’IRI et le LIRIS collaborent à l’expérimentation de nouvelles formes de pratiques cinéphiliques et pédagogiques dans le cadre du projet RIAM Ciné Lab (Annotation de films et partage d’annotation sur postes de travail, sites Web et dispositifs mobiles).
+SLIDERS est un laboratoire de recherche artistique au sein de l’éESI ; il bénéficie du soutien du Ministère de la Culture et de la Communication, DAP, Direction de la Recherche et de l’Innovation.
+<br/><br/>
+Nous invitons d’autres contributeurs à nous soumettre des propositions de présentation courte (10 minutes) d’outils d’annotation d’objets temporels en envoyant une proposition et si possible un accès au logiciel à l’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é</font></h3>
+ <div id="abstract">
+ <p>
+ <b>abstract</b> : Artistes & 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 & 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 & 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énovation de la Salle de l'IRI, la suite du séminaire "Images et Visages" est reportée à 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é)</font></li>
+ <li>15 mai<font color=orange> (reporté)</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’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’est confronté
+l’art conceptuel et néo-conceptuel. En nous appuyant sur les écrits
+de Jeff Wall, nous avions étudié comment l’interrogation de l’institution
+par les pratiques conceptuelles et néo-conceptuelles de l’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’histoire de l’art moderne. <br/></p>
+<p align="justify"> Ces
+analyses nous ont amené à reposer l’importance pour l’art, pour
+sa production comme pour sa réception, de la notion d’expérience
+sans contenu. « L’expérience esthétique nous forme, modifie nos
+sentiments et nous transforme : c’est pourquoi, selon Kant, on a besoin
+d’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’appréciation
+« sentimentale » de cette formation par l’expérience esthétique.
+L’exercice du jugement s’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’est pas intuitive : elle doit être réfléchie à
+partir d’une forme « une » que Kant identifie à la forme de l’entendement. <br/>
+</p>
+
+<p align="justify"> Tout
+en conservant l’essentiel de cette notion d’expérience esthétique,
+la modernité a contesté que cette forme « une » puisse être
+donnée a priori. Comme le montre l’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’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’expérience esthétique. Ce qui a donné lieu, du côté de la
+production, à l’abandon « du » medium pour l’expérimentation des
+media, et, du côté de la réception, à la problématisation de la
+forme-musée. C’est ainsi que le jugement s’est élargi jusqu’à
+inclure la pratique comme une de ses dimensions. </p>
+<p align="justify"> L’articulation
+du jugement et de la pratique est au coeur de l’expérience artistique
+moderne, qu’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’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’elle est proposée dans les différentes versions
+de l’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’est pas le sujet de l’entendement et ses capacités
+de schématisation mais ce qu’il appelle les savoirs, c’est-à-dire
+les formules épistémologiques qui en s’effectuant sous la forme
+de techniques opérent, sans l’intervention précisément d’aucun
+jugement, le contrôle des modes d’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’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’expérimentation des pouvoirs conférés aux savoirs
+par les techniques. L’expérimentation par exemple des pouvoirs sur
+les corps conférés aux théories sociales occidentales par les techniques
+d’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’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’individuation
+qui excèdent les « programmes de contrôle » sans pour autant
+sortir du terrain de l’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’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’en
+est-il aujourd’hui de cet art du jugement, autrement dit de la possibilité
+de conduire l’expérimentation des modes de contrôle impliqués par
+les technologies contemporaines dans le sens de la transgression de
+telle manière qu’elle puissent servir de nouvelles formules épistémologiques
+et des modes d’individuation inédits ? <br/></p>
+
+<p align="justify"> Michel
+Foucault lègue cette question ; il n’y répond pas, s’étant consacré
+à l’articuler dans le contexte de savoirs médiatisés par les techniques
+de production et d’administration du 19<sup>ème</sup> siècle. C’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’é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’articulation
+savoirs/pouvoirs passe aujourd’hui par les technologies de reproduction
+et d’archivage, et le contrôle politique des sociétés s’exerce
+par l’intermédiaire des appareils collectifs de mémorisation.
+Avant de s’exercer sur les individus, les pouvoirs des systèmes de
+programmation s’exercent sur l’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’hui l’information.
+Cette information se réfléchit automatiquement en s’archivant. Pour
+que cette réflexion automatique devienne matière à expérimentation
+il est nécessaire que cet archivage émancipe l’information du programme
+qui l’a produite et la connecte avec d’autres programmes. C’est
+le modèle rhyzomatique de l’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’entend ? A condition qu’elle émancipe l’information
+non seulement de « son » programme, mais de sa fonction de communication
+soluble dans l’opération de sa transmission, et que sa réflexion
+ne soit pas simplement formelle mais réelle : qu’elle produise non
+seulement de la connectivité mais de l’individuation. L’information
+est réfléchie sur un mode pratique dès lors qu’elle est lue. Lue,
+interprétée, documentée. L’opération du jugement intervient ici
+avec l’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’art contemporain, pour envisager
+les modes de lecture, de réinscription et d’archivage qu’il met
+en oeuvre comme autant d’actualisations de la réflexion de Michel
+Foucault. On s’intéressera dans cette perspective à l’oeuvre de
+Chris Marker, de Pierre Huyghe et de Tatiana Trouvé. Il s’agira au
+cours de cette étape de proposer des représentations du jugement aujourd’hui
+tel qu’il s’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"/> <a href="../documents/ANNOTATION_NAVIGATION_EDITION_ELECTRONIQUE_1993.doc">ANNOTATION, NAVIGATION, EDITION ELECTRONIQUE, 1993</a></li>
+ <li><img src="../res/img/page_word.png"/> <a href="../documents/GIS_MEMOIRES_EXTERNES.doc">GIS MEMOIRES EXTERNES, 1994</a></li>
+ <li><img src="../res/img/page_word.png"/> <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é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é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ère de la culture et de la communication (Mission de la Recherche et de la Technologie/Délégation au Développement et aux Affaires Internationales) et le Centre de recherche du Château de Versailles ont organisé le 8 novembre 2006 un séminaire national sur le thème « Lieux culturels et nouvelles pratiques numériques ». De mars à juin 2007, l’Institut de recherche et d’innovation du Centre Pompidou (IRI) a organisé pour le compte de la MRT, un séminaire sur le thème <i>Muséologie, Muséographie et nouvelles formes d’adresse au public</i> qui a pris la forme d'une série de huit séances ouvertes aux étudiants de l’Ecole du Louvre (4ème année, Master I) ainsi qu’aux agents du Ministère de la culture et de la communication, aux établissements culturels et aux professionnels qui en ont fait la demande.
+<h4>Le Séminiaire</h4>
+Dans le cadre de son programme de recherche sur les nouvelles technologies culturelles et éducatives et sur les nouvelles formes d'adresse au public,
+l'IRI propose de focaliser les axes de réflexion de ce séminaire pour 2008-2009 sur les technologies collaboratives en collaboration avec
+le projet ADONIS/CNRS Anthroponet (accès et valorisation des archives muséales) et le projet THD Cap Digital (Pratiques culturelles sur les réseaux haut débit).
+Le principe de ce séminaire est de confronter expériences muséales et réflexions théorique et scientifique en analysant à chaque séance
+l'impact des nouveaux dispositifs d'adresse au public sur les pratiques muséales. Cette année, le séminaire est plus particulièrement ouvert
+aux é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ès d’Anne-Sophie François, Chargée de mission de l’Institut de recherche et d’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éance 1 : </strong>mardi 14 octobre 2008, de 16h à 18h, amphithéâtre Dürer à l’Ecole du Louvre<br />
+ <strong>Thème : Les espaces critiques collaboratifs</strong><br />
+ </li>
+</ul>
+ <p>On s’accorde aujourd’hui à considérer comme une caractéristique du Web 3.0, la conjonction d’un
+ point de vue éditorial et de contributions des visiteurs. En ingénierie sociale, on parle aussi de
+ combiner une approche « top-down » et de l’innovation ascendante de type « bottom-up ». Cette
+ séance introduira et mettra en débat cette notion, sans ignorer les effets de « viralisation » tant
+ recherchés par les industries culturelles, et montrera par des expériences concrètes comment les
+ musées réussissent ou échouent à combiner singularité d’un point de vue sur les oeuvres et contribution des visiteurs.
+ <ul>
+ <li type="circle">Introduction : Bernard Stiegler, IRI/Centre Pompidou : Le musée augmenté comme « théâtre d'individuation » , Elisabeth Caillet/Musée de l’homme : Médiation et TIC,</li>
+ <li type="circle">Jacqueline Eidelman et Séverine Dessajan, CERLIS (Centre de recherche sur les liens sociaux) - Université Paris Descartes et CNRS : <i>Muséologie intrusive ou collaborative : les comité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> </p>
+ <ul type="square">
+ <li><strong>Séance 2 : </strong>mercredi 17 décembre 2008, de 17h à 19h, salle du Collège au Centre Pompidou<br />
+ <strong>Thème : Articuler le musée et les réseaux sociaux</strong><br />
+ </li>
+ </ul>
+ <p>Un musée peut-il s’articuler avec des réseaux sociaux et des sites collaboratifs existants (type FaceBook, Flickr, YouTube, Daily Motion…) ? Dans ce cas, de quelle marge de manoeuvre dispose-t-il pour le choix des métadonnées et leur récupération pour enrichir son fonds ? Doit-il créer intégralement son propre ré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énéral du patrimoine, Directrice des Archives des Yvelines,</li>
+ </ul>
+ <p> </p>
+ <ul type="square">
+ <li><strong>Séance 3 : </strong>mercredi 21 janvier 2009, de 17h à 19h, salle du Collège au Centre Pompidou<br />
+ <strong>Thème : Les objets communicants : un lien entre l’espace du musée et les espaces numériques</strong><br />
+ </li>
+ </ul>
+ <p>Les technologies de la mobilité, utiles à la personnalisation des visites, constituent aussi un lien « pervasif » avec les espaces numériques. Reste à penser de nouvelles formes d’adresse au public
+ (débats, approfondissements, jeux…) pour que l’objet communicant devienne un véritable instrument
+ critique.</p>
+ <ul>
+ <li type="circle">Joëlle Le Marec, Professeur des universités, ENS LSH,</li>
+ <li type="circle">Yves-Armel Martin, Directeur de la Mission technologie et information / Centre informatique Erasme, Département Informatique du Département du Rhône, et Elisabeth Shimmels, Chargée de projets « Espaces découvertes » / Service des publics du Musée des Confluences,</li>
+ <li type="circle">Vincent Puig et Cécilia Jauniau, IRI/Centre Pompidou, Présentation du dispositif et étude du public lors des expérimentations sur l'exposition <em>Traces du sacré</em>.</li>
+ </ul>
+ <p> </p>
+ <ul type="square">
+ <li><strong>Séance 4 : </strong>mercredi 11 février 2009, de 17h à 19h, salle du Collège au Centre Pompidou<br />
+ <strong>Thème : Enjeux des instruments de perception dans les programmes éducatifs du monde
+ numérique</strong><br />
+ </li>
+ </ul>
+ <p>Le contexte éducatif est dans les musées particulièrement propice à l’expérimentation, on y mesure
+ sans doute plus précisément l’importance d’une « instrumentation » de la perception et du jugement.
+ On abordera également dans cette séance la problématique des adolescents.</p>
+ <ul>
+ <li type="circle">Stephan Schwan, IWM/KMRC Tübingen (Allemagne),</li>
+ <li type="circle">Vincent Maestracci, Doyen des enseignements artistiques, Inspection Générale, Ministère
+ de l’Education Nationale,</li>
+ <li type="circle">Nancy Proctor, Smithsonian American Art Museum (Etats-Unis),</li>
+ </ul>
+ <p> </p>
+ <ul type="square">
+ <li><strong>Séance 5 : </strong>mercredi 11 mars 2009, de 17h à 19h, au Centre Pompidou<br />
+ <strong>Thème : Les modèles économiques et le tourisme</strong><br />
+ </li>
+ </ul>
+ <p>Quelle nouvelle organisation de la création de la valeur se dessine dans le contexte du Web
+ collaboratif, des réseaux sociaux, de la mobilité et de l’accès aux réseaux haut débit ? Comment
+ repenser l’articulation entre services culturels et tourisme ?</p>
+ <ul>
+ <li type="circle">Table ronde animée par Jean-Pierre Dalbéra, Chargé de mission auprè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é du Laboratoire LAMIC (Laboratoire de muséologie et d'ingénierie de la culture, Qué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éminaire Muséologie 2007 - Institut de recherche et d'innovation - Centre Pompidou</title></title>
+
+
+<a name="museologie"><h3><img src="res/img/museologie.png" alt="Seminaire musé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ère de la Culture (Mission de la Recherche et de la
+Technologie/Délégation au
+Développement et aux Affaires Internationales) et le Centre de
+recherche du Château de
+Versailles ont organisé le 8 novembre 2006 un séminaire
+national sur le thème « Lieux
+culturels et nouvelles pratiques numériques ».
+Parallèlement, l’Institut de Recherche et
+d’Innovation du Centre Pompidou (IRI), créé en avril
+2006, a mis en place un programme
+de recherche et une série de séminaires sur la
+problématique générale de l’adresse au
+public dans le contexte culturel. Sur cette base, il est proposé
+à la MRT de prolonger
+l’expérience du colloque de Versailles dans le cadre d’un
+séminaire.
+
+<h4>Le Seminiaire</h4>
+Objectifs et modalités du séminaire
+Le séminaire, sur le thème « Muséologie,
+Muséographie et nouvelles formes d’adresse au
+public », prendrait la forme d'une série de huit
+séances ouvertes aux étudiants de l’Ecole
+du Louvre (4ème année, Master I) ainsi qu’aux agents du
+Ministè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’IRI sur le
+développement de nouveaux
+dispositifs critiques pouvant favoriser l’émergence d’une
+nouvelle figure de « l’amateur »,
+il est proposé de confronter expériences muséales
+et réflexions théorique et scientifique
+en analysant à chaque séance l’impact des nouveaux
+dispositifs d’adresse au public sur
+les pratiques culturelles. L’objectif théorique qui sous-tend le
+séminaire consiste à
+réinscrire les œuvres présentées dans le cadre de
+« séries » ou monographies
+permettant d’articuler de nouvelles formes de rendus tenant compte
+notamment du
+contexte esthétique, culturel et historique.<br>
+
+<h4>Esquisse du programme 2007</h4>
+
+Le principe du programme du séminaire est de partir en amont de
+l’analyse des outils
+d’ingénierie des connaissances en tant qu’ils peuvent être
+mis au service d’une stratégie
+de publication et de présentation des œuvres. Les
+expériences de gestion documentaire
+seront ensuite abordées notamment lorsqu’elles visent à
+produire des contenus
+déclinables selon les publics et selon les supports. On
+étudiera ensuite le champ de la
+représentation et des dispositifs de rendus, notamment les
+nouveaux dispositifs en cours
+de développement dans les laboratoires de recherche. Enfin, les
+dernières séances seront
+consacrées à l’enjeu de la participation et de la
+personnalisation dans les lieux culturels
+mais également sur Internet et en situation de mobilité.<br>
+<br>
+
+
+
+<div id="horaires">
+<a name="acces"></a>
+ <p><b>Accès</b> : sur inscription (dans la limite des places disponibles) aux :
+<ul>
+ <li> professionnels du secteur des musées (conservateurs, service des publics, service audiovisuel et informatique)</li>
+
+ <li> personnel du Ministère de la Culture et de la Communication et des établissements sous tutelle</li>
+
+<li> étudiants (musé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 à 20h au Centre Pompidou</p>
+<ul type="square" class="old">
+ <li><strong>21 mars : Ingénierie des connaissances </strong></li>
+</ul>
+Comment indexer, documenter et articuler les contenus en fonction d’un public donné ? Comment constituer un réservoir d’expertises mobilisable en amont pour concevoir des parcours ?
+<ul type="square" class="old">
+ <li><span dir="ltr"><strong>4 avril : Ingénierie documentaire</strong></span></li>
+</ul>
+<p>Comment numériser, indexer et valoriser en restant indépendant des formats et en adaptant les contenus aux différents publics ? La base de données peut-elle servir directement la production de l’exposition ? Chaînes de production : comment passer des œuvres numérisées à l’édition numérique ? Système d’information : comment récupérer les éléments documentaires de l’exposition pour une réédition ou une version en ligne ?</p>
+<ul type="square" class="old">
+ <li><span dir="ltr"><strong>2 mai : Les utopies scénographiques : représentation, reproduction, visualisation et rendus</strong></span></li>
+</ul>
+<p>Interaction, visualisation 3D, avatars : au service de quel propos artistique ? Nouveau statut de l’œuvre d’art à l’heure de la reproductibilité numérique. Valeur ajoutée au contenu dans le contexte numérique ?</p>
+<ul type="square" class="old">
+ <li><strong>9 mai : Participation du public / personnalisation</strong></li>
+</ul>
+<p>Mesure et analyse du public, recueil des réactions, parcours personnalisés, intervention d’artistes, jeux de rôles/jeux vidéo.</p>
+<ul type="square" class="old">
+ <li class="old"><span dir="ltr"><strong>30 mai : Les galeries virtuelles : réalité virtuelle, réalité augmentée, multimodalité</strong></span></li>
+</ul>
+<p>Comment mobiliser tous les sens ? Dans quel contexte l’immersion se justifie-t-elle ? Comment articuler bases de données documentaires et outils de visualisation avancés ? Outils de cartographie.</p>
+<ul type="square" class="old">
+ <li><strong>6 juin : Dispositifs de mobilité</strong></li>
+</ul>
+<p>Comment accompagner et prolonger la visite ? Quels usages innovants de la mobilité dans le contexte culturel ? Comment concevoir des systèmes/réseaux/appareils adaptés pour les musées ?</p>
+<ul type="square" class="old">
+ <li><strong>13 juin : Le musée en ligne</strong></li>
+</ul>
+<p>Comment préparer et compléter la visite ? Mise en réseau de bases de données. Impact des technologies Web 2.0. Espaces personnels et sites éducatifs.</p>
+<ul type="square" class="old">
+ <li><span dir="ltr"><strong>27 juin : Annotation, enrichissement des contenus par le visiteur, parcours pédagogiques : vers des communautés d’amateurs</strong></span></li>
+</ul>
+<p>Dans un contexte participatif et d’échange, quels outils pour favoriser une meilleure appropriation et un enrichissement des contenus par le public lui-même ? Quelles pédagogies développer avec ces nouveaux outils ?</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’articulation du jugement et de la pratique est au coeur de l’expérience artistique moderne, qu’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’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’elle est proposée dans les différentes versions de l’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’est pas le sujet de l’entendement et ses capacités de schématisation mais ce qu’il appelle les savoirs, c’est-à-dire les formules épistémologiques qui en s’effectuant sous la forme de techniques opérent, sans l’intervention précisément d’aucun jugement, le contrôle des modes d’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’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’expérimentation des pouvoirs conférés aux savoirs par les techniques. L’expérimentation par exemple des pouvoirs sur les corps conférés aux théories sociales occidentales par les techniques d’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’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’individuation qui excèdent les « programmes de contrôle » sans pour autant sortir du terrain de l’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’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’en est-il aujourd’hui de cet art du jugement, autrement dit de la possibilité de conduire l’expérimentation des modes de contrôle impliqués par les technologies contemporaines dans le sens de la transgression de telle manière qu’elle puissent servir de nouvelles formules épistémologiques et des modes d’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 " ";
+ }
+ */
+
+ /* l'entrée est-elle le dossier courant */
+ if($file == $cur) {
+ echo "<img src=\"http://www.iri.centrepompidou.fr/seminaires/img/folder.png\" /> ".$entry."<br />\n";
+ } else {
+
+ $display = deInterCaps($entry);
+ $display = UtoWS($display);
+
+ echo "<img src=\"http://www.iri.centrepompidou.fr/seminaires/img/folder.png\" /> <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\" /> <a href='javascript:history.back()' title='retour'>".$elem."</a><br />\n";
+ else:
+ //echo "<img src=\"dir-close.gif\" /> ".$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> ':'';
+
+
+
+ //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'/> <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)."')\"> <img src='res/img/sound.png' border='0' title='ecouter' alt='ecouter' class='image'/></a> <a href=\"http://www.iri.centrepompidou.fr/documents/audio/".$path."\"> <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'/> <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."\"> <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