From 0e0e98fae39b3606928768f1a1c3a3984937b33d Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Fri, 20 Jan 2006 13:37:21 +0000 Subject: [PATCH] eclatement de inc_calendrier pour qu'il ne soit plus charge a la fois automatiquement et manuellement. Les criteres et filtres chargeant auparavant ce fichier peuvent continuer a le faire, mais il est plus efficace de ne charger que inc_agenda --- .gitattributes | 1 + ecrire/inc_agenda.php | 1452 +++++++++++++++++++++++++++++++++++++ ecrire/inc_calendrier.php | 1436 +----------------------------------- 3 files changed, 1454 insertions(+), 1435 deletions(-) create mode 100644 ecrire/inc_agenda.php diff --git a/.gitattributes b/.gitattributes index b821cf266c..61d1d36703 100644 --- a/.gitattributes +++ b/.gitattributes @@ -262,6 +262,7 @@ ecrire/inc_admin_index.php -text ecrire/inc_admin_repair.php -text ecrire/inc_admin_tech.php -text ecrire/inc_admin_vider.php -text +ecrire/inc_agenda.php -text ecrire/inc_aide_index.php -text ecrire/inc_ajax.php3 -text ecrire/inc_ajax_page.php -text diff --git a/ecrire/inc_agenda.php b/ecrire/inc_agenda.php new file mode 100644 index 0000000000..7deae615a8 --- /dev/null +++ b/ecrire/inc_agenda.php @@ -0,0 +1,1452 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2006 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +if (!defined("_ECRIRE_INC_VERSION")) return; + +include_ecrire("inc_presentation"); // inclut inc_layer +include_ecrire("inc_texte"); // inclut inc_filtre + +charger_generer_url(); + +// Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus) + +// Notes: pour toutes les fonctions ayant parmi leurs parametres +// annee, mois, jour, echelle, partie_cal, script, ancre +// ceux-ci apparaissent TOUJOURS dans cet ordre + +define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes + +// +// Utilitaires sans html ni sql +// + +// utilitaire de separation script / ancre +// et de retrait des arguments a remplacer + +function calendrier_retire_args_ancre($script) +{ + $script = str_replace('?bonjour=oui&?','?',$script); + if (ereg('^(.*)(#[^=&]*)$',$script, $m)) { + $script = $m[1]; + $ancre = $m[2]; + } else { $ancre = ''; } + if ($script[strlen($script)-1] == '?') $script = substr($script,0,-1); + foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) { + $script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script); + $script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script); + } + return array($script, $ancre); +} + +// tous les liens de navigations sont issus de cette fonction +// on peut definir generer_url_date et un htacces pour simplifier les URL + +function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) +{ + if (function_exists('generer_url_date')) + return generer_url_date($script, $annee, $mois, $jour, $type, $finurl); + else return $script . + (ereg('[?&]$', $script) ? "" : (strpos($script,'?') ? '&' : '?')) . + 'annee=' . sprintf("%04d", $annee) . '&' . + 'mois=' . sprintf("%02d", $mois) . '&' . + 'jour=' . sprintf("%02d", $jour) . '&' . + 'type=' . $type . + quote_amp($finurl); +} + +# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel) +# et retourne un tableau compose +# - taille d'une heure +# - taille d'une journee +# - taille de la fonte +# - taille de la marge + +function calendrier_echelle($debut, $fin, $echelle) +{ + if ($echelle==0) $echelle = DEFAUT_D_ECHELLE; + if ($fin <= $debut) $fin = $debut +1; + + $duree = $fin - $debut; + $dimheure = floor((3600 / $echelle)); + return array($dimheure, + (($duree+2) * $dimheure), + floor (14 / (1+($echelle/240))), + floor(240 / $echelle)); +} + +# Calcule le "top" d'une heure + +function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) { + + $h_heure = substr($heure, 0, strpos($heure, ":")); + $m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure)); + $heure100 = $h_heure + ($m_heure/60); + + if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1; + if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin; + + $top = floor(($heure100 - $debut + 1) * $dimheure); + + return $top; +} + +# Calcule la hauteur entre deux heures +function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) { + + $height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) + - calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize); + + $padding = floor(($dimheure / 3600) * 240); + $height = $height - (2* $padding + 2); // pour padding interieur + + if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases + + return $height; +} + +// +// init: calcul generique des evenements a partir des tables SQL +// + +function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='') +{ + global $mois, $annee, $jour, $type, $echelle, $partie_cal; + + if (!$time) + { + if (!$mois) + $time = time(); + else + $time = mktime(0,0,0,$mois,$jour,$annee); + $type= 'mois'; + } + + $jour = date("d",$time); + $mois = date("m",$time); + $annee = date("Y",$time); + if (!$ltype) $ltype = $type ? $type : 'mois'; + if (!$lechelle) $lechelle = $echelle; + if (!$lpartie_cal) $lpartie_cal = $partie_cal; + list($script, $ancre) = + calendrier_retire_args_ancre($script ? $script : + $GLOBALS['clean_link']->getUrl()); + if (!$evt) { + $g = 'sql_calendrier_' . $ltype; + $evt = sql_calendrier_interval($g($annee,$mois, $jour)); + sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]); + // si on veut les forums, decommenter +# sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]); + } + $f = 'http_calendrier_' . $ltype; + return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt); + +} + +# affichage d'un calendrier de plusieurs semaines +# si la periode est inferieure a 31 jours, on considere que c'est un mois + +function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) +{ + global $spip_ecran; + if (!isset($spip_ecran)) $spip_ecran = 'large'; + $premier_jour = '01'; + $dernier_jour = '31'; + + if (is_array($evt)) { + list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt; + if (!$premier_jour) $premier_jour = '01'; + if (!$dernier_jour) + { + $dernier_jour = 31; + while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--; + } + if ($sansduree) + foreach($sansduree as $d => $r) + $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r); + $evt = + http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) . + http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&echelle=$echelle&partie_cal=$partie_cal$ancre") ; + } + + return + "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" . + http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) . + $evt . + '</table>' . + http_calendrier_sans_date($annee, $mois, $evenements) . + (_DIR_RESTREINT ? "" : http_calendrier_aide_mess()); +} + +// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc +// pas de navigation suivant/precedent alors + +function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){ + if ($dernier_jour > 31) { + $prec = $suiv = ''; + $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))); + } else { + + $mois_suiv=$mois+1; + $annee_suiv=$annee; + $mois_prec=$mois-1; + $annee_prec=$annee; + if ($mois==1){ + $mois_prec=12; + $annee_prec=$annee-1; + } + else if ($mois==12){$mois_suiv=1; $annee_suiv=$annee+1;} + $prec = array($annee_prec, $mois_prec, 1, "mois"); + $suiv = array($annee_suiv, $mois_suiv, 1, "mois"); + $periode = affdate_mois_annee("$annee-$mois-1"); + } + return + "\n<tr><td colspan='7'>" . + http_calendrier_navigation($annee, + $mois, + $jour, + $echelle, + $partie_cal, + $periode, + $script, + $prec, + $suiv, + 'mois', + $ancre) . + "</td></tr>"; + +} + +function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){ + global $couleur_claire; + + $bandeau =""; + for ($j=1; $j<8;$j++){ + $bandeau .= + "\n\t<th class='calendrier-th'>" . + _T('date_jour_' . (($j%7)+1)) . + "</th>"; + } + return "\n<tr" . + (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . + ">$bandeau\n</tr>"; +} + +# dispose les lignes d'un calendrier de 7 colonnes (les jours) +# chaque case est garnie avec les evenements du jour figurant dans $evenements + +function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='') +{ + global $couleur_claire, $spip_lang_left, $spip_lang_right; + + if (!ereg('[?&]$', $script)) + $script .= (strpos($script,'?') ? '&' : '?'); + + // affichage du debut de semaine hors periode + $init = ''; + $debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee)); + for ($i=$debut ? $debut : 7;$i>1;$i--) + {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\"> </td>";} + + $total = ''; + $ligne = ''; + $today=date("Ymd"); + for ($j=$premier_jour; $j<=$dernier_jour; $j++){ + $nom = mktime(1,1,1,$mois,$j,$annee); + $jour = date("d",$nom); + $jour_semaine = date("w",$nom); + $mois_en_cours = date("m",$nom); + $annee_en_cours = date("Y",$nom); + $amj = date("Y",$nom) . $mois_en_cours . $jour; + $couleur_texte = "black"; + $couleur_fond = ""; + + if ($jour_semaine == 0) $couleur_fond = $couleur_claire; + else if ($jour_semaine==1) + { + if ($ligne||$init) + $total .= "\n<tr>$init$ligne\n</tr>"; + $ligne = $init = ''; + } + + if ($amj == $today) { + $couleur_texte = "red"; + $couleur_fond = "white"; + } + $res = ''; + if ($evts = $evenements[$amj]) { + foreach ($evts as $evenement) + { + $res .= isset($evenement['DTSTART']) ? + http_calendrier_avec_heure($evenement, $amj) : + http_calendrier_sans_heure($evenement); + } + } + + $ligne .= "\n\t\t<td\tclass='calendrier-td' + style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" . + ($couleur_fond ? " background-color: $couleur_fond;" : "") . + ($ligne ? "" : + " border-$spip_lang_left: 1px solid $couleur_claire;") . + "'>" . + (!_DIR_RESTREINT ? + (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre), + $jour, + $jour, "color: $couleur_texte",'calendrier-helvetica16') . + http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)): + http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) . + $res . + "\n\t</td>"; + } + return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : ''); +} + +// typo pour l'espace public + +function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre) +{ + $d = mktime(0,0,0,$mois, $jour, $annee); + $semaine = date("W", $d); + return + "<table width='100%'>\n<tr><td style='text-align: left'>". + http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre), + "$jour/$mois", + _T('date_jour_'. (1+date('w',$d))) . + " $jour " . + _T('date_mois_'.(0+$mois)), + '','calendrier-helvetica16') . + "</td><td style='text-align: right'>" . + http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre), + $semaine, + _T('date_semaines') . " $semaine", + '', + 'calendrier-helvetica16') . + "</td></tr>\n</table>"; +} + +# dispose les evenements d'une semaine + +function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) +{ + global $spip_ecran; + if (!isset($spip_ecran)) $spip_ecran = 'large'; + + $init = date("w",mktime(1,1,1,$mois,$jour,$annee)); + $init = $jour+1-($init ? $init : 7); + $sd = ''; + + if (is_array($evt)) + { + $sd = http_calendrier_sans_date($annee, $mois,$evt[0]); + $finurl = "&echelle=$echelle&partie_cal=$partie_cal$ancre"; + $evt = + http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) . + http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt); + } + + return + "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" . + http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) . + $evt . + "</table>" . + $sd . + (_DIR_RESTREINT ? "" : http_calendrier_aide_mess()); +} + +function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){ + + $fin = mktime (1,1,1,$mois, $jour+6, $annee); + $fjour = date("d",$fin); + $fmois = date("m",$fin); + $fannee = date("Y",$fin); + $fin = date("Y-m-d", $fin); + $debut = mktime (1,1,1,$mois, $jour, $annee); + $djour = date("d",$debut)+0; + $dmois = date("m",$debut); + $dannee = date("Y",$debut); + $debut = date("Y-m-d", $debut); + $periode = (($dannee != $fannee) ? + (affdate($debut)." - ".affdate($fin)) : + (($dmois == $fmois) ? + ($djour ." - ".affdate_jourcourt($fin)) : + (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin)))); + + return + "\n<tr><td colspan='7'>" . + http_calendrier_navigation($annee, + $mois, + $jour, + $echelle, + $partie_cal, + $periode, + $script, + array($dannee, $dmois, ($djour-7), "semaine"), + array($fannee, $fmois, ($fjour+1), "semaine"), + 'semaine', + $ancre) . + "</td></tr>\n"; +} + +function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){ + global $couleur_claire; + + $bandeau = ''; + $script .= (ereg('[?&]$', $script) ? "" : (strpos($script,'?') ? '&' : '?')); + for ($j=$jour; $j<$jour+7;$j++){ + $nom = mktime(0,0,0,$mois,$j,$annee); + $num = intval(date("d", $nom)) ; + $numois = date("m",$nom); + $nomjour = _T('date_jour_'. (1+date('w',$nom))); + $clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') . + ($ancre ? ('/' . $numois) : '')); + $bandeau .= + "\n\t<th class='calendrier-th'>" . + http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) . + "</th>"; + } + return "\n<tr" . + (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . + ">$bandeau\n</tr>"; +} + +function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt) +{ + global $couleur_claire, $spip_ecran, $spip_lang_left; + + $largeur = ($spip_ecran == "large") ? 90 : 60; + + $today=date("Ymd"); + $total = ''; + $style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;"; + for ($j=$jour; $j<$jour+7;$j++){ + $v = mktime(0,0,0,$mois, $j, $annee); + $total .= "\n<td class='calendrier-td'>" . + http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ? + " background-color: $couleur_claire;" : + ((date("Ymd", $v) == $today) ? + " background-color: white;" : + " background-color: #eeeeee;")))) . + "\n</td>"; + } + return "\n<tr class='calendrier-verdana10'>$total</tr>"; +} + + +function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){ + global $spip_ecran; + if (!isset($spip_ecran)) $spip_ecran = 'large'; + + return + "\n<table class='calendrier-table-$spip_ecran'>" . + "\n<tr><td class='calendrier-td-gauche'></td>" . + "<td colspan='5' class='calendrier-td-centre'>" . + http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, + (nom_jour("$annee-$mois-$jour") . " " . + affdate_jourcourt("$annee-$mois-$jour")), + $script, + array($annee, $mois, ($jour-1), "jour"), + array($annee, $mois, ($jour+1), "jour"), + 'jour', + $ancre) . + "</td>" . + "<td class='calendrier-td-droit calendrier-arial10'></td>" . + "</tr>" . + (!is_array($evt) ? $evt : + (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) . + http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt))) . + "</table>"; +} + +function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){ + + global $spip_ecran; + $finurl = "&echelle=$echelle&partie_cal=$partie_cal$ancre"; + + $gauche = (_DIR_RESTREINT || ($spip_ecran != "large")); + return + "\n<tr><td class='calendrier-td-gauche'>" . + ($gauche ? '' : + http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) . + "</td><td colspan='5' class='calendrier-td-centre'>" . + (_DIR_RESTREINT ? '' : + ("\n\t<div class='calendrier-titre'>" . + http_calendrier_ics_message($annee, $mois, $jour, true) . + '</div>')) . + "</td><td class='calendrier-td-droit calendrier-arial10'> " . + (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) . + "</td></tr>"; +} + +function http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){ + global $spip_ecran; + + $gauche = (_DIR_RESTREINT || ($spip_ecran != "large")); + return + "<tr class='calendrier-verdana10'>" . + # afficher en reduction le tableau du jour precedent + "\n<td class='calendrier-td-gauche'>" . + ($gauche ? '' : + http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) . + "</td><td colspan='5' class='calendrier-td-centre'>" . + http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) . + '</td>' . + # afficher en reduction le tableau du jour suivant + "\n<td class='calendrier-td-droit'>" . + + (_DIR_RESTREINT ? '' : + http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) . + '</td>' . + "\n</tr>"; +} + + +// Conversion d'un tableau de champ ics en des balises div positionnees +// Le champ categories indique la Classe de CSS a prendre +// $echelle est le nombre de secondes representees par 1 pixel + +function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal, $largeur, $evt, $style='') { + global $spip_lang_left; + + // tableau + if ($partie_cal == "soir") { + $debut = 12; + $fin = 23; + } else if ($partie_cal == "matin") { + $debut = 4; + $fin = 15; + } else { + $debut = 7; + $fin =21; + } + + if ($echelle==0) $echelle = DEFAUT_D_ECHELLE; + + list($dimheure, $dimjour, $fontsize, $padding) = + calendrier_echelle($debut, $fin, $echelle); + $modif_decalage = round($largeur/8); + + $date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee)); + list($sansheure, $avecheure) = $evt; + $avecheure = $avecheure[$date]; + $sansheure = $sansheure[$date]; + + $total = ''; + + if ($avecheure) + { + $tous = 1 + count($avecheure); + $i = 0; + foreach($avecheure as $evenement){ + + $d = $evenement['DTSTART']; + $e = $evenement['DTEND']; + $d_jour = substr($d,0,8); + $e_jour = $e ? substr($e,0,8) : $d_jour; + $debut_avant = false; + $fin_apres = false; + + /* disparues sauf erreur + $radius_top = " radius-top"; + $radius_bottom = " radius-bottom"; + */ + if ($d_jour <= $date AND $e_jour >= $date) + { + + $i++; + + // Verifier si debut est jour precedent + if (substr($d,0,8) < $date) + { + $heure_debut = 0; $minutes_debut = 0; + $debut_avant = true; + $radius_top = ""; + } + else + { + $heure_debut = substr($d,-6,2); + $minutes_debut = substr($d,-4,2); + } + + if (!$e) + { + $heure_fin = $heure_debut ; + $minutes_fin = $minutes_debut ; + $bordure = "border-bottom: dashed 2px"; + } + else + { + $bordure = ""; + if (substr($e,0,8) > $date) + { + $heure_fin = 23; $minutes_fin = 59; + $fin_apres = true; + $radius_bottom = ""; + } + else + { + $heure_fin = substr($e,-6,2); + $minutes_fin = substr($e,-4,2); + } + } + + if ($debut_avant && $fin_apres) $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);"; + else $opacity = ""; + + $haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize); + $bas = !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize); + $hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize); + + if ($bas_prec >= $haut) $decale += $modif_decalage; + else $decale = (4 * $fontsize); + if ($bas > $bas_prec) $bas_prec = $bas; + $url = $evenement['URL']; + $desc = propre($evenement['DESCRIPTION']); + $perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@')); + $lieu = $evenement['LOCATION']; + $sum = ereg_replace(' +',' ', typo($evenement['SUMMARY'])); + if (!$sum) { $sum = $desc; $desc = '';} + if (!$sum) { $sum = $lieu; $lieu = '';} + if (!$sum) { $sum = $perso; $perso = '';} + if ($sum) + $sum = "<span class='calendrier-verdana10'><span style='font-weight: bold;'>$sum</span>$lieu $perso</span>"; + if (($largeur > 90) && $desc) + $sum .= "\n<br /><span class='calendrier-noir'>$desc</span>"; + $colors = $evenement['CATEGORIES']; + + $total .= "\n<div class='calendrier-arial10 $colors' + style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " . + $i . + "; $spip_lang_left: " . + $decale . + "px; top: " . + $haut . + "px; height: " . + $hauteur . + "px; width: ". + ($largeur - 2 * ($padding+1)) . + "px; font-size: ". + floor($fontsize * 1.3) . + "px; padding: " . + $padding . + "px; $bordure' + onmouseover=\"this.style.zIndex=" . $tous . "\" + onmouseout=\"this.style.zIndex=" . $i . "\">" . + ((!$url) ? + $sum : + http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors)) . + "</div>"; + } + } + } + return + "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" . + http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) . + $total . + "\n</div>" . + (!$sansheure ? "" : + http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ; + +} + +# Affiche une grille horaire +# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes. + +function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) +{ + global $spip_lang_left, $spip_lang_right; + $slice = floor($dimheure/(2*$fontsize)); + if ($slice%2) $slice --; + if (!$slice) $slice = 1; + + $total = ''; + for ($i = $debut; $i < $fin; $i++) { + for ($j=0; $j < $slice; $j++) + { + $total .= "\n<div class='calendrier-heure" . + ($j ? "face" : "pile") . + "' style='$spip_lang_left: 0px; top: ". + calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) . + "px;'>$i:" . + sprintf("%02d",floor(($j*60)/$slice)) . + "</div>"; + } + } + + return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" . + $total . + "\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ". + calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize). + "px;'>$fin:00</div>" . + "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ". + ($dimjour - $fontsize - 2) . + "px;'>23:59</div>"; +} + +# si la largeur le permet, les evenements sans duree, +# se placent a cote des autres, sinon en dessous + +function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border) +{ + global $spip_lang_left; + + $types = array(); + foreach($evt as $v) + $types[isset($v['DESCRIPTION']) ? 'info_articles' : + (isset($v['DTSTART']) ? 'info_liens_syndiques_3' : + 'info_breves_02')][] = $v; + $res = ''; + foreach ($types as $k => $v) { + $res2 = ''; + foreach ($v as $evenement) { + $res2 .= http_calendrier_sans_heure($evenement); + } + $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>". + _T($k) . + "</div>" . + $res2; + } + + if ($largeur > 90) { + $largeur += (5*$fontsize); + $pos = "-$dimjour"; + } else { $largeur = (3*$fontsize); $pos= 0; } + + return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>"; +} + +function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='') +{ + $date = mktime(0,0,0,$mois, $jour, $annee); + $jour = date("d",$date); + $mois = date("m",$date); + $annee = date("Y",$date); + $nom = affdate_jourcourt("$annee-$mois-$jour"); + return "<div class='calendrier-arial10 calendrier-titre'>" . + http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') . + "</div>"; +} + + +function http_calendrier_sans_date($annee, $mois, $evenements) +{ + $r = $evenements[0+($annee . $mois . "00")]; + if (!$r) return ""; + $res = "\n<div class='calendrier-arial10 calendrier-titre'>". + _T('info_mois_courant'). + "</div>"; + foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement); + return $res; +} + + +function http_calendrier_sans_heure($ev) +{ + $desc = propre($ev['DESCRIPTION']); + $sum = $ev['SUMMARY']; + if (!$sum) $sum = $desc; + $i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre + if ($ev['URL']) + $sum = http_href(quote_amp($ev['URL']), $sum, $desc); + return "\n<div class='calendrier-arial$i calendrier-evenement'>" . + "<span class='" . $ev['CATEGORIES'] . "'> </span> $sum</div>"; +} + +function http_calendrier_avec_heure($evenement, $amj) +{ + $jour_debut = substr($evenement['DTSTART'], 0,8); + $jour_fin = substr($evenement['DTEND'], 0, 8); + if ($jour_fin <= 0) $jour_fin = $jour_debut; + if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj)) + return ""; + + $desc = propre($evenement['DESCRIPTION']); + $sum = $evenement['SUMMARY']; + if (!$sum) $sum = $desc; + $sum = ereg_replace(' +',' ', typo($sum)); + if ($lieu = $evenement['LOCATION']) + $sum .= '<br />' . $lieu; + if ($perso = $evenement['ATTENDEE']) + $sum .= '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@')); + if ($evenement['URL']) + $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px'); + $opacity = ""; + $deb_h = substr($evenement['DTSTART'],-6,2); + $deb_m = substr($evenement['DTSTART'],-4,2); + $fin_h = substr($evenement['DTEND'],-6,2); + $fin_m = substr($evenement['DTEND'],-4,2); + + if ($deb_h >0 OR $deb_m > 0) { + if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut) + { $deb = "<span style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';} + else { + $deb = '...'; + } + + if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin) + { $fin = "<span style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';} + else { + $fin = '...'; + } + + if ($amj == $jour_debut OR $amj == $jour_fin) { + $sum = "<div>$deb-$fin</div>$sum"; + } else { + $opacity =' calendrier-opacity'; + } + } + return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n"; +} + +# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee): +# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee +# 2 icones de loupes pour zoom sur la meme date et le meme type +# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre +# et le $nom du calendrier + +function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre) +{ + global $spip_lang_right, $spip_lang_left, $couleur_foncee; + + if (!$echelle) $echelle = DEFAUT_D_ECHELLE; + + if ($args_pred) { + list($a, $m, $j, $t) = $args_pred; + $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), + http_img_pack("fleche-$spip_lang_left.png", '<<<', "class='calendrier-png'"), + _T('precedent')); + } + + if ($args_suiv) { + list($a, $m, $j, $t) = $args_suiv; + $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), + http_img_pack("fleche-$spip_lang_right.png", '>>>', "class='calendrier-png'"), + _T('suivant')); + } + + $today=getdate(time()); + $jour_today = $today["mday"]; + $mois_today = $today["mon"]; + $annee_today = $today["year"]; + + $id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre); + + return + "<div class='navigation-calendrier calendrier-moztop8'" + . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'") + . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>" + . (($type == "mois") ? '' : + ( + http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=tout$ancre"), + "heures-tout.png", + "class='calendrier-png" . + (($partie_cal == "tout") ? " calendrier-opacity'" : "'"), + _T('cal_jour_entier')) + .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=matin$ancre"), + "heures-am.png", + "class='calendrier-png" . + (($partie_cal == "matin") ? " calendrier-opacity'" : "'"), + _T('cal_matin')) + + .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=soir$ancre"), + "heures-pm.png", + "class='calendrier-png" . + (($partie_cal == "soir") ? " calendrier-opacity'" : "'"), + _T('cal_apresmidi')) + . " " + . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&partie_cal=$partie_cal&echelle=" . + floor($echelle * 1.5)) . $ancre, + "loupe-moins.gif", + '', + _T('info_zoom'). '-') + . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&partie_cal=$partie_cal&echelle=" . + floor($echelle / 1.5)) . $ancre, + "loupe-plus.gif", + '', + _T('info_zoom'). '+') + )) + . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&echelle=$echelle&partie_cal=$partie_cal$ancre"),"cal-jour.gif", + (($type == 'jour') ? " class='calendrier-opacity'" : ''), + _T('cal_par_jour')) + + . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&echelle=$echelle&partie_cal=$partie_cal$ancre"), "cal-semaine.gif", + (($type == 'semaine') ? " class='calendrier-opacity'" : "" ), + _T('cal_par_semaine')) + + . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&echelle=$echelle&partie_cal=$partie_cal$ancre"),"cal-mois.gif", + (($type == 'mois') ? " class='calendrier-opacity'" : "" ), + _T('cal_par_mois')) + . "</div>" + . " " + . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), + "cal-today.gif", + (" onmouseover=\"montrer('$id');\"" . + (($annee == $annee_today && $mois == $mois_today && (($type == 'mois') || ($jour == $jour_today))) + ? " class='calendrier-opacity'" : "")), + _T("ecrire:info_aujourdhui")) + . " " + . $args_pred + . $args_suiv + . " " + . $nom + . (_DIR_RESTREINT ? '' : aide("messcalen")) + . "</div>" + . http_calendrier_invisible($annee, $mois, $jour, $script, "&echelle=$echelle&partie_cal=$partie_cal$ancre", $id); +} + + +// fabrique un petit agenda accessible par survol + +function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id) +{ + global $spip_lang_right, $spip_lang_left, $couleur_claire; + $gadget = "<div style='position: relative;z-index: 1000;' + onmouseover=\"montrer('$id');\" + onmouseout=\"cacher('$id');\">" + . "<table id='$id' class='calendrier-cadreagenda'" + . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") + . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>"; + + $annee_avant = $annee - 1; + $annee_apres = $annee + 1; + + for ($i=$mois; $i < 13; $i++) { + $nom = nom_mois("$annee_avant-$i-1"); + $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre), + $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ; + } + for ($i=1; $i < $mois - 1; $i++) { + $nom = nom_mois("$annee-$i-1"); + $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre), + $nom,$nom . ' ' . $annee,'', 'calendrier-annee'); + } + $gadget .= "</td></tr>" + . "\n<tr><td class='calendrier-tripleagenda'>" + . http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) + . "</td>\n<td class='calendrier-tripleagenda'>" + . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) + . "</td>\n<td class='calendrier-tripleagenda'>" + . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) + . "</td>" + . "</tr>" + . "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>"; + for ($i=$mois+2; $i <= 12; $i++) { + $nom = nom_mois("$annee-$i-1"); + $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre), + $nom,$nom . ' ' . $annee,'', 'calendrier-annee'); + } + for ($i=1; $i < $mois+1; $i++) { + $nom = nom_mois("$annee_apres-$i-1"); + $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre), + $nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee'); + } + return $gadget . "</td></tr></table></div>"; +} + +// agenda mensuel + +function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false, $script='', $ancre='', $evt='') { + + if (!$script) $script = $GLOBALS['PHP_SELF'] ; + if (!strpos($script, '?')) $script .= '?'; + if (!$mois) {$mois = 12; $annee--;} + elseif ($mois==13) {$mois = 1; $annee++;} + if (!$evt) $evt = sql_calendrier_agenda($annee, $mois); + $nom = affdate_mois_annee("$annee-$mois-1"); + return + "<div class='calendrier-titre calendrier-arial10'>" . + http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre), + $nom, $nom, + 'color: black;') . + "<table width='100%' cellspacing='0' cellpadding='0'>" . + http_calendrier_agenda_rv ($annee, $mois, $evt, + 'http_calendrier_clic', array($script, $ancre), + $jour_ved, $mois_ved, $annee_ved, + $semaine) . + "</table>" . + "</div>"; +} + +function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso) +{ + + list($script, $ancre) = $perso; + + return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre), + $jour, + "$jour-$mois-$annee", + "color: $couleur; font-weight: bold"); +} + +// typographie un mois sous forme d'un tableau de 7 colonnes + +function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='', + $jour_ved='', $mois_ved='', $annee_ved='', + $semaine='') { + global $couleur_foncee, $spip_lang_left, $spip_lang_right; + + // Former une date correcte (par exemple: $mois=13; $annee=2003) + $date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee)); + $mois = mois($date_test); + $annee = annee($date_test); + if ($semaine) + { + $jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved)); + if ($jour_semaine_valide==0) $jour_semaine_valide=7; + $debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved); + $fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved); + } else { $debut = $fin = '';} + + $today=getdate(time()); + $jour_today = $today["mday"]; + $cemois = ($mois == $today["mon"] AND $annee == $today["year"]); + + $total = ''; + $ligne = ''; + $jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee)); + if ($jour_semaine==0) $jour_semaine=7; + for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>"; + $style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'"; + for ($j=1; (checkdate($mois,$j,$annee)); $j++) { + $style = ""; + $nom = mktime(1,1,1,$mois,$j,$annee); + $jour_semaine = date("w",$nom); + if ($jour_semaine==0) $jour_semaine=7; + + if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) { + $class= 'calendrier-arial11 calendrier-demiagenda'; + $type = 'jour'; + $couleur = "black"; + } else if ($semaine AND $nom >= $debut AND $nom <= $fin) { + $class= 'calendrier-arial11 calendrier-demiagenda' . + (($jour_semaine==1) ? " calendrier-$spip_lang_left" : + (($jour_semaine==7) ? " calendrier-$spip_lang_right" : + '')); + $type = ($semaine ? 'semaine' : 'jour') ; + $couleur = "black"; + } else { + if ($j == $jour_today AND $cemois) { + $style = $couleur_foncee; + if(!$style) $style = '#333333'; + $couleur = "white"; + } else { + if ($jour_semaine == 7) { + $style = "#aaaaaa"; + $couleur = 'white'; + } else { + $style = "#ffffff"; + $couleur = "#aaaaaa"; + } + if ($les_rv[$j] > 0) { + $style = "#ffffff"; + $couleur = "black"; + } + } + $class= 'calendrier-arial11 calendrier-agenda'; + $type = ($semaine ? 'semaine' : 'jour') ; + } + if ($style) + $style = " style='background-color: $style'"; + else $style = $style0; + $ligne .= "\n\t<td><div class='$class'$style>" . + $fclic($annee,$mois, $j, $type, $couleur, $perso) . + "</div></td>"; + if ($jour_semaine==7) + { + if ($ligne) $total .= "\n<tr>$ligne\n</tr>"; + $ligne = ''; + } + } + return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>"); +} + +// Fonction pour la messagerie et ecrire/index.php + +function http_calendrier_rv($messages, $type) { + global $spip_lang_rtl, $spip_lang_left, $spip_lang_right; + + $total = ''; + if (!$messages) return $total; + foreach ($messages as $row) { + if (ereg("^=([^[:space:]]+)$",$row['texte'],$match)) + $url = quote_amp($match[1]); + else + $url = generer_url_ecrire("message", "id_message=".$row['id_message']); + + $rv = ($row['rv'] == 'oui'); + $date = $row['date_heure']; + $date_fin = $row['date_fin']; + if ($row['type']=="pb") $bouton = "pense-bete"; + else if ($row['type']=="affich") $bouton = "annonce"; + else $bouton = "message"; + + if ($rv) { + $date_jour = affdate_jourcourt($date); + $total .= "<tr><td colspan='2'>" . + (($date_jour == $date_rv) ? '' : + "<div class='calendrier-arial11'><b>$date_jour</b></div>") . + "</td></tr>"; + $rv = + ((affdate($date) == affdate($date_fin)) ? + ("<div class='calendrier-arial9 fond-agenda'>" + . heures($date).":".minutes($date)."<br />" + . heures($date_fin).":".minutes($date_fin)."</div>") : + ( "<div class='calendrier-arial9 fond-agenda' style='text-align: center;'>" + . heures($date).":".minutes($date)."<br />...</div>" )); + } + + $total .= "<tr><td style='width: 24px' valign='middle'>" . + http_href($url, + ($rv ? + http_img_pack("rv.gif", 'rv', + http_style_background($bouton . '.gif', "no-repeat;' border='0'")) : + http_img_pack($bouton.".gif", $bouton, "style='border: 0px'")), + '', '') . + "</td>" . + "<td valign='middle'>" . + $rv . + "<div><b>" . + http_href($url, typo($row['titre']), '', '', 'calendrier-verdana10') . + "</b></div>" . + "</td>" . + "</tr>\n"; + + $date_rv = $date_jour; + } + + if ($type == 'annonces') { + $titre = _T('info_annonces_generales'); + $couleur_titre = "ccaa00"; + $couleur_texte = "black"; + $couleur_fond = "#ffffee"; + } + else if ($type == 'pb') { + $titre = _T('infos_vos_pense_bete'); + $couleur_titre = "#3874B0"; + $couleur_fond = "#EDF3FE"; + $couleur_texte = "white"; + } + else if ($type == 'rv') { + $titre = _T('info_vos_rendez_vous'); + $couleur_titre = "#666666"; + $couleur_fond = "#eeeeee"; + $couleur_texte = "white"; + } + + return + debut_cadre_enfonce("", true, "", $titre) . + "<table width='100%' border='0' cellpadding='0' cellspacing='2'>" . + $total . + "</table>" . + fin_cadre_enfonce(true); +} + +function calendrier_categories($table, $num, $objet) +{ + if (function_exists('generer_calendrier_class')) + return generer_calendrier_class($table, $num, $objet); + else { + // cf calendrier.css + $result= spip_fetch_array(spip_query(" +SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . " +FROM $table +WHERE $objet=$num +")); + if ($result) $num = $result[0]; + return 'calendrier-couleur' . (($num%14)+1); + } +} + +//------- fonctions d'appel MySQL. +// au dela cette limite, pas de production HTML + +function sql_calendrier_mois($annee,$mois,$jour) { + $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'"; + $apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) . + " 00:00:00'"; + return array($avant, $apres); +} + +function sql_calendrier_semaine($annee,$mois,$jour) { + $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee)); + if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero + $debut = $jour-$w_day; + $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'"; + $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) . + " 23:59:59'"; + return array($avant, $apres); +} + +// ici on prend en fait le jour, la veille et le lendemain + +function sql_calendrier_jour($annee,$mois,$jour) { + $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'"; + $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) . + " 23:59:59'"; + return array($avant, $apres); +} + +// retourne un tableau de 2 tableaux indexes par des dates +// - le premier indique les evenements du jour, sans indication de duree +// - le deuxime indique les evenements commencant ce jour, avec indication de duree + +function sql_calendrier_interval($limites) { + list($avant, $apres) = $limites; + $evt = array(); + sql_calendrier_interval_articles($avant, $apres, $evt); + sql_calendrier_interval_breves($avant, $apres, $evt); + sql_calendrier_interval_rubriques($avant, $apres, $evt); + return array($evt, sql_calendrier_interval_rv($avant, $apres)); +} + +function sql_calendrier_interval_forums($limites, &$evenements) { + list($avant, $apres) = $limites; + $result=spip_query(" +SELECT DISTINCT titre, date_heure, id_forum +FROM spip_forum +WHERE date_heure >= $avant + AND date_heure < $apres +ORDER BY date_heure +"); + while($row=spip_fetch_array($result)){ + $amj = date_anneemoisjour($row['date_heure']); + $id = $row['id_forum']; + $evenements[$amj][]= + array( + 'URL' => generer_url_forum($id), + 'CATEGORIES' => 'calendrier-couleur7', + 'SUMMARY' => $row['titre'], + 'DTSTART' => date_ical($row['date_heure'])); + } +} + +# 3 fonctions retournant les evenements d'une periode +# le tableau retourne est indexe par les balises du format ics +# afin qu'il soit facile de produire de tels documents. + +function sql_calendrier_interval_articles($avant, $apres, &$evenements) { + + $result=spip_query(" +SELECT id_article, titre, date, descriptif, chapo +FROM spip_articles +WHERE statut='publie' + AND date >= $avant + AND date < $apres +ORDER BY date +"); + while($row=spip_fetch_array($result)){ + $amj = date_anneemoisjour($row['date']); + $id = $row['id_article']; + $evenements[$amj][]= + array( + 'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'), + 'DESCRIPTION' => $row['descriptif'], + 'SUMMARY' => $row['titre'], + 'URL' => generer_url_article($id)); + } +} + +function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) { + + $result=spip_query(" +SELECT DISTINCT R.id_rubrique, titre, descriptif, date +FROM spip_rubriques AS R, spip_documents_rubriques AS L +WHERE statut='publie' + AND date >= $avant + AND date < $apres + AND R.id_rubrique = L.id_rubrique +ORDER BY date +"); + while($row=spip_fetch_array($result)){ + $amj = date_anneemoisjour($row['date']); + $id = $row['id_rubrique']; + $evenements[$amj][]= + array( + 'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'), + 'DESCRIPTION' => $row['descriptif'], + 'SUMMARY' => $row['titre'], + 'URL' => generer_url_rubrique($id)); + } +} + +function sql_calendrier_interval_breves($avant, $apres, &$evenements) { + $result=spip_query(" +SELECT id_breve, titre, date_heure, id_rubrique +FROM spip_breves +WHERE statut='publie' + AND date_heure >= $avant + AND date_heure < $apres +ORDER BY date_heure +"); + while($row=spip_fetch_array($result)){ + $amj = date_anneemoisjour($row['date_heure']); + $id = $row['id_breve']; + $ir = $row['id_rubrique']; + $evenements[$amj][]= + array( + 'URL' => generer_url_breve($id), + 'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'), + 'SUMMARY' => $row['titre']); + } +} + +function sql_calendrier_interval_rv($avant, $apres) { + global $connect_id_auteur; + $evenements= array(); + if (!$connect_id_auteur) return $evenements; + $result=spip_query(" +SELECT messages.id_message, messages.titre, messages.texte, + messages.date_heure, messages.date_fin, messages.type +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_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres) + AND messages.statut='publie' +GROUP BY messages.id_message +ORDER BY messages.date_heure +"); + while($row=spip_fetch_array($result)){ + $date_heure=$row["date_heure"]; + $date_fin=$row["date_fin"]; + $type=$row["type"]; + $id_message=$row['id_message']; + + if ($type=="pb") + $cat = 'calendrier-couleur2'; + else { + if ($type=="affich") + $cat = 'calendrier-couleur4'; + else { + if ($type!="normal") + $cat = 'calendrier-couleur12'; + else { + $cat = 'calendrier-couleur9'; + $auteurs = array(); + $result_aut=spip_query(" +SELECT auteurs.nom +FROM spip_auteurs AS auteurs, + spip_auteurs_messages AS lien +WHERE (lien.id_message='$id_message' + AND (auteurs.id_auteur!='$connect_id_auteur' + AND lien.id_auteur=auteurs.id_auteur))"); + while($row_auteur=spip_fetch_array($result_aut)){ + $auteurs[] = $row_auteur['nom']; + } + } + } + } + + $jour_avant = substr($avant, 9,2); + $mois_avant = substr($avant, 6,2); + $annee_avant = substr($avant, 1,4); + $jour_apres = substr($apres, 9,2); + $mois_apres = substr($apres, 6,2); + $annee_apres = substr($apres, 1,4); + $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres)); + + // Calcul pour les semaines a cheval sur deux mois + $j = 0; + $amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant))); + + while ($amj <= $ical_apres) { + if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin))) // Ne pas prendre la fin a minuit sur jour precedent + $evenements[$amj][$id_message]= + array( + 'URL' => generer_url_ecrire("message","id_message=$id_message"), + 'DTSTART' => date_ical($date_heure), + 'DTEND' => date_ical($date_fin), + 'DESCRIPTION' => $row['texte'], + 'SUMMARY' => $row['titre'], + 'CATEGORIES' => $cat, + 'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", ")); + + $j ++; + $ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant)); + + $amj = date_anneemoisjour($ladate); + + } + + } + return $evenements; +} + +// fonction SQL, pour la messagerie + +function sql_calendrier_taches_annonces () { + global $connect_id_auteur; + $r = array(); + if (!$connect_id_auteur) return $r; + $result = spip_query(" +SELECT * FROM spip_messages +WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC"); + if (spip_num_rows($result) > 0) + while ($x = spip_fetch_array($result)) $r[] = $x; + return $r; +} + +function sql_calendrier_taches_pb () { + global $connect_id_auteur; + $r = array(); + if (!$connect_id_auteur) return $r; + $result = spip_query(" +SELECT * FROM spip_messages AS messages +WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'"); + if (spip_num_rows($result) > 0){ + $r = array(); + while ($x = spip_fetch_array($result)) $r[] = $x; + } + return $r; +} + +function sql_calendrier_taches_rv () { + global $connect_id_auteur; + $r = array(); + if (!$connect_id_auteur) return $r; + $result = spip_query(" +SELECT messages.* +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 > DATE_SUB(NOW(), INTERVAL 1 DAY) + AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH)) + OR (messages.date_heure < NOW() AND messages.date_fin > NOW() )) +AND messages.statut='publie' +GROUP BY messages.id_message +ORDER BY messages.date_heure"); + if (spip_num_rows($result) > 0){ + $r = array(); + while ($x = spip_fetch_array($result)) $r[] = $x; + } + return $r; +} + +function sql_calendrier_agenda ($annee, $mois) { + global $connect_id_auteur; + + $rv = array(); + if (!$connect_id_auteur) return $rv; + $date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee)); + $mois = mois($date); + $annee = annee($date); + + // rendez-vous personnels dans le mois + $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'"); + while($row=spip_fetch_array($result_messages)){ + $rv[journum($row['date_heure'])] = 1; + } + return $rv; +} + +?> diff --git a/ecrire/inc_calendrier.php b/ecrire/inc_calendrier.php index 8bad31b044..bfe945637c 100644 --- a/ecrire/inc_calendrier.php +++ b/ecrire/inc_calendrier.php @@ -12,10 +12,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return; -include_ecrire("inc_presentation"); // inclut inc_layer -include_ecrire("inc_texte"); // inclut inc_filtre - -charger_generer_url(); +include_ecrire("inc_agenda"); function calendrier_dist() { @@ -49,723 +46,6 @@ function calendrier_dist() fin_page(); } -// Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus) - -// Notes: pour toutes les fonctions ayant parmi leurs parametres -// annee, mois, jour, echelle, partie_cal, script, ancre -// ceux-ci apparaissent TOUJOURS dans cet ordre - -define(DEFAUT_D_ECHELLE,120); # 1 pixel = 2 minutes - -// -// Utilitaires sans html ni sql -// - -// utilitaire de separation script / ancre -// et de retrait des arguments a remplacer - -function calendrier_retire_args_ancre($script) -{ - $script = str_replace('?bonjour=oui&?','?',$script); - if (ereg('^(.*)(#[^=&]*)$',$script, $m)) { - $script = $m[1]; - $ancre = $m[2]; - } else { $ancre = ''; } - if ($script[strlen($script)-1] == '?') $script = substr($script,0,-1); - foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal') as $arg) { - $script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script); - $script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script); - } - return array($script, $ancre); -} - -// tous les liens de navigations sont issus de cette fonction -// on peut definir generer_url_date et un htacces pour simplifier les URL - -function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) -{ - if (function_exists('generer_url_date')) - return generer_url_date($script, $annee, $mois, $jour, $type, $finurl); - else return $script . - (ereg('[?&]$', $script) ? "" : (strpos($script,'?') ? '&' : '?')) . - 'annee=' . sprintf("%04d", $annee) . '&' . - 'mois=' . sprintf("%02d", $mois) . '&' . - 'jour=' . sprintf("%02d", $jour) . '&' . - 'type=' . $type . - quote_amp($finurl); -} - -# prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel) -# et retourne un tableau compose -# - taille d'une heure -# - taille d'une journee -# - taille de la fonte -# - taille de la marge - -function calendrier_echelle($debut, $fin, $echelle) -{ - if ($echelle==0) $echelle = DEFAUT_D_ECHELLE; - if ($fin <= $debut) $fin = $debut +1; - - $duree = $fin - $debut; - $dimheure = floor((3600 / $echelle)); - return array($dimheure, - (($duree+2) * $dimheure), - floor (14 / (1+($echelle/240))), - floor(240 / $echelle)); -} - -# Calcule le "top" d'une heure - -function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize) { - - $h_heure = substr($heure, 0, strpos($heure, ":")); - $m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure)); - $heure100 = $h_heure + ($m_heure/60); - - if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1; - if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin; - - $top = floor(($heure100 - $debut + 1) * $dimheure); - - return $top; -} - -# Calcule la hauteur entre deux heures -function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) { - - $height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour, $fontsize) - - calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour, $fontsize); - - $padding = floor(($dimheure / 3600) * 240); - $height = $height - (2* $padding + 2); // pour padding interieur - - if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases - - return $height; -} - -// -// init: calcul generique des evenements a partir des tables SQL -// - -function http_calendrier_init($time='', $ltype='', $lechelle='', $lpartie_cal='', $script='', $evt='') -{ - global $mois, $annee, $jour, $type, $echelle, $partie_cal; - - if (!$time) - { - if (!$mois) - $time = time(); - else - $time = mktime(0,0,0,$mois,$jour,$annee); - $type= 'mois'; - } - - $jour = date("d",$time); - $mois = date("m",$time); - $annee = date("Y",$time); - if (!$ltype) $ltype = $type ? $type : 'mois'; - if (!$lechelle) $lechelle = $echelle; - if (!$lpartie_cal) $lpartie_cal = $partie_cal; - list($script, $ancre) = - calendrier_retire_args_ancre($script ? $script : - $GLOBALS['clean_link']->getUrl()); - if (!$evt) { - $g = 'sql_calendrier_' . $ltype; - $evt = sql_calendrier_interval($g($annee,$mois, $jour)); - sql_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]); - // si on veut les forums, decommenter -# sql_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]); - } - $f = 'http_calendrier_' . $ltype; - return $f($annee, $mois, $jour, $lechelle, $lpartie_cal, $script, $ancre, $evt); - -} - -# affichage d'un calendrier de plusieurs semaines -# si la periode est inferieure a 31 jours, on considere que c'est un mois - -function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) -{ - global $spip_ecran; - if (!isset($spip_ecran)) $spip_ecran = 'large'; - $premier_jour = '01'; - $dernier_jour = '31'; - - if (is_array($evt)) { - list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt; - if (!$premier_jour) $premier_jour = '01'; - if (!$dernier_jour) - { - $dernier_jour = 31; - while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--; - } - if ($sansduree) - foreach($sansduree as $d => $r) - $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r); - $evt = - http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre) . - http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, "&echelle=$echelle&partie_cal=$partie_cal$ancre") ; - } - - return - "<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" . - http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) . - $evt . - '</table>' . - http_calendrier_sans_date($annee, $mois, $evenements) . - (_DIR_RESTREINT ? "" : http_calendrier_aide_mess()); -} - -// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc -// pas de navigation suivant/precedent alors - -function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){ - if ($dernier_jour > 31) { - $prec = $suiv = ''; - $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))); - } else { - - $mois_suiv=$mois+1; - $annee_suiv=$annee; - $mois_prec=$mois-1; - $annee_prec=$annee; - if ($mois==1){ - $mois_prec=12; - $annee_prec=$annee-1; - } - else if ($mois==12){$mois_suiv=1; $annee_suiv=$annee+1;} - $prec = array($annee_prec, $mois_prec, 1, "mois"); - $suiv = array($annee_suiv, $mois_suiv, 1, "mois"); - $periode = affdate_mois_annee("$annee-$mois-1"); - } - return - "\n<tr><td colspan='7'>" . - http_calendrier_navigation($annee, - $mois, - $jour, - $echelle, - $partie_cal, - $periode, - $script, - $prec, - $suiv, - 'mois', - $ancre) . - "</td></tr>"; - -} - -function http_calendrier_mois_noms($annee, $mois, $jour, $script, $ancre){ - global $couleur_claire; - - $bandeau =""; - for ($j=1; $j<8;$j++){ - $bandeau .= - "\n\t<th class='calendrier-th'>" . - _T('date_jour_' . (($j%7)+1)) . - "</th>"; - } - return "\n<tr" . - (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . - ">$bandeau\n</tr>"; -} - -# dispose les lignes d'un calendrier de 7 colonnes (les jours) -# chaque case est garnie avec les evenements du jour figurant dans $evenements - -function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $ancre='') -{ - global $couleur_claire, $spip_lang_left, $spip_lang_right; - - if (!ereg('[?&]$', $script)) - $script .= (strpos($script,'?') ? '&' : '?'); - - // affichage du debut de semaine hors periode - $init = ''; - $debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee)); - for ($i=$debut ? $debut : 7;$i>1;$i--) - {$init .= "\n\t<td style=\"border-bottom: 1px solid $couleur_claire;\"> </td>";} - - $total = ''; - $ligne = ''; - $today=date("Ymd"); - for ($j=$premier_jour; $j<=$dernier_jour; $j++){ - $nom = mktime(1,1,1,$mois,$j,$annee); - $jour = date("d",$nom); - $jour_semaine = date("w",$nom); - $mois_en_cours = date("m",$nom); - $annee_en_cours = date("Y",$nom); - $amj = date("Y",$nom) . $mois_en_cours . $jour; - $couleur_texte = "black"; - $couleur_fond = ""; - - if ($jour_semaine == 0) $couleur_fond = $couleur_claire; - else if ($jour_semaine==1) - { - if ($ligne||$init) - $total .= "\n<tr>$init$ligne\n</tr>"; - $ligne = $init = ''; - } - - if ($amj == $today) { - $couleur_texte = "red"; - $couleur_fond = "white"; - } - $res = ''; - if ($evts = $evenements[$amj]) { - foreach ($evts as $evenement) - { - $res .= isset($evenement['DTSTART']) ? - http_calendrier_avec_heure($evenement, $amj) : - http_calendrier_sans_heure($evenement); - } - } - - $ligne .= "\n\t\t<td\tclass='calendrier-td' - style='height: 100px; border-bottom: 1px solid $couleur_claire; border-$spip_lang_right: 1px solid $couleur_claire;" . - ($couleur_fond ? " background-color: $couleur_fond;" : "") . - ($ligne ? "" : - " border-$spip_lang_left: 1px solid $couleur_claire;") . - "'>" . - (!_DIR_RESTREINT ? - (http_href(calendrier_args_date($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $ancre), - $jour, - $jour, "color: $couleur_texte",'calendrier-helvetica16') . - http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)): - http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $ancre)) . - $res . - "\n\t</td>"; - } - return $total . ($ligne ? "\n<tr>$ligne\n</tr>" : ''); -} - -// typo pour l'espace public - -function http_calendrier_mois_clics($annee, $mois, $jour, $script, $ancre) -{ - $d = mktime(0,0,0,$mois, $jour, $annee); - $semaine = date("W", $d); - return - "<table width='100%'>\n<tr><td style='text-align: left'>". - http_href(calendrier_args_date($script,$annee, $mois, $jour, "jour", $ancre), - "$jour/$mois", - _T('date_jour_'. (1+date('w',$d))) . - " $jour " . - _T('date_mois_'.(0+$mois)), - '','calendrier-helvetica16') . - "</td><td style='text-align: right'>" . - http_href(calendrier_args_date($script,$annee, $mois, $jour, "semaine", $ancre), - $semaine, - _T('date_semaines') . " $semaine", - '', - 'calendrier-helvetica16') . - "</td></tr>\n</table>"; -} - -# dispose les evenements d'une semaine - -function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt) -{ - global $spip_ecran; - if (!isset($spip_ecran)) $spip_ecran = 'large'; - - $init = date("w",mktime(1,1,1,$mois,$jour,$annee)); - $init = $jour+1-($init ? $init : 7); - $sd = ''; - - if (is_array($evt)) - { - $sd = http_calendrier_sans_date($annee, $mois,$evt[0]); - $finurl = "&echelle=$echelle&partie_cal=$partie_cal$ancre"; - $evt = - http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl) . - http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt); - } - - return - "\n<table class='calendrier-table-$spip_ecran' cellspacing='0' cellpadding='0'>" . - http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) . - $evt . - "</table>" . - $sd . - (_DIR_RESTREINT ? "" : http_calendrier_aide_mess()); -} - -function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){ - - $fin = mktime (1,1,1,$mois, $jour+6, $annee); - $fjour = date("d",$fin); - $fmois = date("m",$fin); - $fannee = date("Y",$fin); - $fin = date("Y-m-d", $fin); - $debut = mktime (1,1,1,$mois, $jour, $annee); - $djour = date("d",$debut)+0; - $dmois = date("m",$debut); - $dannee = date("Y",$debut); - $debut = date("Y-m-d", $debut); - $periode = (($dannee != $fannee) ? - (affdate($debut)." - ".affdate($fin)) : - (($dmois == $fmois) ? - ($djour ." - ".affdate_jourcourt($fin)) : - (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin)))); - - return - "\n<tr><td colspan='7'>" . - http_calendrier_navigation($annee, - $mois, - $jour, - $echelle, - $partie_cal, - $periode, - $script, - array($dannee, $dmois, ($djour-7), "semaine"), - array($fannee, $fmois, ($fjour+1), "semaine"), - 'semaine', - $ancre) . - "</td></tr>\n"; -} - -function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $ancre){ - global $couleur_claire; - - $bandeau = ''; - $script .= (ereg('[?&]$', $script) ? "" : (strpos($script,'?') ? '&' : '?')); - for ($j=$jour; $j<$jour+7;$j++){ - $nom = mktime(0,0,0,$mois,$j,$annee); - $num = intval(date("d", $nom)) ; - $numois = date("m",$nom); - $nomjour = _T('date_jour_'. (1+date('w',$nom))); - $clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') . - ($ancre ? ('/' . $numois) : '')); - $bandeau .= - "\n\t<th class='calendrier-th'>" . - http_href(calendrier_args_date($script, date("Y",$nom), $numois, $num, 'jour', $ancre), $clic, $clic) . - "</th>"; - } - return "\n<tr" . - (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") . - ">$bandeau\n</tr>"; -} - -function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt) -{ - global $couleur_claire, $spip_ecran, $spip_lang_left; - - $largeur = ($spip_ecran == "large") ? 90 : 60; - - $today=date("Ymd"); - $total = ''; - $style = "border-$spip_lang_left: 1px solid $couleur_claire; border-bottom: 1px solid $couleur_claire; border-top: 0px; border-right: 0px;"; - for ($j=$jour; $j<$jour+7;$j++){ - $v = mktime(0,0,0,$mois, $j, $annee); - $total .= "\n<td class='calendrier-td'>" . - http_calendrier_ics($annee,$mois,$j, $echelle, $partie_cal, $largeur, $evt, ($style . ( (date("w",$v)==0 && isset($couleur_claire)) ? - " background-color: $couleur_claire;" : - ((date("Ymd", $v) == $today) ? - " background-color: white;" : - " background-color: #eeeeee;")))) . - "\n</td>"; - } - return "\n<tr class='calendrier-verdana10'>$total</tr>"; -} - - -function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){ - global $spip_ecran; - if (!isset($spip_ecran)) $spip_ecran = 'large'; - - return - "\n<table class='calendrier-table-$spip_ecran'>" . - "\n<tr><td class='calendrier-td-gauche'></td>" . - "<td colspan='5' class='calendrier-td-centre'>" . - http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, - (nom_jour("$annee-$mois-$jour") . " " . - affdate_jourcourt("$annee-$mois-$jour")), - $script, - array($annee, $mois, ($jour-1), "jour"), - array($annee, $mois, ($jour+1), "jour"), - 'jour', - $ancre) . - "</td>" . - "<td class='calendrier-td-droit calendrier-arial10'></td>" . - "</tr>" . - (!is_array($evt) ? $evt : - (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) . - http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt))) . - "</table>"; -} - -function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){ - - global $spip_ecran; - $finurl = "&echelle=$echelle&partie_cal=$partie_cal$ancre"; - - $gauche = (_DIR_RESTREINT || ($spip_ecran != "large")); - return - "\n<tr><td class='calendrier-td-gauche'>" . - ($gauche ? '' : - http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl)) . - "</td><td colspan='5' class='calendrier-td-centre'>" . - (_DIR_RESTREINT ? '' : - ("\n\t<div class='calendrier-titre'>" . - http_calendrier_ics_message($annee, $mois, $jour, true) . - '</div>')) . - "</td><td class='calendrier-td-droit calendrier-arial10'> " . - (_DIR_RESTREINT ? '' : http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl)) . - "</td></tr>"; -} - -function http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){ - global $spip_ecran; - - $gauche = (_DIR_RESTREINT || ($spip_ecran != "large")); - return - "<tr class='calendrier-verdana10'>" . - # afficher en reduction le tableau du jour precedent - "\n<td class='calendrier-td-gauche'>" . - ($gauche ? '' : - http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt)) . - "</td><td colspan='5' class='calendrier-td-centre'>" . - http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt) . - '</td>' . - # afficher en reduction le tableau du jour suivant - "\n<td class='calendrier-td-droit'>" . - - (_DIR_RESTREINT ? '' : - http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt)) . - '</td>' . - "\n</tr>"; -} - - -// Conversion d'un tableau de champ ics en des balises div positionnees -// Le champ categories indique la Classe de CSS a prendre -// $echelle est le nombre de secondes representees par 1 pixel - -function http_calendrier_ics($annee, $mois, $jour,$echelle, $partie_cal, $largeur, $evt, $style='') { - global $spip_lang_left; - - // tableau - if ($partie_cal == "soir") { - $debut = 12; - $fin = 23; - } else if ($partie_cal == "matin") { - $debut = 4; - $fin = 15; - } else { - $debut = 7; - $fin =21; - } - - if ($echelle==0) $echelle = DEFAUT_D_ECHELLE; - - list($dimheure, $dimjour, $fontsize, $padding) = - calendrier_echelle($debut, $fin, $echelle); - $modif_decalage = round($largeur/8); - - $date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee)); - list($sansheure, $avecheure) = $evt; - $avecheure = $avecheure[$date]; - $sansheure = $sansheure[$date]; - - $total = ''; - - if ($avecheure) - { - $tous = 1 + count($avecheure); - $i = 0; - foreach($avecheure as $evenement){ - - $d = $evenement['DTSTART']; - $e = $evenement['DTEND']; - $d_jour = substr($d,0,8); - $e_jour = $e ? substr($e,0,8) : $d_jour; - $debut_avant = false; - $fin_apres = false; - - /* disparues sauf erreur - $radius_top = " radius-top"; - $radius_bottom = " radius-bottom"; - */ - if ($d_jour <= $date AND $e_jour >= $date) - { - - $i++; - - // Verifier si debut est jour precedent - if (substr($d,0,8) < $date) - { - $heure_debut = 0; $minutes_debut = 0; - $debut_avant = true; - $radius_top = ""; - } - else - { - $heure_debut = substr($d,-6,2); - $minutes_debut = substr($d,-4,2); - } - - if (!$e) - { - $heure_fin = $heure_debut ; - $minutes_fin = $minutes_debut ; - $bordure = "border-bottom: dashed 2px"; - } - else - { - $bordure = ""; - if (substr($e,0,8) > $date) - { - $heure_fin = 23; $minutes_fin = 59; - $fin_apres = true; - $radius_bottom = ""; - } - else - { - $heure_fin = substr($e,-6,2); - $minutes_fin = substr($e,-4,2); - } - } - - if ($debut_avant && $fin_apres) $opacity = "-moz-opacity: 0.6; filter: alpha(opacity=60);"; - else $opacity = ""; - - $haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour, $fontsize); - $bas = !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize); - $hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour, $fontsize); - - if ($bas_prec >= $haut) $decale += $modif_decalage; - else $decale = (4 * $fontsize); - if ($bas > $bas_prec) $bas_prec = $bas; - $url = $evenement['URL']; - $desc = propre($evenement['DESCRIPTION']); - $perso = substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@')); - $lieu = $evenement['LOCATION']; - $sum = ereg_replace(' +',' ', typo($evenement['SUMMARY'])); - if (!$sum) { $sum = $desc; $desc = '';} - if (!$sum) { $sum = $lieu; $lieu = '';} - if (!$sum) { $sum = $perso; $perso = '';} - if ($sum) - $sum = "<span class='calendrier-verdana10'><span style='font-weight: bold;'>$sum</span>$lieu $perso</span>"; - if (($largeur > 90) && $desc) - $sum .= "\n<br /><span class='calendrier-noir'>$desc</span>"; - $colors = $evenement['CATEGORIES']; - - $total .= "\n<div class='calendrier-arial10 $colors' - style='cursor: auto; position: absolute; overflow: hidden;$opacity z-index: " . - $i . - "; $spip_lang_left: " . - $decale . - "px; top: " . - $haut . - "px; height: " . - $hauteur . - "px; width: ". - ($largeur - 2 * ($padding+1)) . - "px; font-size: ". - floor($fontsize * 1.3) . - "px; padding: " . - $padding . - "px; $bordure' - onmouseover=\"this.style.zIndex=" . $tous . "\" - onmouseout=\"this.style.zIndex=" . $i . "\">" . - ((!$url) ? - $sum : - http_href(quote_amp($url), $sum, $desc,"border: 0px",$colors)) . - "</div>"; - } - } - } - return - "\n<div class='calendrier-jour' style='height: ${dimjour}px; font-size: ${fontsize}px;$style'>\n" . - http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) . - $total . - "\n</div>" . - (!$sansheure ? "" : - http_calendrier_ics_trois($sansheure, $largeur, $dimjour, $fontsize, '')) ; - -} - -# Affiche une grille horaire -# Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes. - -function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $fontsize) -{ - global $spip_lang_left, $spip_lang_right; - $slice = floor($dimheure/(2*$fontsize)); - if ($slice%2) $slice --; - if (!$slice) $slice = 1; - - $total = ''; - for ($i = $debut; $i < $fin; $i++) { - for ($j=0; $j < $slice; $j++) - { - $total .= "\n<div class='calendrier-heure" . - ($j ? "face" : "pile") . - "' style='$spip_lang_left: 0px; top: ". - calendrier_top ("$i:".sprintf("%02d",floor(($j*60)/$slice)), $debut, $fin, $dimheure, $dimjour, $fontsize) . - "px;'>$i:" . - sprintf("%02d",floor(($j*60)/$slice)) . - "</div>"; - } - } - - return "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: 2px;'>0:00</div>" . - $total . - "\n<div class='calendrier-heurepile' style='$spip_lang_left: 0px; top: ". - calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour, $fontsize). - "px;'>$fin:00</div>" . - "\n<div class='calendrier-heurepile' style='border: 0px; $spip_lang_left: 0px; top: ". - ($dimjour - $fontsize - 2) . - "px;'>23:59</div>"; -} - -# si la largeur le permet, les evenements sans duree, -# se placent a cote des autres, sinon en dessous - -function http_calendrier_ics_trois($evt, $largeur, $dimjour, $fontsize, $border) -{ - global $spip_lang_left; - - $types = array(); - foreach($evt as $v) - $types[isset($v['DESCRIPTION']) ? 'info_articles' : - (isset($v['DTSTART']) ? 'info_liens_syndiques_3' : - 'info_breves_02')][] = $v; - $res = ''; - foreach ($types as $k => $v) { - $res2 = ''; - foreach ($v as $evenement) { - $res2 .= http_calendrier_sans_heure($evenement); - } - $res .= "\n<div class='calendrier-verdana10 calendrier-titre'>". - _T($k) . - "</div>" . - $res2; - } - - if ($largeur > 90) { - $largeur += (5*$fontsize); - $pos = "-$dimjour"; - } else { $largeur = (3*$fontsize); $pos= 0; } - - return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>"; -} - -function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='') -{ - $date = mktime(0,0,0,$mois, $jour, $annee); - $jour = date("d",$date); - $mois = date("m",$date); - $annee = date("Y",$date); - $nom = affdate_jourcourt("$annee-$mois-$jour"); - return "<div class='calendrier-arial10 calendrier-titre'>" . - http_href(calendrier_args_date($script, $annee, $mois, $jour, 'jour', $finurl), $nom, $nom, '', 'calendrier-noir') . - "</div>"; -} - function http_calendrier_ics_message($annee, $mois, $jour, $large) { global $bleu, $vert,$jaune; @@ -794,76 +74,6 @@ function http_calendrier_ics_message($annee, $mois, $jour, $large) 'calendrier-arial10'))); } -function http_calendrier_sans_date($annee, $mois, $evenements) -{ - $r = $evenements[0+($annee . $mois . "00")]; - if (!$r) return ""; - $res = "\n<div class='calendrier-arial10 calendrier-titre'>". - _T('info_mois_courant'). - "</div>"; - foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement); - return $res; -} - - -function http_calendrier_sans_heure($ev) -{ - $desc = propre($ev['DESCRIPTION']); - $sum = $ev['SUMMARY']; - if (!$sum) $sum = $desc; - $i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre - if ($ev['URL']) - $sum = http_href(quote_amp($ev['URL']), $sum, $desc); - return "\n<div class='calendrier-arial$i calendrier-evenement'>" . - "<span class='" . $ev['CATEGORIES'] . "'> </span> $sum</div>"; -} - -function http_calendrier_avec_heure($evenement, $amj) -{ - $jour_debut = substr($evenement['DTSTART'], 0,8); - $jour_fin = substr($evenement['DTEND'], 0, 8); - if ($jour_fin <= 0) $jour_fin = $jour_debut; - if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj)) - return ""; - - $desc = propre($evenement['DESCRIPTION']); - $sum = $evenement['SUMMARY']; - if (!$sum) $sum = $desc; - $sum = ereg_replace(' +',' ', typo($sum)); - if ($lieu = $evenement['LOCATION']) - $sum .= '<br />' . $lieu; - if ($perso = $evenement['ATTENDEE']) - $sum .= '<br />' . substr($evenement['ATTENDEE'], 0,strpos($evenement['ATTENDEE'],'@')); - if ($evenement['URL']) - $sum = http_href(quote_amp($evenement['URL']), $sum, $desc, 'border: 0px'); - $opacity = ""; - $deb_h = substr($evenement['DTSTART'],-6,2); - $deb_m = substr($evenement['DTSTART'],-4,2); - $fin_h = substr($evenement['DTEND'],-6,2); - $fin_m = substr($evenement['DTEND'],-4,2); - - if ($deb_h >0 OR $deb_m > 0) { - if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut) - { $deb = "<span style='font-weight: bold;'>" . $deb_h . ':' . $deb_m . '</span>';} - else { - $deb = '...'; - } - - if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin) - { $fin = "<span style='font-weight: bold;'>" . $fin_h . ':' . $fin_m . '</span> ';} - else { - $fin = '...'; - } - - if ($amj == $jour_debut OR $amj == $jour_fin) { - $sum = "<div>$deb-$fin</div>$sum"; - } else { - $opacity =' calendrier-opacity'; - } - } - return "\n<div class='calendrier-arial10 calendrier-evenement " . $evenement['CATEGORIES'] ."$opacity'>$sum\n</div>\n"; -} - function http_calendrier_aide_mess() { global $bleu, $vert, $jaune, $spip_lang_left; @@ -875,648 +85,4 @@ function http_calendrier_aide_mess() "</td></tr>\n</table></font>"; } -# Bandeau superieur d'un calendrier selon son $type (jour/mois/annee): -# 2 icones vers les 2 autres types, a la meme date $jour $mois $annee -# 2 icones de loupes pour zoom sur la meme date et le meme type -# 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre -# et le $nom du calendrier - -function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre) -{ - global $spip_lang_right, $spip_lang_left, $couleur_foncee; - - if (!$echelle) $echelle = DEFAUT_D_ECHELLE; - - if ($args_pred) { - list($a, $m, $j, $t) = $args_pred; - $args_pred = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), - http_img_pack("fleche-$spip_lang_left.png", '<<<', "class='calendrier-png'"), - _T('precedent')); - } - - if ($args_suiv) { - list($a, $m, $j, $t) = $args_suiv; - $args_suiv = http_href(calendrier_args_date($script, $a, $m, $j, $t, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), - http_img_pack("fleche-$spip_lang_right.png", '>>>', "class='calendrier-png'"), - _T('suivant')); - } - - $today=getdate(time()); - $jour_today = $today["mday"]; - $mois_today = $today["mon"]; - $annee_today = $today["year"]; - - $id = 'nav-agenda' .ereg_replace('[^A-Za-z0-9]', '', $ancre); - - return - "<div class='navigation-calendrier calendrier-moztop8'" - . (!isset($couleur_foncee) ? "" : "\nstyle='background-color: $couleur_foncee;'") - . "><div style='float: $spip_lang_right; padding-left: 5px; padding-right: 5px;'>" - . (($type == "mois") ? '' : - ( - http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=tout$ancre"), - "heures-tout.png", - "class='calendrier-png" . - (($partie_cal == "tout") ? " calendrier-opacity'" : "'"), - _T('cal_jour_entier')) - .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=matin$ancre"), - "heures-am.png", - "class='calendrier-png" . - (($partie_cal == "matin") ? " calendrier-opacity'" : "'"), - _T('cal_matin')) - - .http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&echelle=$echelle&partie_cal=soir$ancre"), - "heures-pm.png", - "class='calendrier-png" . - (($partie_cal == "soir") ? " calendrier-opacity'" : "'"), - _T('cal_apresmidi')) - . " " - . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&partie_cal=$partie_cal&echelle=" . - floor($echelle * 1.5)) . $ancre, - "loupe-moins.gif", - '', - _T('info_zoom'). '-') - . http_href_img(calendrier_args_date($script, $annee, $mois, $jour, $type, "&partie_cal=$partie_cal&echelle=" . - floor($echelle / 1.5)) . $ancre, - "loupe-plus.gif", - '', - _T('info_zoom'). '+') - )) - . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "jour", "&echelle=$echelle&partie_cal=$partie_cal$ancre"),"cal-jour.gif", - (($type == 'jour') ? " class='calendrier-opacity'" : ''), - _T('cal_par_jour')) - - . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "semaine", "&echelle=$echelle&partie_cal=$partie_cal$ancre"), "cal-semaine.gif", - (($type == 'semaine') ? " class='calendrier-opacity'" : "" ), - _T('cal_par_semaine')) - - . http_href_img(calendrier_args_date($script,$annee, $mois, $jour, "mois", "&echelle=$echelle&partie_cal=$partie_cal$ancre"),"cal-mois.gif", - (($type == 'mois') ? " class='calendrier-opacity'" : "" ), - _T('cal_par_mois')) - . "</div>" - . " " - . http_href_img(calendrier_args_date($script,$annee_today, $mois_today, $jour_today, $type, "&echelle=$echelle&partie_cal=$partie_cal$ancre"), - "cal-today.gif", - (" onmouseover=\"montrer('$id');\"" . - (($annee == $annee_today && $mois == $mois_today && (($type == 'mois') || ($jour == $jour_today))) - ? " class='calendrier-opacity'" : "")), - _T("ecrire:info_aujourdhui")) - . " " - . $args_pred - . $args_suiv - . " " - . $nom - . (_DIR_RESTREINT ? '' : aide("messcalen")) - . "</div>" - . http_calendrier_invisible($annee, $mois, $jour, $script, "&echelle=$echelle&partie_cal=$partie_cal$ancre", $id); -} - - -// fabrique un petit agenda accessible par survol - -function http_calendrier_invisible($annee, $mois, $jour, $script, $ancre, $id) -{ - global $spip_lang_right, $spip_lang_left, $couleur_claire; - $gadget = "<div style='position: relative;z-index: 1000;' - onmouseover=\"montrer('$id');\" - onmouseout=\"cacher('$id');\">" - . "<table id='$id' class='calendrier-cadreagenda'" - . (!isset($couleur_claire) ? "" : " style='background-color: $couleur_claire'") - . ">\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>"; - - $annee_avant = $annee - 1; - $annee_apres = $annee + 1; - - for ($i=$mois; $i < 13; $i++) { - $nom = nom_mois("$annee_avant-$i-1"); - $gadget .= http_href(calendrier_args_date($script,$annee_avant, $i, 1, "mois", $ancre), - $nom,$nom . ' ' . $annee_avant,'', 'calendrier-annee') ; - } - for ($i=1; $i < $mois - 1; $i++) { - $nom = nom_mois("$annee-$i-1"); - $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre), - $nom,$nom . ' ' . $annee,'', 'calendrier-annee'); - } - $gadget .= "</td></tr>" - . "\n<tr><td class='calendrier-tripleagenda'>" - . http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) - . "</td>\n<td class='calendrier-tripleagenda'>" - . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) - . "</td>\n<td class='calendrier-tripleagenda'>" - . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre) - . "</td>" - . "</tr>" - . "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>"; - for ($i=$mois+2; $i <= 12; $i++) { - $nom = nom_mois("$annee-$i-1"); - $gadget .= http_href(calendrier_args_date($script,$annee, $i, 1, "mois", $ancre), - $nom,$nom . ' ' . $annee,'', 'calendrier-annee'); - } - for ($i=1; $i < $mois+1; $i++) { - $nom = nom_mois("$annee_apres-$i-1"); - $gadget .= http_href(calendrier_args_date($script, $annee_apres, $i, 1, "mois", $ancre), - $nom,$nom . ' ' . $annee_apres,'', 'calendrier-annee'); - } - return $gadget . "</td></tr></table></div>"; -} - -// agenda mensuel - -function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false, $script='', $ancre='', $evt='') { - - if (!$script) $script = $GLOBALS['PHP_SELF'] ; - if (!strpos($script, '?')) $script .= '?'; - if (!$mois) {$mois = 12; $annee--;} - elseif ($mois==13) {$mois = 1; $annee++;} - if (!$evt) $evt = sql_calendrier_agenda($annee, $mois); - $nom = affdate_mois_annee("$annee-$mois-1"); - return - "<div class='calendrier-titre calendrier-arial10'>" . - http_href(calendrier_args_date($script, $annee, $mois, 1, 'mois', $ancre), - $nom, $nom, - 'color: black;') . - "<table width='100%' cellspacing='0' cellpadding='0'>" . - http_calendrier_agenda_rv ($annee, $mois, $evt, - 'http_calendrier_clic', array($script, $ancre), - $jour_ved, $mois_ved, $annee_ved, - $semaine) . - "</table>" . - "</div>"; -} - -function http_calendrier_clic($annee, $mois, $jour, $type, $couleur, $perso) -{ - - list($script, $ancre) = $perso; - - return http_href(calendrier_args_date($script, $annee, $mois, $jour,$type, $ancre), - $jour, - "$jour-$mois-$annee", - "color: $couleur; font-weight: bold"); -} - -// typographie un mois sous forme d'un tableau de 7 colonnes - -function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic, $perso='', - $jour_ved='', $mois_ved='', $annee_ved='', - $semaine='') { - global $couleur_foncee, $spip_lang_left, $spip_lang_right; - - // Former une date correcte (par exemple: $mois=13; $annee=2003) - $date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee)); - $mois = mois($date_test); - $annee = annee($date_test); - if ($semaine) - { - $jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved)); - if ($jour_semaine_valide==0) $jour_semaine_valide=7; - $debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved); - $fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved); - } else { $debut = $fin = '';} - - $today=getdate(time()); - $jour_today = $today["mday"]; - $cemois = ($mois == $today["mon"] AND $annee == $today["year"]); - - $total = ''; - $ligne = ''; - $jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee)); - if ($jour_semaine==0) $jour_semaine=7; - for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n\t<td></td>"; - $style0 = (!isset($couleur_foncee)) ? "" : " style='border: 1px solid $couleur_foncee;'"; - for ($j=1; (checkdate($mois,$j,$annee)); $j++) { - $style = ""; - $nom = mktime(1,1,1,$mois,$j,$annee); - $jour_semaine = date("w",$nom); - if ($jour_semaine==0) $jour_semaine=7; - - if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) { - $class= 'calendrier-arial11 calendrier-demiagenda'; - $type = 'jour'; - $couleur = "black"; - } else if ($semaine AND $nom >= $debut AND $nom <= $fin) { - $class= 'calendrier-arial11 calendrier-demiagenda' . - (($jour_semaine==1) ? " calendrier-$spip_lang_left" : - (($jour_semaine==7) ? " calendrier-$spip_lang_right" : - '')); - $type = ($semaine ? 'semaine' : 'jour') ; - $couleur = "black"; - } else { - if ($j == $jour_today AND $cemois) { - $style = $couleur_foncee; - if(!$style) $style = '#333333'; - $couleur = "white"; - } else { - if ($jour_semaine == 7) { - $style = "#aaaaaa"; - $couleur = 'white'; - } else { - $style = "#ffffff"; - $couleur = "#aaaaaa"; - } - if ($les_rv[$j] > 0) { - $style = "#ffffff"; - $couleur = "black"; - } - } - $class= 'calendrier-arial11 calendrier-agenda'; - $type = ($semaine ? 'semaine' : 'jour') ; - } - if ($style) - $style = " style='background-color: $style'"; - else $style = $style0; - $ligne .= "\n\t<td><div class='$class'$style>" . - $fclic($annee,$mois, $j, $type, $couleur, $perso) . - "</div></td>"; - if ($jour_semaine==7) - { - if ($ligne) $total .= "\n<tr>$ligne\n</tr>"; - $ligne = ''; - } - } - return $total . (!$ligne ? '' : "\n<tr>$ligne\n</tr>"); -} - -// Fonction pour la messagerie et ecrire/index.php - -function http_calendrier_rv($messages, $type) { - global $spip_lang_rtl, $spip_lang_left, $spip_lang_right; - - $total = ''; - if (!$messages) return $total; - foreach ($messages as $row) { - if (ereg("^=([^[:space:]]+)$",$row['texte'],$match)) - $url = quote_amp($match[1]); - else - $url = generer_url_ecrire("message", "id_message=".$row['id_message']); - - $rv = ($row['rv'] == 'oui'); - $date = $row['date_heure']; - $date_fin = $row['date_fin']; - if ($row['type']=="pb") $bouton = "pense-bete"; - else if ($row['type']=="affich") $bouton = "annonce"; - else $bouton = "message"; - - if ($rv) { - $date_jour = affdate_jourcourt($date); - $total .= "<tr><td colspan='2'>" . - (($date_jour == $date_rv) ? '' : - "<div class='calendrier-arial11'><b>$date_jour</b></div>") . - "</td></tr>"; - $rv = - ((affdate($date) == affdate($date_fin)) ? - ("<div class='calendrier-arial9 fond-agenda'>" - . heures($date).":".minutes($date)."<br />" - . heures($date_fin).":".minutes($date_fin)."</div>") : - ( "<div class='calendrier-arial9 fond-agenda' style='text-align: center;'>" - . heures($date).":".minutes($date)."<br />...</div>" )); - } - - $total .= "<tr><td style='width: 24px' valign='middle'>" . - http_href($url, - ($rv ? - http_img_pack("rv.gif", 'rv', - http_style_background($bouton . '.gif', "no-repeat;' border='0'")) : - http_img_pack($bouton.".gif", $bouton, "style='border: 0px'")), - '', '') . - "</td>" . - "<td valign='middle'>" . - $rv . - "<div><b>" . - http_href($url, typo($row['titre']), '', '', 'calendrier-verdana10') . - "</b></div>" . - "</td>" . - "</tr>\n"; - - $date_rv = $date_jour; - } - - if ($type == 'annonces') { - $titre = _T('info_annonces_generales'); - $couleur_titre = "ccaa00"; - $couleur_texte = "black"; - $couleur_fond = "#ffffee"; - } - else if ($type == 'pb') { - $titre = _T('infos_vos_pense_bete'); - $couleur_titre = "#3874B0"; - $couleur_fond = "#EDF3FE"; - $couleur_texte = "white"; - } - else if ($type == 'rv') { - $titre = _T('info_vos_rendez_vous'); - $couleur_titre = "#666666"; - $couleur_fond = "#eeeeee"; - $couleur_texte = "white"; - } - - return - debut_cadre_enfonce("", true, "", $titre) . - "<table width='100%' border='0' cellpadding='0' cellspacing='2'>" . - $total . - "</table>" . - fin_cadre_enfonce(true); -} - -function calendrier_categories($table, $num, $objet) -{ - if (function_exists('generer_calendrier_class')) - return generer_calendrier_class($table, $num, $objet); - else { - // cf calendrier.css - $result= spip_fetch_array(spip_query(" -SELECT " . (($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . " -FROM $table -WHERE $objet=$num -")); - if ($result) $num = $result[0]; - return 'calendrier-couleur' . (($num%14)+1); - } -} - -//------- fonctions d'appel MySQL. -// au dela cette limite, pas de production HTML - -function sql_calendrier_mois($annee,$mois,$jour) { - $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'"; - $apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) . - " 00:00:00'"; - return array($avant, $apres); -} - -function sql_calendrier_semaine($annee,$mois,$jour) { - $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee)); - if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero - $debut = $jour-$w_day; - $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'"; - $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) . - " 23:59:59'"; - return array($avant, $apres); -} - -// ici on prend en fait le jour, la veille et le lendemain - -function sql_calendrier_jour($annee,$mois,$jour) { - $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'"; - $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) . - " 23:59:59'"; - return array($avant, $apres); -} - -// retourne un tableau de 2 tableaux indexes par des dates -// - le premier indique les evenements du jour, sans indication de duree -// - le deuxime indique les evenements commencant ce jour, avec indication de duree - -function sql_calendrier_interval($limites) { - list($avant, $apres) = $limites; - $evt = array(); - sql_calendrier_interval_articles($avant, $apres, $evt); - sql_calendrier_interval_breves($avant, $apres, $evt); - sql_calendrier_interval_rubriques($avant, $apres, $evt); - return array($evt, sql_calendrier_interval_rv($avant, $apres)); -} - -function sql_calendrier_interval_forums($limites, &$evenements) { - list($avant, $apres) = $limites; - $result=spip_query(" -SELECT DISTINCT titre, date_heure, id_forum -FROM spip_forum -WHERE date_heure >= $avant - AND date_heure < $apres -ORDER BY date_heure -"); - while($row=spip_fetch_array($result)){ - $amj = date_anneemoisjour($row['date_heure']); - $id = $row['id_forum']; - $evenements[$amj][]= - array( - 'URL' => generer_url_forum($id), - 'CATEGORIES' => 'calendrier-couleur7', - 'SUMMARY' => $row['titre'], - 'DTSTART' => date_ical($row['date_heure'])); - } -} - -# 3 fonctions retournant les evenements d'une periode -# le tableau retourne est indexe par les balises du format ics -# afin qu'il soit facile de produire de tels documents. - -function sql_calendrier_interval_articles($avant, $apres, &$evenements) { - - $result=spip_query(" -SELECT id_article, titre, date, descriptif, chapo -FROM spip_articles -WHERE statut='publie' - AND date >= $avant - AND date < $apres -ORDER BY date -"); - while($row=spip_fetch_array($result)){ - $amj = date_anneemoisjour($row['date']); - $id = $row['id_article']; - $evenements[$amj][]= - array( - 'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'), - 'DESCRIPTION' => $row['descriptif'], - 'SUMMARY' => $row['titre'], - 'URL' => generer_url_article($id)); - } -} - -function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) { - - $result=spip_query(" -SELECT DISTINCT R.id_rubrique, titre, descriptif, date -FROM spip_rubriques AS R, spip_documents_rubriques AS L -WHERE statut='publie' - AND date >= $avant - AND date < $apres - AND R.id_rubrique = L.id_rubrique -ORDER BY date -"); - while($row=spip_fetch_array($result)){ - $amj = date_anneemoisjour($row['date']); - $id = $row['id_rubrique']; - $evenements[$amj][]= - array( - 'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'), - 'DESCRIPTION' => $row['descriptif'], - 'SUMMARY' => $row['titre'], - 'URL' => generer_url_rubrique($id)); - } -} - -function sql_calendrier_interval_breves($avant, $apres, &$evenements) { - $result=spip_query(" -SELECT id_breve, titre, date_heure, id_rubrique -FROM spip_breves -WHERE statut='publie' - AND date_heure >= $avant - AND date_heure < $apres -ORDER BY date_heure -"); - while($row=spip_fetch_array($result)){ - $amj = date_anneemoisjour($row['date_heure']); - $id = $row['id_breve']; - $ir = $row['id_rubrique']; - $evenements[$amj][]= - array( - 'URL' => generer_url_breve($id), - 'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'), - 'SUMMARY' => $row['titre']); - } -} - -function sql_calendrier_interval_rv($avant, $apres) { - global $connect_id_auteur; - $evenements= array(); - if (!$connect_id_auteur) return $evenements; - $result=spip_query(" -SELECT messages.id_message, messages.titre, messages.texte, - messages.date_heure, messages.date_fin, messages.type -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_fin >= $avant OR messages.date_heure >= $avant) AND messages.date_heure <= $apres) - AND messages.statut='publie' -GROUP BY messages.id_message -ORDER BY messages.date_heure -"); - while($row=spip_fetch_array($result)){ - $date_heure=$row["date_heure"]; - $date_fin=$row["date_fin"]; - $type=$row["type"]; - $id_message=$row['id_message']; - - if ($type=="pb") - $cat = 'calendrier-couleur2'; - else { - if ($type=="affich") - $cat = 'calendrier-couleur4'; - else { - if ($type!="normal") - $cat = 'calendrier-couleur12'; - else { - $cat = 'calendrier-couleur9'; - $auteurs = array(); - $result_aut=spip_query(" -SELECT auteurs.nom -FROM spip_auteurs AS auteurs, - spip_auteurs_messages AS lien -WHERE (lien.id_message='$id_message' - AND (auteurs.id_auteur!='$connect_id_auteur' - AND lien.id_auteur=auteurs.id_auteur))"); - while($row_auteur=spip_fetch_array($result_aut)){ - $auteurs[] = $row_auteur['nom']; - } - } - } - } - - $jour_avant = substr($avant, 9,2); - $mois_avant = substr($avant, 6,2); - $annee_avant = substr($avant, 1,4); - $jour_apres = substr($apres, 9,2); - $mois_apres = substr($apres, 6,2); - $annee_apres = substr($apres, 1,4); - $ical_apres = date_anneemoisjour("$annee_apres-$mois_apres-".sprintf("%02d",$jour_apres)); - - // Calcul pour les semaines a cheval sur deux mois - $j = 0; - $amj = date_anneemoisjour("$annee_avant-$mois_avant-".sprintf("%02d", $j+($jour_avant))); - - while ($amj <= $ical_apres) { - if (!($amj == date_anneemoisjour($date_fin) AND ereg("00:00:00", $date_fin))) // Ne pas prendre la fin a minuit sur jour precedent - $evenements[$amj][$id_message]= - array( - 'URL' => generer_url_ecrire("message","id_message=$id_message"), - 'DTSTART' => date_ical($date_heure), - 'DTEND' => date_ical($date_fin), - 'DESCRIPTION' => $row['texte'], - 'SUMMARY' => $row['titre'], - 'CATEGORIES' => $cat, - 'ATTENDEE' => (count($auteurs) == 0) ? '' : join($auteurs,", ")); - - $j ++; - $ladate = date("Y-m-d",mktime (1,1,1,$mois_avant, ($j + $jour_avant), $annee_avant)); - - $amj = date_anneemoisjour($ladate); - - } - - } - return $evenements; -} - -// fonction SQL, pour la messagerie - -function sql_calendrier_taches_annonces () { - global $connect_id_auteur; - $r = array(); - if (!$connect_id_auteur) return $r; - $result = spip_query(" -SELECT * FROM spip_messages -WHERE type = 'affich' AND rv != 'oui' AND statut = 'publie' ORDER BY date_heure DESC"); - if (spip_num_rows($result) > 0) - while ($x = spip_fetch_array($result)) $r[] = $x; - return $r; -} - -function sql_calendrier_taches_pb () { - global $connect_id_auteur; - $r = array(); - if (!$connect_id_auteur) return $r; - $result = spip_query(" -SELECT * FROM spip_messages AS messages -WHERE id_auteur=$connect_id_auteur AND statut='publie' AND type='pb' AND rv!='oui'"); - if (spip_num_rows($result) > 0){ - $r = array(); - while ($x = spip_fetch_array($result)) $r[] = $x; - } - return $r; -} - -function sql_calendrier_taches_rv () { - global $connect_id_auteur; - $r = array(); - if (!$connect_id_auteur) return $r; - $result = spip_query(" -SELECT messages.* -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 > DATE_SUB(NOW(), INTERVAL 1 DAY) - AND messages.date_heure < DATE_ADD(NOW(), INTERVAL 1 MONTH)) - OR (messages.date_heure < NOW() AND messages.date_fin > NOW() )) -AND messages.statut='publie' -GROUP BY messages.id_message -ORDER BY messages.date_heure"); - if (spip_num_rows($result) > 0){ - $r = array(); - while ($x = spip_fetch_array($result)) $r[] = $x; - } - return $r; -} - -function sql_calendrier_agenda ($annee, $mois) { - global $connect_id_auteur; - - $rv = array(); - if (!$connect_id_auteur) return $rv; - $date = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee)); - $mois = mois($date); - $annee = annee($date); - - // rendez-vous personnels dans le mois - $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'"); - while($row=spip_fetch_array($result_messages)){ - $rv[journum($row['date_heure'])] = 1; - } - return $rv; -} - ?> -- GitLab