/** * Librairie tFlot pour jQuery et jQuery.flot * Licence GNU/GPL - Matthieu Marcillaud * Version 1.4.0 */ (function($){ /** * Des variables a garder globalement * * collections : stockage de l'ensemble de toutes les valeurs de tous les graphs et leurs options * collectionsActives : stockage des series actives * plots : stockage des graphiques * vignettes : stockage des vignettes * idGraph : identifiant unique pour tous les graphs */ collections = []; collectionsActives = []; plots = []; vignettes = []; vignettesSelection = []; idGraph = 0; /* * Fait un graphique d'un tableau donne * $("table.graph").tFlot(); * necessite la librairie "jQuery flot". * http://code.google.com/p/flot/ */ $.fn.tFlot = function(settings) { var options, flot; options = { width:'500px', height:'250px', parse:{ orientation:'row', // 'column' : tableaux verticaux par defaut... axeOnTitle:false // les coordonnees x d'axe sont donnes dans l'attribut title du et non dans le ? }, legendeExterne:false, legendeActions:false, // ne fonctionne qu'avec l'option legende externe modeDate:false, // pour calculer les timestamp automatiquement moyenneGlissante:{ show:false, // pour calculer une moyenne glissante automatiquement plage:7 // plage de glissement (nombre impair !) }, grille:{weekend:false}, infobulle:{ show:false, serie_color:false // utiliser comme couleur de fond la même couleur que les lignes du graph }, zoom:false, vignette:{ show:false, width:'160px', height:'100px' }, flot:{ legend:{ show:true, container:null, labelFormatter:null, noColumns: 3 }, bars: {fill:false}, yaxis: { min: 0 }, selection: { mode: "x" } } } $.extend(true, options, settings); $(this).each(function(){ // identifiant unique pour tous les graphs // creer les cadres // .graphique // .graphResult // .graphInfos // .graphLegend // .graphOverview $(this).hide().wrap("
"); graphique = $(this).parent(); values = parseTable(this, options.parse); $.extend(true, values.options, options.flot); graph = $("
").appendTo(graphique); graph.wrap("
"); gInfo = $("
").appendTo(graphique); // legende en dehors du dessin ? if (options.legendeExterne) { legend = $("
").appendTo(gInfo); values.options.legend.container = legend; } // legende avec items clicables pour desactiver certaines series if (options.legendeExterne && options.legendeActions) { values.options.legend.labelFormatter = function(label) { return '' + label + ''; } } // si mode time, on calcule des timestamp // les series sont alors de la forme [[timestamp, valeur],...] // et pas besoin de ticks declare if (options.modeDate) { timestamps = []; // calcul des timestamps $.each(values.options.xaxis.ticks, function(i, val){ timestamps.push([val[0], (new Date(val[1])).getTime()]); }); // les remettre dans les series $.each(values.series, function(i, val){ data = []; $.each(val.data, function (j, d){ data.push([timestamps[j][1], d[1]]); }); values.series[i].data = data; }); // plus besoin du ticks // mais toujours besoin des valeurs completes... values.options.xaxis = $.extend(true, { mode: "time", timeformat: "%d/%m/%y" }, values.options.xaxis, {ticks: null} ); if (options.grille.weekend) { values.options.grid = { markings: weekendAreas } } if (options.grille.years) { values.options.grid = { markings: yearsArea } } } // en cas de moyenne glissante, on la calcule if (options.moyenneGlissante.show) { values.series = moyenneGlissante(values.series, options.moyenneGlissante); } // si infobulles, les ajouter if (options.infobulle.show) { $.extend(true, options.infobulle, {date:options.modeDate}); infobulle($('#graphique'+idGraph), options.infobulle); $.extend(true, values.options, { grid:{hoverable:true} }); } // dessiner plots[idGraph] = $.plot(graph, values.series, values.options); // prevoir les actions sur les labels if (options.legendeExterne && options.legendeActions) { $.extend(values.options, {legend:{container:null, show:false}}); actionsLegendes($('#graphique'+idGraph)); } // ajouter une mini vue si demandee if (options.vignette.show) { $("
").appendTo(gInfo); creerVignette($('#graphique'+idGraph), values.series, values.options, options.vignette); } // autoriser les zoom if (options.zoom) { zoomGraphique($('#graphique'+idGraph)); } // stocker les valeurs collections.push({id:idGraph, values:values}); // sources collectionsActives = $.extend(true, {}, collections); // affiches ++idGraph; }); /* * Prendre une table HTML * et calculer les donnees d'un graph jQuery.plot */ function parseTable(table, settings){ var options; flot = []; options = { ticks:[], // [1:"label 1", 2:"label 2"] orientation:'row', // 'column' ticksReels:[], // on sauve les vraies donnees pour les infobulles (1 janvier 2008) et non le code de date (1/1/2008) axeOnTitle:false, defaultSerie:{ bars: { barWidth: 0.9, align: "center", show:true, fill:false }, lines: { show:false, fill:false } } } $.extend(options, settings); row = (options.orientation == 'row'); // // recuperer les points d'axes // // // Une fonction pour simplifier la recup // function getValue(element) { if (options.axeOnTitle) { return element.attr('title'); } else { return element.text(); } } axe=0; if (row) { // dans le th de chaque tr $(table).find('tr:not(:first)').each(function(){ $(this).find('th:first').each(function(){ options.ticks.push([++axe, getValue($(this))]); options.ticksReels.push([axe, $(this).text()]); }); }); } else { // dans les th du premier tr $(table).find('tr:first th:not(:first)').each(function(){ options.ticks.push([++axe, getValue($(this))]); options.ticksReels.push([axe, $(this).text()]); }); } // // recuperer les noms de series // axe = (axe ? 1 : 0); if (row) { // si axes definis, on saute une ligne if (axe) { columns = $(table).find('tr:first th:not(:first)'); } else { columns = $(table).find('tr:first th'); } // chaque colonne est une serie for(i=0; i=g) { moy.shift();} // calcul de la somme et ajout de la moyenne for(var k=0,sum=0;k' + contents + '').css( { top: y + 5, left: x + 5, opacity: 0.80, background:color }).addClass('tooltip_statistiques').appendTo("body").fadeIn(200); } // copie de la fonction de jquery.flot.js // pour utilisation dans infobulle function formatDate(d, fmt, monthNames) { var leftPad = function(n) { n = "" + n; return n.length == 1 ? "0" + n : n; }; var r = []; var escape = false; if (monthNames == null) monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; for (var i = 0; i < fmt.length; ++i) { var c = fmt.charAt(i); if (escape) { switch (c) { case 'h': c = "" + d.getUTCHours(); break; case 'H': c = leftPad(d.getUTCHours()); break; case 'M': c = leftPad(d.getUTCMinutes()); break; case 'S': c = leftPad(d.getUTCSeconds()); break; case 'd': c = "" + d.getUTCDate(); break; case 'm': c = "" + (d.getUTCMonth() + 1); break; case 'y': c = "" + d.getUTCFullYear(); break; case 'b': c = "" + monthNames[d.getUTCMonth()]; break; } r.push(c); escape = false; } else { if (c == "%") escape = true; else r.push(c); } } return r.join(""); } })(jQuery);