# HG changeset patch # User ymh@caf4f556-3d62-0410-8435-a86758001935 # Date 1236963898 0 # Node ID 553f788214d5b7d9a1597d881aba7d042ab29ba5 # Parent 69ad5eacfee529afeca26a44b2b1b800b2f14c0a Add seminar + version 00.05 diff -r 69ad5eacfee5 -r 553f788214d5 web/index.en.html --- 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 @@ - +
diff -r 69ad5eacfee5 -r 553f788214d5 web/index.fr.html --- 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 @@ - + diff -r 69ad5eacfee5 -r 553f788214d5 web/seminaires/culture2.php --- /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"); +?> + +Résumé : +
Internet et la mutation numérique travaillent en profondeur le champ culturel.
+ +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.
+ +L'attention tend à se déplacer désormais vers les usages numériques culturels eux mêmes, sinon vers les « contenus ».
+ +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.
+ +L'objectif de ce séminaire est de dégager les lignes de force qui travaillent tant l'offre culturelle que les pratiques culturelles.
+ +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 ».
+ +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.
+ +Ce séminaire s'adresse aux agents du DEPS : il est ouvert aux responsables des différentes directions du ministère de la Culture.
+ +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).
+ +La séance inaugurale aura lieu le 17 octobre, à 15h Salle «Vivant Denon», Ministère de la Culture, 182 rue Saint Honoré.
+ +Sauf indication différente, le séminaire se tiendra ensuite les mardi de 14h30 à 17h30.
+Salle Colette. Ministère de la Culture. 182, rue Saint-Honoré Paris 7ème étage.
+Des séances auront lieu au Centre G. Pompidou.
+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.
+ + +Programme et horaires :
+Contact Y. Maignien (0140157975) et J. Beaudoin-Glandières. (0140157917)
+Lieu : Salle Colette. Ministère de la Culture : 182, rue Saint-Honoré Paris 7ème étage. (excepté séance inaugurale)
+ +Horaires : les mardi de 14h30 à 17h30
+Dates : +
Séminaire de l'Institut de recherche et d'innovation du Centre Pompidou, organisé avec la collaboration de l'Hôpital Marmottan et de L'Ecole Doctorale de Recherche en Psychanalyse (CEPP) de l'Université Paris VII.
+Sous la direction de Mathilde Girard (psychologue-psychothérapeute et philosophe).
+
+ 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.
+ 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.
+ 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...
+ 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.
+ 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.
+ 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.
+ 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é.
+ 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 :
+
+
+ Bibliographie sur le jeu et le jeu pathologique par Clotilde Carrandié de l'hôpital Marmottan
+
Accès Sur invitation: contact(at)iri.centrepompidou.fr
+Lieux: Salle du collège
+Dates et horaires : de 18h à 20h, les jeudis suivants:
+Abstract : 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.
+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).
+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.
+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 Lignes de temps sous le nom de Regards signés.
+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.
+ +Programme des Conférences publiques :
+Lieu : en Sorbonne, amphithéâtre Milne-Edwards, 17 rue de la Sorbonne, escalier B, 3ème étage.
+Horaires : 19 heures
+Accès : dans la limite des places disponibles
+Dates : + +
Direction : Denis Guénoun
+Coordination : Johann Holland : information.grt@gmail.com
+Sous la direction de Jacqueline Lichtenstein, Université Paris IV.
+Les figures de l'amateur dans Lignes de temps
++ 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. +
+Accès: Sur invitation
+Contact séminaire: Yves-Marie L'Hour à l'adresse contact(at)iri.centrepompidou.fr
+Lieux: Salle du collège
+Dates et horaires : de 17h à 19h, les mardis suivants :
+13-15 novembre 2007 + Ircam (site officiel)
++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: +
+Une dimension transversale est celle de la présentation et de l’interaction avec les unités de description des documents temporels.
+
+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.
+
+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.
+
+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 : contact@iri.centrepompidou.fr
+
+ Interfaces pour l'annotation et la manipulation d'objets temporels
+ EESI : SLIDERS, tentative de cinéma interactif collectif
+ GRAME : L'annotation de partitions musicales à des fins pédagogiques : l'exemple de Vemus
+ IRCAM : Interface de navigation musicale par le contenu
+ IRI : Lignes de temps, une plateforme collaborative pour l'annotation de films et d'objets temporels.
+ LIRIS : Annotations de documents audiovisuels Temporalisation et spatialisation
+ IRCAM : Annoter la musique : de la segmentation de fichiers audio à la publication d'articles multimédia
+
+ abstract : 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.
+ +Il s'agit de réunir pendant une saison, à intervalles réguliers de deux mois, Christian Caujolle, Pascal Convert, Georges Didi-Huberman et +Bernard Stiegler à 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.
+ +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).
+ +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.
+ +Modalités pratiques
+ +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.
+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.
+Lieu : Centre Pompidou, petite salle (niveau -1)
+Accès : Chercheurs, étudiants et professionnels sur inscription.
+Dates et horaires : de 18h à 20h, les mardis suivants :
+ +Inscriptions : contact@iri.centrepompidou.fr
+ ++ Abstract : + + 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.
+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.
+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.
+Accès : limité et sur inscription
+Dates :
+Coordination du séminaire : Denis Guénoun, Julien Abriel
+ + +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.
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.
+
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.
+ 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.
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 ».
+
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 ?
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ème 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.
+
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.
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.
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 ». »
+
+
abstract : 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.
+ +Accès : Résidents et conseillers de l'IRI.
+ +Dates : le vendredi de 10h à 12h
+Textes de Bernard Stiegler à télécharger : +
+ + +Sous la direction de Pierre-Damien Huyghe, philosophe Paris I Panthéon-Sorbonne
+ + +abstract : + + +
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.
+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é.
+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 ?
+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| :
+ +«| 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 » ?
+ +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.
+ +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.| »
+ +Lieu : +
+ +Accès : Sur inscription : contact@iri.centrepompidou.fr
+ +Horaires : les lundis : 18h-20h
+ +Dates et lieux : +
Archives 2007
+Muséologie 2007 dans Lignes de temps
Inscription obligatoire auprès d’Anne-Sophie François, Chargée de mission de l’Institut de recherche et d’innovation/Centre Pompidou :
+ anne-sophie.francois@centrepompidou.fr
+ Tel : 01 44 78 49 11
+
+ +
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. +
+
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 ?
++
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.
++
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.
++
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 ?
+Accès : sur inscription (dans la limite des places disponibles) aux : +
Inscriptions : contact@iri.centrepompidou.fr
+Dates : le mercredi de 17h à 20h au Centre Pompidou
+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 ?
+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 ?
+Mesure et analyse du public, recueil des réactions, parcours personnalisés, intervention d’artistes, jeux de rôles/jeux vidéo.
+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.
+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 ?
+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.
+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 ?
+".$navLinked." | |
+ + + + + | + |
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
+ + + ++Le séminaire Enjeux anthropologiques, culturels et philosophiques des nanotechnologies 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. +
+ + +Lieu : salle du Collège sur la Piazza Beaubourg.
+Coordination : Xavier Guchet, Sacha Loeve
+ +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
+ + +Nanosciences et philosophies de la nature
+ +
+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.
+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.
+
Coordination : Xavier Guchet, Sacha Loeve
+ +
+ Flyer du séminaire 2008
+ Flyer du séminaire 2007
+
+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). +
+ ++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. +
+ ++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. +
+ +
+Information, inscriptions, programme :
+http://www.digitallyours.fr
+
![]() |
+ ![]() |
+
+ 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. +
+ ++ Profound changes and contradictions ensue, forcing us to rethink practices in design and + research & development, as well as their socio and economic implications. +
+ ++ 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. +
+ ++ Information, registration, program: + http://www.digitallyours.fr +
+ +![]() |
+ ![]() |
+
+
Sous la direction de Catherine Perret, Paris 10 Nanterre
+ abstract : ++« 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. » +
++« 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 ». +
+ ++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 ? » +
+ + +ici, renvoi au texte entier +Accès Sur invitation
+Dates : à partir du mois de mars
+Lieux: Salle du collège
+Dates et horaires : de 14h30 à 17h30, les vendredi suivants :
++ Abstract : 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 Erice - Kiarostami : +Correspondances. +
Lieu : Atelier de L'IRI, 111 rue Saint Martin
+ +Accès : résidents de l'Institut et professionnels uniquement sur invitation.
+ +Horaires : Les mardis de 10 heures à 13 heures
+ +Dates :
+![]() | ";
+ echo "".$iconeInfo." ![]() ![]() | ";
+ echo '
";
+ echo "![]() | ";
+ echo "".$iconeInfo." ![]() | ";
+ echo '
/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));
+ }
+};
diff -r 69ad5eacfee5 -r 553f788214d5 web/seminaires/res/js/dragdrop.js
--- /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
diff -r 69ad5eacfee5 -r 553f788214d5 web/seminaires/res/js/effects.js
--- /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 '#' + html.stripScripts() + '
';
+ depth = 2;
+ break;
+ case 'TR':
+ div.innerHTML = '
';
+ depth = 3;
+ break;
+ case 'TD':
+ div.innerHTML = '' + html.stripScripts() + '
';
+ 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 = '' + html.stripScripts() + ' ' + this.content + '
';
+ 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
diff -r 69ad5eacfee5 -r 553f788214d5 web/seminaires/res/js/scriptaculous.js
--- /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('');
+ },
+ 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
diff -r 69ad5eacfee5 -r 553f788214d5 web/seminaires/res/js/slider.js
--- /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
Status | Test | Message |
---|