Les scripts du site

Sommaire du document

A propos de ces extraits de codes...

J'ai commencé la réalisation de ce site dans le but de lier entre elles différentes notes que je possédais sur certaines notions comme les télécommunications A l'époque je n'avais aucune expérience dans le domaine du Web (rares étaient les sites Web personnels, et la consultation de documents sur Internet était assez onéreux), ni aucune expérience en programmation. La première version était donc entièrement statique et ne comportait pas de JavaScript (chaque lien était directement codé dans la page).

J'ai par la suite loué à la bibliothèque un livre sur le JavaScript pendant mes vacances, et je me suis lancé. Ces scripts comportent des commentaires en français (et parfois pas de commentaire du tout), aucune convention d'écriture n'est respectée (nous avons des noms de variables ou de fonctions qui débutent par des majuscules ou des minuscules, qui ne sont pas explicites, etc.), des indentations qui varient, etc.

De plus, ces fichiers ne sont plus utilisés à ce jour, une part importante du traitement étant effectué côté serveur, et les données stockées dans une base de données.

J'avais réalisé cette page quelques années plus tard au moment où les différentes pages ont été stockées sur Internet et non plus en local, et je ne l'ai toujours pas supprimée car elle peut servir de point de départ ou donner des idées à ceux qui désirent utiliser un système similaire.

Scripts externes

Lorsque nous avons besoin d'exécuter un même script dans de nombreuses pages, il devient fastidieux de le recopier sur chaque page. Nous pouvons grouper les scripts les plus utilisés dans un fichier externe. Cette technique présente en plus l'avantage de ne pas devoir charger pour chaque page le code de ces scripts, car les navigateurs modernes placent généralement le fichier en cache.

Nous pouvons donc créer un simple fichier texte (avec vi ou gedit sous Linux, notepad sous Windows, ...) dans lequel les différentes fonctions seront écrites, puis sauver ce fichier avec l'extension .js (pour JavaScript).

Chaque page qui fait appel à une fonction du fichier y fait référence dans la partie <head>. La référence se fait de la manière suivante :

  1. <SCRIPT LANGUAGE="javascript" SRC="adresse_du_fichier/nom_du_fichier.js"></SCRIPT>

Dans la partie <body> du document HTML, l'appel d'une fonction située sur le fichier externe se fait simplement de cette manière: :

  1. <SCRIPT LANGUAGE="javascript">
  2. <!--
  3. nom_de_fonction(parametres_de_fonction);
  4. //-->

 

L'objet BrolPage

Afin de gérer la navigation, le moteur de recherche, la recherche des dernières pages créées, etc. nous pouvons créer un objet BrolPage, qui comporte une série de propriétés telles que :

  • son identité
    • son adresse
    • son nom
    • une description
  • la navigation
    • la page précédente
    • la page suivante
    • son appartenance à un chapitre
    • la nécessité de figurer ou pas dans le menu de gauche
    • le texte qui doit apparaître dans un lien vers cette page
    • les mots clés pour indexer le moteur de recherche
  • etc.

Un tableau est créé, afin de gérer tous ces objets selon leur index, d'effectuer des recherches à l'aide de boucles for, et tout ce que l'imagination permet...

  1. function BrolPage(rep, nom, chap, titre, desc, pre, sui, men, dev, dCrea){
  2. this.path=GlobURL+rep;
  3. this.nom=nom;
  4. this.adr=this.path+nom;
  5. this.chap=chap;
  6. this.titre=titre;
  7. this.desc=(desc.length==0) ? titre:desc;
  8. this.pre=pre;
  9. this.sui=sui;
  10. this.men=men;
  11. /*numéro de chapitre si la page est développée dans le menu de gauche mode cadre
  12. -2 si astuces win, sinon -1
  13. au delà de -100 : sous chapitres (100->200=info, 200->300=res, etc)
  14. -101=Excel
  15. -102=Outlook
  16. -103=Exchange
  17. */
  18. this.dev=dev;
  19. this.dCrea=dCrea;
  20. }
  21.  
  22. /* EXEMPLE :
  23.  
  24. globNavPge[1]=new BrolPage("_pge", "js42",3,"Les coulisses","Les scripts utilisés sur ce site",23,2,3,0,"19 03 2002");
  25. globNomCle[1]="programmation+langage+c+ide+visual";
  26. */

 

