Un squelette pas fini, qui marche pas toujours avec IE, dont le développement est quasi à l'arrêt... LISEZ-MOI pour plus d'infos.

master
baptiste.goupil@gmail.com 18 years ago
commit c7d507b209

79
.gitattributes vendored

@ -0,0 +1,79 @@
* text=auto !eol
/A-FAIRE -text
/LISEZ-MOI -text
/_REGLES_DE_COMMIT -text
formulaires/formulaire_signature.html -text
squelettes/agenda.html -text
squelettes/article.html -text
squelettes/auteur.html -text
squelettes/barre.js -text
squelettes/breve.html -text
squelettes/breves.html -text
squelettes/brevesmot.html -text
squelettes/brevesrech.html -text
squelettes/discussion.html -text
squelettes/effects.js -text
squelettes/formulaire_ecrire_auteur.html -text
squelettes/formulaire_forum.html -text
squelettes/formulaire_forum_previsu.html -text
squelettes/formulaire_inscription.html -text
squelettes/formulaire_recherche.html -text
squelettes/forum.html -text
squelettes/haut.html -text
squelettes/lecteur.swf -text
squelettes/lecteur_multi.swf -text
squelettes/lightbox.html -text
squelettes/liste-articles.html -text
squelettes/local_fr.php -text
squelettes/logo.html -text
squelettes/menu.html -text
squelettes/mes_fonctions.php -text
squelettes/message.html -text
squelettes/mot.html -text
squelettes/pied.html -text
squelettes/plan.html -text
squelettes/portfolia.html -text
squelettes/portfolio.html -text
squelettes/prototype.js -text
squelettes/recherche.html -text
squelettes/rubrique.html -text
squelettes/rubriques.html -text
squelettes/scriptaculous.js -text
squelettes/scripts/javascript.js -text
squelettes/sommaire.html -text
squelettes/style/barre/bt_br.png -text
squelettes/style/barre/bt_code.png -text
squelettes/style/barre/bt_del.png -text
squelettes/style/barre/bt_em.png -text
squelettes/style/barre/bt_ins.png -text
squelettes/style/barre/bt_link.png -text
squelettes/style/barre/bt_ol.png -text
squelettes/style/barre/bt_pre.png -text
squelettes/style/barre/bt_quote.png -text
squelettes/style/barre/bt_strong.png -text
squelettes/style/barre/bt_ul.png -text
squelettes/style/cite.gif -text
squelettes/style/ecran.css -text
squelettes/style/galerie.css -text
squelettes/style/galerie/apres.png -text
squelettes/style/galerie/avant.png -text
squelettes/style/galerie/blank.gif -text
squelettes/style/galerie/close.gif -text
squelettes/style/galerie/closelabel.gif -text
squelettes/style/galerie/fermer.gif -text
squelettes/style/galerie/loading.gif -text
squelettes/style/galerie/next.gif -text
squelettes/style/galerie/nextlabel.gif -text
squelettes/style/galerie/prev.gif -text
squelettes/style/galerie/prevlabel.gif -text
squelettes/style/hover.htc -text
squelettes/style/menu.gif -text
squelettes/style/menur.gif -text
squelettes/style/moins.gif -text
squelettes/style/plus.gif -text
squelettes/style/puce.gif -text
squelettes/style/puceh.gif -text
squelettes/style/puces.gif -text
squelettes/style/script.js -text
squelettes/video.swf -text
squelettes/vue-article.html -text

@ -0,0 +1,15 @@
#############
## À faire ##
#############
Évidemment, la liste est longue, mais on retient principalement ça :
* rendre le menu déroulant compatible avec tous les navigateurs (éventuellement abandonner le seul CSS et ajouter un peu de JavaScript). Actuellement ça fonctionne pas partout à cause de la largeur relative du menu. toute aide est bienvenue et serait même accueillie avec allégresse et volupté
* concevoir l'interface qui va derrière. c'est à dire qu'au départ le squelette devait aller de pair avec un plugin permettant de le configurer, en utilisant les extras. il faut donc établir la liste des choses devant être paramétrables... et faire le plugin, bien évidemment. enfin ça, on verra en dernier hein
* sortir le jeu de couleurs de la css. la configuration/personnalisation du squelette passe par une possibilité de choisir autre chose que le bleu, sans pour autant devoir tout refaire. pouvoir paramétrer toutes les couleurs avec une feuille de style est indispensable pour permettre ça
* améliorer l'apparence du squelette
* rendre la lightbox modifiée compatible avec IE (ça ne semble pas être le cas, non-confirmé)
* faire un joli plan de site (ben non y en a pas encore)
* faire une page listant les derniers messages
* personnaliser la page de connexion à l'espace privé
Si vous avez d'autres idées, écrivez-les à partir de cette ligne, je suis preneur !

