PageRenderTime 57ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/spip/ecrire/inc/agenda.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 1614 lines | 1211 code | 253 blank | 150 comment | 231 complexity | 712ba6e9bc0d2017823762bdf6abdf40 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. include_spip('inc/layer');
  13. include_spip('inc/texte'); // inclut inc_filtre
  14. /// @file
  15. /// Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
  16. /// Notes: pour toutes les fonctions ayant parmi leurs parametres
  17. /// annee, mois, jour, echelle, partie_cal, script, ancre
  18. /// ceux-ci apparaissent TOUJOURS dans cet ordre
  19. define('DEFAUT_D_ECHELLE',120); # 1 pixel = 2 minutes
  20. define('DEFAUT_PARTIE_M', "matin");
  21. define('DEFAUT_PARTIE_S', "soir");
  22. define('DEFAUT_PARTIE_T', "tout");
  23. define('DEFAUT_PARTIE_R', "sansheure");
  24. define('DEFAUT_PARTIE', DEFAUT_PARTIE_R);
  25. $GLOBALS['calendrier_partie'] = array(
  26. DEFAUT_PARTIE_S => array('debut' => 12, 'fin' => 23),
  27. DEFAUT_PARTIE_M => array('debut' => 4, 'fin' => 15),
  28. DEFAUT_PARTIE_T => array('debut' => 7, 'fin' => 21)
  29. );
  30. ///
  31. ///Utilitaires sans html ni sql
  32. ///
  33. /// Utilitaire de separation script / ancre
  34. /// et de retrait des arguments a remplacer
  35. /// (a mon avis cette fonction ne sert a rien, puisque parametre_url()
  36. /// sait remplacer les arguments au bon endroit -- Fil)
  37. /// Pas si simple: certains param ne sont pas remplaces
  38. /// et doivent reprendre leur valeur par defaut -- esj.
  39. /// http://doc.spip.org/@calendrier_retire_args_ancre
  40. function calendrier_retire_args_ancre($script)
  41. {
  42. if (preg_match(',^(.*)#([\w-]+)$,',$script, $m)) {
  43. $script = $m[1];
  44. $ancre = $m[2];
  45. } else { $ancre = ''; }
  46. foreach(array('echelle','jour','mois','annee', 'type', 'partie_cal', 'bonjour') as $arg) {
  47. $script = preg_replace("/([?&])$arg=[^&]*&/",'\1', $script);
  48. $script = preg_replace("/([?&])$arg=[^&]*$/",'\1', $script);
  49. }
  50. if (in_array(substr($script,-1),array('&','?'))) $script = substr($script,0,-1);
  51. return array(quote_amp($script), $ancre);
  52. }
  53. /// construit un bout de Query-String en eliminant le superflu
  54. function calendrier_retire_defaults($echelle, $partie_cal)
  55. {
  56. if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
  57. return (($echelle != DEFAUT_D_ECHELLE) ? "&amp;echelle=$echelle" : '')
  58. . (($partie_cal != DEFAUT_PARTIE) ? "&amp;partie_cal=$partie_cal" : '');
  59. }
  60. /// tous les liens de navigations sont issus de cette fonction
  61. /// on peut definir generer_url_date et un htacces pour simplifier les URL
  62. // http://doc.spip.org/@calendrier_args_date
  63. function calendrier_args_date($script, $annee, $mois, $jour, $type, $finurl) {
  64. if (function_exists('generer_url_date'))
  65. return generer_url_date($script, $annee, $mois, $jour, $type, $finurl);
  66. $script = parametre_url($script, 'annee', sprintf("%04d", $annee));
  67. $script = parametre_url($script, 'mois', sprintf("%02d", $mois));
  68. $script = parametre_url($script, 'jour', sprintf("%02d", $jour));
  69. $script = parametre_url($script, 'type', $type);
  70. return $script . $finurl;
  71. }
  72. /// utilise la precedente pour produire une balise A avec tous les accessoires
  73. // http://doc.spip.org/@calendrier_href
  74. function calendrier_href($script, $annee, $mois, $jour, $type, $fin, $ancre, $img, $titre, $class='', $alt='', $clic='', $style='', $evt='')
  75. {
  76. static $moi = NULL;
  77. // pas d'Ajax pour l'espace public pour le moment ou si indispo
  78. // sinon preparer la RegExp qui l'empeche aussi pour la page elle-meme
  79. if ($moi === NULL) {
  80. $moi = (test_espace_prive() AND (_SPIP_AJAX === 1 ))
  81. ? ("/exec=" . _request('exec') .'$/')
  82. : '';
  83. }
  84. $d = mktime (1,1,1, $mois, $jour, $annee);
  85. $jour = date("d",$d);
  86. $mois = date("m",$d);
  87. $annee = date("Y",$d);
  88. $h = calendrier_args_date($script, $annee, $mois, $jour, $type, $fin);
  89. $url = $h . ($ancre ? "#$ancre" : '');
  90. $c = ($class ? " class=\"$class\"" : '');
  91. if ($img) $clic = http_img_pack($img, ($alt ? $alt : $titre), $c);
  92. if ($moi AND preg_match($moi, $script))
  93. $evt .= "\nonclick=" . ajax_action_declencheur($h,$ancre);
  94. return http_href($url, PtoBR($clic), attribut_html($titre), $style, $class, $evt);
  95. }
  96. /// Fabrique une balise A, avec tous les attributs possibles
  97. /// attention au cas ou la href est du Javascript avec des "'"
  98. /// pour un href conforme au validateur W3C, faire & --> &amp; avant
  99. // http://doc.spip.org/@http_href
  100. function http_href($href, $clic, $title='', $style='', $class='', $evt='') {
  101. if ($style) $evt .= " style='$style'";
  102. $r = lien_ou_expose($href, $clic, false, $class, $title, 'nofollow', $evt);
  103. return str_replace('<a href=', "<a\nhref=", $r);
  104. }
  105. /// prend une heure de debut et de fin, ainsi qu'une echelle (seconde/pixel)
  106. /// et retourne un tableau compose
  107. /// - taille d'une heure
  108. /// - taille d'une journee
  109. /// - taille de la fonte
  110. /// - taille de la marge
  111. // http://doc.spip.org/@calendrier_echelle
  112. function calendrier_echelle($debut, $fin, $echelle)
  113. {
  114. if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
  115. if ($fin <= $debut) $fin = $debut +1;
  116. $duree = $fin - $debut;
  117. $dimheure = floor(3600 / $echelle);
  118. return array($dimheure,
  119. (($duree+2) * $dimheure),
  120. floor(14 / (1+($echelle/240))),
  121. floor(240 / $echelle));
  122. }
  123. /// Calcule le "top" d'une heure
  124. // http://doc.spip.org/@calendrier_top
  125. function calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour) {
  126. $h_heure = substr($heure, 0, strpos($heure, ":"));
  127. $m_heure = substr($heure, strpos($heure,":") + 1, strlen($heure));
  128. $heure100 = $h_heure + ($m_heure/60);
  129. if ($heure100 < $debut) $heure100 = ($heure100 / $debut) + $debut - 1;
  130. if ($heure100 > $fin) $heure100 = (($heure100-$fin) / (24 - $fin)) + $fin;
  131. $top = floor(($heure100 - $debut + 1) * $dimheure);
  132. return $top;
  133. }
  134. /// Calcule la hauteur entre deux heures
  135. // http://doc.spip.org/@calendrier_height
  136. function calendrier_height ($heure, $heurefin, $debut, $fin, $dimheure, $dimjour) {
  137. $height = calendrier_top ($heurefin, $debut, $fin, $dimheure, $dimjour)
  138. - calendrier_top ($heure, $debut, $fin, $dimheure, $dimjour);
  139. $padding = floor(($dimheure / 3600) * 240);
  140. $height = $height - (2* $padding + 2); // pour padding interieur
  141. if ($height < ($dimheure/4)) $height = floor($dimheure/4); // eviter paves totalement ecrases
  142. return $height;
  143. }
  144. ///
  145. /// init: calcul generique des evenements a partir des tables SQL
  146. ///
  147. // http://doc.spip.org/@http_calendrier_init
  148. function http_calendrier_init($time='', $type='mois', $echelle='', $partie_cal='', $script='', $evt=null)
  149. {
  150. if (is_array($time)) {
  151. list($j,$m,$a) = $time;
  152. if ($j+$m+$a) $time = @mktime(0,0,0, $m, $j, $a);
  153. }
  154. if (!is_numeric($time)) $time = time();
  155. $jour = date("d",$time);
  156. $mois = date("m",$time);
  157. $annee = date("Y",$time);
  158. if (!$echelle = intval($echelle)) $echelle = DEFAUT_D_ECHELLE;
  159. if (!is_string($type) OR !preg_match('/^\w+$/', $type)) $type ='mois';
  160. if (!is_string($partie_cal) OR !preg_match('/^\w+$/', $partie_cal))
  161. $partie_cal = DEFAUT_PARTIE;
  162. list($script, $ancre) =
  163. calendrier_retire_args_ancre($script);
  164. if (is_null($evt)) {
  165. $g = 'quete_calendrier_' . $type;
  166. $evt = quete_calendrier_interval($g($annee,$mois, $jour));
  167. quete_calendrier_interval_articles("'$annee-$mois-00'", "'$annee-$mois-1'", $evt[0]);
  168. // si on veut les forums, decommenter
  169. # quete_calendrier_interval_forums($g($annee,$mois,$jour), $evt[0]);
  170. }
  171. $f = 'http_calendrier_' . $type;
  172. if (!function_exists($f)) $f = 'http_calendrier_mois';
  173. return $f($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt);
  174. }
  175. /// affichage d'un calendrier de mois, avec son bandeau de navigation
  176. // http://doc.spip.org/@http_calendrier_mois
  177. function http_calendrier_mois($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
  178. {
  179. global $spip_ecran;
  180. if (!isset($spip_ecran)) $spip_ecran = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "large";
  181. if (is_array($evt)) {
  182. list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
  183. if (!$premier_jour) $premier_jour = '01';
  184. if (!$dernier_jour)
  185. {
  186. $dernier_jour = 31;
  187. while (!(checkdate($mois,$dernier_jour,$annee))) $dernier_jour--;
  188. }
  189. if ($sansduree)
  190. foreach($sansduree as $d => $r)
  191. $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
  192. $evt =
  193. http_calendrier_mois_noms() .
  194. http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, calendrier_retire_defaults($echelle, $partie_cal), $ancre) ;
  195. } else {
  196. $evt = "<tr><td>$evt</td></tr>";
  197. $premier_jour = '01';
  198. $dernier_jour = '31';
  199. }
  200. $id = ($ancre ? $ancre : 'agenda') . "-nav";
  201. return
  202. "<div><div id='$id'></div>" .
  203. "<table class='calendrier calendrier-$spip_ecran'>" .
  204. http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre) .
  205. $evt .
  206. '</table>' .
  207. http_calendrier_sans_date($annee, $mois, $evenements) .
  208. (!test_espace_prive() ? "" : http_calendrier_aide_mess()) .
  209. "</div>";
  210. }
  211. /// si la periore a plus de 31 jours, c'est du genre trimestre, semestre etc
  212. /// pas de navigation suivant/precedent alors
  213. // http://doc.spip.org/@http_calendrier_mois_navigation
  214. function http_calendrier_mois_navigation($annee, $mois, $premier_jour, $dernier_jour, $echelle, $partie_cal, $script, $ancre){
  215. if ($dernier_jour > 31) {
  216. $prec = $suiv = '';
  217. $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)));
  218. } else {
  219. $mois_suiv=$mois+1;
  220. $annee_suiv=$annee;
  221. $mois_prec=$mois-1;
  222. $annee_prec=$annee;
  223. if ($mois==1){
  224. $mois_prec=12;
  225. $annee_prec=$annee-1;
  226. }
  227. else if ($mois==12){$mois_suiv=1; $annee_suiv=$annee+1;}
  228. $prec = array($annee_prec, $mois_prec, 1, "mois");
  229. $suiv = array($annee_suiv, $mois_suiv, 1, "mois");
  230. $periode = affdate_mois_annee("$annee-$mois-1");
  231. }
  232. return
  233. http_calendrier_navigation($annee,
  234. $mois,
  235. 1,
  236. $echelle,
  237. $partie_cal,
  238. $periode,
  239. $script,
  240. $prec,
  241. $suiv,
  242. 'mois',
  243. $ancre);
  244. }
  245. // http://doc.spip.org/@http_calendrier_mois_noms
  246. function http_calendrier_mois_noms(){
  247. $bandeau ="";
  248. for ($j=1; $j<8;$j++){
  249. $bandeau .=
  250. "\n<th>" .
  251. _T('date_jour_' . (($j%7)+1)) .
  252. "</th>";
  253. }
  254. return "\n<tr>$bandeau</tr>";
  255. }
  256. /// dispose les lignes d'un calendrier de 7 colonnes (les jours)
  257. /// chaque case est garnie avec les evenements du jour figurant dans $evenements
  258. // http://doc.spip.org/@http_calendrier_mois_sept
  259. function http_calendrier_mois_sept($annee, $mois, $premier_jour, $dernier_jour,$evenements, $script, $finurl, $ancre='')
  260. {
  261. global $spip_lang_left, $spip_lang_right;
  262. // affichage du debut de semaine hors periode
  263. $init = '';
  264. $debut = date("w",mktime(1,1,1,$mois,$premier_jour,$annee));
  265. for ($i=$debut ? $debut : 7;$i>1;$i--)
  266. {$init .= "\n<td></td>";}
  267. $total = '';
  268. $ligne = '';
  269. $today=date("Ymd");
  270. for ($j=$premier_jour; $j<=$dernier_jour; $j++){
  271. $nom = mktime(1,1,1,$mois,$j,$annee);
  272. $jour = date("d",$nom);
  273. $jour_semaine = date("w",$nom);
  274. $mois_en_cours = date("m",$nom);
  275. $annee_en_cours = date("Y",$nom);
  276. $amj = date("Y",$nom) . $mois_en_cours . $jour;
  277. $couleur_texte = "black";
  278. $fond = "";
  279. if ($jour_semaine == 0) $fond = 'jour_dimanche ';
  280. else if ($jour_semaine==1)
  281. {
  282. if ($ligne||$init)
  283. $total .= "\n<tr>$init$ligne</tr>";
  284. $ligne = $init = '';
  285. }
  286. if ($amj == $today) {
  287. $couleur_texte = "red";
  288. $fond = "jour_encours ";
  289. }
  290. $res = (test_espace_prive() ?
  291. (calendrier_href($script,$annee_en_cours, $mois_en_cours, $jour, "jour", $finurl, $ancre, '', $jour, 'calendrier-helvetica16', '', $jour, "color: $couleur_texte") .
  292. http_calendrier_ics_message($annee_en_cours, $mois_en_cours, $jour, false)):
  293. http_calendrier_mois_clics($annee_en_cours, $mois_en_cours, $jour, $script, $finurl, $ancre));
  294. if ($evts = $evenements[$amj]) {
  295. foreach ($evts as $evenement)
  296. {
  297. $res .= isset($evenement['DTSTART']) ?
  298. http_calendrier_avec_heure($evenement, $amj) :
  299. http_calendrier_sans_heure($evenement);
  300. }
  301. }
  302. $fond .= $ligne ? "bordure_$spip_lang_right" :'bordure_double';
  303. $ligne .= "\n<td class='$fond'>$res</td>";
  304. }
  305. return $total . ($ligne ? "\n<tr>$ligne</tr>" : '');
  306. }
  307. /// Appelle la fonction precedente en sachant que ca produira 1 TD/TR unique.
  308. /// retourne le contenu du TD
  309. function http_calendrier_sept_un($annee, $mois, $jour,$evenements, $script, $finurl, $ancre='', $class='', $att='')
  310. {
  311. $res = http_calendrier_mois_sept($annee, $mois, $jour, $jour,$evenements, $script, $finurl, $ancre);
  312. preg_match(',^\s*<tr>\s*<td[^>]*>(.*?)</td>\s*</tr>\s*$,s', $res, $m);
  313. return $m[1];
  314. }
  315. /// typo pour l'espace public
  316. // http://doc.spip.org/@http_calendrier_mois_clics
  317. function http_calendrier_mois_clics($annee, $mois, $jour, $script, $finurl, $ancre)
  318. {
  319. $d = mktime(0,0,0,$mois, $jour, $annee);
  320. $semaine = date("W", $d);
  321. $semaine = calendrier_href($script,$annee, $mois, $jour, "semaine", $finurl, $ancre,'',
  322. (_T('date_semaines') . ": $semaine"),
  323. '','', $semaine);
  324. $jour = calendrier_href($script,$annee, $mois, $jour, "jour", $finurl, $ancre, '',
  325. (_T('date_jour_'. (1+date('w',$d))) .
  326. " $jour " .
  327. _T('date_mois_'.(0+$mois))),
  328. '', '',
  329. "$jour/$mois");
  330. return "$jour$semaine";
  331. }
  332. /// dispose les evenements d'une semaine
  333. // http://doc.spip.org/@http_calendrier_semaine
  334. function http_calendrier_semaine($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt)
  335. {
  336. global $spip_ecran;
  337. if (!isset($spip_ecran)) $spip_ecran = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "large";
  338. $finurl = calendrier_retire_defaults($echelle, $partie_cal);
  339. $init = date("w",mktime(1,1,1,$mois,$jour,$annee));
  340. $init = $jour+1-($init ? $init : 7);
  341. $sd = '';
  342. if (is_array($evt)) {
  343. if ($partie_cal!= DEFAUT_PARTIE_R) {
  344. $sd = http_calendrier_sans_date($annee, $mois, $evt[0]);
  345. $evt = http_calendrier_semaine_sept($annee, $mois, $init, $echelle, $partie_cal, $evt);
  346. } else {
  347. list($sansduree, $evenements, , ) = $evt;
  348. if ($sansduree)
  349. foreach($sansduree as $d => $r)
  350. $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
  351. $evt = http_calendrier_mois_sept($annee, $mois, $init, $init+ 6, $evenements, $script, $finurl, $ancre);
  352. }
  353. } else $evt = "<tr><td>$evt</td></tr>";
  354. $id = ($ancre ? $ancre : 'agenda') . "-nav";
  355. return
  356. "<div><div id='$id'></div>" .
  357. "<table class='calendrier calendrier-$spip_ecran'>" .
  358. http_calendrier_semaine_navigation($annee, $mois, $init, $echelle, $partie_cal, $script, $ancre) .
  359. http_calendrier_semaine_noms($annee, $mois, $init, $script, $finurl, $ancre) .
  360. $evt .
  361. "</table>" .
  362. $sd .
  363. (!test_espace_prive() ? "" : http_calendrier_aide_mess()) .
  364. "</div>";
  365. }
  366. // http://doc.spip.org/@http_calendrier_semaine_navigation
  367. function http_calendrier_semaine_navigation($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
  368. $fin = mktime (1,1,1,$mois, $jour+6, $annee);
  369. $fjour = date("d",$fin);
  370. $fmois = date("m",$fin);
  371. $fannee = date("Y",$fin);
  372. $fin = date("Y-m-d", $fin);
  373. $debut = mktime (1,1,1,$mois, $jour, $annee);
  374. $djour = date("d",$debut)+0;
  375. $dmois = date("m",$debut);
  376. $dannee = date("Y",$debut);
  377. $debut = date("Y-m-d", $debut);
  378. $periode = (($dannee != $fannee) ?
  379. (affdate($debut)." - ".affdate($fin)) :
  380. (($dmois == $fmois) ?
  381. ($djour ." - ".affdate_jourcourt($fin)) :
  382. (affdate_jourcourt($debut)." - ".affdate_jourcourt($fin))));
  383. return
  384. http_calendrier_navigation($annee,
  385. $mois,
  386. $jour,
  387. $echelle,
  388. $partie_cal,
  389. $periode,
  390. $script,
  391. array($dannee, $dmois, ($djour-7), "semaine"),
  392. array($fannee, $fmois, ($fjour+1), "semaine"),
  393. 'semaine',
  394. $ancre);
  395. }
  396. // http://doc.spip.org/@http_calendrier_semaine_noms
  397. function http_calendrier_semaine_noms($annee, $mois, $jour, $script, $finurl, $ancre){
  398. $bandeau = '';
  399. for ($j=$jour; $j<$jour+7;$j++){
  400. $nom = mktime(0,0,0,$mois,$j,$annee);
  401. $num = intval(date("d", $nom)) ;
  402. $numois = date("m",$nom);
  403. $nomjour = _T('date_jour_'. (1+date('w',$nom)));
  404. $clic = ($nomjour . " " . $num . (($num == 1) ? 'er' : '') .
  405. ($ancre ? ('/' . $numois) : ''));
  406. $bandeau .=
  407. "\n\t<th>" .
  408. calendrier_href($script, date("Y",$nom), $numois, $num, 'jour', $finurl, $ancre, '', $clic, '', '', $clic) .
  409. "</th>";
  410. }
  411. return "\n<tr>$bandeau</tr>";
  412. }
  413. // http://doc.spip.org/@http_calendrier_semaine_sept
  414. function http_calendrier_semaine_sept($annee, $mois, $jour, $echelle, $partie_cal, $evt)
  415. {
  416. global $spip_ecran, $spip_lang_left;
  417. $largeur = ($spip_ecran == "large") ? 80 : 60;
  418. $today=date("Ymd");
  419. $total = '';
  420. for ($j=$jour; $j<$jour+7;$j++){
  421. $v = mktime(0,0,0,$mois, $j, $annee);
  422. $v = http_calendrier_ics($annee, $mois, $j, $echelle, $partie_cal, $largeur, $evt, '', ( (date("w",$v)==0 && test_espace_prive()) ?
  423. " jour_dimanche" :
  424. ((date("Ymd", $v) == $today) ?
  425. " jour_encours" :
  426. " jour_gris") ) ) ;
  427. $total .= "\n<td>$v</td>";
  428. }
  429. return "\n<tr class='heure'>$total</tr>";
  430. }
  431. // http://doc.spip.org/@http_calendrier_jour
  432. function http_calendrier_jour($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
  433. global $spip_ecran;
  434. if (!isset($spip_ecran)) $spip_ecran = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "large";
  435. $id = ($ancre ? $ancre : 'agenda') . "-nav";
  436. return
  437. "<div><div id='$id'></div>" .
  438. "<table class='calendrier calendrier-$spip_ecran'>" .
  439. http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal,
  440. (nom_jour("$annee-$mois-$jour") . " " .
  441. affdate_jourcourt("$annee-$mois-$jour")),
  442. $script,
  443. array($annee, $mois, ($jour-1), "jour"),
  444. array($annee, $mois, ($jour+1), "jour"),
  445. 'jour',
  446. $ancre) .
  447. (!is_array($evt) ? ("<tr><td>$evt</td></tr>") :
  448. (http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre) .
  449. http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt))) .
  450. "</table>" .
  451. "</div>";
  452. }
  453. // http://doc.spip.org/@http_calendrier_jour_noms
  454. function http_calendrier_jour_noms($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre){
  455. global $spip_ecran;
  456. if (!test_espace_prive()) return '';
  457. $finurl = calendrier_retire_defaults($echelle, $partie_cal);
  458. if ($spip_ecran != "large") {
  459. $c = '';
  460. } else { $c = http_calendrier_ics_titre($annee,$mois,$jour-1,$script, $finurl, $ancre);
  461. }
  462. return
  463. "\n<tr class='calendrier-titre-jour'><th>$c</th><th></th><th>" .
  464. ("\n<div class='calendrier-titre'>" .
  465. http_calendrier_ics_message($annee, $mois, $jour, true) .
  466. '</div>') .
  467. "</th><th></th><th>" .
  468. http_calendrier_ics_titre($annee,$mois,$jour+1,$script, $finurl, $ancre) .
  469. "</th></tr>";
  470. }
  471. // http://doc.spip.org/@http_calendrier_jour_sept
  472. function http_calendrier_jour_sept($annee, $mois, $jour, $echelle, $partie_cal, $script, $ancre, $evt){
  473. global $spip_ecran;
  474. $gauche = (test_espace_prive() AND ($spip_ecran == "large"));
  475. if ($partie_cal!= DEFAUT_PARTIE_R) {
  476. $gauche = !$gauche ? '' : http_calendrier_ics($annee, $mois, $jour-1, $echelle, $partie_cal, 0, $evt);
  477. $mil = http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 300, $evt);
  478. $droite = (!test_espace_prive() ? '':
  479. http_calendrier_ics($annee, $mois, $jour+1, $echelle, $partie_cal, 0, $evt));
  480. } else {
  481. list($sansduree, $evenements, $premier_jour, $dernier_jour) = $evt;
  482. if ($sansduree)
  483. foreach($sansduree as $d => $r)
  484. $evenements[$d] = !$evenements[$d] ? $r : array_merge($evenements[$d], $r);
  485. $gauche = (!$gauche ? "" :
  486. http_calendrier_sept_un($annee, $mois, $jour-1, $evenements, $script, '', $ancre)
  487. );
  488. $mil = http_calendrier_sept_un($annee, $mois, $jour, $evenements, $script, '', $ancre);
  489. $droite = (!test_espace_prive() ? "" :http_calendrier_sept_un($annee, $mois, $jour+1,$evenements, $script, '', $ancre));
  490. }
  491. if (!test_espace_prive())
  492. return "<tr class='calendrier-3jours'><td colspan='5'>$mil</td></tr>";
  493. $gauche = !$gauche ? "<td colspan='3'>" : "<td>$gauche</td><td></td><td>";
  494. return "<tr class='calendrier-3jours'>$gauche$mil</td><td></td><td>$droite</td></tr>";
  495. }
  496. /// Conversion d'un tableau de champ ics en des balises div positionnees
  497. /// Le champ categories indique la Classe de CSS a prendre
  498. /// $echelle est le nombre de secondes representees par 1 pixel
  499. /// $partie_cal donne l'intervalle des heures affichee
  500. /// a travers la globale calendrier_partie ou sous la forme D_F
  501. // http://doc.spip.org/@http_calendrier_ics
  502. function http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, $largeur, $evt, $style='', $class='') {
  503. global $spip_lang_left;
  504. if (is_array($GLOBALS['calendrier_partie'][$partie_cal]))
  505. list($debut, $fin) = $GLOBALS['calendrier_partie'][$partie_cal];
  506. elseif (preg_match('/^(\d+)\D(\d+)$/', $partie_cal, $m))
  507. list(,$debut, $fin) = $m;
  508. else {
  509. $debut = 7;
  510. $fin =21;
  511. }
  512. if ($echelle==0) $echelle = DEFAUT_D_ECHELLE;
  513. list($dimheure, $dimjour, $fontsize, $padding) =
  514. calendrier_echelle($debut, $fin, $echelle);
  515. $size = sprintf("%0.2f", 0.7+(10/$echelle));
  516. $style .= "height:${dimjour}px;font-size:${size}em;";
  517. $date = date("Ymd", mktime(0,0,0,$mois, $jour, $annee));
  518. $avecheure = !isset($evt[1][$date]) ? '' : http_calendrier_ics_div($evt[1][$date], $date, $debut, $fin, $dimheure, $dimjour, $echelle, $largeur, $padding);
  519. $sansheure = !isset($evt[0][$date]) ? '' : http_calendrier_ics_trois($evt[0][$date], $largeur, $dimjour, $fontsize, '');
  520. return
  521. "\n<div class='calendrier-jour$class' style='$style'>" .
  522. http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $echelle) .
  523. $avecheure .
  524. "\n</div>" .
  525. $sansheure;
  526. }
  527. function http_calendrier_ics_div($evts, $date, $debut, $fin, $dimheure, $dimjour, $echelle, $largeur, $padding)
  528. {
  529. global $spip_lang_left;
  530. $total = '';
  531. $tous = 1 + count($evts);
  532. $i = $bas_prec = 0;
  533. foreach($evts as $evenement) {
  534. $d = $evenement['DTSTART'];
  535. $e = $evenement['DTEND'];
  536. $d_jour = substr($d,0,8);
  537. $e_jour = $e ? substr($e,0,8) : $d_jour;
  538. $debut_avant = false;
  539. $fin_apres = false;
  540. if ($d_jour > $date OR $e_jour < $date) continue;
  541. $i++;
  542. // Verifier si debut est jour precedent
  543. if (substr($d,0,8) < $date)
  544. {
  545. $heure_debut = 0; $minutes_debut = 0;
  546. $debut_avant = true;
  547. $radius_top = "";
  548. }
  549. else
  550. {
  551. $heure_debut = substr($d,-6,2);
  552. $minutes_debut = substr($d,-4,2);
  553. }
  554. if (!$e)
  555. {
  556. $heure_fin = $heure_debut ;
  557. $minutes_fin = $minutes_debut ;
  558. $bordure = "border-bottom: dashed 2px";
  559. }
  560. else
  561. {
  562. $bordure = "";
  563. if (substr($e,0,8) > $date)
  564. {
  565. $heure_fin = 23; $minutes_fin = 59;
  566. $fin_apres = true;
  567. $radius_bottom = "";
  568. }
  569. else
  570. {
  571. $heure_fin = substr($e,-6,2);
  572. $minutes_fin = substr($e,-4,2);
  573. }
  574. }
  575. $opacity = ($debut_avant && $fin_apres) ? "calendrier-opacity60" : "";
  576. $haut = calendrier_top ("$heure_debut:$minutes_debut", $debut, $fin, $dimheure, $dimjour);
  577. $bas = !$e ? $haut :calendrier_top ("$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour);
  578. $hauteur = calendrier_height ("$heure_debut:$minutes_debut", "$heure_fin:$minutes_fin", $debut, $fin, $dimheure, $dimjour);
  579. if ($bas_prec >= $haut) $decale += 1;
  580. else $decale = ($echelle >= 120) ? 4 : 3;
  581. if ($bas > $bas_prec) $bas_prec = $bas;
  582. $colors = $evenement['CATEGORIES'];
  583. $url = isset($evenement['URL']) ? $evenement['URL'] : '';
  584. $desc = PtoBR(propre($evenement['DESCRIPTION']));
  585. $perso = construire_personne_ics($evenement['ATTENDEE']);
  586. $lieu = isset($evenement['LOCATION']) ? $evenement['LOCATION'] : '';
  587. $sum = typo($evenement['SUMMARY']);
  588. if (!$sum) { $sum = $desc; $desc = '';}
  589. if (!$sum) { $sum = $lieu; $lieu = '';}
  590. if (!$sum) { $sum = textebrut($perso);}
  591. if ($sum) {
  592. if ($url)
  593. $sum = http_href(quote_amp($url), $sum, attribut_html($desc), '', "calendrier-summary calendrier-url $colors");
  594. else $sum = "<span class='calendrier-summary'>$sum</span>";
  595. }
  596. if (($largeur > 90) && $desc)
  597. $sum .= "\n<br /><span class='calendrier-noir'>$desc</span>";
  598. if ($lieu)
  599. $sum .= "\n<span class='calendrier-location'>$lieu</span>";
  600. if ($perso AND $perso != $sum)
  601. $sum .= "\n<span class='calendrier-attendee $colors'>$perso</span>";
  602. $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'ics'),'data'=>$sum));
  603. $width = ($largeur - 2 * ($padding+1));
  604. $fontsize = sprintf("%0.2f", 1+(10/$echelle));
  605. $style = "z-index:${i};${spip_lang_left}:${decale}em;top:${haut}px;height:${hauteur}px;width:${width}px;font-size:${fontsize}em;padding:${padding}px;$bordure";
  606. $total .= "\n<div class='$colors calendrier-evt' style='$style'
  607. onmouseover=\"this.style.zIndex=" . $tous . "\"
  608. onmouseout=\"this.style.zIndex=" . $i . "\">" .
  609. $sum .
  610. "</div>";
  611. }
  612. return $total;
  613. }
  614. /// Affiche une grille horaire
  615. /// Selon l'echelle demandee, on affiche heure, 1/2 heure 1/4 heure, 5minutes.
  616. // http://doc.spip.org/@http_calendrier_ics_grille
  617. function http_calendrier_ics_grille($debut, $fin, $dimheure, $dimjour, $echelle)
  618. {
  619. global $spip_lang_left, $spip_lang_right;
  620. $size = floor(14 / (1+($echelle/240)));
  621. $slice = floor($dimheure/(2*$size));
  622. if ($slice%2) $slice --;
  623. if (!$slice) $slice = 1;
  624. $total = '';
  625. for ($i = $debut; $i < $fin; $i++) {
  626. $k = "$i:00";
  627. $n = calendrier_top ($k, $debut, $fin, $dimheure, $dimjour);
  628. $total .= "\n<span style='$spip_lang_left:0;top:${n}px;'>$k</span>";
  629. for ($j=1; $j < $slice; $j++)
  630. {
  631. $k = $i .':' . sprintf("%02d",floor(($j*60)/$slice));
  632. $n = calendrier_top ($k, $debut, $fin, $dimheure, $dimjour);
  633. $total .= "\n<span class='calendrier-jour-m' style='$spip_lang_left:0;top:${n}px;'>$k</span>";
  634. }
  635. }
  636. $n = calendrier_top ("$fin:00", $debut, $fin, $dimheure, $dimjour);
  637. $c = ($dimjour - $size - 2);
  638. return "\n<span style='border:0;$spip_lang_left:0;top:2px;'>0:00</span>" .
  639. $total .
  640. "\n<span style='$spip_lang_left:0;top:${n}px;'>$fin:00</span>" .
  641. "\n<span style='border:0;$spip_lang_left:0;top:${c}px;'>23:59</span>";
  642. }
  643. /// si la largeur le permet, les evenements sans duree,
  644. /// se placent a cote des autres, sinon en dessous
  645. // http://doc.spip.org/@http_calendrier_ics_trois
  646. function http_calendrier_ics_trois($evt, $largeur, $dimjour, $echelle, $border)
  647. {
  648. global $spip_lang_left;
  649. $types = array();
  650. foreach($evt as $v)
  651. $types[isset($v['DESCRIPTION']) ? 'info_articles' :
  652. (isset($v['DTSTART']) ? 'info_liens_syndiques_3' :
  653. 'info_breves_02')][] = $v;
  654. $res = '';
  655. foreach ($types as $k => $v) {
  656. $res2 = '';
  657. foreach ($v as $evenement) {
  658. $res2 .= http_calendrier_sans_heure($evenement);
  659. }
  660. $res .= "\n<div class='calendrier-verdana calendrier-titre'>".
  661. _T($k) .
  662. "</div>" .
  663. $res2;
  664. }
  665. $size = floor(14 / (1+($echelle/240)));
  666. if ($largeur > 90) {
  667. $largeur += (5*$size);
  668. $pos = "-$dimjour";
  669. } else { $largeur = (3*$size); $pos= 0; }
  670. return "\n<div style='position: relative; z-index: 2; top: ${pos}px; margin-$spip_lang_left: " . $largeur . "px'>$res</div>";
  671. }
  672. // http://doc.spip.org/@http_calendrier_ics_titre
  673. function http_calendrier_ics_titre($annee, $mois, $jour,$script, $finurl='', $ancre='')
  674. {
  675. $date = mktime(0,0,0,$mois, $jour, $annee);
  676. $jour = date("d",$date);
  677. $mois = date("m",$date);
  678. $annee = date("Y",$date);
  679. $nom = affdate_jourcourt("$annee-$mois-$jour");
  680. return "<div class='calendrier-arial10 calendrier-titre'>" .
  681. calendrier_href($script, $annee, $mois, $jour, 'jour', $finurl, $ancre, '', $nom, 'calendrier-noir','',$nom) .
  682. "</div>";
  683. }
  684. // http://doc.spip.org/@http_calendrier_sans_date
  685. function http_calendrier_sans_date($annee, $mois, $evenements)
  686. {
  687. $r = $evenements[0+($annee . $mois . "00")];
  688. if (!$r) return "";
  689. $res = "\n<div class='calendrier-arial10 calendrier-titre'>".
  690. _T('info_mois_courant').
  691. "</div>";
  692. foreach ($r as $evenement) $res .= http_calendrier_sans_heure($evenement);
  693. return $res;
  694. }
  695. // http://doc.spip.org/@http_calendrier_sans_heure
  696. function http_calendrier_sans_heure($ev)
  697. {
  698. $desc = PtoBR(propre($ev['DESCRIPTION']));
  699. $sum = typo($ev['SUMMARY']);
  700. if (!$sum) $sum = $desc;
  701. $i = isset($ev['DESCRIPTION']) ? 11 : 9; // 11: article; 9:autre
  702. if ($ev['URL'])
  703. $sum = http_href(quote_amp($ev['URL']), $sum, attribut_html($desc));
  704. $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$ev,'type'=>'sans_heure'),'data'=>$sum));
  705. return "\n<div class='calendrier-arial$i calendrier-evenement'>" .
  706. "<span class='" . $ev['CATEGORIES'] . "'>&nbsp;</span>&nbsp;$sum</div>";
  707. }
  708. // http://doc.spip.org/@http_calendrier_avec_heure
  709. function http_calendrier_avec_heure($evenement, $amj)
  710. {
  711. $jour_debut = substr($evenement['DTSTART'], 0,8);
  712. $jour_fin = substr($evenement['DTEND'], 0, 8);
  713. if ($jour_fin <= 0) $jour_fin = $jour_debut;
  714. if (($jour_debut <= 0) OR ($jour_debut > $amj) OR ($jour_fin < $amj))
  715. return "";
  716. $desc = PtoBR(propre($evenement['DESCRIPTION']));
  717. $sum = $evenement['SUMMARY'];
  718. $u = $GLOBALS['meta']['pcre_u'];
  719. $sum = typo($sum);
  720. if (!$sum) $sum = $desc;
  721. if ($lieu = $evenement['LOCATION'])
  722. $sum .= '<br />' . $lieu;
  723. if ($perso = construire_personne_ics($evenement['ATTENDEE']))
  724. $sum .= '<br />' . $perso;
  725. if ($evenement['URL'])
  726. $sum = http_href(quote_amp($evenement['URL']), $sum, attribut_html($desc), 'border: 0');
  727. $sum = pipeline('agenda_rendu_evenement',array('args'=>array('evenement'=>$evenement,'type'=>'avec_heure'),'data'=>$sum));
  728. $deb_h = substr($evenement['DTSTART'],-6,2);
  729. $deb_m = substr($evenement['DTSTART'],-4,2);
  730. $fin_h = substr($evenement['DTEND'],-6,2);
  731. $fin_m = substr($evenement['DTEND'],-4,2);
  732. $opacity = $evenement['CATEGORIES'];
  733. if ($amj != $jour_debut AND $amj != $jour_fin) {
  734. $opacity .= ' calendrier-opacity';
  735. } else {
  736. if ($deb_h >0 OR $deb_m > 0) {
  737. if ((($deb_h > 0) OR ($deb_m > 0)) AND $amj == $jour_debut)
  738. { $deb = $deb_h . ':' . $deb_m;}
  739. else {
  740. $deb = '...';
  741. }
  742. if ((($fin_h > 0) OR ($fin_m > 0)) AND $amj == $jour_fin)
  743. { $fin = $fin_h . ':' . $fin_m;}
  744. else {
  745. $fin = '...';
  746. }
  747. $sum = "<div style='font-weight: bold;'>$deb-$fin</div>$sum";
  748. }
  749. }
  750. return "\n<div class='calendrier-arial10 calendrier-evenement $opacity'>$sum\n</div>\n";
  751. }
  752. /// Gestion du sous-tableau ATTENDEE.
  753. /// dans les version anterieures, ce n'etait pas un tableau
  754. function construire_personne_ics($personnes)
  755. {
  756. $r = is_array($personnes) ? $personnes : array($personnes);
  757. foreach ($r as $k => $p) {
  758. if ($a = email_valide($p) AND preg_match('/^[^@]+/', $a, $m))
  759. $r[$k] = "<a href='mailto:$a'>".preg_replace('/[.]/', ' ', $m[0]). "</a>";
  760. }
  761. return join(' ', $r);
  762. }
  763. /// fabrique un agenda sur 3 mois.
  764. /// fonction appelee par le filtre agenda_affiche du squelette agenda_trimestre,
  765. /// lui-meme issu d'un Ajax construit par la fonction http_calendrier_navigation,
  766. /// qui fournit via $self la query-string de l'appel anterieur.
  767. /// Celle-ci est vide sur les squelettes agenda std cependant.
  768. function http_calendrier_trimestre($annee, $mois, $jour, $echelle, $partie_cal, $self, $ancre, $evt)
  769. {
  770. global $spip_lang_right, $spip_lang_left, $spip_ecran;
  771. if (!isset($spip_ecran)) $spip_ecran = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "large";
  772. $script = preg_match('/\bscript=(\w+)/', $self, $m) ? $m[1]:'';
  773. $script = (preg_match('/\bprive=(.)/', $self, $m) ? $m[1] : 0)
  774. ? generer_url_ecrire($script) : generer_url_public($script);
  775. $fin = preg_replace('/^.*[?]page=agenda_trimestre/', '', $self)
  776. . calendrier_retire_defaults($echelle, $partie_cal);
  777. $res = "\n<tr><td colspan='3' style='text-align:$spip_lang_left;'>";
  778. $annee_avant = $annee - 1;
  779. $annee_apres = $annee + 1;
  780. for ($i=$mois; $i < 13; $i++) {
  781. $nom = nom_mois("$annee_avant-$i-1");
  782. $res .= calendrier_href($script,$annee_avant, $i, 1, "mois", $fin, $ancre,'', ($nom . ' ' . $annee_avant), 'calendrier-annee','', $nom) ;
  783. }
  784. for ($i=1; $i < $mois - 1; $i++) {
  785. $nom = nom_mois("$annee-$i-1");
  786. $res .= calendrier_href($script,$annee, $i, 1, "mois", $fin, $ancre,'',($nom . ' ' . $annee),'calendrier-annee','', $nom);
  787. }
  788. $script .= $fin ; // http_calendrier_agenda devrait avoir cet arg en +
  789. $res .= "</td></tr>"
  790. . "\n<tr><td class='calendrier-tripleagenda'>"
  791. . http_calendrier_agenda($annee, $mois-1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
  792. . "</td>\n<td class='calendrier-tripleagenda'>"
  793. . http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
  794. . "</td>\n<td class='calendrier-tripleagenda'>"
  795. . http_calendrier_agenda($annee, $mois+1, $jour, $mois, $annee, $GLOBALS['afficher_bandeau_calendrier_semaine'], $script,$ancre)
  796. . "</td>"
  797. . "</tr>"
  798. . "\n<tr><td colspan='3' style='text-align:$spip_lang_right;'>";
  799. for ($i=$mois+2; $i <= 12; $i++) {
  800. $nom = nom_mois("$annee-$i-1");
  801. $res .= calendrier_href($script, $annee, $i, 1, "mois", $fin, $ancre,'',$nom . ' ' . $annee, 'calendrier-annee','', $nom);
  802. }
  803. for ($i=1; $i < $mois+1; $i++) {
  804. $nom = nom_mois("$annee_apres-$i-1");
  805. $res .= calendrier_href($script, $annee_apres, $i, 1, "mois", $fin, $ancre,'',$nom . ' ' . $annee_apres, 'calendrier-annee','',$nom);
  806. }
  807. $res .= "</td></tr>";
  808. $id = ($ancre ? $ancre : 'agenda') . "-nav";
  809. return
  810. "<div><div id='$id'></div>" .
  811. "<table class='calendrier-cadreagenda calendrier-$spip_ecran'
  812. onmouseover=\"$('#$id').show();\"
  813. onmouseout=\"$('#$id').hide();\">$res</table>" .
  814. "</div>";
  815. }
  816. /// Bandeau superieur d'un calendrier selon son $type (jour/mois/annee):
  817. /// 2(+1) icones vers les 2 autres types, a la meme date $jour $mois $annee
  818. /// 2 icones de loupes pour zoom sur la meme date et le meme type
  819. /// 4 icones de selection de demi-journees, idem
  820. /// 2 fleches appelant le $script sur les periodes $pred/$suiv avec une $ancre
  821. /// 1 icone pour amener sur aujourd'hui au clic, et donner un triple agenda au survol
  822. /// et le $nom du calendrier
  823. // http://doc.spip.org/@http_calendrier_navigation
  824. function http_calendrier_navigation($annee, $mois, $jour, $echelle, $partie_cal, $nom, $script, $args_pred, $args_suiv, $type, $ancre)
  825. {
  826. global $spip_lang_right, $spip_lang_left;
  827. if (!$echelle) $echelle = DEFAUT_D_ECHELLE;
  828. $arg_echelle = ($echelle != DEFAUT_D_ECHELLE) ? "&amp;echelle=$echelle" : '';
  829. $arg_partie = ($partie_cal != DEFAUT_PARTIE) ? "&amp;partie_cal=$partie_cal" : '';
  830. if ($args_pred) {
  831. list($a, $m, $j, $t) = $args_pred;
  832. $args_pred = calendrier_href($script, $a, $m, $j, $t, "$arg_echelle$arg_partie", $ancre,
  833. "fleche-$spip_lang_left.png",
  834. _T('precedent'),
  835. 'calendrier-png',
  836. '&lt;&lt;&lt;');
  837. }
  838. if ($args_suiv) {
  839. list($a, $m, $j, $t) = $args_suiv;
  840. $args_suiv = calendrier_href($script, $a, $m, $j, $t, "$arg_echelle$arg_partie", $ancre,
  841. "fleche-$spip_lang_right.png",
  842. _T('suivant'),
  843. 'calendrier-png',
  844. '&gt;&gt;&gt;');
  845. }
  846. $today = getdate(time());
  847. $jour_today = $today["mday"];
  848. $mois_today = $today["mon"];
  849. $annee_today = $today["year"];
  850. if (preg_match('/[?&;](exec=(\w+)(&(amp;)?)?)/', $script, $regs)) {
  851. $page = $regs[2]; $prive = 1; $raz = $regs[1];
  852. } elseif (preg_match('/[?&;](page=(\w+)(&(amp;)?)?)/', $script, $regs)) {
  853. $page = $regs[2]; $prive = 0; $raz = $regs[1];
  854. } else $page = $prive = $raz = '';
  855. $href = generer_url_public('agenda_trimestre', substr(str_replace($raz, '', $script), strpos($script, '?')+1));
  856. $href = parametre_url($href, 'script', $page);
  857. $href = parametre_url($href, 'prive', $prive);
  858. $href = parametre_url($href, 'ancre', $ancre);
  859. $href = calendrier_args_date($href, $annee, $mois, $jour, '', "$arg_echelle" . ((DEFAUT_PARTIE == DEFAUT_PARTIE_R) ? '' : ("&amp;partie_cal=" . DEFAUT_PARTIE_R)));
  860. $id = ($ancre ? $ancre : 'agenda') . "-nav";
  861. $onmouseover = "if (!this.trimestre)\n{this.trimestre=!charger_node_url('$href', document.getElementById('$id'));}\n;$('#$id').css('visibility','visible').show();";
  862. return
  863. "\n<caption>"
  864. . "\n<span style='float: $spip_lang_left;'>"
  865. . calendrier_href($script,$annee_today, $mois_today, $jour_today, $type, "$arg_echelle$arg_partie", $ancre,
  866. "cal-today.gif",
  867. _T("ecrire:info_aujourdhui"),
  868. (($annee == $annee_today && $mois == $mois_today && (($type == 'mois') || ($jour == $jour_today)))
  869. ? "calendrier-opacity" : ""),
  870. '','','',
  871. ("\nonmouseover=\"$onmouseover\"" ))
  872. . "&nbsp;"
  873. . $args_pred
  874. . $args_suiv
  875. . "&nbsp;&nbsp;"
  876. . $nom
  877. . (!test_espace_prive() ? '' : aide("messcalen"))
  878. . "</span>"
  879. . "&nbsp;\n" // Sans "nbsp" Safari (5.1) n'affiche aucun des 2 span !!
  880. . "<span style='float: $spip_lang_right;'>"
  881. . (($type == "mois") ? '' :
  882. calendrier_navigation_heures($annee, $mois, $jour, $echelle, $partie_cal, $script, $type, $ancre))
  883. . calendrier_navigation_type($annee, $mois, $jour, "$arg_echelle$arg_partie", $script, $type)
  884. . "</span></caption>";
  885. }
  886. /// Bloc de navigation pour zoom sur les heures
  887. function calendrier_navigation_heures($annee, $mois, $jour, $echelle, $partie_cal, $script, $type, $ancre)
  888. {
  889. return
  890. calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults($echelle, DEFAUT_PARTIE_R), $ancre,
  891. "sans-heure.gif",
  892. _T('sans_heure'),
  893. "calendrier-png" .
  894. (($partie_cal == DEFAUT_PARTIE_R) ? " calendrier-opacity" : ""))
  895. . calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults($echelle, DEFAUT_PARTIE_T), $ancre,
  896. "heures-tout.png",
  897. _T('cal_jour_entier'),
  898. "calendrier-png" .
  899. (($partie_cal == DEFAUT_PARTIE_T) ? " calendrier-opacity" : ""))
  900. . calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults($echelle, DEFAUT_PARTIE_M), $ancre,
  901. "heures-am.png",
  902. _T('cal_matin'),
  903. "calendrier-png" .
  904. (($partie_cal == DEFAUT_PARTIE_M) ? " calendrier-opacity" : ""))
  905. . calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults($echelle, DEFAUT_PARTIE_S), $ancre,
  906. "heures-pm.png",
  907. _T('cal_apresmidi'),
  908. "calendrier-png" .
  909. (($partie_cal == DEFAUT_PARTIE_S) ? " calendrier-opacity" : ""))
  910. . "&nbsp;"
  911. . calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults(floor($echelle * 1.5), $partie_cal),
  912. $ancre,
  913. "loupe-moins.gif",
  914. _T('info_zoom'). '-')
  915. . calendrier_href($script, $annee, $mois, $jour, $type, calendrier_retire_defaults(floor($echelle / 1.5), $partie_cal),
  916. $ancre,
  917. "loupe-plus.gif",
  918. _T('info_zoom'). '+')
  919. ;
  920. }
  921. /// Bloc de navigation sur le type mois/semaine/jour
  922. function calendrier_navigation_type($annee, $mois, $jour, $finurl, $script, $type)
  923. {
  924. return
  925. calendrier_href($script,$annee, $mois, $jour, "jour", "$arg_echelle$arg_partie", $ancre,"cal-jour.gif",
  926. _T('cal_par_jour'),
  927. (($type == 'jour') ? " calendrier-opacity" : ''))
  928. . calendrier_href($script,$annee, $mois, $jour, "semaine", "$arg_echelle$arg_partie", $ancre, "cal-semaine.gif",
  929. _T('cal_par_semaine'),
  930. (($type == 'semaine') ? " calendrier-opacity" : "" ))
  931. . calendrier_href($script,$annee, $mois, $jour, "mois", "$arg_echelle$arg_partie", $ancre,"cal-mois.gif",
  932. _T('cal_par_mois'),
  933. (($type == 'mois') ? "calendrier-opacity" : "" ));
  934. }
  935. /// agenda mensuel
  936. // http://doc.spip.org/@http_calendrier_agenda
  937. function http_calendrier_agenda ($annee, $mois, $jour_ved, $mois_ved, $annee_ved, $semaine = false, $script='', $ancre='', $evt='') {
  938. if (!$script) $script = $GLOBALS['PHP_SELF'] ;
  939. if (!$mois) {$mois = 12; $annee--;}
  940. elseif ($mois==13) {$mois = 1; $annee++;}
  941. if (!$evt) $evt = quete_calendrier_agenda($annee, $mois);
  942. $nom = affdate_mois_annee("$annee-$mois-1");
  943. return
  944. "<div class='calendrier-titre calendrier-arial10'>" .
  945. calendrier_href($script, $annee, $mois, 1, 'mois', '', $ancre,'', $nom,'','', $nom,'color: black;') .
  946. "<table width='100%'>" .
  947. http_calendrier_agenda_rv ($annee, $mois, $evt,
  948. 'calendrier_href', $script, $ancre,
  949. $jour_ved, $mois_ved, $annee_ved,
  950. $semaine) .
  951. "</table>" .
  952. "</div>";
  953. }
  954. /// typographie un mois sous forme d'un tableau de 7 colonnes
  955. // http://doc.spip.org/@http_calendrier_agenda_rv
  956. function http_calendrier_agenda_rv ($annee, $mois, $les_rv, $fclic,
  957. $script='', $ancre='',
  958. $jour_ved='', $mois_ved='', $annee_ved='',
  959. $semaine='') {
  960. global $spip_lang_left, $spip_lang_right;
  961. // Former une date correcte (par exemple: $mois=13; $annee=2003)
  962. $date_test = date("Y-m-d", mktime(0,0,0,$mois, 1, $annee));
  963. $mois = mois($date_test);
  964. $annee = annee($date_test);
  965. if ($semaine)
  966. {
  967. $jour_semaine_valide = date("w",mktime(1,1,1,$mois_ved,$jour_ved,$annee_ved));
  968. if ($jour_semaine_valide==0) $jour_semaine_valide=7;
  969. $debut = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+1,$annee_ved);
  970. $fin = mktime(1,1,1,$mois_ved,$jour_ved-$jour_semaine_valide+7,$annee_ved);
  971. } else { $debut = $fin = '';}
  972. $today=getdate(time());
  973. $jour_today = $today["mday"];
  974. $cemois = ($mois == $today["mon"] AND $annee == $today["year"]);
  975. $total = '';
  976. $ligne = '';
  977. $jour_semaine = date("w", mktime(1,1,1,$mois,1,$annee));
  978. if ($jour_semaine==0) $jour_semaine=7;
  979. for ($i=1;$i<$jour_semaine;$i++) $ligne .= "\n<td></td>";
  980. for ($j=1; (checkdate($mois,$j,$annee)); $j++) {
  981. $class = 'calendrier-agenda-abb11';
  982. $nom = mktime(1,1,1,$mois,$j,$annee);
  983. $jour_semaine = date("w",$nom);
  984. $title = "$j-$mois-$annee";
  985. if ($jour_semaine==0) $jour_semaine=7;
  986. if ($j == $jour_ved AND $mois == $mois_ved AND $annee == $annee_ved) {
  987. $type = 'jour';
  988. } else if ($semaine AND $nom >= $debut AND $nom <= $fin) {
  989. $class .=
  990. (($jour_semaine==1) ? " calendrier-$spip_lang_left" :
  991. (($jour_semaine==7) ? " calendrier-$spip_lang_right" :
  992. ''));
  993. $type = ($semaine ? 'semaine' : 'jour') ;
  994. } else {
  995. if ($j == $jour_today AND $cemois) {
  996. $toile = ' jour_encours';
  997. } else {
  998. if ($jour_semaine == 7) {
  999. $toile = " jour_dimanche";
  1000. } else {
  1001. $toile = ' jour_gris';
  1002. }
  1003. if (isset($les_rv[$j])) {
  1004. $toile = " jour_pris$toile";
  1005. $title = textebrut($les_rv[$j]['SUMMARY']);
  1006. }
  1007. }
  1008. $class .= $toile;
  1009. $type = ($semaine ? 'semaine' : 'jour') ;
  1010. }
  1011. $corps = $fclic($script, $annee, $mois, $j,$type, '', $ancre,'', $title ,'','', $j);
  1012. $ligne .= "\n<td class='$class'>$corps</td>";
  1013. if ($jour_semaine==7)
  1014. {
  1015. if ($ligne) $total .= "\n<tr>$ligne</tr>";
  1016. $ligne = '';
  1017. }
  1018. }
  1019. return $total . (!$ligne ? '' : "\n<tr>$ligne</tr>");
  1020. }
  1021. /// Fonctions pour la messagerie, la page d'accueil et les gadgets
  1022. // http://doc.spip.org/@http_calendrier_messages
  1023. function http_calendrier_messages($annee='', $mois='', $jour='', $heures='', $partie_cal='', $echelle='')
  1024. {
  1025. $evtm = quete_calendrier_agenda($annee, $mois);
  1026. if ($evtm OR !$heures)
  1027. $evtm = http_calendrier_agenda($annee, $mois, $jour, $mois, $annee, false, generer_url_ecrire('calendrier'), '', $evtm);
  1028. else $evtm= '';
  1029. $evtt = http_calendrier_rv(quete_calendrier_taches_annonces(),"annonces")
  1030. . http_calendrier_rv(quete_calendrier_taches_pb(),"pb")
  1031. . http_calendrier_rv(quete_calendrier_taches_rv(), "rv");
  1032. $evtr= '';
  1033. if ($heures) {
  1034. $date = date("$annee-$mois-$jour");
  1035. $datef = "'$date $heures'";
  1036. if ($heures = quete_calendrier_interval_rv("'$date'", $datef))
  1037. $evtr = http_calendrier_ics_titre($annee,$mois,$jour,generer_url_ecrire('calendrier')) . http_calendrier_ics($annee, $mois, $jour, $echelle, $partie_cal, 90, array('', $heures), '', ' calendrier-msg');
  1038. }
  1039. return array($evtm, $evtt, $evtr);
  1040. }
  1041. // http://doc.spip.org/@http_calendrier_rv
  1042. function http_calendrier_rv($messages, $type) {
  1043. $total = $date_rv = '';
  1044. if (!$messages) return $total;
  1045. $connect_quand = $GLOBALS['visiteur_session']['quand'];
  1046. foreach ($messages as $row) {
  1047. $rv = ($row['location'] == 'oui');
  1048. $date = $row['dtstart'];
  1049. $date_fin = $row['dtend'];
  1050. if ($row['category']=="pb") $bouton = "pense-bete";
  1051. else if ($row['category']=="affich") $bouton = "annonce";
  1052. else $bouton = "message";
  1053. if ($rv) {
  1054. $date_jour = affdate_jourcourt($date);
  1055. $total .= "<tr><td colspan='2'>" .
  1056. (($date_jour == $date_rv) ? '' :
  1057. "\n<div class='calendrier-arial11'><b>$date_jour</b></div>") .
  1058. "</td></tr>";
  1059. $date_rv = $date_jour;
  1060. $rv =
  1061. ((affdate($date) == affdate($date_fin)) ?
  1062. ("\n<div class='calendrier-arial9 fond-agenda'>"
  1063. . heures($date).":".minutes($date)."<br />"
  1064. . heures($date_fin).":".minutes($date_fin)."</div>") :
  1065. ( "\n<div class='calendrier-arial9 fond-agenda' style='text-align: center;'>"
  1066. . heures($date).":".minutes($date)."<br />...</div>" ));
  1067. }
  1068. $c = (strtotime($date) <= $connect_quand) ? '' : " color: red;";
  1069. $total .= "<tr><td style='width: 24px' valign='middle'>" .
  1070. http_href($row['url'],
  1071. ($rv ?
  1072. http_img_pack("rv.gif", 'rv',
  1073. http_style_background($bouton . '.gif', "no-repeat;")) :
  1074. http_img_pack($bouton.".gif", $bouton, ""))) .
  1075. "</td>\n" .
  1076. "<td valign='middle'><div style='font-weight: bold;$c'>" .
  1077. $rv .
  1078. http_href($row['url'], typo($row['summary']), '', '', 'calendrier-verdana') .
  1079. "</div></td></tr>";
  1080. }
  1081. if ($type == 'annonces') {
  1082. $titre = _T('info_annonces_generales');
  1083. }
  1084. else if ($type == 'pb') {
  1085. $titre = _T('infos_vos_pense_bete');
  1086. }
  1087. else if ($type == 'rv') {
  1088. $titre = _T('info_vos_rendez_vous');
  1089. }
  1090. return
  1091. debut_cadre_enfonce("", true, "", $titre) .
  1092. "\n<table>" .
  1093. $total .
  1094. "</table>" .
  1095. fin_cadre_enfonce(true);
  1096. }
  1097. // http://doc.spip.org/@calendrier_categories
  1098. function calendrier_categories($table, $num, $objet)
  1099. {
  1100. if (function_exists('generer_calendrier_class'))
  1101. return generer_calendrier_class($table, $num, $objet);
  1102. else {
  1103. // cf agenda.css
  1104. $num= sql_getfetsel((($objet != 'id_breve') ? 'id_secteur' : 'id_rubrique') . " AS id", $table, "$objet=$num");
  1105. return 'calendrier-couleur' . (($num%14)+1);
  1106. }
  1107. }
  1108. // http://doc.spip.org/@http_calendrier_ics_message
  1109. function http_calendrier_ics_message($annee, $mois, $jour, $large)
  1110. {
  1111. if (!autoriser('ecrire')) return '';
  1112. $b = _T("lien_nouvea_pense_bete");
  1113. $v = _T("lien_nouveau_message");
  1114. $j= _T("lien_nouvelle_annonce");
  1115. return "&nbsp;" .
  1116. http_href(generer_action_auteur("editer_message","pb/$annee-$mois-$jour"),
  1117. ($large ? $b : '&nbsp;'),
  1118. attribut_html($b),
  1119. 'color: blue;',
  1120. 'calendrier-arial10 pense-bete') .
  1121. "\n" .
  1122. http_href(generer_action_auteur("editer_message","normal/$annee-$mois-$jour"),
  1123. ($large ? $v : '&nbsp;'),
  1124. attribut_html($v),
  1125. 'color: green;',
  1126. 'calendrier-arial10 message') .
  1127. (($GLOBALS['connect_statut'] != "0minirezo") ? "" :
  1128. ("\n" .
  1129. http_href(generer_action_auteur("editer_message","affich/$annee-$mois-$jour"),
  1130. ($large ? $j : '&nbsp;'),
  1131. attribut_html($j),
  1132. 'color: #ff9900;',
  1133. 'calendrier-arial10 annonce')));
  1134. }
  1135. // http://doc.spip.org/@http_calendrier_aide_mess
  1136. function http_calendrier_aide_mess()
  1137. {
  1138. global $spip_lang_left;
  1139. if (!autoriser('ecrire')) return '';
  1140. return
  1141. "\n<br /><br /><br />" .
  1142. "\n<div class='arial1 spip_xx-small'>" .
  1143. "<span style='text-align: $spip_lang_left; font-weight: bold;'> " . _T('info_aide'). "</span>" .
  1144. "<div class='pense-bete'>" ._T('info_symbole_bleu')."\n</div>" .
  1145. "<div class='message'>" . _T('info_symbole_vert')."\n</div>" .
  1146. "<div class='annonce'>" . _T('info_symbole_jaune')."\n</div>" .
  1147. "</div>\n";
  1148. }
  1149. //------- fonctions d'appel MySQL.
  1150. // au dela cette limite, pas de production HTML
  1151. // http://doc.spip.org/@quete_calendrier_mois
  1152. function quete_calendrier_mois($annee,$mois,$jour) {
  1153. $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,1,$annee)) . "'";
  1154. $apres = "'" . date("Y-m-d", mktime(0,0,0,$mois+1,1,$annee)) .
  1155. " 00:00:00'";
  1156. return array($avant, $apres);
  1157. }
  1158. // http://doc.spip.org/@quete_calendrier_semaine
  1159. function quete_calendrier_semaine($annee,$mois,$jour) {
  1160. $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee));
  1161. if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero
  1162. $debut = $jour-$w_day;
  1163. $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$debut,$annee)) . "'";
  1164. $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$debut+7,$annee)) .
  1165. " 23:59:59'";
  1166. return array($avant, $apres);
  1167. }
  1168. /// ici on prend en fait le jour, la veille et le lendemain
  1169. // http://doc.spip.org/@quete_calendrier_jour
  1170. function quete_calendrier_jour($annee,$mois,$jour) {
  1171. $avant = "'" . date("Y-m-d", mktime(0,0,0,$mois,$jour-1,$annee)) . "'";
  1172. $apres = "'" . date("Y-m-d", mktime(1,1,1,$mois,$jour+1,$annee)) .
  1173. " 23:59:59'";
  1174. return array($avant, $apres);
  1175. }
  1176. /// retourne un tableau de 2 tableaux indexes par des dates
  1177. /// - le premier indique les evenements du jour, sans indication de duree
  1178. /// - le deuxime indique les evenements commencant ce jour, avec indication de duree
  1179. // http://doc.spip.org/@quete_calendrier_interval
  1180. function quete_calendrier_interval($limites) {
  1181. include_spip('inc/u…

Large files files are truncated, but you can click here to view the full file