La navigation

Un script détermine le haut et le bas de chaque page, afin de faciliter la navigation.

Eléments générés par le script en haut de page :

  • Des boutons de navigation :
    • Bouton vers la page précédente.
    • Bouton vers la page suivante.
      Remarque: ces deux boutons permettent une navigation linéaire à la manière des pages d'un livre.
  • Le numéro et le titre du chapitre.
  • Le titre de la page.
  • Des boîtes de sélections qui permettent :
    • d'atteindre les différentes parties de la page.
    • d'atteindre les pages appartenant au même chapitre.

Une variable est déclarée sur la page, et contient l'index correspondant à un objet dans un tableau (voir plus haut).

  1. //js
  2. //haut de page
  3. var topPage='<a name="h"></a>';
  4. topPage+='<TABLE width="100%" height="40" border="0" cellpadding="0" cellspacing="0"><TR><td valign="top">'+affMh()+'</TD>';
  5. topPage+='<TD colspan="2"><DIV align="center"><H1>Chapitre '+globNumChap+': '+globIndChap[globNumChap]+'</H1></DIV></TD>';
  6. topPage+='<TD valign="top">'+dirPge_1()+'</TD></TR>';
  7. topPage+='<TR><TD width="25%"><DIV align="center">'+affpre('aph')+'</DIV></TD>';
  8. topPage+='<TD colspan="2"><DIV align="center"><H3>'+globNavPge[npge].titre+'</H3></DIV></TD>';
  9. topPage+='<TD width="25%"><DIV align="center">'+affsui('ash')+'</DIV></TD></TR>';
  10. topPage+='<TR><TD colspan="4">'+globHr1+globHr2;+'</TD></TR>';
  11. topPage+='</TABLE>';
  12.  
  13. //document.write(topPage);
  14. }
  15.  
  16. //bouton page précédente
  17. function affpre(affpre_in){
  18. var affprepge=' ';
  19. switch (globNavPge[npge].pre){
  20. //pas pge pre
  21. case -1:
  22. //mode gr (pas besoin else: si pas mode gr, pas affichage btn inactif!)
  23. if(Lit_Cookie("globgr")==oui){
  24. affprepge+='<img src ="'+globURL_ImgFond+'/nav/vide.gif" width="120" height="31" alt="Ce bouton est inactif.">';
  25. }
  26. break;
  27. case -2://pre == history-1
  28. if(Lit_Cookie("globgr")==oui){
  29. affprepge+='<a onClick="retour();" onMouseOut="remetimg()" onMouseOver="changeimg("'+affpre_in+'","","';
  30. affprepge+=globURL_ImgFond+'/nav/pre_s.gif",1)">';
  31. affprepge+='<img border ="0" name="'+affpre_in+'" src="'+globURL_ImgFond+'/nav/pre.gif" width="120" height="31">';
  32. affprepge+='</a>';
  33. }else{
  34. affprepge+='Page précédente:<br><a href="javascript:retour()">Page précédente</a>';
  35. }
  36. break;
  37. if(Lit_Cookie("globgr")==non){
  38. affprepge+='Page précédente:<br>';
  39. }
  40. affprepge+='<script language="JavaScript">';
  41. affprepge+='BtnActif("'+affpre_in+'",2,globNavPge[npge].pre,-1,-1,globNavPge[npge].desc)';
  42. affprepge+='</script>';
  43. break;
  44. }
  45. return(affprepge);
  46. }
  47.  
  48. //bouton page suivante
  49. function affsui(affsui_in){
  50. var affsuipge='';
  51. if (globNavPge[npge].sui == -1){
  52. affsuipge+='<img src ="'+globURL_ImgFond+'/nav/vide.gif" width="120" height="31" alt="Ce bouton est inactif.">';
  53. }else{
  54. if (Lit_Cookie('globgr')==non) {
  55. affsuipge+='Page suivante:<br>';
  56. }
  57. affsuipge+='<script language="JavaScript">';
  58. affsuipge+='BtnActif("'+affsui_in+'",3,globNavPge[npge].sui,-1,-1,globNavPge[npge].desc)';
  59. affsuipge+='</script>';
  60. }
  61. return(affsuipge);
  62. }

 