@ -0,0 +1,24 @@
###################################################
## Squelette aospip version 0.0001 alpha preview ##
###################################################
Ce squelette n'est pas terminé et son développement est un à l'arrêt, ne fonctionne pas toujours bien sous Internet Explorer, est donc inutilisable en production, nécessite le plugin de Cédric recherche_etendue et n'est pas très beau.
Mais il utilise les microformats, est en xHTML + CSS, comporte peu de PHP et est surtout composé de bidouilles SPIP, gère plutôt bien les différents types de fichiers joints, et fonctionne bien avec Firefox.
À terme, si terme il y a, il est destiné à servir de squelette complet mais pas trop pour des sites simples dans leur architecture. Un genre de beespip/sarka-spip mais un peu plus agréable visuellement (quand même), et pondant du code pas trop laid.
par défaut, un des objectifs est d'avoir très peu d'images pour le rendre léger vis-à-vis du visiteur.
Pour l'utiliser (devrais-je dire le tester ?), vous devez placer le dossier squelettes/ à la racine de votre site, et remplacer le fichier formulaires/formulaire_signature.html existant par celui fourni.
La license n'est pas définie (à la version 0.0001 alpha preview, pensez-vous), mais ce sera à priori soit la Creative Commons soit la GPL. de toute façon on s'en fout, pour le moment il est pas utilisable.
d'ailleurs, il utilise la barre de syntaxe WiKi de dotclear parce qu'elle est plus fonctionnelle (donc copyright olivier meunier, toussa), la lightbox 2, et le lecteur de neolao pour les fichiers multimédias du portfolio. si j'oublie un des trucs utilisé, je m'en excuse.
(ce squelette nécessite évidemment SPIP 1.9 et ne fonctionnera absolument pas avec une version antérieure)
pour me contacter, baptiste.goupil<ché>gmail<pouint>com. je prend remarques/critiques/suggestions (pas d'insultes, après ça finit en coup d'boule et en carton rouge...)
Ah, et pas la peine de chercher, il n'y a pas de site de test pour l'instant (je sais c'est chiant).
Mais si vous êtes curieux, ça ressemble à ça : http://www.image-dream.com/membre/up/BaptisteAozeo/captureaospip.png
La maquette est étirable, et vous formalisez pas sur le contenu factice, faut bien mettre quelque chose !

@ -0,0 +1,2 @@
Ne vous gênez pas, commitez si vous voulez.
mais si jamais - Ô grand jamais - quelqu'un voudrait changer quelque chose d'un peu important, parlez m'en d'abord à baptiste.goupil<ché>gmail<pouint>com...

@ -0,0 +1,34 @@
<form method='post' action="[(#ENV{self})][#sp(#ENV{id_article})]" class="petition">
<input type="hidden" name="url_page" value="#URL_SITE_SPIP/#SELF" />
<p class="infopetition">[(#ENV*{texte}|propre)]</p>
<fieldset>
<legend><:form_forum_identifiants:></legend>
<label for="nom"><:form_pet_votre_nom:> :
<input type="text" class="forml" name="nom_email" value="" size="20" id="nom" />
</label>
<label for="email"><:form_pet_votre_email:> :
<input type="text" class="forml" name="adresse_email" value="" size="20" id="email" />
</label>
</fieldset>
<fieldset>
<legend>[(#ENV{site_obli}|?{<:forum_lien_hyper:>,<:forum_lien:>})]</legend>
<label for="site"><:form_pet_nom_site2:> :
<input type="text" class="forml" name="signature_nom_site" value="" size="20" id="site" />
</label>
<label for="site"><:form_pet_adresse_site:> :
<input type="text" class="forml" name="signature_url_site" value="http://" size="20" id="urlsite" />
</label>
</fieldset>
[(#ENV{message})
<fieldset>
<legend><:form_pet_message_commentaire:></legend>
<label for="message"><span><:info_texte_message:></span>
<textarea name="message" rows="3" class="forml" cols="20" id="message"></textarea>
</label>
</fieldset>]
<input type="submit" class="soumission" value="<:bouton_valider:>" />
</form>

@ -0,0 +1,47 @@
#CACHE{7200}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
<title><:icone_agenda:> - #NOM_SITE_SPIP</title>
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" />
<link rel="stylesheet" type="text/css" href="#CHEMIN{style/ecran.css}" />
<script type="text/javascript" src="#CHEMIN{prototype.js}"></script>
<script type="text/javascript" src="#CHEMIN{scriptaculous.js}"></script>
<script type="text/javascript" src="#URL_PAGE{lightbox}"></script>
</head>
<body>
<div id="corps">
<INCLURE{fond=haut}{id_rubrique}>
<div id="colonneprincipale">
<div class="padding">
[(#ENV{type, mois}|agenda_connu)<INCLURE {fond=agenda_#ENV{type,mois}} {type} {delais=900} {annee} {mois} {jour} {echelle} {partie_cal} {theme}>]
</div>
</div>
<div id="colonneactu" class="hfeed">
<div class="padding paddinge">
<INCLURE{fond=breves}>
</div>
</div>
<div id="colonnemenu">
<div class="paddinge">
<INCLURE{fond=menu}>
</div>
</div>
<INCLURE{fond=pied}>
</div>
</body>
</html>

@ -0,0 +1,70 @@
<BOUCLE_article_principal(ARTICLES) {id_article}>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
<title>[(#TITRE|textebrut|supprimer_numero)] - <BOUCLE_titrerub(RUBRIQUES){id_rubrique=#ID_RUBRIQUE}>[(#TITRE|supprimer_numero)] -</BOUCLE_titrerub> #NOM_SITE_SPIP</title>
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" />
<link rel="stylesheet" type="text/css" href="#CHEMIN{style/ecran.css}" />
<link rel="stylesheet" type="text/css" href="#CHEMIN{style/galerie.css}" />
<script type="text/javascript" src="#CHEMIN{scripts/javascript.js}"></script>
<script type="text/javascript" src="#CHEMIN{prototype.js}"></script>
<script type="text/javascript" src="#CHEMIN{scriptaculous.js}"></script>
<script type="text/javascript" src="#URL_PAGE{lightbox}"></script>
</head>
<body>
<div id="corps">
<INCLURE{fond=haut}{id_article}>
<div id="colonneprincipale">
<div class="padding">
<div class="bienvenue article">
<INCLURE{fond=logo}{id_article}>
<h6>le [(#DATE|nom_jour)] [(#DATE|affdate)] <B_auteurs_un><:par_auteur:> <BOUCLE_auteurs_un(AUTEURS) {id_article} {", "}><a href="#URL_AUTEUR" title="<:fiche_de:> #NOM">#NOM</a></BOUCLE_auteurs_un></h6>
[<h3>(#SURTITRE)</h3>]
[<h2>(#TITRE|supprimer_numero)</h2>]
[<h4>(#SOUSTITRE)</h4>]
#DEBUT_SURLIGNE
[<div class="chapo" [style="margin-right:(#LOGO_ARTICLE||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'width'}||plus{15})px"]>(#CHAPO)</div>]
[<div class="texte">(#TEXTE|reduire_image{340,0})</div>]
#FIN_SURLIGNE
<INCLURE{fond=portfolio}{id_article}>
[<div class="lien"><a href="(#URL_SITE)" [title="(#NOM_SITE)"]>[(#NOM_SITE|sinon{#URL_SITE})]</a></div>]
[<div class="notes"><h5><:notes:></h5>(#NOTES)</div>]
[<div class=postscriptum><h5><:postscriptum:></h5>(#PS)</div>]
[(#FORMULAIRE_SIGNATURE)]
<INCLURE{fond=discussion}{id_article}>
<span class="espace">&nbsp;</span>
</div>
<INCLURE{fond=liste-articles}{id_rubrique}{id_article}>
</div>
</div>
<div id="colonneactu" class="hfeed">
<div class="padding paddinge">
<INCLURE{fond=breves}>
</div>
</div>
<div id="colonnemenu">
<div class="paddinge">
<INCLURE{fond=menu}{id_article}>
</div>
</div>
<INCLURE{fond=pied}>
</div>
</body>
</html>
</BOUCLE_article_principal>

@ -0,0 +1,81 @@
#CACHE{90000}
<BOUCLE_auteur(AUTEURS) {id_auteur}>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
<title>[(#NOM|textebrut)] - #NOM_SITE_SPIP</title>
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" />
<link rel="stylesheet" type="text/css" href="#CHEMIN{style/ecran.css}" />
</head>
<body>
<div id="corps">
<INCLURE{fond=haut}{id_auteur}>
<div id="colonneprincipale">
<div class="padding">
<div class="bienvenue">
[<img src="(#LOGO_AUTEUR_NORMAL||extraire_attribut{'src'})" [height="(#LOGO_AUTEUR_NORMAL||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'height'})"] [width="(#LOGO_AUTEUR_NORMAL||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'width'})"] alt="<:logo_auteur:> #NOM" title="#NOM" class="logo" [onmouseover="this.src='(#LOGO_AUTEUR_SURVOL||extraire_attribut{'src'})';" [onmouseout="this.src='(#LOGO_AUTEUR_NORMAL||extraire_attribut{'src'})';"]] />]
[<h6><a href="(#URL_SITE)" [title="(#NOM_SITE)"]>[(#NOM_SITE|sinon{'#URL_SITE'})]</a></h6>]
[<h2>(#NOM|supprimer_numero)</h2>]
[<div class="texte">(#BIO|reduire_image{340,0})</div>]
[<div class="notes"><h5><:notes:></h5>(#NOTES)</div>]
<span class="espace">&nbsp;</span>
</div>
#FORMULAIRE_ECRIRE_AUTEUR
<B_articles>
<h4 class="dca">[(#TOTAL_BOUCLE|>{1}|?{<:articles_auteur:>,<:article_auteur:>})] (#TOTAL_BOUCLE)</h4>
<div class="listearticle hfeed">
<BOUCLE_articles(ARTICLES){id_auteur}{par titre}{!par date}>
<div class="hentry" id="article-#ID_ARTICLE" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
[<h3 class="entry-title" onclick="document.location='#URL_ARTICLE';"><a href="#URL_ARTICLE" rel="bookmark"[ title="(#TITRE|supprimer_numero)"]>(#TITRE|supprimer_numero)</a></h3>]
<div class="infos"><span><B_articleauteurs><:par_auteur:> <BOUCLE_articleauteurs(AUTEURS) {id_article} {", "}>#NOM</BOUCLE_articleauteurs></span> [<abbr class="published" title="[(#DATE|date_iso)]">
<:le:> [(#DATE|nom_jour)] (#DATE|affdate)
</abbr>]</div>
<div class="sommairearticle entry-summary">
<INCLURE{fond=logo}{id_article}>
[(#DESCRIPTIF|sinon{[(#CHAPO|sinon{[(#TEXTE|couper{350})]})]}|reduire_image{150,0})]</div>
</div>
</BOUCLE_articles>
</div>
</B_articles>
</div>
</div>
<div id="colonneactu" class="hfeed">
<div class="padding paddinge">
<B_auteurs>
<h3 class="info"><:info_auteurs:></h3>
<ul class="resultat">
<BOUCLE_auteurs(AUTEURS)>
<li><a href="#URL_AUTEUR" title="[(#NOM|supprimer_numero)]" #EXPOSE{class="actif", ''}>[(#NOM|supprimer_numero)]</a></li>
</BOUCLE_auteurs>
</ul>
</B_auteurs>
<INCLURE{fond=breves}>
</div>
</div>
<div id="colonnemenu">
<div class="paddinge">
<INCLURE{fond=menu}{id_auteur}>
</div>
</div>
<INCLURE{fond=pied}>
</div>
</body>
</html>
</BOUCLE_auteur>

@ -0,0 +1,211 @@
/* ***** BEGIN LICENSE BLOCK *****
* This file is part of DotClear.
* Copyright (c) 2004 Olivier Meunier and contributors. All rights
* reserved.
*
* DotClear is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* DotClear is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with DotClear; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ***** END LICENSE BLOCK ***** */
function dcWikiBar(textarea,img_path)
{
this.addButton = function() {}
this.addSpace = function() {}
this.draw = function() {}
this.btStrong = function() {}
this.btEm = function() {}
this.btIns = function() {}
this.btDel = function() {}
this.btQ = function() {}
this.btCode = function() {}
this.btBr = function() {}
this.btBquote = function() {}
this.btPre = function() {}
this.btList = function() {}
this.btLink = function() {}
if (!document.createElement) {
return;
}
if ((typeof(document["selection"]) == "undefined")
&& (typeof(textarea["setSelectionRange"]) == "undefined")) {
return;
}
var toolbar = document.createElement("div");
toolbar.id = "dcwikibar";
function addButton(src, title, fn) {
var i = document.createElement('img');
i.src = src;
i.title = title;
i.onclick = function() { try { fn() } catch (e) { } return false };
i.tabIndex = 400;
toolbar.appendChild(i);
addSpace(2);
}
function addSpace(w)
{
s = document.createElement('span');
s.style.padding='0 '+w+'px 0 0';
s.appendChild(document.createTextNode(' '));
toolbar.appendChild(s);
}
function encloseSelection(prefix, suffix, fn) {
textarea.focus();
var start, end, sel, scrollPos, subst;
if (typeof(document["selection"]) != "undefined") {
sel = document.selection.createRange().text;
} else if (typeof(textarea["setSelectionRange"]) != "undefined") {
start = textarea.selectionStart;
end = textarea.selectionEnd;
scrollPos = textarea.scrollTop;
sel = textarea.value.substring(start, end);
}
if (sel.match(/ $/)) { // exclude ending space char, if any
sel = sel.substring(0, sel.length - 1);
suffix = suffix + " ";
}
if (typeof(fn) == 'function') {
var res = (sel) ? fn(sel) : fn('');
} else {
var res = (sel) ? sel : '';
}
subst = prefix + res + suffix;
if (typeof(document["selection"]) != "undefined") {
var range = document.selection.createRange().text = subst;
textarea.caretPos -= suffix.length;
} else if (typeof(textarea["setSelectionRange"]) != "undefined") {
textarea.value = textarea.value.substring(0, start) + subst +
textarea.value.substring(end);
if (sel) {
textarea.setSelectionRange(start + subst.length, start + subst.length);
} else {
textarea.setSelectionRange(start + prefix.length, start + prefix.length);
}
textarea.scrollTop = scrollPos;
}
}
function draw(msg) {
p = document.createElement('em');
p.style.display='block';
p.style.margin='-0.5em 0 0.5em 0';
p.appendChild(document.createTextNode(msg));
textarea.parentNode.insertBefore(p, textarea);
textarea.parentNode.insertBefore(toolbar, textarea);
}
// ---
function singleTag(wtag,htag,wetag) {
var stag = wtag;
var etag = (wetag) ? wetag : wtag;
encloseSelection(stag,etag);
}
function btStrong(label) {
addButton(img_path+'bt_strong.png',label,
function() { singleTag('{{','strong','}}'); });
}
function btEm(label) {
addButton(img_path+'bt_em.png',label,
function() { singleTag('{','em','}'); });
}
function btIns(label) {
addButton(img_path+'bt_ins.png',label,
function() { singleTag('++','ins'); });
}
function btDel(label) {
addButton(img_path+'bt_del.png',label,
function() { singleTag('__','del'); });
}
function btQ(label) {
addButton(img_path+'bt_quote.png',label,
function() { singleTag("''",'blockquote','}}'); });
}
function btCode(label) {
addButton(img_path+'bt_code.png',label,
function() { singleTag('@@','code'); });
}
function btBr(label) {
addButton(img_path+'bt_br.png',label,
function() {
var tag = "\n_ ";
encloseSelection('',tag);
});
}
function btPre(label) {
addButton(img_path+'bt_pre.png',label,
function() { singleTag('<< ','pre',' >>'); });
}
function btList(label,type) {
var img = (type == 'ul') ? 'bt_ul.png' : 'bt_ol.png';
var wtag = (type == 'ul') ? '-*' : '-#';
addButton(img_path+img,label,
function() {
encloseSelection("",'',
function(str) {
str = str.replace(/\r/g,'');
return wtag+' '+str.replace(/\n/g,"\n"+wtag+' ');
});
});
}
function btLink(label,msg_url,msg_lang,default_lang) {
addButton(img_path+'bt_link.png',label,
function() {
var href = window.prompt(msg_url,'');
if (!href) { return; }
stag = '[';
var etag = '->'+href;
etag = etag+']';
encloseSelection(stag,etag);
});
}
// methods
this.addButton = addButton;
this.addSpace = addSpace;
this.draw = draw;
this.btStrong = btStrong;
this.btEm = btEm;
this.btIns = btIns;
this.btDel = btDel;
this.btQ = btQ;
this.btCode = btCode;
this.btBr = btBr;
this.btPre = btPre;
this.btList = btList;
this.btLink = btLink;
}

@ -0,0 +1,59 @@
#CACHE{43200}
<BOUCLE_breve_principal(BREVES) {id_breve}>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
<title>[(#TITRE|textebrut|supprimer_numero)] - <BOUCLE_titrerub(RUBRIQUES){id_rubrique=#ID_RUBRIQUE}>[(#TITRE|supprimer_numero)] -</BOUCLE_titrerub> #NOM_SITE_SPIP</title>
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="#URL_PAGE{backend,id_rubrique=#ID_RUBRIQUE}" />
<link rel="stylesheet" type="text/css" href="#CHEMIN{style/ecran.css}" />
</script>
</head>
<body>
<div id="corps">
<INCLURE{fond=haut}{id_breve}>
<div id="colonneprincipale">
<div class="padding">
<div class="bienvenue article breve">
[<img src="(#LOGO_BREVE_NORMAL||extraire_attribut{'src'})" [height="(#LOGO_BREVE_NORMAL||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'height'})"] [width="(#LOGO_BREVE_NORMAL||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'width'})"] alt="<:logo_article:> #TITRE" title="#TITRE" class="logo" [onmouseover="this.src='(#LOGO_BREVE_SURVOL||extraire_attribut{'src'})';" [onmouseout="this.src='(#LOGO_BREVE_NORMAL||extraire_attribut{'src'})';"]] />]
[<h6>le (#DATE|nom_jour) [(#DATE|affdate)]</h6>]
#DEBUT_SURLIGNE
[<h2>(#TITRE|supprimer_numero)</h2>]
[<div class="chapo" [style="margin-right:(#LOGO_ARTICLE||reduire_image{120,0}||reduire_image{0,100}||extraire_attribut{'width'}||plus{15})px"]>(#CHAPO)</div>]
[<div class="texte">(#TEXTE|reduire_image{250,0})</div>]
[<div class="notes"><h5><:notes:></h5>(#NOTES)</div>]
#FIN_SURLIGNE
<INCLURE{fond=discussion}{id_breve}>
</div>
<INCLURE{fond=liste-articles}{id_rubrique}>
</div>
</div>
<div id="colonneactu" class="hfeed">
<div class="padding paddinge">
<INCLURE{fond=breves}{id_breve}>
</div>
</div>
<div id="colonnemenu">
<div class="paddinge">
<INCLURE{fond=menu}{id_breve}>
</div>
</div>
<INCLURE{fond=pied}>
</div>
</body>
</html>
</BOUCLE_breve_principal>

@ -0,0 +1,12 @@
<B_breves>
[(#ENV{resultat}|=={non}|?{<h3 class="info">, ''})<:aucune_breve_trouvee:></h3>]
<BOUCLE_breves(BREVES){!par date}{par titre}{id_breve!=#ID_BREVE?}{id_rubrique?}>
[<h3 class="jour">[(#DATE|nom_jour)] (#DATE|affdate_jourcourt|unique)</h3>]
<div class="hentry" id="actu-#ID_BREVE" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
[<h2 class="entry-title"><a href="#URL_BREVE" rel="bookmark">(#TITRE)</a></h2>]
<abbr class="published" title="[(#DATE|date_iso)]" onclick="document.location='#URL_BREVE';">
<:a:> [(#DATE|heures)]:[(#DATE|minutes)]
</abbr>
[<div class="entry-content">(#TEXTE|reduire_image{140,0})</div>]
</div>
</BOUCLE_breves>

@ -0,0 +1,13 @@
<BOUCLE_breves(BREVES){id_mot}{par date}{inverse}>
[<h3 class="jour">[(#DATE|nom_jour)] (#DATE|affdate_jourcourt|unique)</h3>]
<div class="hentry" id="actu-#ID_BREVE" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
[<h2 class="entry-title"><a href="#URL_BREVE" rel="bookmark">(#TITRE)</a></h2>]
<abbr class="published" title="[(#DATE|date_iso)]" onclick="document.location='#URL_BREVE';">
<:a:> [(#DATE|heures)]:[(#DATE|minutes)]
</abbr>
[<div class="entry-content">(#TEXTE|reduire_image{150,0})</div>]
</div>
</BOUCLE_breves>
<h4 class="dca"><:aucune_breve_attachee:></h4>
<INCLURE{fond=breves}>
<//B_breves>

@ -0,0 +1,20 @@
<B_marecherche>
<h3 class="info">#TOTAL_BOUCLE [(#TOTAL_BOUCLE|>{1}|?{<:breves_trouvees:>,<:breve_trouvee:>})]</h3>
<BOUCLE_marecherche(INDEX){recherche}{!par points}{id_table==^(breves)$}>
<B_breves>
<BOUCLE_breves(BREVES){id_breve}>
[<h3 class="jour">[(#DATE|nom_jour)] (#DATE|affdate_jourcourt|unique)</h3>]
<div class="hentry" id="actu-#ID_BREVE" xml:lang="#LANG" lang="#LANG" dir="#LANG_DIR">
[<h2 class="entry-title"><a href="[(#URL_BREVE|parametre_url{'var_recherche',[(#RECHERCHE)]})]" rel="bookmark">(#TITRE)</a></h2>]
<abbr class="published" title="[(#DATE|date_iso)]" onclick="document.location='#URL_BREVE';">
<:a:> [(#DATE|heures)]:[(#DATE|minutes)]
</abbr>
#DEBUT_SURLIGNE
[<div class="entry-content">(#TEXTE|reduire_image{150,0})</div>]
#FIN_SURLIGNE
</div>
</BOUCLE_breves>
</BOUCLE_marecherche>
<h3 class="info"><:aucune_breve_trouvee:></h3>
<INCLURE{fond=breves}>
<//B_marecherche>

@ -0,0 +1,30 @@
<B_fils>
<div class="discussion">
<h5><:discussion:></h5>
<BOUCLE_breved(BREVES){id_breve}>
[<a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_breve:>" class="repondre dr"><:repondre_breve:></a>]
</BOUCLE_breved>
<BOUCLE_articled(ARTICLES){id_article}>
[<a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_article:>" class="repondre dr"><:repondre_article:></a>]
</BOUCLE_articled>
<BOUCLE_rubriqued(RUBRIQUES){id_rubrique}>
[<a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_rubrique:>" class="repondre dr"><:repondre_rubrique:></a>]
</BOUCLE_rubriqued>
<//B_breve>
</div>
<BOUCLE_fils(FORUMS){id_article?}{id_breve?}{id_rubrique?}{par date}{inverse}{0,10}>
<div class="discut couleurmessage[(#COMPTEUR_BOUCLE|alterner{'1','0'})]">
<INCLURE{fond=message}{id_forum}>
</div>
</BOUCLE_fils>
<BOUCLE_breve(BREVES){id_breve}>
[<p class="repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_breve:>" class="repondre"><:repondre_breve:></a></p>]
</BOUCLE_breve>
<BOUCLE_article(ARTICLES){id_article}>
[<p class="repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_article:>" class="repondre"><:repondre_article:></a></p>]
</BOUCLE_article>
<BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
[<p class="repondre"><a href="(#PARAMETRES_FORUM|url_reponse_forum)" title="<:repondre_rubrique:>" class="repondre"><:repondre_rubrique:></a></p>]
</BOUCLE_rubrique>
<//B_breve>
<//B_fils>

@ -0,0 +1,676 @@
// 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.
/* ------------- element ext -------------- */
// 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.collectTextNodes(node) : ''));
}).flatten().join('');
}
Element.setStyle = function(element, style) {
element = $(element);
for(k in style) element.style[k.camelize()] = style[k];
}
Element.setContentZoom = function(element, percent) {
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 : null });
if(/MSIE/.test(navigator.userAgent))
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))
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) {
return $A($(element).getElementsByTagName('*')).select(
function(c) { return Element.hasClassName(c, className) });
}
Array.prototype.call = function() {
var args = arguments;
this.each(function(f){ f.apply(this, args) });
}
/*--------------------------------------------------------------------------*/
var Effect = {
tagifyText: function(element) {
var tagifyStyle = 'position:relative';
if(/MSIE/.test(navigator.userAgent)) 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') }
}, arguments[2] || {});
Effect[Element.visible(element) ?
Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
}
};
var Effect2 = Effect; // deprecated
/* ------------- transitions ------------- */
Effect.Transitions = {}
Effect.Transitions.linear = function(pos) {
return pos;
}
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;
}
/* ------------- 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;
this.effects.push(effect);
if(!this.interval)
this.interval = setInterval(this.loop.bind(this), 40);
},
remove: function(effect) {
this.effects = this.effects.reject(function(e) { return e==effect });
if(this.effects.length == 0) {
clearInterval(this.interval);
this.interval = null;
}
},
loop: function() {
var timePos = new Date().getTime();
this.effects.invoke('loop', timePos);
}
});
Effect.Queues = {
instances: $H(),
get: function(queueName) {
if(typeof queueName != 'string') return queueName;
if(!this.instances[queueName])
this.instances[queueName] = new Effect.ScopedQueue();
return this.instances[queueName];
}
}
Effect.Queue = Effect.Queues.get('global');
Effect.DefaultOptions = {
transition: Effect.Transitions.sinoidal,
duration: 1.0, // seconds
fps: 25.0, // max. 25fps due to Effect.Queue implementation
sync: false, // true for combining
from: 0.0,
to: 1.0,
delay: 0.0,
queue: 'parallel'
}
Effect.Base = function() {};
Effect.Base.prototype = {
position: null,
start: function(options) {
this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
this.currentFrame = 0;
this.state = 'idle';
this.startOn = this.options.delay*1000;
this.finishOn = this.startOn + (this.options.duration*1000);
this.event('beforeStart');
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue == 'string' ?
'global' : this.options.queue.scope).add(this);
},
loop: function(timePos) {
if(timePos >= this.startOn) {
if(timePos >= this.finishOn) {
this.render(1.0);
this.cancel();
this.event('beforeFinish');
if(this.finish) this.finish();
this.event('afterFinish');
return;
}
var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
var frame = Math.round(pos * this.options.fps * this.options.duration);
if(frame > this.currentFrame) {
this.render(pos);
this.currentFrame = frame;
}
}
},
render: function(pos) {
if(this.state == 'idle') {
this.state = 'running';
this.event('beforeSetup');
if(this.setup) this.setup();
this.event('afterSetup');
}
if(this.state == 'running') {
if(this.options.transition) pos = this.options.transition(pos);
pos *= (this.options.to-this.options.from);
pos += this.options.from;
this.position = pos;
this.event('beforeUpdate');
if(this.update) this.update(pos);
this.event('afterUpdate');
}
},
cancel: function() {
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue == 'string' ?
'global' : this.options.queue.scope).remove(this);
this.state = 'finished';
},
event: function(eventName) {
if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
if(this.options[eventName]) this.options[eventName](this);
},
inspect: function() {
return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
}
}
Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
initialize: function(effects) {
this.effects = effects || [];
this.start(arguments[1]);
},
update: function(position) {
this.effects.invoke('render', position);
},
finish: function(position) {
this.effects.each( function(effect) {
effect.render(1.0);
effect.cancel();
effect.event('beforeFinish');
if(effect.finish) effect.finish(position);
effect.event('afterFinish');
});
}
});
Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
// make this work on IE on elements without 'layout'
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
Element.setStyle(this.element, {zoom: 1});
var options = Object.extend({
from: Element.getOpacity(this.element) || 0.0,
to: 1.0
}, arguments[1] || {});
this.start(options);
},
update: function(position) {
Element.setOpacity(this.element, position);
}
});
Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
var options = Object.extend({
x: 0,
y: 0,
mode: 'relative'
}, arguments[1] || {});
this.start(options);
},
setup: function() {
Element.makePositioned(this.element);
this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0');
if(this.options.mode == 'absolute') {
// absolute movement, so we need to calc deltaX and deltaY
this.options.x = this.options.x - this.originalLeft;
this.options.y = this.options.y - this.originalTop;
}
},
update: function(position) {
Element.setStyle(this.element, {
left: this.options.x * position + this.originalLeft + 'px',
top: this.options.y * position + this.originalTop + 'px'
});
}
});
// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
return new Effect.Move(element,
Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};
Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
initialize: function(element, percent) {
this.element = $(element)
var options = Object.extend({
scaleX: true,
scaleY: true,
scaleContent: true,
scaleFromCenter: false,
scaleMode: 'box', // 'box' or 'contents' or {} with provided values
scaleFrom: 100.0,
scaleTo: percent
}, arguments[2] || {});
this.start(options);
},
setup: function() {
this.restoreAfterFinish = this.options.restoreAfterFinish || false;
this.elementPositioning = Element.getStyle(this.element,'position');
this.originalStyle = {};
['top','left','width','height','fontSize'].each( function(k) {
this.originalStyle[k] = this.element.style[k];
}.bind(this));
this.originalTop = this.element.offsetTop;
this.originalLeft = this.element.offsetLeft;
var fontSize = Element.getStyle(this.element,'font-size') || '100%';
['em','px','%'].each( function(fontSizeType) {
if(fontSize.indexOf(fontSizeType)>0) {
this.fontSize = parseFloat(fontSize);
this.fontSizeType = fontSizeType;
}
}.bind(this));
this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
this.dims = null;
if(this.options.scaleMode=='box')
this.dims = [this.element.offsetHeight, this.element.offsetWidth];
if(/^content/.test(this.options.scaleMode))
this.dims = [this.element.scrollHeight, this.element.scrollWidth];
if(!this.dims)
this.dims = [this.options.scaleMode.originalHeight,
this.options.scaleMode.originalWidth];
},
update: function(position) {
var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
if(this.options.scaleContent && this.fontSize)
Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
},
finish: function(position) {
if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle);
},
setDimensions: function(height, width) {
var d = {};
if(this.options.scaleX) d.width = width + 'px';
if(this.options.scaleY) d.height = height + 'px';
if(this.options.scaleFromCenter) {
var topd = (height - this.dims[0])/2;
var leftd = (width - this.dims[1])/2;
if(this.elementPositioning == 'absolute') {
if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
} else {
if(this.options.scaleY) d.top = -topd + 'px';
if(this.options.scaleX) d.left = -leftd + 'px';
}
}
Element.setStyle(this.element, d);
}
});
Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
this.start(arguments[1] || {});
},
setup: function() {
Position.prepare();
var offsets = Position.cumulativeOffset(this.element);
if(this.options.offset) offsets[1] += this.options.offset;
var max = window.innerHeight ?
window.height - window.innerHeight :
document.body.scrollHeight -
(document.documentElement.clientHeight ?
document.documentElement.clientHeight : document.body.clientHeight);
this.scrollStart = Position.deltaY;
this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
},
update: function(position) {
Position.prepare();
window.scrollTo(Position.deltaX,
this.scrollStart + (position*this.delta));
}
});
/* ------------- combination effects ------------- */
Effect.Fade = function(element) {
var oldOpacity = Element.getInlineOpacity(element);
var options = Object.extend({
from: Element.getOpacity(element) || 1.0,
to: 0.0,
afterFinishInternal: function(effect) { with(Element) {
if(effect.options.to!=0) return;
hide(effect.element);
setStyle(effect.element, {opacity: oldOpacity}); }}
}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.Appear = function(element) {
var options = Object.extend({
from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
to: 1.0,
beforeSetup: function(effect) { with(Element) {
setOpacity(effect.element, effect.options.from);
show(effect.element); }}
}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.SwitchOff = function(element) {
element = $(element);
var oldOpacity = Element.getInlineOpacity(element);
return new Effect.Appear(element, {
duration: 0.4,
from: 0,
transition: Effect.Transitions.flicker,
afterFinishInternal: function(effect) {
new Effect.Scale(effect.element, 1, {
duration: 0.3, scaleFromCenter: true,
scaleX: false, scaleContent: false, restoreAfterFinish: true,
beforeSetup: function(effect) { with(Element) {
[makePositioned,makeClipping].call(effect.element);
}},
afterFinishInternal: function(effect) { with(Element) {
[hide,undoClipping,undoPositioned].call(effect.element);
setStyle(effect.element, {opacity: oldOpacity});
}}
})
}
});
}
Effect.SlideDown = function(element) {
element = $(element);
Element.cleanWhitespace(element);
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
var elementDimensions = Element.getDimensions(element);
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
setStyle(effect.element, {height: '0px'});
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
undoClipping(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
}, arguments[1] || {})
);
}
Effect.SlideUp = function(element) {
element = $(element);
Element.cleanWhitespace(element);
var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleX: false,
scaleMode: 'box',
scaleFrom: 100,
restoreAfterFinish: true,
beforeStartInternal: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping].call(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
}, arguments[1] || {})
);
}
Effect.Grow = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
moveTransistion: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.full
}, arguments[1] || {});
var oldStyle = {
top: element.style.top,
left: element.style.left,
height: element.style.height,
width: element.style.width,
opacity: Element.getInlineOpacity(element) };
var dims = Element.getDimensions(element);
var initialMoveX, initialMoveY;
var moveX, moveY;
switch (options.direction) {
case 'top-left':
initialMoveX = initialMoveY = moveX = moveY = 0;
break;
case 'top-right':
initialMoveX = dims.width;
initialMoveY = moveY = 0;
moveX = -dims.width;
break;
case 'bottom-left':
initialMoveX = moveX = 0;
initialMoveY = dims.height;
moveY = -dims.height;
break;
case 'bottom-right':
initialMoveX = dims.width;
initialMoveY = dims.height;
moveX = -dims.width;
moveY = -dims.height;
break;
case 'center':
initialMoveX = dims.width / 2;
initialMoveY = dims.height / 2;
moveX = -dims.width / 2;
moveY = -dims.height / 2;
break;
}
return new Effect.Move(element, {
x: initialMoveX,
y: initialMoveY,
duration: 0.01,
beforeSetup: function(effect) { with(Element) {
hide(effect.element);
makeClipping(effect.element);
makePositioned(effect.element);
}},
afterFinishInternal: function(effect) {
new Effect.Parallel(
[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
new Effect.Scale(effect.element, 100, {
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
], Object.extend({
beforeSetup: function(effect) { with(Element) {
setStyle(effect.effects[0].element, {height: '0px'});
show(effect.effects[0].element); }},
afterFinishInternal: function(effect) { with(Element) {
[undoClipping, undoPositioned].call(effect.effects[0].element);
setStyle(effect.effects[0].element, oldStyle); }}
}, options)
)
}
});
}