[SPIP] +2.1.12
[velocampus/web/www.git] / www / ecrire / inc / statistiques.php
diff --git a/www/ecrire/inc/statistiques.php b/www/ecrire/inc/statistiques.php
new file mode 100644 (file)
index 0000000..26e1494
--- /dev/null
@@ -0,0 +1,669 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2011                                                *
+ *  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;
+
+// http://doc.spip.org/@aff_statistique_visites_popularite
+function aff_statistique_visites_popularite($serveur, $id_article, &$classement, &$liste){
+       // Par popularite
+       $result = sql_select("id_article, titre, popularite, visites", "spip_articles", "statut='publie' AND popularite > 0", "", "popularite DESC",'','',$serveur);
+       $out = '';
+       while ($row = sql_fetch($result,$serveur)) {
+               $l_article = $row['id_article'];
+               $liste++;
+               $classement[$l_article] = $liste;
+
+               if ($liste <= 30) {
+                       $articles_vus[] = $l_article;
+                       $out .= statistiques_populaires($row, $id_article, $liste);
+               }
+       }
+       $recents = array();
+       $q = sql_select("id_article", "spip_articles", "statut='publie' AND popularite > 0", "", "date DESC", "10",'',$serveur);
+       while ($r = sql_fetch($q,$serveur))
+               if (!in_array($r['id_article'], $articles_vus))
+                       $recents[]= $r['id_article'];
+
+       if ($recents) {
+               $result = sql_select("id_article, titre, popularite, visites", "spip_articles", "statut='publie' AND " . sql_in('id_article', $recents), "", "popularite DESC",'','',$serveur);
+
+               $out .= "</ul><div style='text-align: center'>[...]</div>" .
+               "<ul class='classement'>";
+               while ($row = sql_fetch($result,$serveur)) {
+                       $l_article = $row["id_article"];
+                       $out .= statistiques_populaires($row, $id_article, $classement[$l_article]);
+               }
+       }
+
+       return !$out ? '' : (
+               "<div class='cadre cadre-e'>\n"
+               ."<div class='cadre_padding verdana1 spip_x-small'>"
+               .typo(_T('info_visites_plus_populaires'))
+               ."<ul class='classement'>"
+               .$out
+
+               ."</ul>"
+               
+               ."<div class='arial11'><b>"._T('info_comment_lire_tableau')."</b><br />"._T('texte_comment_lire_tableau')."</div>"
+
+               ."</div>"
+               ."</div>");
+}
+
+function statistiques_populaires($row, $id_article, $classement)
+{
+       $titre = typo(supprime_img($row['titre'], ''));
+       $l_article = $row['id_article'];
+
+       if ($l_article == $id_article){
+               return "<li class='on'><em>$classement.</em>$titre</li>";
+       } else {
+               $visites = $row['visites'];
+               $popularite = round($row['popularite']);
+               return "<li><em>$classement.</em><a href='" . generer_url_ecrire("statistiques_visites","id_article=$l_article") . "' title='"._T('info_popularite_3', array('popularite' => $popularite, 'visites' => $visites))."'>$titre</a></li>";
+       }
+}
+
+// http://doc.spip.org/@aff_statistique_visites_par_visites
+function aff_statistique_visites_par_visites($serveur='', $id_article=0, $classement= array()) {
+       $res = "";
+       // Par visites depuis le debut
+       $result = sql_select("id_article, titre, popularite, visites", "spip_articles", "statut='publie' AND popularite > 0", "", "visites DESC", "30",'',$serveur);
+
+       while ($row = sql_fetch($result,$serveur)) {
+               $titre = typo(supprime_img($row['titre'],''));
+               $l_article = $row['id_article'];
+
+               if ($l_article == $id_article){
+                       $res.= "<li class='on'><em>"
+                       . $classement[$l_article]
+                       . ".</em>$titre</li>";
+               } else {
+                       $t = _T('info_popularite_4',
+                               array('popularite' => round($row['popularite']), 'visites' =>  $row['visites']));
+                       $h = generer_url_ecrire("statistiques_visites","id_article=$l_article");
+                       $out = "<a href='$h'\ntitle='$t'>$titre</a>";
+                       $res.= "<li><em>"
+                               . $classement[$l_article]
+                               . ".</em>$out</li>";
+               }
+       }
+
+       if (!$res) return '';
+
+       return "<div class='cadre cadre-e' style='padding: 5px;'>"
+         . "<div class='cadre_padding verdana1 spip_x-small'>"
+         . typo(_T('info_affichier_visites_articles_plus_visites'))
+         . "<ul class='classement'>"
+         . $res
+         . '</ul></div></div>';
+}
+
+// http://doc.spip.org/@http_img_rien
+function http_img_rien($width, $height, $class='', $title='') {
+       return http_img_pack('rien.gif', $title,
+               "width='$width' height='$height'"
+               . (!$class ? '' : (" class='$class'"))
+               . (!$title ? '' : (" title=\"$title\"")));
+}
+
+// Donne la hauteur du graphe en fonction de la valeur maximale
+// Doit etre un entier "rond", pas trop eloigne du max, et dont
+// les graduations (divisions par huit) soient jolies :
+// on prend donc le plus proche au-dessus de x de la forme 12,16,20,40,60,80,100
+// http://doc.spip.org/@maxgraph
+function maxgraph($max) {
+
+       switch ($n =strlen($max)) {
+       case 0:
+               return 1;
+       case 1:
+               return 16;
+       case 2:
+               return (floor($max / 8) + 1) * 8;
+       case 3:
+               return (floor($max / 80) + 1) * 80;
+       default:
+               $dix = 2 * pow(10, $n-2);
+               return (floor($max / $dix) + 1) * $dix;
+       }
+}
+
+// http://doc.spip.org/@cadre_stat
+function cadre_stat($stats, $table, $id_article)
+{
+       if (!$stats) return '';
+       return debut_cadre_relief("statistiques-24.gif", true)
+       . join('', $stats)
+       . fin_cadre_relief(true)
+       . statistiques_mode($table, $id_article);
+}
+
+// http://doc.spip.org/@statistiques_collecte_date
+function statistiques_collecte_date($count, $date, $table, $where, $serveur)
+{
+       $result = sql_select("$count AS n, $date AS d", $table, $where, 'd', 'd', '','', $serveur);
+       $log = array();
+
+       while ($r = sql_fetch($result,$serveur)) $log[$r['d']] = $r['n'];
+       return $log;
+}
+
+// http://doc.spip.org/@statistiques_tous
+function statistiques_tous($log, $id_article, $table, $where, $order, $serveur, $duree, $interval, $total, $popularite, $liste='', $classement=array(), $script='')
+{
+       $r = array_keys($log);
+       $date_fin = max($r);
+       $today = strtotime(date('Y-m-d 01:00:01'));
+       if ($today-$date_fin>$interval){
+               $log[$today] = 0;
+               $r = array_keys($log);
+               $date_fin = max($r);
+       }
+       $date_debut = min($r);
+       $date_premier = sql_getfetsel("UNIX_TIMESTAMP($order) AS d", $table, $where, '', $order, 1,'',$serveur);
+       $last = $log[$date_fin];
+       $max = max($log);
+       $maxgraph = maxgraph($max);
+       $rapport = 200 / $maxgraph;
+       $agreg = ceil(count($log) / 420);
+       $x = ceil(($date_fin-$date_debut)/$interval);
+       $largeur = ($agreg > 1) ? 1 : (!$x ? 420 :  floor(420 / $x));
+
+       if ($largeur > 50) $largeur = 50; elseif ($largeur < 1) $largeur = 1;
+
+       list($moyenne,$prec, $res) = stat_log1($log, $agreg, $date_fin, $largeur, $rapport, $interval, $script);
+
+       $stats = "\n<table cellpadding='0' cellspacing='0' border='0'><tr>" .
+         "\n<td ".http_style_background("fond-stats.gif").">"
+       . "\n<table cellpadding='0' cellspacing='0' border='0' class='bottom'><tr>"
+       . "\n<td style='background-color: black'>" . http_img_rien(1, 200) . "</td>"
+       . $res
+         . (!is_array($liste) ? '' : // prevision que pour les visites
+            statistiques_prevision($id_article, $largeur, $moyenne, $rapport, $popularite, $last))
+       . "\n<td style='background-color: black'>"
+       . http_img_rien(1, 1) ."</td>"
+       . "</tr></table>"
+       . "</td>\n<td "
+       . http_style_background("fond-stats.gif")."  valign='bottom'>"
+       . http_img_rien(3, 1, 'trait_bas') ."</td>"
+       . "\n<td>" . http_img_rien(5, 1) ."</td>"
+       . "\n<td valign='top'>"
+       . statistiques_echelle($maxgraph)
+       . "</td>"
+       . "</tr></table>";
+
+       $total = "<b>" .  _T('info_total') ." " . $total."</b>";
+
+       if  (is_array($liste)) {
+               $liste = statistiques_classement($id_article, $classement, $liste);
+               $legend = statistiques_nom_des_mois($date_debut, $date_fin, $largeur, $interval,$agreg)
+                 . "<span class='arial1 spip_x-small'>"
+                 . _T('texte_statistiques_visites')
+                 . "</span><br />";
+               $resume =  statistiques_resume($max, $moyenne, $last, $prec, $popularite);
+       } else {
+         $legend = "<table width='100%'><tr><td width='50%'>" .
+           affdate_heure(date("Y-m-d H:i:s", $date_debut)) .
+           "</td><td width='50%' align='right'>" .
+           affdate_heure(date("Y-m-d H:i:s", $date_fin)) .
+           '</td></tr></table>';
+         $resume = '';
+       }
+
+       $legend .=
+         "<table cellpadding='0' cellspacing='0' border='0' width='100%'><tr style='width:100%;'>"
+       . $resume
+       . "\n<td valign='top' style='width: 33%; ' class='verdana1'>"
+       . $total
+       . $liste
+       . "</td></tr></table>";
+
+       $x = (!$duree) ? 1 : (420/ $duree);
+       $zoom = statistiques_zoom($id_article, $x, $date_premier, $date_debut, $date_fin);
+       return array($zoom, $stats, $mark, $legend);
+}
+
+// http://doc.spip.org/@statistiques_resume
+function statistiques_resume($max, $moyenne, $last, $prec, $popularite)
+{
+       return  "\n<td valign='top' style='width: 33%; ' class='verdana1'>"
+       . _T('info_maximum')." "
+       . $max . "<br />"
+       . _T('info_moyenne')." "
+       . round($moyenne). "</td>"
+       . "\n<td valign='top' style='width: 33%; ' class='verdana1'>"
+       . '<a href="'
+       . generer_url_ecrire("statistiques_referers")
+       . '" title="'._T('titre_liens_entrants').'">'
+       . _T('info_aujourdhui')
+       . '</a> '
+       . $last
+       . (($prec <= 0) ? '' :
+            ('<br /><a href="'
+             . generer_url_ecrire("statistiques_referers","jour=veille")
+             .'"  title="'._T('titre_liens_entrants').'">'
+             ._T('info_hier').'</a> '.$prec))
+       . (!$popularite ? '' :
+          ("<br />"._T('info_popularite_5').' '.$popularite))
+       .  "</td>";
+}
+
+// http://doc.spip.org/@statistiques_classement
+function statistiques_classement($id_article, $classement, $liste)
+{
+       if ($id_article) {
+               if ($classement[$id_article] > 0) {
+                       if ($classement[$id_article] == 1)
+                             $ch = _T('info_classement_1', array('liste' => $liste));
+                       else
+                             $ch = _T('info_classement_2', array('liste' => $liste));
+                       return "<br />".$classement[$id_article].$ch;
+               }
+         } else
+               return "<span class='spip_x-small'><br />"
+                 ._T('info_popularite_2')." "
+                 . ceil($GLOBALS['meta']['popularite_total'])
+                 . "</span>";
+}
+
+// http://doc.spip.org/@statistiques_zoom
+function statistiques_zoom($id_article, $largeur_abs, $date_premier, $date_debut, $date_fin)
+{
+       if ($largeur_abs > 1) {
+               $inc = ceil($largeur_abs / 5);
+               $duree_plus = 420 / ($largeur_abs - $inc);
+               $duree_moins = 420 / ($largeur_abs + $inc);
+       }
+
+       if ($largeur_abs == 1) {
+               $duree_plus = 840;
+               $duree_moins = 210;
+       }
+
+       if ($largeur_abs < 1) {
+               $duree_plus = 420 * ((1/$largeur_abs) + 1);
+               $duree_moins = 420 * ((1/$largeur_abs) - 1);
+       }
+
+       $pour_article = $id_article ? "&id_article=$id_article" : '';
+
+       $zoom = '';
+       
+       if ($date_premier < $date_debut)
+               $zoom= lien_ou_expose(generer_url_ecrire("statistiques_visites","duree=$duree_plus$pour_article"),
+                        http_img_pack('loupe-moins.gif',
+                                      _T('info_zoom'). '-',
+                                      "style='border: 0px; vertical-align: middle;'"), false, '',
+                        "&nbsp;");
+       if ( (($date_fin - $date_debut) / (24*3600)) > 30)
+               $zoom .= lien_ou_expose(generer_url_ecrire("statistiques_visites","duree=$duree_moins$pour_article"),
+                        http_img_pack('loupe-plus.gif',
+                                      _T('info_zoom'). '+',
+                                      "style='border: 0px; vertical-align: middle;'"), false, '',
+                        "&nbsp;");
+
+       return $zoom;
+}
+
+// Presentation graphique
+// (rq: on n'affiche pas le jour courant, c'est a la charge de la prevision)
+// http://doc.spip.org/@stat_log1
+function stat_log1($log, $agreg, $date_today, $largeur, $rapport, $interval, $script) {
+       $res = '';
+       $rien = http_img_rien($largeur, 1, 'trait_bas', '');
+       $test_agreg = $decal = $date_prec = $val_prec = $moyenne = 0;
+       foreach ($log as $key => $value) {
+               if ($key == $date_today) break;
+               $test_agreg ++;
+               if ($test_agreg != $agreg) continue;
+               $test_agreg = 0;
+               if ($decal == 30) $decal = 0;
+               $decal ++;
+               $evol[$decal] = $value;
+               // Inserer des jours vides si pas d'entrees
+               if ($date_prec > 0) {
+                       $ecart = (($key-$date_prec)/$agreg)-$interval;
+                       for ($i=$interval; $i <= $ecart; $i+=$interval){
+                               if ($decal == 30) $decal = 0;
+                               $decal ++;
+                               $evol[$decal] = $value;
+                               $m = statistiques_moyenne($evol);
+                               $m = statistiques_vides($date_prec+$i, $largeur, $rapport, $m, $script);
+                               $res .= "\n<td style='width: ${largeur}px'>$m</td>";
+                       }
+               }
+               $moyenne = round(statistiques_moyenne($evol),2);
+               $hauteur = round($value * $rapport) - 1;
+               $m = ($hauteur <= 0) ? '' : statistiques_jour($key, $value, $largeur, $moyenne, $hauteur, $rapport, (date("w",$key) == "0"), $script);
+               $res .= "\n<td style='width: ${largeur}px'>$m$rien</td>\n";
+               $date_prec = $key;
+               $val_prec = $value;
+       }
+       return array($moyenne, $val_prec, $res);
+}
+
+// http://doc.spip.org/@statistiques_href
+function statistiques_href($jour, $moyenne, $script, $value='')
+{
+       $ce_jour=date("Y-m-d H:i:s", $jour);
+       $title = nom_jour($ce_jour) . ' '
+         . ($script ? affdate_heure($ce_jour) :
+            (affdate_jourcourt($ce_jour)  .' '.
+             (" | " ._T('info_visites')." $value | " ._T('info_moyenne')." "
+              . round($moyenne,2))));
+       return attribut_html(supprimer_tags($title));
+}
+
+// http://doc.spip.org/@statistiques_vides
+function statistiques_vides($prec, $largeur, $rapport, $moyenne, $script)
+{
+       $hauteur_moyenne = round($moyenne*$rapport)-1;
+       $title = statistiques_href($prec, $moyenne, $script);
+       $tagtitle = $script ? '' : $title;
+       if ($hauteur_moyenne > 1) {
+               $res = http_img_rien($largeur,1, 'trait_moyen', $tagtitle)
+               . http_img_rien($largeur, $hauteur_moyenne, '', $tagtitle);
+       } else $res = '';
+       $res .= http_img_rien($largeur,1,'trait_bas', $tagtitle);
+       if (!$script) return $res;
+       return "<a href='$script' title='$title'>$res</a>";
+}
+
+
+// http://doc.spip.org/@statistiques_prevision
+function statistiques_prevision($id_article, $largeur, $moyenne, $rapport, $val_popularite, $visites_today)
+{
+       $hauteur = round($visites_today * $rapport) - 1;
+       // $total_absolu = $total_absolu + $visites_today;
+       // prevision de visites jusqu'a minuit
+       // basee sur la moyenne (site) ou popularite (article)
+       if (! $id_article) $val_popularite = $moyenne;
+       $prevision = (1 - (date("H")*60 + date("i"))/(24*60)) * $val_popularite;
+       $hauteurprevision = ceil($prevision * $rapport);
+       // preparer le texte de survol (prevision)
+       $tagtitle= attribut_html(supprimer_tags(_T('info_aujourdhui')." $visites_today &rarr; ".(round($prevision,0)+$visites_today)));
+
+       $res .= "\n<td style='width: ${largeur}px'>";
+       if ($hauteur+$hauteurprevision>0)
+       // Afficher la barre tout en haut
+               $res .= http_img_rien($largeur, 1, "trait_haut");
+       if ($hauteurprevision>0)
+       // afficher la barre previsionnelle
+               $res .= http_img_rien($largeur, $hauteurprevision,'couleur_prevision', $tagtitle);
+       // afficher la barre deja realisee
+       if ($hauteur>0)
+               $res .= http_img_rien($largeur, $hauteur, 'couleur_realise', $tagtitle);
+       // et afficher la ligne de base
+       $res .= http_img_rien($largeur, 1, 'trait_bas')
+       . "</td>";
+
+       return $res;
+}
+
+// Dimanche en couleur foncee
+// http://doc.spip.org/@statistiques_jour
+function statistiques_jour($key, $value, $largeur, $moyenne, $hauteur, $rapport, $dimanche, $script)
+{
+       $hauteur_moyenne = round($moyenne * $rapport) - 1;
+       $title= statistiques_href($key, $moyenne, $script, $value);
+       $tagtitle = $script ? '' : $title;
+       $couleur = $dimanche ? "couleur_dimanche" :  "couleur_jour";
+       if ($hauteur_moyenne > $hauteur) {
+               $difference = ($hauteur_moyenne - $hauteur) -1;
+
+               $res = http_img_rien($largeur, 1,'trait_moyen',$tagtitle)
+               . http_img_rien($largeur, $difference, '', $tagtitle)
+               . http_img_rien($largeur, 1, "trait_haut", $tagtitle)
+               . http_img_rien($largeur, $hauteur, $couleur, $tagtitle);
+       } else if ($hauteur_moyenne < $hauteur) {
+               $difference = ($hauteur - $hauteur_moyenne) -1;
+               $res = http_img_rien($largeur,1,"trait_haut", $tagtitle)
+               . http_img_rien($largeur, $difference, $couleur, $tagtitle)
+               . http_img_rien($largeur,1,"trait_moyen", $tagtitle)
+               . http_img_rien($largeur, $hauteur_moyenne, $couleur, $tagtitle);
+       } else {
+               $res = http_img_rien($largeur, 1, "trait_haut", $tagtitle)
+               . http_img_rien($largeur, $hauteur, $couleur, $tagtitle);
+       }
+       if ($script)
+               $script .= "&amp;date=$key";
+       else  {
+               $y = date("Y", $key);
+               $m = date("m", $key);
+               $d = date("d", $key);
+               $script = generer_url_ecrire('calendrier', 
+                               "type=semaine&annee=$y&mois=$m&jour=$d");
+       } 
+       return "<a href='$script' title='$title'>$res</a>";
+}
+
+// http://doc.spip.org/@statistiques_nom_des_mois
+function statistiques_nom_des_mois($date_debut, $date_today, $largeur, $pas, $agreg)
+{
+       global $spip_lang_left;
+
+       $res = '';
+       $largeur /= ($pas*$agreg);
+       $gauche_prec = -50;
+       for ($jour = $date_debut; $jour <= $date_today; $jour += $pas) {
+               if (date("d", $jour) == "1") {
+                       $newy = (date("m", $jour) == 1);
+                       $gauche = floor(($jour - $date_debut) * $largeur);
+                       if ($gauche - $gauche_prec >= 40 OR $newy) {
+                               $afficher = $newy ?
+                                 ("<b>".annee(date("Y-m-d", $jour))."</b>")
+                                 : nom_mois(date("Y-m-d", $jour));
+
+                                 $res .= "<div class='arial0' style='border-$spip_lang_left: 1px solid black; padding-$spip_lang_left: 2px; padding-top: 3px; position: absolute; $spip_lang_left: ".$gauche."px; top: -1px;'>".$afficher."</div>";
+                               $gauche_prec = $gauche;
+                               if ($gauche > 400) break; //400px max
+                       }
+               }
+       }
+       return "<div style='position: relative; height: 15px'>$res</div>";
+}
+
+// http://doc.spip.org/@statistiques_par_mois
+function statistiques_par_mois($entrees, $script){
+
+       $maxgraph = maxgraph(max($entrees));
+       $rapport = 200/$maxgraph;
+       $largeur = floor(420 / (count($entrees)));
+       if ($largeur < 1) $largeur = 1;
+       if ($largeur > 50) $largeur = 50;
+       $decal = 0;
+       $tab_moyenne = array();
+
+       $all = '';
+
+       foreach($entrees as $key=>$value) {
+               $key = substr($key,0,4).'-'.substr($key,4,2);
+               $mois = affdate_mois_annee($key);
+               if ($decal == 30) $decal = 0;
+               $decal ++;
+               $tab_moyenne[$decal] = $value;
+               $moyenne = statistiques_moyenne($tab_moyenne);
+               $hauteur_moyenne = round($moyenne * $rapport) - 1;
+               $hauteur = round($value * $rapport) - 1;
+               $res = '';
+               $title= attribut_html(supprimer_tags("$mois | "
+                       ._T('info_total')." ".$value));
+               $tagtitle = $script ? '' : $title;
+               if ($hauteur > 0){
+                       if ($hauteur_moyenne > $hauteur) {
+                               $difference = ($hauteur_moyenne - $hauteur) -1;
+                               $res .= http_img_rien($largeur, 1, 'trait_moyen');
+                               $res .= http_img_rien($largeur, $difference, '', $tagtitle);
+                               $res .= http_img_rien($largeur,1,"trait_haut");
+                               if (preg_match(",-01,",$key)){ // janvier en couleur foncee
+                                       $res .= http_img_rien($largeur,$hauteur,"couleur_janvier", $tagtitle);
+                               } else {
+                                       $res .= http_img_rien($largeur,$hauteur,"couleur_mois", $tagtitle);
+                               }
+                       }
+                       else if ($hauteur_moyenne < $hauteur) {
+                               $difference = ($hauteur - $hauteur_moyenne) -1;
+                               $res .= http_img_rien($largeur,1,"trait_haut", $tagtitle);
+                               if (preg_match(",-01,",$key)){ // janvier en couleur foncee
+                                               $couleur =  'couleur_janvier';
+                               } else {
+                                               $couleur = 'couleur_mois';
+                               }
+                               $res .= http_img_rien($largeur,$difference, $couleur, $tagtitle);
+                               $res .= http_img_rien($largeur,1,'trait_moyen',$tagtitle);
+                               $res .= http_img_rien($largeur,$hauteur_moyenne, $couleur, $tagtitle);
+                       } else {
+                               $res .= http_img_rien($largeur,1,"trait_haut", $tagtitle);
+                               if (preg_match(",-01,",$key)){ // janvier en couleur foncee
+                                       $res .= http_img_rien($largeur, $hauteur, "couleur_janvier", $tagtitle);
+                               } else {
+                                       $res .= http_img_rien($largeur,$hauteur, "couleur_mois", $tagtitle);
+                               }
+                       }
+               }
+               $res .= http_img_rien($largeur,1,'trait_bas', $tagtitle);
+
+               if (!$script) {
+                       $y = annee($key);
+                       $m = mois($key);
+                       $href = generer_url_ecrire('calendrier', "type=mois&annee=$y&mois=$m&jour=1");
+               } else $href = "$script&amp;date=$key";
+
+               $all .= "\n<td style='width: ${largeur}px'><a href='"
+               .  $href
+               . '\' title="'
+               . $title
+               . '">'
+               . $res
+               . "</a></td>\n";
+       }
+
+       return
+         "\n<table cellpadding='0' cellspacing='0' border='0'><tr>"
+       .  "\n<td ".http_style_background("fond-stats.gif").">"
+       . "\n<table cellpadding='0' cellspacing='0' border='0' class='bottom'><tr>"
+       . "\n<td class='trait_bas'>" . http_img_rien(1, 200) ."</td>"
+       .  $all
+       . "\n<td style='background-color: black'>" . http_img_rien(1, 1)
+       . "</td>"
+       . "</tr></table></td>"
+       . "\n<td ".http_style_background("fond-stats.gif")." valign='bottom'>"
+       . http_img_rien(3, 1, 'trait_bas') ."</td>"
+       . "\n<td>" . http_img_rien(5, 1) ."</td>"
+       . "\n<td valign='top'>"
+       . statistiques_echelle($maxgraph)
+       . "</td></tr></table>";
+ }
+
+// http://doc.spip.org/@statistiques_echelle
+function statistiques_echelle($maxgraph)
+{
+  return recuperer_fond('prive/stats/echelle', array('echelle' => $maxgraph));
+}
+
+// http://doc.spip.org/@statistiques_moyenne
+function statistiques_moyenne($tab)
+{
+       if (!$tab) return 0;
+       $moyenne = 0;
+       foreach($tab as $v) $moyenne += $v;
+       return  $moyenne / count($tab);
+}
+
+
+// http://doc.spip.org/@statistiques_signatures_dist
+function statistiques_signatures_dist($duree, $interval, $type, $id_article, $serveur)
+{
+       $where = "id_article=$id_article";
+       $total = sql_countsel("spip_signatures", $where);
+       if (!$total) return '';
+
+       $order = 'date_time';
+       if ($duree)
+               $where .= " AND $order > DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).",INTERVAL $duree $type)";
+
+       $log = statistiques_collecte_date('COUNT(*)', "(FLOOR(UNIX_TIMESTAMP($order) / $interval) *  $interval)", 'spip_signatures', $where, $serveur);
+
+       $script = generer_url_ecrire('controle_petition', "id_article=$id_article");
+       if (count($log) > 1) {
+               $res = statistiques_tous($log, $id_article, "spip_signatures", "id_article=$id_article", "date_time", $serveur, $duree, $interval, $total, 0, '', array(), $script);
+               $res = gros_titre(_T('titre_page_statistiques_signatures_jour'),'', false) . cadre_stat($res, 'spip_signatures', $id_article);
+       } else $res = '';
+
+       $mois = statistiques_collecte_date( "COUNT(*)",
+               "DATE_FORMAT(date_time,'%Y%m')",
+               "spip_signatures",
+               "date_time > DATE_SUB(".sql_quote(date('Y-m-d H:i:s')).",INTERVAL 2700 DAY)"
+               . (" AND id_article=$id_article"),
+               $serveur);
+
+       return "<br />"
+       . $res
+       . (!$mois ? '' : (
+         "<br />"
+       . gros_titre(_T('titre_page_statistiques_signatures_mois'),'', false)
+       . statistiques_par_mois($mois, $script)))
+       . ($res ? '' : statistiques_mode("spip_signatures", $id_article))
+;
+}
+
+// http://doc.spip.org/@statistiques_forums_dist
+function statistiques_forums_dist($duree, $interval, $type, $id_article, $serveur)
+{
+       $where = "id_article=$id_article AND statut='publie'";
+       $total = sql_countsel("spip_forum", $where);
+       if (!$total) return '';
+       $order = 'date_heure';
+       $interval = 24 * 3600;
+       $oldscore = 420;
+       $oldlog = array();
+       while ($interval >= 1) {
+               $log = statistiques_collecte_date('COUNT(*)', "(FLOOR(UNIX_TIMESTAMP($order) / $interval) *  $interval)", 'spip_forum', $where, $serveur);
+               if (count($log) > 3) break;
+               $oldlog = $log;
+               $oldinterval = $interval;
+               $interval /= ($interval>3600) ?  24 : 60;
+       }
+       if (count($log) > 20) {
+         $interval = $oldinterval;
+         $log = $oldlog;
+       }
+       $script = generer_url_ecrire('articles_forum', "id_article=$id_article");
+       $date = sql_getfetsel('UNIX_TIMESTAMP(date)', 'spip_articles', $where);
+       $back = 10*ceil((time()-$date) / 3600);
+       $jour = statistiques_tous($log, $id_article, "spip_forum", $where, "date_heure", $serveur, $back, $interval, $total, 0, '', array(), $script);
+
+       return "<br />"
+       . gros_titre(_T('titre_page_statistiques_messages_forum'),'', false)
+         . cadre_stat($jour, 'spip_forum', $id_article);
+}
+
+// Le bouton pour CSV
+
+// http://doc.spip.org/@statistiques_mode
+function statistiques_mode($table, $id=0)
+{
+       global $spip_lang_left;
+       $t = str_replace('spip_', '', $table);
+       $fond = (strstr($t, 'visites') ? 'statistiques' : $t);
+       $args = array();
+       if ($id) {
+               $fond .= "_article"; 
+               $args['id_article'] = $id;
+       }
+       include_spip('inc/acces');
+       $args = param_low_sec($fond, $args, '', 'transmettre');
+       $url = generer_url_public('transmettre', $args);
+       return "<a style='float: $spip_lang_left;' href='$url'>CSV</a>";
+}
+?>