Pour le bas de la page, un script génère:

  • Des boutons :
    • Page précédente.
    • Haut de la page.
    • Page suivante.
  • Mon nom (afin de flater mon égo...)
  • La date de dernière modification du fichier (voir le script).
  1. function bas(){
  2. var BasPge=Glob_Hr1+'<BR><BR><TABLE width="100%" border="0" cellpadding="0" cellspacing="0">';
  3. BasPge+='<TR>';
  4. BasPge+='<TD width="31%" valign="top"><DIV align="center">'+affpre("apb")+'</DIV></TD>';
  5. BasPge+='<TD width="38%"><DIV align="center"><script language="JavaScript">BtnActif("hb",1,-1,"h",-1,"Haut de la page.")</script></DIV></TD>';
  6. BasPge+='<TD width="31%" valign="bottom"><DIV align="center">'+affsui("asb")+'</DIV></TD>';
  7. BasPge+='</TR></TABLE>';
  8.  
  9. document.write(BasPge);
  10.  
  11. statx();
  12. }

Un ensemble de fonctions déterminent les actions à prendre dans la gestion des boutons, qui ne sont en fait que le remplacement d'une image par une autre...

  1. //gestion de boutons
  2. /*
  3. BtAId=Identifiant pour changer l'image avec onMouseOver.
  4. BtnAIndImg=Index dans le tableau des images.
  5. BtnAIndPge=Index de la page à joindre dans le tableau des pages.-1 si inactif.
  6. BtnADsPge=Balise à joindre sur la page.-1 si inactif.
  7. BtnAAct=Action à entreprendre, ou dest sur la page.-1 si inactif.
  8. BtnAInfo=Balise alt si image, affichage txt si mode rapide. Si (BtnAIndPge!=-1)&&BtnAInfo=='t', target=top
  9. */
  10. function BtnActif(BtAId,BtnAIndImg,BtnAIndPge,BtnADsPge,BtnAAct,BtnAInfo)
  11. {
  12. /*if (Lit_Cookie("Glob_nv")==oui){var BtnA_Target='_pge';} else {*/var BtnA_Target='_self';//}
  13. if (Lit_Cookie("Glob_gr")==oui)//mode normal, boutons img
  14. {
  15. if (BtnAAct!=-1)
  16. {
  17. if (BtnAAct=='t')//pas de javascript, seulement changement de frameset
  18. {document.writeln('<a href="'+Glob_NavPge[BtnAIndPge].rep+Glob_NavPge[BtnAIndPge].nom+'" target="_top"');}
  19. else//javascript
  20. {document.writeln('<a onClick="'+BtnAAct+'" onMouseOver="music(5);" target="'+BtnA_Target+'"');}
  21. }
  22. else//bouton lien traditionnel
  23. {
  24. if (btnaindpge==-1)//ancre sur la page en cours
  25. {document.writeln('<a href="#'+BtnADsPge+'" target="'+BtnA_Target+'"');}
  26. else//pointe vers ancre d"une autre page
  27. {document.writeln('<a href="'+Glob_NavPge[BtnAIndPge].rep+Glob_NavPge[BtnAIndPge].nom+'" target="'+BtnA_Target+'"');}
  28. }
  29. document.writeln('onMouseOver="music(5);changeimg("img'+BtAId+'","","'+Glob_Img[BtnAIndImg].s+'",1)" onMouseOut="remetimg()">');
  30. document.writeln('<img name="img'+BtAId+'" border="0" src="'+Glob_Img[BtnAIndImg].n+'" width="'+Glob_Img[BtnAIndImg].l+'" height="'+Glob_Img[BtnAIndImg].h+'"');
  31.  
  32. if ((btnaact!='t')&&(btnaindpge!=-1))
  33. {document.writeln(' alt="'+Glob_NavPge[BtnAIndPge].desc+'"></a>');}
  34. else//desc javascript
  35. {document.writeln(' alt="'+BtnAInfo+'"></a>');}
  36. }
  37. else //mode rapide, boutons style
  38. {
  39. if (BtnAAct!=-1)
  40. {
  41. if (BtnAAct=='t')//pas de javascript, seulement changement de frameset
  42. {document.writeln('<a href="'+Glob_NavPge[BtnAIndPge].rep+Glob_NavPge[BtnAIndPge].nom+'" target="_top">'+Glob_NavPge[BtnAIndPge].titre+'</a><br>');}
  43. else//javascript
  44. //{document.writeln('<a href="javascript:'+BtnAAct+'">'+BtnAInfo+'</a><br>');}
  45. {document.writeln('<a href="#" onClick='+BtnAAct+'>'+BtnAInfo+'</a><br>');}
  46. //<a onClick='+BtnAAct+' target="_self"');
  47. }
  48. else//pointe vers page
  49. if (btnaindpge==-1)//ancre sur la page en cours
  50. {document.writeln('<a href="#'+BtnADsPge+'" target="'+BtnA_Target+'">-&lt;]'+BtnAInfo+'[&gt;-</a><br>');}
  51. else
  52. {document.writeln('<a href="'+Glob_NavPge[BtnAIndPge].adr+'">'+Glob_NavPge[BtnAIndPge].titre+'</a><br>');}
  53. }
  54. }
  55. //fin btnactif

 

