var subPhone = $('section[data-sublink="phone"] section#phone-charts-container');
subPhone.style.display = 'flex';
subPhone.style.flexWrap = 'wrap';
subPhone.style.justifyContent = 'space-around';
/* [0] Paramètres globaux
=========================================================*/
subject = 1;
var charts = ['sexe', 'direction', 'type', 'ages', 'relations', 'weekdays', 'duration', 'timeofday'];
var canvas = []; // Contiendra les canvas
var instances = []; // Contiendra les charts
Highcharts.dateFormats = {
X: function (timestamp) {
var d = new Date(timestamp*1000);
return d.toLocaleTimeString();
}
};
/* [1] Gestion des options par défaut
=========================================================*/
var plotOptions = {};
/* (1) Pour les graphiques de type 'pie' */
plotOptions['pie'] = { pie: { // pie
showInLegend: true,
innerSize: '50%',
allowPointSelect: true,
cursor: 'pointer',
startAngle: -90,
endAngle: 90,
dataLabels: {
enabled: false,
distance: 10,
format: '{point.name}: {point.percentage:.1f} %',
style: { color: 'black', textShadow: '0 0 2px white' }
}
} };
/* (2) Pour les graphiques de type 'column' */
plotOptions['column'] = { column: { shadow: false, borderWidth: 0, stacking: null } };
/* (3) Pour le graphique des jours de la semaine */
plotOptions['weekdays'] = { column: { shadow: false, borderWidth: 0, stacking: 'normal', dataLabels: { enabled: true } } };
/* (4) Pour les graphiques de type 'bar' */
plotOptions['bar'] = { bar: { allowPointSelect: true, cursor: 'pointer' } };
/* (5) Pour les graphiques de type 'spline' */
plotOptions['spline'] = { spline: { pointInterval: 1000 } }; // 1 min
/* FONCTION QUI CHARGE LES GRAPHIQUES AVEC UN ID SUJET PARTICULIER
*
* @nomParam Description du param
*
* @return nomRetour Description du retour
*
*/
function loadCharts(subject){
/* [1] Initialisation
=========================================================*/
subPhone.innerHTML = '';
canvas = [];
/* [2] On crée les conteneurs
=========================================================*/
for( var c in charts ){
canvas[c] = document.createElement('div');
canvas[c].id = charts[c];
canvas[c].style.width = canvas[c].style.height = '30em';
canvas[c].style.margin = '2em';
subPhone.appendChild( canvas[c] );
}
/* [3] Pour chaque graphique, on récupère les données et on les affiche
=========================================================*/
for( var c = 0 ; c < charts.length ; c++ ){
/* (1) On rédige la requête */
var request = {
path: 'chart/'+charts[c],
subject: subject
};
/* (2) On lance la requête */
api.send(request, function(response, args){
// On récupère @c dans le scope du handler
var c = args[0];
/* (3) Si erreur, on quitte */
if( response.ModuleError != 0 )
return false;
/* [4] On construit les données
=========================================================*/
var data = {
labels: response.labels,
datasets: response.datasets
};
/* [5] On construit les options du graphique
=========================================================*/
/* (1) On définit les options */
var options = {
chart: { renderTo: canvas[c], type: response.type },
series: response.series,
xAxis: {},
yAxis: {},
tooltip: {}
};
// Si c'est un 'donut', on met plus petit
if( response.type == 'pie' )
canvas[c].style.width = canvas[c].style.height = '20em';
else
options.tooltip.headerFormat = '{point.x}
';
// Gestion des options
if( plotOptions[charts[c]] != null )
options.plotOptions = plotOptions[charts[c]];
else if( plotOptions[response.type] != null )
options.plotOptions = plotOptions[response.type];
// types de données
if( response.xaxis != null ) options.xAxis = response.xaxis;
if( response.yaxis != null ) options.yAxis = response.yaxis;
// labels
if( response.xlabels != null ) options.xAxis.categories = response.xlabels;
if( response.ylabels != null ) options.yAxis.categories = response.ylabels;
// zoom
if( response.zoom != null ) options.chart.zoomType = response.zoom;
// titre
if( response.title != null ) options.title = { text: response.title };
// titres des axes
if( response.xtitle != null ) options.xAxis.title = { text: response.xtitle };
if( response.ytitle != null ) options.yAxis.title = { text: response.ytitle };
// pointFormat
if( response.pointFormat != null ) options.tooltip.pointFormat = response.pointFormat;
// headerFormat
if( response.headerFormat != null ) options.tooltip.headerFormat = response.headerFormat;
/* [6] On crée le graphique
=========================================================*/
instances[c] = new Highcharts.Chart(options);
}, null, c); // On passe @c au @handler pour l'avoir dans le scope
}
}
// Gestion de l'affichage
var phoneChartsSubject = $('#phone-charts-subject');
var phoneChartsSubmit = $('#phone-charts-submit');
phoneChartsSubmit.addEventListener('click', function(e){
if( !isNaN(phoneChartsSubject.value) )// Si identifiant
loadCharts(phoneChartsSubject.value);
}, false);