Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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