/**
* 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);
|