source: trunk/spip/esqueleto-redcta/plugins/agenda/1_9_2/inc/agenda.php.sav @ 674

Last change on this file since 674 was 30, checked in by sebas, 17 years ago

nueva importacion del codigo del esqueleto de redcta con los plugins

File size: 48.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2006                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15include_spip('inc/minipres');
16include_spip('inc/layer');
17include_spip('inc/texte'); // inclut inc_filtre
18include_spip('inc/calendar'); // inclut widget calendar
19
20charger_generer_url();
21
22//  Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
23
24// Notes: pour toutes les fonctions ayant parmi leurs parametres
25// annee, mois, jour, echelle, partie_cal, script, ancre
26// ceux-ci apparaissent TOUJOURS dans cet ordre
27
28define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes
29
30//
31// Utilitaires sans html ni sql
32//
33
34// utilitaire de separation script / ancre
35// et de retrait des arguments a remplacer
36// (a mon avis cette fonction ne sert a rien, puisque parametre_url()
37// sait remplacer les arguments au bon endroit -- Fil)
38// Pas si simple: certains param ne sont pas remplaces
39// et doivent reprendre leur valeur par defaut -- esj.
40function calendrier_retire_args_ancre($script)
41{
42        $script = str_replace('&amp;', '&', $script);
43  $script = str_replace('?bonjour=oui&?','?',$script);
44  if (ereg('^(.*)(#[^=&]*)$',$script, $m)) {
45          $script = $m[1];
46          $ancre = $m[2];
47  } else { $ancre = ''; }
48  if ($script[strlen($script)-1] == '?')  $script = substr($script,0,-1);
49  foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) {
50                $script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script);
51                $script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script);
52        }
53  if (ereg('[?&]$', $script)) $script =   substr($script,0,-1);
54  return array(quote_amp($script), $ancre);
55}
56
57// tous les liens de navigations sont issus de cette fonction
58// on peut definir generer_url_date et un htacces pour simplifier les URL
59
60function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) {
61        if (function_exists('generer_url_date'))
62                return generer_url_date($script, $annee, $mois, $jour, $type, $finurl);
63
64        $script = parametre_url($script, 'annee', sprintf("%04d", $annee));
65        $script = parametre_url($script, 'mois',  sprintf("%02d", $mois));
66        $script = parametre_url($script, 'jour',  sprintf("%02d", $jour));
67        $script = parametre_url($script, 'type',  $type);
68        return $script . $finurl;
69}
70
71# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel)
72# et retourne un tableau compose
73# - taille d'une heure
74# - taille d'une journee
75# - taille de la fonte
76# - taille de la marge
77
78function calendrier_echelle($debut, $fin, $echelle)
79{
80  if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
81  if ($fin <= $debut) $fin = $debut +1;
82
83  $duree = $fin - $debut;
84  $dimheure = floor((3600 / $echelle));
85  return array($dimheure,
86               (($duree+2) * $dimheure),
87               floor (14 / (1+($echelle/240))),
88               floor(240 / $echelle));
89}
90
91# Calcule le "top" d'une heure
92
93function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) {
94       
95        $h_heure = substr($heure, 0, strpos($heure, ":"));
96        $m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure));
97        $heure100 = $h_heure + ($m_heure/60);
98
99        if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1;
100        if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin;
101
102        $top = floor(($heure100 - $debut + 1) * $dimheure);
103
104        return $top;   
105}
106
107# Calcule la hauteur entre deux heures
108function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) {
109
110        $height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize)
111                                - calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize);
112
113        $padding = floor(($dimheure / 3600) * 240);
114        $height = $height - (2* $padding + 2); // pour padding interieur
115       
116        if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases
117       
118        return $height;
119}
120
121//
122// init: calcul generique des evenements a partir des tables SQL
123//
124
125function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='')
126{
127        global $mois, $annee, $jour, $type, $echelle, $partie_cal;
128
129        if (!$time)
130          {
131            if (!$mois)
132              $time = time();
133            else
134              $time = mktime(0,0,0,$mois,$jour,$annee);
135            $type= 'mois';
136          }
137
138        $jour = date("d",$time);
139        $mois = date("m",$time);
140        $annee = date("Y",$time);
141        if (!$ltype) $ltype = $type ? $type : 'mois';
142        if (!$lechelle) $lechelle = $echelle;
143        if (!$lpartie_cal) $lpartie_cal = $partie_cal;
144        list($script, $ancre) =
145          calendrier_retire_args_ancre($script);
146        if (!$evt) {
147          $g = 'sql_calendrier_' . $ltype;
148          $evt = sql_calendrier_interval($g($annee,$mois, $jour));
149          sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]);
150          // si on veut les forums, decommenter
151#         sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]);
152        }
153        $f = 'http_calendrier_' . $ltype;
154        return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt);
155
156}
157
158# affichage d'un calendrier de plusieurs semaines
159# si la periode est inferieure a 31 jours, on considere que c'est un mois
160
161function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
162{
163        global $spip_ecran;
164        if (!isset($spip_ecran)) $spip_ecran = 'large';
165        $premier_jour = '01';
166        $dernier_jour = '31';
167
168        if (is_array($evt)) {
169          list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
170          if (!$premier_jour) $premier_jour = '01';
171          if (!$dernier_jour)
172            {
173              $dernier_jour = 31;
174              while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
175            }
176          if ($sansduree)
177            foreach($sansduree as $d => $r)
178              $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
179          $evt =
180            http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) .
181            http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre") ;
182        } else $evt = "<tr><td>$evt</td></tr>";
183
184        return
185          "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
186          http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) .
187          $evt .
188          '</table>' .
189          http_calendrier_sans_date($annee, $mois, $evenements) .
190          (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
191}
192
193// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc
194// pas de navigation suivant/precedent alors
195
196function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){
197        if ($dernier_jour > 31) {
198          $prec = $suiv = '';
199          $periode = affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$premier_jour,$annee))) . ' - '. affdate_mois_annee(date("Y-m-d", mktime(1,1,1,$mois,$dernier_jour,$annee)));
200        } else {
201
202        $mois_suiv=$mois+1;
203        $annee_suiv=$annee;
204        $mois_prec=$mois-1;
205        $annee_prec=$annee;
206        if ($mois==1){
207          $mois_prec=12;
208          $annee_prec=$annee-1;
209        }
210        else if ($mois==12){$mois_suiv=1;       $annee_suiv=$annee+1;}
211        $prec = array($annee_prec, $mois_prec, 1, "mois");
212        $suiv = array($annee_suiv, $mois_suiv, 1, "mois");
213        $periode = affdate_mois_annee("$annee-$mois-1");
214        }
215        return
216          "\n<tr><td colspan='7'>" .
217          http_calendrier_navigation($annee,
218                                   $mois,
219                                   $jour,
220                                   $echelle,
221                                   $partie_cal,
222                                   $periode,
223                                   $script,
224                                   $prec,
225                                   $suiv,
226                                   'mois',
227                                   $ancre) .
228          "</td></tr>";
229
230}
231
232function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){
233        global $couleur_claire;
234
235        $bandeau ="";
236        for ($j=1; $j<8;$j++){
237                $bandeau .=
238                  "\n\t<th class='calendrier-th'>" .
239                  _T('date_jour_' . (($j%7)+1)) .
240                  "</th>";
241        }
242        return "\n<tr" .
243          (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") .
244          ">$bandeau\n</tr>";
245}
246
247# dispose les lignes d'un calendrier de 7 colonnes (les jours)
248# chaque case est garnie avec les evenements du jour figurant dans $evenements
249
250function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='')
251{
252        global $couleur_claire, $spip_lang_left, $spip_lang_right;
253
254        // affichage du debut de semaine hors periode
255        $init = '';
256        $debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
257        for ($i=$debut ? $debut : 7;$i>1;$i--)
258          {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\">&nbsp;</td>";}
259
260        $total = '';
261        $ligne = '';
262        $today=date("Ymd");
263        for ($j=$premier_jour; $j<=$dernier_jour; $j++){
264                $nom = mktime(1,1,1,$mois,$j,$annee);
265                $jour = date("d",$nom);
266                $jour_semaine = date("w",$nom);
267                $mois_en_cours = date("m",$nom);
268                $annee_en_cours = date("Y",$nom);
269                $amj = date("Y",$nom) . $mois_en_cours . $jour;
270                $couleur_texte = "black";
271                $couleur_fond = "";
272
273                if ($jour_semaine == 0) $couleur_fond = $couleur_claire;
274                else if ($jour_semaine==1)
275                          {
276                            if ($ligne||$init)
277                              $total .= "\n<tr>$init$ligne\n</tr>";
278                            $ligne = $init = '';
279                          }
280               
281                if ($amj == $today) {
282                        $couleur_texte = "red";
283                        $couleur_fond = "white";
284                }
285                $res = '';
286                if ($evts = $evenements[$amj]) {
287                  foreach ($evts as $evenement)
288                    {
289                      $res .= isset($evenement['DTSTART']) ?
290                        http_calendrier_avec_heure($evenement, $amj) :
291                        http_calendrier_sans_heure($evenement);
292                    }
293                }
294
295                $ligne .= "\n\t\t<td\tclass='calendrier-td'
296                        style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" .
297                  ($couleur_fond ? " background-color: $couleur_fond;" : "") .
298                  ($ligne ? "" :
299                   " border-$spip_lang_left: 1px solid $couleur_claire;") .
300                  "'>" .
301                  (!_DIR_RESTREINT ?
302                   (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre),
303                              $jour,
304                              $jour, "color: $couleur_texte",'calendrier-helvetica16') .
305                    http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)):
306                   http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) .
307                  $res .
308                  "\n\t</td>";
309        }
310        return  $total . ($ligne ? "\n<tr>$ligne\n</tr>" : '');
311}
312
313// typo pour l'espace public
314
315function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre)
316{
317      $d = mktime(0,0,0,$mois, $jour, $annee);
318      $semaine = date("W", $d);
319      return
320        "<table width='100%'>\n<tr><td style='text-align: left'>".
321        http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre),
322                  "$jour/$mois",
323                  _T('date_jour_'. (1+date('w',$d))) .
324                  " $jour " .
325                  _T('date_mois_'.(0+$mois)),
326                  '','calendrier-helvetica16') .
327        "</td><td style='text-align: right'>" .
328        http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre),
329                  $semaine,
330                  _T('date_semaines') . ": $semaine",
331                  '',
332                  'calendrier-helvetica16') .
333        "</td></tr>\n</table>";
334}
335
336# dispose les evenements d'une semaine
337
338function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
339{
340        global $spip_ecran;
341        if (!isset($spip_ecran)) $spip_ecran = 'large';
342
343        $init = date("w",mktime(1,1,1,$mois,$jour,$annee));
344        $init = $jour+1-($init ? $init : 7);
345        $sd = '';
346
347        if (is_array($evt))
348          {
349                if($partie_cal!='sansheure'){
350            $sd = http_calendrier_sans_date($annee, $mois,$evt[0]);
351            $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
352            $evt =
353              http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
354              http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt);
355                }
356                else {
357                          list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
358                          if ($sansduree)
359                            foreach($sansduree as $d => $r)
360                              $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
361                    $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
362                    $evt =
363                      http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) .
364                      http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script);
365                }
366          } else $evt = "<tr><td>$evt</td></tr>";
367
368        return
369          "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" .
370          http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
371          $evt .
372          "</table>" .
373          $sd .
374          (_DIR_RESTREINT ? "" : http_calendrier_aide_mess());
375}
376
377function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
378
379        $fin = mktime (1,1,1,$mois, $jour+6, $annee);
380        $fjour = date("d",$fin);
381        $fmois = date("m",$fin);
382        $fannee = date("Y",$fin);
383        $fin = date("Y-m-d", $fin);
384        $debut = mktime (1,1,1,$mois, $jour, $annee);
385        $djour = date("d",$debut)+0;
386        $dmois = date("m",$debut);
387        $dannee = date("Y",$debut);
388        $debut = date("Y-m-d", $debut);
389        $periode = (($dannee != $fannee) ?
390                    (affdate($debut)." - ".affdate($fin)) :
391                    (($dmois == $fmois) ?
392                     ($djour ." - ".affdate_jourcourt($fin)) :
393                     (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin))));
394
395  return
396    "\n<tr><td colspan='7'>" .
397    http_calendrier_navigation($annee,
398                               $mois,
399                               $jour,
400                               $echelle,
401                               $partie_cal,
402                               $periode,
403                               $script,
404                               array($dannee, $dmois, ($djour-7), "semaine"),
405                               array($fannee, $fmois, ($fjour+1), "semaine"),
406                               'semaine',
407                               $ancre) .
408    "</td></tr>\n";
409}
410
411function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){
412        global $couleur_claire;
413
414        $bandeau = '';
415
416        for ($j=$jour; $j<$jour+7;$j++){
417                $nom = mktime(0,0,0,$mois,$j,$annee);
418                $num = intval(date("d", $nom)) ;
419                $numois = date("m",$nom);
420                $nomjour = _T('date_jour_'. (1+date('w',$nom)));
421                $clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') .
422                         ($ancre  ? ('/' . $numois) : ''));
423                $bandeau .=
424                  "\n\t<th class='calendrier-th'>" .
425                  http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) .
426                  "</th>";
427        }
428        return "\n<tr" .
429          (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") .
430          ">$bandeau\n</tr>";
431}
432
433function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt)
434{
435        global $couleur_claire, $spip_ecran, $spip_lang_left;
436
437        $largeur =  ($spip_ecran == "large") ? 90 : 60;
438
439        $today=date("Ymd");
440        $total = '';
441        $style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;";
442        for ($j=$jour; $j<$jour+7;$j++){
443                $v = mktime(0,0,0,$mois, $j, $annee);
444                $total .= "\n<td class='calendrier-td'>" .
445                  http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ?
446                          " background-color: $couleur_claire;" :
447                          ((date("Ymd", $v) == $today) ?
448                           " background-color: white;" :
449                           " background-color: #eeeeee;")))) .
450                  "\n</td>";
451        }
452        return "\n<tr class='calendrier-verdana10'>$total</tr>";
453}
454
455
456function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
457        global $spip_ecran;
458        if (!isset($spip_ecran)) $spip_ecran = 'large';
459
460        return 
461          "\n<table class='calendrier-table-$spip_ecran'>" .
462          "\n<tr><td class='calendrier-td-gauche'></td>" .
463          "<td colspan='5' class='calendrier-td-centre'>" .
464          http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal,
465                                     (nom_jour("$annee-$mois-$jour") . " " .
466                                      affdate_jourcourt("$annee-$mois-$jour")),
467                                     $script,
468                                     array($annee, $mois, ($jour-1), "jour"),
469                                     array($annee, $mois, ($jour+1), "jour"),
470                                     'jour',
471                                     $ancre) .
472          "</td>" .
473          "<td class='calendrier-td-droit calendrier-arial10'></td>" .
474          "</tr>" .
475          (!is_array($evt) ? ("<tr><td>$evt</td></tr>") :
476           (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) .
477            http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt))) .
478          "</table>";
479}
480
481function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
482
483        global $spip_ecran;
484        $finurl = "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre";
485
486        $gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
487        return
488          "\n<tr><td class='calendrier-td-gauche'>" .
489          ($gauche ? '' :
490           http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) .
491          "</td><td colspan='5' class='calendrier-td-centre'>" .
492          (_DIR_RESTREINT ? '' :
493                   ("\n\t<div class='calendrier-titre'>" .
494                    http_calendrier_ics_message($annee, $mois, $jour, true) .
495                    '</div>')) .
496          "</td><td class='calendrier-td-droit calendrier-arial10'> " .
497           (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) .
498          "</td></tr>";
499}
500
501function http_calendrier_jour_sept($annee, $mois, $jour, $echelle,  $partie_cal, $script, $ancre, $evt){
502        global $spip_ecran;
503
504        $gauche = (_DIR_RESTREINT  || ($spip_ecran != "large"));
505        if ($partie_cal!="sansheure")
506                return
507                  "<tr class='calendrier-verdana10'>" .
508                        # afficher en reduction le tableau du jour precedent
509                  "\n<td class='calendrier-td-gauche'>" .
510                  ($gauche  ? '' :
511                   http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) .
512                  "</td><td colspan='5' class='calendrier-td-centre'>" .
513                   http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) .
514                  '</td>' .
515                        # afficher en reduction le tableau du jour suivant
516                  "\n<td class='calendrier-td-droit'>" .
517       
518                  (_DIR_RESTREINT ? '' :
519                   http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) .
520                  '</td>' .
521                  "\n</tr>";
522        else {
523          list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
524          if ($sansduree)
525            foreach($sansduree as $d => $r)
526              $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
527                return
528                  "<tr class='calendrier-verdana10'>" .
529                        # afficher en reduction le tableau du jour precedent
530                  "\n<td class='calendrier-td-gauche'>" .
531                  ($gauche  ? '' :
532                  "<table width='100%'>".
533                   http_calendrier_mois_sept($annee, $mois, $jour-1, $jour-1,$evenements, $script, $ancre)
534                   ."</table>"
535                   ) .
536                  "</td><td colspan='5' class='calendrier-td-centre'>" .
537                  "<table width='100%'>".
538                   http_calendrier_mois_sept($annee, $mois, $jour, $jour,$evenements, $script, $ancre) .
539                   "</table>" .
540                  '</td>' .
541                        # afficher en reduction le tableau du jour suivant
542                  "\n<td class='calendrier-td-droit'>" .
543                  (_DIR_RESTREINT ? '' :
544                  "<table width='100%'>".
545                   http_calendrier_mois_sept($annee, $mois, $jour+1, $jour+1,$evenements, $script, $ancre)
546                   ."</table>"
547                   ) .
548                  '</td>' .
549                  "\n</tr>";
550               
551        }
552}
553
554
555// Conversion d'un tableau de champ ics en des balises div positionnees   
556// Le champ categories indique la Classe de CSS a prendre
557// $echelle est le nombre de secondes representees par 1 pixel
558
559function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal,  $largeur, $evt, $style='') {
560        global $spip_lang_left;
561
562        // tableau
563        if ($partie_cal == "soir") {
564                $debut = 12;
565                $fin = 23;
566        } else if ($partie_cal == "matin") {
567                $debut = 4;
568                $fin = 15;
569        } else {
570                $debut = 7;
571                $fin =21;
572        }
573       
574        if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
575
576        list($dimheure, $dimjour, $fontsize, $padding) =
577          calendrier_echelle($debut, $fin, $echelle);
578        $modif_decalage = round($largeur/8);
579
580        $date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee));
581        list($sansheure, $avecheure) = $evt;
582        $avecheure = $avecheure[$date];
583        $sansheure = $sansheure[$date];
584
585        $total = '';
586
587        if ($avecheure)
588    {
589                $tous = 1 + count($avecheure);
590                $i = 0;
591                foreach($avecheure as $evenement){
592
593                        $d = $evenement['DTSTART'];
594                        $e = $evenement['DTEND'];
595                        $d_jour = substr($d,0,8);
596                        $e_jour = $e ? substr($e,0,8) : $d_jour;
597                        $debut_avant = false;
598                        $fin_apres = false;
599                       
600                        /* disparues sauf erreur
601                         $radius_top = " radius-top";
602                        $radius_bottom = " radius-bottom";
603                        */
604                        if ($d_jour <= $date AND $e_jour >= $date)
605                        {
606
607                        $i++;
608
609                        // Verifier si debut est jour precedent
610                        if (substr($d,0,8) < $date)
611                        {
612                                $heure_debut = 0; $minutes_debut = 0;
613                                $debut_avant = true;
614                                $radius_top = "";
615                        }
616                        else
617                        {
618                                $heure_debut = substr($d,-6,2);
619                                $minutes_debut = substr($d,-4,2);
620                        }
621
622                        if (!$e)
623                        {
624                                $heure_fin = $heure_debut ;
625                                $minutes_fin = $minutes_debut ;
626                                $bordure = "border-bottom: dashed 2px";
627                        }
628                        else
629                        {
630                                $bordure = "";
631                                if (substr($e,0,8) > $date)
632                                {
633                                        $heure_fin = 23; $minutes_fin = 59;
634                                        $fin_apres = true;
635                                        $radius_bottom = "";
636                                }
637                                else
638                                {
639                                        $heure_fin = substr($e,-6,2);
640                                        $minutes_fin = substr($e,-4,2);
641                                }
642                        }
643                       
644                        if ($debut_avant && $fin_apres)  $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);";
645                        else $opacity = "";
646                                               
647                        $haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize);
648                        $bas =  !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
649                        $hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize);
650
651                        if ($bas_prec >= $haut) $decale += $modif_decalage;
652                        else $decale = (4 * $fontsize);
653                        if ($bas > $bas_prec) $bas_prec = $bas;
654                       
655                        $url = $evenement['URL'];
656                        $desc = propre($evenement['DESCRIPTION']);
657                        $perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
658                        $lieu = $evenement['LOCATION'];
659                        $sum = ereg_replace(' +','&nbsp;', typo($evenement['SUMMARY']));
660                        if (!$sum) { $sum = $desc; $desc = '';}
661                        if (!$sum) { $sum = $lieu; $lieu = '';}
662                        if (!$sum) { $sum = $perso; $perso = '';}
663                        if ($sum)
664                          $sum = "<span class='calendrier-verdana10'><span  style='font-weight: bold;'>$sum</span>$lieu $perso</span>";
665                        if (($largeur > 90) && $desc)
666                          $sum .=  "\n<br /><span class='calendrier-noir'>$desc</span>";
667                        $colors = $evenement['CATEGORIES'];
668                  $sum = ((!$url) ? $sum : http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors));
669                        $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'ics'),'data'=>$sum));
670
671                        $total .= "\n<div class='calendrier-arial10 $colors'
672        style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " .
673                                $i .
674                                "; $spip_lang_left: " .
675                                $decale .
676                                "px; top: " .
677                                $haut .
678                                "px; height: " .
679                                $hauteur .
680                                "px; width: ".
681                                ($largeur - 2 * ($padding+1)) .
682                                "px; font-size: ".
683                                floor($fontsize * 1.3) .
684                                "px; padding: " .
685                                $padding .
686                                "px; $bordure'
687        onmouseover=\"this.style.zIndex=" . $tous . "\"
688        onmouseout=\"this.style.zIndex=" . $i . "\">" .
689                          $sum .
690                                "</div>";
691                        }
692                }
693    }
694        return
695           "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" .
696          http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) .
697          $total .
698          "\n</div>" .
699          (!$sansheure ? "" :
700           http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ;
701
702}
703
704# Affiche une grille horaire
705# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes.
706
707function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize)
708{
709        global $spip_lang_left, $spip_lang_right;
710        $slice = floor($dimheure/(2*$fontsize));
711        if ($slice%2) $slice --;
712        if (!$slice) $slice = 1;
713
714        $total = '';
715        for ($i = $debut; $i < $fin; $i++) {
716                for ($j=0; $j < $slice; $j++)
717                {
718                        $total .= "\n<div class='calendrier-heure" .
719                                ($j  ? "face" : "pile") .
720                                "' style='$spip_lang_left: 0px; top: ".
721                                calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) .
722                                "px;'>$i:" .
723                                sprintf("%02d",floor(($j*60)/$slice)) .
724                                "</div>";
725                }
726        }
727
728        return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" .
729                $total .
730                "\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ".
731                calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize).
732                "px;'>$fin:00</div>" .
733                "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ".
734                ($dimjour - $fontsize - 2) .
735                "px;'>23:59</div>";
736}
737
738# si la largeur le permet, les evenements sans duree,
739# se placent a cote des autres, sinon en dessous
740
741function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border)
742{
743        global $spip_lang_left;
744
745        $types = array();
746        foreach($evt as $v)
747          $types[isset($v['DESCRIPTION']) ? 'info_articles' :
748                 (isset($v['DTSTART']) ? 'info_liens_syndiques_3' :
749                  'info_breves_02')][] = $v;
750        $res = '';
751        foreach ($types as $k => $v) {
752          $res2 = '';
753          foreach ($v as $evenement) {
754            $res2 .= http_calendrier_sans_heure($evenement);
755          }
756          $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>".
757            _T($k) .
758            "</div>" .
759            $res2;
760        }
761               
762        if ($largeur > 90) {
763                $largeur += (5*$fontsize);
764                $pos = "-$dimjour";
765        } else { $largeur = (3*$fontsize); $pos= 0; }
766         
767        return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>";
768}
769
770function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='')
771{
772        $date = mktime(0,0,0,$mois, $jour, $annee);
773        $jour = date("d",$date);
774        $mois = date("m",$date);
775        $annee = date("Y",$date);
776        $nom = affdate_jourcourt("$annee-$mois-$jour");
777        return "<div class='calendrier-arial10 calendrier-titre'>" .
778          http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') .
779          "</div>";
780}
781
782
783function http_calendrier_sans_date($annee, $mois, $evenements)
784{
785  $r = $evenements[0+($annee . $mois . "00")];
786  if (!$r) return "";
787  $res = "\n<div class='calendrier-arial10 calendrier-titre'>".
788    _T('info_mois_courant').
789    "</div>";
790  foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement);
791  return $res;
792}
793
794
795function http_calendrier_sans_heure($ev)
796{
797        $desc = propre($ev['DESCRIPTION']);
798        $sum = $ev['SUMMARY'];
799        if (!$sum) $sum = $desc;
800        $i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre
801        if ($ev['URL'])
802          $sum = http_href(quote_amp($ev['URL']), $sum, $desc);
803        $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$ev,'type'=>'sans_heure'),'data'=>$sum));
804        return "\n<div class='calendrier-arial$i calendrier-evenement'>" .
805          "<span class='" . $ev['CATEGORIES'] . "'>&nbsp;</span>&nbsp;$sum</div>";
806}
807
808function http_calendrier_avec_heure($evenement, $amj)
809{
810        $jour_debut = substr($evenement['DTSTART'], 0,8);
811        $jour_fin = substr($evenement['DTEND'], 0, 8);
812        if ($jour_fin <= 0) $jour_fin = $jour_debut;
813        if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj))
814          return "";
815       
816        $desc = propre($evenement['DESCRIPTION']);
817        $sum = $evenement['SUMMARY'];
818        if (!$sum) $sum = $desc;
819        $sum = ereg_replace(' +','&nbsp;', typo($sum));
820        if ($lieu = $evenement['LOCATION'])
821          $sum .= '<br />' . $lieu;
822        if ($perso = $evenement['ATTENDEE'])
823          $sum .=  '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@'));
824        if ($evenement['URL'])
825          $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px');
826
827        $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'avec_heure'),'data'=>$sum));
828        $opacity = "";
829        $deb_h = substr($evenement['DTSTART'],-6,2);
830        $deb_m = substr($evenement['DTSTART'],-4,2);
831        $fin_h = substr($evenement['DTEND'],-6,2);
832        $fin_m = substr($evenement['DTEND'],-4,2);
833       
834        if ($deb_h >0 OR $deb_m > 0) {
835          if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut)
836            { $deb = "<span  style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';}
837          else {
838            $deb = '...';
839          }
840         
841          if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin)
842            { $fin = "<span  style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';}
843          else {
844            $fin = '...';
845          }
846         
847          if ($amj == $jour_debut OR $amj == $jour_fin) {
848            $sum = "<div>$deb-$fin</div>$sum";
849          } else {
850            $opacity =' calendrier-opacity';
851          }
852        }
853        return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n";
854}
855
856# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee):
857# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee
858# 2 icones de loupes pour zoom sur la meme date et le meme type
859# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre
860# et le $nom du calendrier
861
862function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre)
863{
864        global $spip_lang_right, $spip_lang_left, $couleur_foncee;
865
866        if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
867
868        if ($args_pred) {
869          list($a, $m, $j, $t) = $args_pred;
870          $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
871                                 http_img_pack("fleche-$spip_lang_left.png", '&lt;&lt;&lt;', "class='calendrier-png'"),
872                                 _T('precedent'));
873        }
874
875        if ($args_suiv) {
876          list($a, $m, $j, $t) = $args_suiv;
877          $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
878                                 http_img_pack("fleche-$spip_lang_right.png",  '&gt;&gt;&gt;', "class='calendrier-png'"),
879                                 _T('suivant'));
880        }
881
882        $today=getdate(time());
883        $jour_today = $today["mday"];
884        $mois_today = $today["mon"];
885        $annee_today = $today["year"];
886
887        $id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre);
888
889        return
890          "<div class='navigation-calendrier calendrier-moztop8'"
891          . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'")
892          . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>"
893          . (($type == "mois") ? '' :
894             (
895                  http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=sansheure$ancre"),
896                                 "sans-heure.gif",
897                                 "class='calendrier-png" .
898                                 (($partie_cal == "sansheure") ? " calendrier-opacity'" : "'"),
899                                 _T('sans_heure'))
900                  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=tout$ancre"),
901                                 "heures-tout.png",
902                                 "class='calendrier-png" .
903                                 (($partie_cal == "tout") ? " calendrier-opacity'" : "'"),
904                                 _T('cal_jour_entier'))
905                  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=matin$ancre"),
906                                 "heures-am.png",
907                                 "class='calendrier-png" .
908                                 (($partie_cal == "matin") ? " calendrier-opacity'" : "'"),
909                                 _T('cal_matin'))
910
911                  .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;echelle=$echelle&amp;partie_cal=soir$ancre"),
912                                 "heures-pm.png",
913                                 "class='calendrier-png" .
914                                 (($partie_cal == "soir") ? " calendrier-opacity'" : "'"),
915                                 _T('cal_apresmidi'))
916                  . "&nbsp;"
917                  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
918                                          floor($echelle * 1.5)) . $ancre,
919                                         "loupe-moins.gif",
920                                         '',
921                                         _T('info_zoom'). '-')
922                  . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&amp;partie_cal=$partie_cal&amp;echelle=" .
923                                          floor($echelle / 1.5)) . $ancre,
924                                         "loupe-plus.gif",
925                                         '',
926                                         _T('info_zoom'). '+')
927                  ))
928          . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-jour.gif",
929                          (($type == 'jour') ? " class='calendrier-opacity'" : ''),
930                          _T('cal_par_jour'))
931
932          . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"), "cal-semaine.gif",
933                          (($type == 'semaine') ?  " class='calendrier-opacity'" : "" ),
934                          _T('cal_par_semaine'))
935
936          . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),"cal-mois.gif",
937                          (($type == 'mois') ? " class='calendrier-opacity'" : "" ),
938                          _T('cal_par_mois'))
939          . "</div>"
940          . "&nbsp;&nbsp;"
941          . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre"),
942                          "cal-today.gif",
943                          (" onmouseover=\"montrer('$id');\"" .
944                           (($annee == $annee_today && $mois == $mois_today && (($type == 'mois')  || ($jour == $jour_today)))
945                            ? " class='calendrier-opacity'" : "")),
946                          _T("ecrire:info_aujourdhui"))
947          . "&nbsp;"
948          . $args_pred
949          . $args_suiv
950          . "&nbsp;&nbsp;"
951          . $nom
952          . (_DIR_RESTREINT ? '' :  aide("messcalen"))
953          . "</div>"
954          . http_calendrier_invisible($annee, $mois, $jour, $script, "&amp;echelle=$echelle&amp;partie_cal=$partie_cal$ancre", $id);
955}
956
957
958// fabrique un petit agenda accessible par survol
959
960function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id)
961{
962        global $spip_lang_right, $spip_lang_left, $couleur_claire;
963        $gadget = "<div style='position: relative;z-index: 1000;'
964                        onmouseover=\"montrer('$id');\"
965                        onmouseout=\"cacher('$id');\">"
966          . "<table id='$id' class='calendrier-cadreagenda'"
967          . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'")
968          . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>";
969
970        $annee_avant = $annee - 1;
971        $annee_apres = $annee + 1;
972
973        for ($i=$mois; $i < 13; $i++) {
974          $nom = nom_mois("$annee_avant-$i-1");
975          $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre),
976                                     $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ;
977                        }
978        for ($i=1; $i < $mois - 1; $i++) {
979          $nom = nom_mois("$annee-$i-1");
980          $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
981                                        $nom,$nom . ' ' . $annee,'', 'calendrier-annee');
982                        }
983        $gadget .= "</td></tr>"
984                . "\n<tr><td class='calendrier-tripleagenda'>"
985                . http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
986                . "</td>\n<td class='calendrier-tripleagenda'>"
987          . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
988                . "</td>\n<td class='calendrier-tripleagenda'>"
989          . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
990                . "</td>"
991                . "</tr>"
992                . "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>";
993        for ($i=$mois+2; $i <= 12; $i++) {
994          $nom = nom_mois("$annee-$i-1");
995          $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre),
996                                        $nom,$nom . ' ' . $annee,'', 'calendrier-annee');
997                        }
998        for ($i=1; $i < $mois+1; $i++) {
999          $nom = nom_mois("$annee_apres-$i-1");
1000          $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre),
1001                                        $nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee');
1002                        }
1003        return $gadget . "</td></tr></table></div>";
1004}
1005
1006// agenda mensuel
1007
1008function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false,  $script='', $ancre='', $evt='') {
1009
1010  if (!$script) $script =  $GLOBALS['PHP_SELF'] ;
1011
1012  if (!$mois) {$mois = 12; $annee--;}
1013  elseif ($mois==13) {$mois = 1; $annee++;}
1014  if (!$evt) $evt = sql_calendrier_agenda($annee, $mois);
1015  $nom = affdate_mois_annee("$annee-$mois-1");
1016  return
1017    "<div class='calendrier-titre calendrier-arial10'>" .
1018    http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre),
1019              $nom, $nom,
1020              'color: black;') .
1021    "<table width='100%' cellspacing='0' cellpadding='0'>" .
1022    http_calendrier_agenda_rv ($annee, $mois, $evt,                             
1023                                'http_calendrier_clic', array($script, $ancre),
1024                                $jour_ved, $mois_ved, $annee_ved,
1025                                $semaine) .
1026    "</table>" .
1027    "</div>";
1028}
1029
1030function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso)
1031{
1032
1033  list($script, $ancre) = $perso;
1034
1035  return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre),
1036                   $jour,
1037                   "$jour-$mois-$annee",
1038                   "color: $couleur; font-weight: bold");
1039}
1040
1041// typographie un mois sous forme d'un tableau de 7 colonnes
1042
1043function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='',
1044                                    $jour_ved='', $mois_ved='', $annee_ved='',
1045                                    $semaine='') {
1046        global $couleur_foncee, $spip_lang_left, $spip_lang_right;
1047
1048        // Former une date correcte (par exemple: $mois=13; $annee=2003)
1049        $date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
1050        $mois = mois($date_test);
1051        $annee = annee($date_test);
1052        if ($semaine)
1053        {
1054                $jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved));
1055                if ($jour_semaine_valide==0) $jour_semaine_valide=7;
1056                $debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved);
1057                $fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved);
1058        } else { $debut = $fin = '';}
1059       
1060        $today=getdate(time());
1061        $jour_today = $today["mday"];
1062        $cemois = ($mois == $today["mon"] AND $annee ==  $today["year"]);
1063
1064        $total = '';
1065        $ligne = '';
1066        $jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee));
1067        if ($jour_semaine==0) $jour_semaine=7;
1068        for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>";
1069        $style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'";
1070        for ($j=1; (checkdate($mois,$j,$annee)); $j++) {
1071                $style = "";
1072                $nom = mktime(1,1,1,$mois,$j,$annee);
1073                $jour_semaine = date("w",$nom);
1074                if ($jour_semaine==0) $jour_semaine=7;
1075
1076                if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) {
1077                  $class= 'calendrier-arial11 calendrier-demiagenda';
1078                  $type = 'jour';
1079                  $couleur = "black";
1080                  } else if ($semaine AND $nom >= $debut AND $nom <= $fin) {
1081                  $class= 'calendrier-arial11 calendrier-demiagenda' .
1082                      (($jour_semaine==1) ? " calendrier-$spip_lang_left"  :
1083                       (($jour_semaine==7) ? " calendrier-$spip_lang_right" :
1084                        ''));
1085                  $type = ($semaine ? 'semaine' : 'jour') ;
1086                  $couleur = "black";
1087                } else {
1088                  if ($j == $jour_today AND $cemois) {
1089                        $style = $couleur_foncee;
1090                        if(!$style) $style = '#333333';
1091                        $couleur = "white";
1092                    } else {
1093                        if ($jour_semaine == 7) {
1094                                $style = "#aaaaaa";
1095                                $couleur = 'white';
1096                        } else {
1097                                $style = "#ffffff";
1098                                $couleur = "#aaaaaa";
1099                        }
1100                        if ($les_rv[$j] > 0) {
1101                          $style = "#ffffff";
1102                          $couleur = "black";
1103                        }
1104                  }
1105                  $class= 'calendrier-arial11 calendrier-agenda';
1106                  $type = ($semaine ? 'semaine' : 'jour') ;
1107                }
1108                if ($style)
1109                  $style = " style='background-color: $style'";
1110                else $style = $style0;
1111                $ligne .= "\n\t<td><div class='$class'$style>" .
1112                  $fclic($annee,$mois, $j, $type, $couleur, $perso) .
1113                  "</div></td>";
1114                if ($jour_semaine==7)
1115                    {
1116                      if ($ligne) $total .= "\n<tr>$ligne\n</tr>";
1117                      $ligne = '';
1118                    }
1119        }
1120        return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>");
1121}
1122
1123
1124function calendrier_categories($table, $num, $objet)
1125{
1126  if (function_exists('generer_calendrier_class'))
1127    return generer_calendrier_class($table, $num, $objet);
1128  else {
1129    // cf calendrier.css
1130    $result= spip_fetch_array(spip_query("SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . "
1131FROM    $table
1132WHERE   $objet=$num
1133"));
1134    if ($result) $num = $result[0];
1135    return 'calendrier-couleur' . (($num%14)+1);
1136  }
1137}
1138
1139//------- fonctions d'appel MySQL.
1140// au dela cette limite, pas de production HTML
1141
1142function sql_calendrier_mois($annee,$mois,$jour) {
1143        $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'";
1144        $apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) .
1145        " 00:00:00'";
1146        return array($avant, $apres);
1147}
1148
1149function sql_calendrier_semaine($annee,$mois,$jour) {
1150        $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee));
1151        if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero
1152        $debut = $jour-$w_day;
1153        $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'";
1154        $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) .
1155        " 23:59:59'";
1156        return array($avant, $apres);
1157}
1158
1159// ici on prend en fait le jour, la veille et le lendemain
1160
1161function sql_calendrier_jour($annee,$mois,$jour) {
1162        $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
1163        $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
1164        " 23:59:59'";
1165        return array($avant, $apres);
1166}
1167
1168// retourne un tableau de 2 tableaux indexes par des dates
1169// - le premier indique les evenements du jour, sans indication de duree
1170// - le deuxime indique les evenements commencant ce jour, avec indication de duree
1171
1172function sql_calendrier_interval($limites) {
1173        list($avant, $apres) = $limites;
1174        $evt = array();
1175        sql_calendrier_interval_articles($avant, $apres, $evt);
1176        sql_calendrier_interval_breves($avant, $apres, $evt);
1177        sql_calendrier_interval_rubriques($avant, $apres, $evt);
1178        return array($evt, sql_calendrier_interval_rv($avant, $apres));
1179}
1180
1181function  sql_calendrier_interval_forums($limites, &$evenements) {
1182        list($avant, $apres) = $limites;
1183        $result=spip_query("
1184SELECT  DISTINCT titre, date_heure, id_forum
1185FROM    spip_forum
1186WHERE   date_heure >= $avant
1187 AND    date_heure < $apres
1188ORDER BY date_heure
1189");
1190        while($row=spip_fetch_array($result)){
1191                $amj = date_anneemoisjour($row['date_heure']);
1192                $id = $row['id_forum'];
1193                $evenements[$amj][]=
1194                array(
1195                        'URL' => generer_url_forum($id),
1196                        'CATEGORIES' => 'calendrier-couleur7',
1197                        'SUMMARY' => $row['titre'],
1198                        'DTSTART' => date_ical($row['date_heure']));
1199        }
1200}
1201
1202# 3 fonctions retournant les evenements d'une periode
1203# le tableau retourne est indexe par les balises du format ics
1204# afin qu'il soit facile de produire de tels documents.
1205
1206function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
1207       
1208        $result=spip_query("
1209SELECT  id_article, titre, date, descriptif, chapo
1210FROM    spip_articles
1211WHERE   statut='publie'
1212 AND    date >= $avant
1213 AND    date < $apres
1214ORDER BY date
1215");
1216        while($row=spip_fetch_array($result)){
1217                $amj = date_anneemoisjour($row['date']);
1218                $id = $row['id_article'];
1219                $evenements[$amj][]=
1220                    array(
1221                          'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
1222                        'DESCRIPTION' => $row['descriptif'],
1223                        'SUMMARY' => $row['titre'],
1224                        'URL' => generer_url_article($id, 'prop'));
1225        }
1226}
1227
1228function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
1229       
1230        $result=spip_query("
1231SELECT  DISTINCT R.id_rubrique, titre, descriptif, date
1232FROM    spip_rubriques AS R, spip_documents_rubriques AS L
1233WHERE   statut='publie'
1234 AND    date >= $avant
1235 AND    date < $apres
1236 AND    R.id_rubrique = L.id_rubrique
1237ORDER BY date
1238");
1239        while($row=spip_fetch_array($result)){
1240                $amj = date_anneemoisjour($row['date']);
1241                $id = $row['id_rubrique'];
1242                $evenements[$amj][]=
1243                    array(
1244                          'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
1245                        'DESCRIPTION' => $row['descriptif'],
1246                        'SUMMARY' => $row['titre'],
1247                        'URL' => generer_url_rubrique($id, 'prop'));
1248        }
1249}
1250
1251function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
1252        $result=spip_query("
1253SELECT  id_breve, titre, date_heure, id_rubrique
1254FROM    spip_breves
1255WHERE   statut='publie'
1256 AND    date_heure >= $avant
1257 AND    date_heure < $apres
1258ORDER BY date_heure
1259");
1260        while($row=spip_fetch_array($result)){
1261                $amj = date_anneemoisjour($row['date_heure']);
1262                $id = $row['id_breve'];
1263                $ir = $row['id_rubrique'];
1264                $evenements[$amj][]=
1265                array(
1266                      'URL' => generer_url_breve($id, 'prop'),
1267                      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
1268                      'SUMMARY' => $row['titre']);
1269        }
1270}
1271
1272function sql_calendrier_interval_rv($avant, $apres) {
1273        global $connect_id_auteur;
1274        $evenements= array();
1275        if (!$connect_id_auteur) return $evenements;
1276        $result=spip_query("
1277SELECT  messages.id_message, messages.titre, messages.texte,
1278        messages.date_heure, messages.date_fin, messages.type
1279FROM    spip_messages AS messages,
1280        spip_auteurs_messages AS lien
1281WHERE   ((lien.id_auteur='$connect_id_auteur'
1282 AND    lien.id_message=messages.id_message) OR messages.type='affich')
1283 AND    messages.rv='oui'
1284 AND    ((messages.date_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres)
1285 AND    messages.statut='publie'
1286GROUP BY messages.id_message
1287ORDER BY messages.date_heure
1288");
1289        while($row=spip_fetch_array($result)){
1290                $date_heure=$row["date_heure"];
1291                $date_fin=$row["date_fin"];
1292                $type=$row["type"];
1293                $id_message=$row['id_message'];
1294
1295                if ($type=="pb")
1296                  $cat = 'calendrier-couleur2';
1297                else {
1298                  if ($type=="affich")
1299                  $cat = 'calendrier-couleur4';
1300                  else {
1301                    if ($type!="normal")
1302                      $cat = 'calendrier-couleur12';
1303                    else {
1304                      $cat = 'calendrier-couleur9';
1305                      $auteurs = array();
1306                      $result_aut=spip_query("
1307SELECT  auteurs.nom
1308FROM    spip_auteurs AS auteurs,
1309        spip_auteurs_messages AS lien
1310WHERE   (lien.id_message='$id_message'
1311  AND   (auteurs.id_auteur!='$connect_id_auteur'
1312  AND   lien.id_auteur=auteurs.id_auteur))");
1313                        while($row_auteur=spip_fetch_array($result_aut)){
1314                                $auteurs[] = $row_auteur['nom'];
1315                        }
1316                    }
1317                  }
1318                }
1319
1320                $jour_avant = substr($avant, 9,2);
1321                $mois_avant = substr($avant, 6,2);
1322                $annee_avant = substr($avant, 1,4);
1323                $jour_apres = substr($apres, 9,2);
1324                $mois_apres = substr($apres, 6,2);
1325                $annee_apres = substr($apres, 1,4);
1326                $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres));
1327
1328                // Calcul pour les semaines a cheval sur deux mois
1329                $j = 0;
1330                $amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant)));
1331
1332                while ($amj <= $ical_apres) {
1333                if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin)))  // Ne pas prendre la fin a minuit sur jour precedent
1334                        $evenements[$amj][$id_message]=
1335                          array(
1336                                'URL' => generer_url_ecrire("message","id_message=$id_message"),
1337                                'DTSTART' => date_ical($date_heure),
1338                                'DTEND' => date_ical($date_fin),
1339                                'DESCRIPTION' => $row['texte'],
1340                                'SUMMARY' => $row['titre'],
1341                                'CATEGORIES' => $cat,
1342                                'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", "));
1343                       
1344                        $j ++;
1345                        $ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant));
1346                       
1347                        $amj = date_anneemoisjour($ladate);
1348
1349                }
1350
1351        }
1352  return $evenements;
1353}
1354
1355// fonction SQL, pour la messagerie
1356
1357function sql_calendrier_taches_annonces () {
1358        global $connect_id_auteur;
1359        $r = array();
1360        if (!$connect_id_auteur) return $r;
1361        $result = spip_query("
1362SELECT * FROM spip_messages
1363WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC");
1364        if (spip_num_rows($result) > 0)
1365                while ($x = spip_fetch_array($result)) $r[] = $x;
1366        return $r;
1367}
1368
1369function sql_calendrier_taches_pb () {
1370        global $connect_id_auteur;
1371        $r = array();
1372        if (!$connect_id_auteur) return $r;
1373        $result = spip_query("
1374SELECT * FROM spip_messages AS messages
1375WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'");
1376        if (spip_num_rows($result) > 0){
1377          $r = array();
1378          while ($x = spip_fetch_array($result)) $r[] = $x;
1379        }
1380        return $r;
1381}
1382
1383function sql_calendrier_taches_rv () {
1384        global $connect_id_auteur;
1385        $r = array();
1386        if (!$connect_id_auteur) return $r;
1387        $result = spip_query("
1388SELECT messages.*
1389FROM spip_messages AS messages, spip_auteurs_messages AS lien
1390WHERE ((lien.id_auteur='$connect_id_auteur'
1391        AND lien.id_message=messages.id_message)
1392        OR messages.type='affich')
1393AND messages.rv='oui'
1394AND ( (messages.date_heure > DATE_SUB(NOW(), INTERVAL 1 DAY)
1395        AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH))
1396        OR (messages.date_heure < NOW() AND messages.date_fin > NOW() ))
1397AND messages.statut='publie'
1398GROUP BY messages.id_message
1399ORDER BY messages.date_heure");
1400        if (spip_num_rows($result) > 0){
1401          $r = array();
1402          while ($x = spip_fetch_array($result)) $r[] = $x;
1403        }
1404        return  $r;
1405}
1406
1407function sql_calendrier_agenda ($annee, $mois) {
1408        global $connect_id_auteur;
1409
1410        $rv = array();
1411        if (!$connect_id_auteur) return $rv;
1412        $date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
1413        $mois = mois($date);
1414        $annee = annee($date);
1415
1416        // rendez-vous personnels dans le mois
1417        $result_messages=spip_query("SELECT messages.date_heure FROM spip_messages AS messages, spip_auteurs_messages AS lien WHERE ((lien.id_auteur='$connect_id_auteur' AND lien.id_message=messages.id_message) OR messages.type='affich') AND messages.rv='oui' AND messages.date_heure >='$annee-$mois-1' AND date_heure < DATE_ADD('$annee-$mois-1', INTERVAL 1 MONTH) AND messages.statut='publie'");
1418        while($row=spip_fetch_array($result_messages)){
1419                $rv[journum($row['date_heure'])] = 1;
1420        }
1421        return $rv;
1422}
1423
1424?>
Note: See TracBrowser for help on using the repository browser.