Le moteur de recherche JavaScript

Un moteur de recherche interne, une galère ?

Pas du tout, car toute page étant répertoriée sous forme d'objet dans un tableau, il suffit de déterminer comme propriété de cet objet un ensemble de chaînes de caractères qui constituent les mots clés qui référencent le contenu de cette page.

Ensuite, il suffit de saisir les mots clés, de parcourir le tableau des pages, et de vérifier pour chaque page si le mot clé figure dans sa propriété de référencement.

Nous pouvons donc afficher un lien vers chaque page en déterminant son nom, son adresse et sa description dans ses propriétés.

Petit plus, nous pouvons utiliser un compteur d'occurences afin de classer les pages selon le nombre de mots clés trouvés.

  1. var Glob_Moteur_ResNbRes=new Number(0);//nbre de pages trouvées
  2.  
  3. function motphp()
  4. {
  5. if ((!document.FormCh.saisie.value)||(document.FormCh.saisie.value=="Introduisez ici le mot à chercher")) alert("Vous devez introduire le mot à chercher\ndans le champ prévu à cet effet.")
  6. else
  7. document.forms["FormCh"].submit();
  8. }
  9.  
  10. function moteur()
  11. {
  12. if ((!document.FormCh.saisie.value)||(document.FormCh.saisie.value=="Introduisez ici le mot à chercher")) alert("Vous devez introduire le mot à chercher\ndans le champ prévu à cet effet.")
  13. else
  14. {
  15. MoteurTab = new Array();//prépare tableau pour la future chaîne de mots clés à chercher
  16. MoteurPge = "";
  17. Moteur_prepare();
  18. }
  19. }
  20.  
  21. function Moteur_prepare()
  22. {
  23. //début garniture
  24. Moteur_prepCh = new String();//prépare tableau pour les mots à chercher
  25. MoteurTab = document.FormCh.saisie.value.split("+");//les mots saisis dans le formulaire sont classés dans le tableau
  26. for(Moteur_prepK=0;Moteur_prepK<MoteurTab.length;Moteur_prepK++)//tableau.length renvoit le nbre de mots introduits dans le tableau
  27. {
  28. if (MoteurTab[Moteur_prepK].length > 1)//si le mot à plus d'une lettre
  29. {
  30. //toLowerCase() pour forcer les majuscules en minuscules
  31. Moteur_prepCh = MoteurTab[Moteur_prepK].toLowerCase(); //la var Moteur_prepCh recupère le mot clé de l'index i
  32. Moteur_Cmp(Moteur_prepCh); //le mot clé est soumis à la fonction Moteur_Cmp()
  33. }
  34. }
  35. //fin garniture
  36. Moteur_c&oelig;ur();//recherche proprement dite et affichage
  37. }
  38.  
  39. function Moteur_Cmp(Moteur_ChchMot)//récupération d'un mot clé
  40. {
  41. for (Moteur_ChchK=1;Moteur_ChchK<Glob_nmaxPge;Moteur_ChchK++)//passe toutes les pges
  42. {
  43.  
  44. document.FormCh.resultat.value = "";
  45. document.FormCh.resultat.value = Glob_NomCle[Moteur_ChchK];//mots clés de la pge
  46. Moteur_ChchTab = document.FormCh.resultat.value.split("+");//tableau des mots de la pge
  47. document.FormCh.resultat.value = "";
  48. for (m=0;m<Moteur_ChchTab.length;m++)//évaluation du premier mot au dernier
  49. {
  50. Moteur_ChchTemp = Moteur_ChchTab[m]; //le mot est stocké dans la var Moteur_ChchTemp
  51. if ((Moteur_ChchMot == Moteur_ChchTemp.toLowerCase())||
  52. (Moteur_ChchMot == (Moteur_ChchTemp.toLowerCase()+"s")))//mot trouvé ok
  53. {
  54. Glob_OccurCle[Moteur_ChchK]=Glob_OccurCle[Moteur_ChchK]+1;//incrémentation du compteur d'occurences (de nbre de mots cherchés présents dans les mots clés de la page)
  55. }
  56. }
  57. }
  58. }
  59. function Moteur_c&oelig;ur()
  60. {
  61. Moteur_ResNmaxOcc = 0;
  62. var MoteurPge="<br>";
  63. for (Moteur_ResK1=1;Moteur_ResK1<Glob_nmaxPge;Moteur_ResK1++)//passe pges
  64. {
  65. //Moteur_ResNmaxOcc = index de la pge qui a le > nbre d'occurences
  66. if (Glob_OccurCle[Moteur_ResK1]>Moteur_ResNmaxOcc) {Moteur_ResNmaxOcc = Glob_OccurCle[Moteur_ResK1];}
  67. }
  68.  
  69. for (Moteur_ResNmaxOcc;Moteur_ResNmaxOcc>0;Moteur_ResNmaxOcc--)//du > nbre occurences au <
  70. {
  71. for (Moteur_ResK2=1;Moteur_ResK2<Glob_nmaxPge;Moteur_ResK2++)
  72. {
  73. //passe pges du > nbre occurences au <
  74. if (Glob_OccurCle[Moteur_ResK2] == Moteur_ResNmaxOcc)
  75. {
  76. Glob_Moteur_ResNbRes++;
  77. MoteurPge+="<TABLE class='td' width='100%'><TR><th>Résultat n°"+Glob_Moteur_ResNbRes+" : <a href='"+Glob_NavPge[Moteur_ResK2].rep+Glob_NavPge[Moteur_ResK2].nom+"' class='ind'>"+Glob_NavPge[Moteur_ResK2].titre+"</a></th></TR>";
  78. MoteurPge+="<TR><TD>"+Moteur_ResNmaxOcc;
  79. if(Moteur_ResNmaxOcc>1){MoteurPge+=" mots cl&eacute;s";}else {MoteurPge+=" mot cl&eacute;";}MoteurPge+=" pour la page.";
  80. MoteurPge+="<p><i>"+Glob_NavPge[Moteur_ResK2].desc+"</i></p>";
  81. MoteurPge+="<p align='right'>Date de création : "+Glob_NavPge[Moteur_ResK2].D_Crea+"</p>";
  82. MoteurPge+="</TD></TR><TR><TD>"+Glob_NavPge[Moteur_ResK2].rep+Glob_NavPge[Moteur_ResK2].nom;
  83. MoteurPge+="</TD></TR></TABLE><BR><BR>";
  84. }
  85. }
  86. }
  87. AffichPge = "";
  88. IfSimple=1;
  89. //création du début de la page
  90. AffichPge += "<HTML>\n\n<HEAD>\n\t<TITLE>R&eacute;sultat de la recherche</TITLE>\n\t";
  91. AffichPge += "<script language='javascript' src='"+Glob_URL_Scr+"gs_p.js'>var recherche=true;</script>";
  92. AffichPge += "</HEAD>\n\n<BODY onload='f1();clic();' onunload='f2()' topmargin='0' leftmargin='0' rightmargin='0'>";
  93. AffichPge +=if1()+if3()+if4();
  94.  
  95. AffichPge +="Recherche de \"<b>"+ MoteurTab+"</b>\"<BR>sur base d'un index.</TD><TD class='table' align='right'><DIV align='right'>";
  96. if (MoteurPge.length >> 0)
  97. {
  98. AffichPge +="Affichage d";
  99. if(MoteurPge.length >> 1)
  100. {
  101. AffichPge +="es résultats <b>1 - "+Glob_Moteur_ResNbRes+" </b>sur un total de <b>"+Glob_Moteur_ResNbRes+"</b>";
  102. }
  103. else AffichPge +="u résultat ";
  104. }
  105. else AffichPge +="Aucun résultat.";
  106. AffichPge +="<BR>Recherche effectuée dans <b>"+Glob_nmaxPge+"</b> pages.";
  107. AffichPge +="</DIV></TD></TR></TABLE><br>";
  108.  
  109. if (MoteurPge.length == 0)
  110. {
  111. AffichPge += "\n<p class='pgestyle'>Votre recherche ( "+ MoteurTab+" ) ne correspond à aucun résultat.<br><br><ul><li class='pgestyle'>Pensez à vérifier l'orthographe des mots.</li><li class='pgestyle'>Essayez de séparer les mots par le signe +.</li><li class='pgestyle'>Essayez d'utliser moins de mots.</li><li class='pgestyle'>Essayez d'utiliser des mots plus généraux.</li></ul><br></p><form><input type='button' onclick='history.go(-1)' value='Nouvelle Recherche...'></form>";
  112. }
  113. else AffichPge +=MoteurPge;
  114.  
  115. /*AffichPge +="\n<DIV align='center'><H6>"+Glob_Hr1+"<br><br><font size='+1'><b>R&eacute;sultats de la recherche</b></font><br>"+Glob_Hr2+"<br><br><br><font size='-2'>mot(s) clé(s): " + MoteurTab;
  116. AffichPge +="<br><br>"+Glob_nmaxPge+" pages évaluées.<br>"+Glob_Moteur_ResNbRes+" pages trouvées.</font><br><br><br>"+Glob_Hr1+"</H6></DIV>";
  117. //si au moins une page a été trouvée, page des résultats, puis présentation des résultats.
  118. if (MoteurPge.length >> 0)
  119. {AffichPge+="\n<br><br>Si le nombre de reponses est trop grand, veuillez diminuer le nombre de mots clés.<br><br><form><input type='button' onclick='history.go(-1)' value='Nouvelle Recherche...'></form><br><br>" + MoteurPge + "</center>";}
  120. //si rien trouvé, page pas de résultats
  121. else if (MoteurPge.length == 0)
  122. {AffichPge = AffichPge + "\n<br><br>Aucun r&eacute;sultat pour cette recherche, veuillez r&eacute;essayer avec d'autres mots clés.<br><br><form><input type='button' onclick='history.go(-1)' value='Nouvelle Recherche...'></form>"}
  123. */
  124. document.write(AffichPge);
  125.  
  126. ifc();ifb();
  127. document.write("\n</BODY>\n</HTML>");
  128. }

 

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

8 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Notes

  1.  HyperText Mark-Up Language : correspond à « langage de balises hypertexte” en français

  2.  HTML : “HyperText Mark-Up Language” (en français, « langage de balises hypertexte »)

 

Historique et modifications de la page

  • Samedi 03 Juillet 2010, 13:30 : Passage vers la nouvelle interface du site.
    Ajout d'un avertissement en début de page.
Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-187
Document créé le 19/03/02 01:00, dernière modification le Vendredi 17 Juin 2011, 12:12
Source du document imprimé : http:///www.gaudry.be/javascript-infobrol.html
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Apparence (afficher)
Stats (afficher)
15838 documents
455 astuces.
550 niouzes.
3107 definitions.
447 membres.
8121 messages.

Document genere en :
0,16 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
CHANDAIL : Vêtement que doit porter un enfant lorsque sa mère a froid.

Pierre Desproges
 
l'infobrol
Nous sommes le Lundi 26 Juin 2017, 21:09, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)