phpmyadmin/js/tbl_chart.js
Tyron Madlener 9db1342b2a Bug Fixes
2011-06-13 16:45:31 +02:00

237 lines
7.9 KiB
JavaScript

var chart_xaxis_idx = -1;
var chart_series;
var chart_series_index = -1;
$(document).ready(function() {
var currentChart=null;
var chart_data = jQuery.parseJSON($('#querychart').html());
chart_series = 'columns';
chart_xaxis_idx = $('select[name="chartXAxis"]').attr('value');
$('#resizer').resizable({
minHeight:240,
minWidth:300,
// On resize, set the chart size to that of the
// resizer minus padding. If your chart has a lot of data or other
// content, the redrawing might be slow. In that case, we recommend
// that you use the 'stop' event instead of 'resize'.
resize: function() {
currentChart.setSize(
this.offsetWidth - 20,
this.offsetHeight - 20,
false
);
}
});
var currentSettings = {
chart: {
type:'line',
width:$('#resizer').width()-20,
height:$('#resizer').height()-20
},
xAxis: {
title: { text: $('input[name="xaxis_label"]').attr('value') }
},
yAxis: {
title: { text: $('input[name="yaxis_label"]').attr('value') }
},
title: { text: $('input[name="chartTitle"]').attr('value'), margin:20 },
plotOptions: {
series: {}
}
}
$('#querychart').html('');
$('input[name="chartType"]').click(function() {
currentSettings.chart.type=$(this).attr('value');
drawChart();
if($(this).attr('value')=='bar' || $(this).attr('value')=='column')
$('span.barStacked').show();
else
$('span.barStacked').hide();
});
$('input[name="barStacked"]').click(function() {
if(this.checked)
$.extend(true,currentSettings,{ plotOptions: { series: { stacking:'normal' } } });
else
$.extend(true,currentSettings,{ plotOptions: { series: { stacking:null } } });
drawChart();
});
$('input[name="chartTitle"]').keyup(function() {
var title=$(this).attr('value');
if(title.length==0) title=' ';
currentChart.setTitle({text: title});
});
$('select[name="chartXAxis"]').change(function() {
chart_xaxis_idx = this.value;
drawChart();
});
$('select[name="chartSeries"]').change(function() {
chart_series = this.value;
chart_series_index = this.selectedIndex;
drawChart();
});
/* Sucks, we cannot just set axis labels, we have to redraw the chart completely */
$('input[name="xaxis_label"]').keyup(function() {
currentSettings.xAxis.title.text = $(this).attr('value');
drawChart(true);
});
$('input[name="yaxis_label"]').keyup(function() {
currentSettings.yAxis.title.text = $(this).attr('value');
drawChart(true);
});
function drawChart(noAnimation) {
currentSettings.chart.width=$('#resizer').width()-20;
currentSettings.chart.height=$('#resizer').height()-20;
if(currentChart!=null) currentChart.destroy();
if(noAnimation) currentSettings.plotOptions.series.animation = false;
currentChart = PMA_queryChart(chart_data,currentSettings);
if(noAnimation) currentSettings.plotOptions.series.animation = true;
}
drawChart();
$('#querychart').show();
});
function in_array(element,array) {
for(var i=0; i<array.length; i++)
if(array[i]==element) return true;
return false;
}
function PMA_queryChart(data,passedSettings) {
if($('#querychart').length==0) return;
var columnNames = Array();
var series = new Array();
var xaxis = new Object();
var yaxis = new Object();
$.each(data[0],function(index,element) {
columnNames.push(index);
});
switch(passedSettings.chart.type) {
case 'column':
case 'spline':
case 'line':
case 'bar':
xaxis.categories = new Array();
if(chart_series=='columns') {
var j=0;
for(var i=0; i<columnNames.length; i++)
if(i!=chart_xaxis_idx) {
series[j] = new Object();
series[j].data = new Array();
series[j].name = columnNames[i];
$.each(data,function(key,value) {
series[j].data.push(parseFloat(value[columnNames[i]]));
if(j==0 && chart_xaxis_idx!=-1 && !xaxis.categories[value[columnNames[chart_xaxis_idx]]])
xaxis.categories.push(value[columnNames[chart_xaxis_idx]]);
});
j++;
}
} else {
var j=0;
var seriesIndex = new Object();
// Get series types and build series object from the query data
$.each(data,function(index,element) {
var contains=false;
for(var i=0; i<series.length; i++)
if(series[i].name == element[chart_series]) contains=true;
if(!contains) {
seriesIndex[element[chart_series]] = j;
series[j] = new Object();
series[j].data = new Array();
series[j].name = element[chart_series]; // columnNames[i];
j++;
}
});
var type;
// Get series points from query data
$.each(data,function(key,value) {
type = value[chart_series];
series[seriesIndex[type]].data.push(parseFloat(value[columnNames[0]]));
if(!in_array(value[columnNames[chart_xaxis_idx]],xaxis.categories))
xaxis.categories.push(value[columnNames[chart_xaxis_idx]]);
});
}
if(columnNames.length==2)
yaxis.title = { text: columnNames[0] };
break;
case 'pie':
series[0] = new Object();
series[0].data = new Array();
$.each(data,function(key,value) {
series[0].data.push({name:value[columnNames[chart_xaxis_idx]],y:parseFloat(value[columnNames[0]])});
});
break;
}
// Prevent the user from seeing the JSON code
$('div#profilingchart').html('').show();
var settings = {
chart: {
renderTo: 'querychart',
backgroundColor: $('fieldset').css('background-color')
},
title: { text:'', margin:0 },
series: series,
xAxis: xaxis,
yAxis: yaxis,
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: true,
distance: 35,
formatter: function() {
return '<b>'+ this.point.name +'</b><br/>'+ Highcharts.numberFormat(this.percentage, 2) +' %';
}
}
}
},
credits: {
enabled:false
},
exporting: {
enabled: true
},
tooltip: {
formatter: function() {
if(this.point.name) return '<b>'+this.series.name+'</b><br/>'+this.point.name+'<br/>'+this.y;
return '<b>'+this.series.name+'</b><br/>'+this.y;
}
}
};
if(passedSettings.chart.type=='pie')
settings.tooltip.formatter = function() { return '<b>'+columnNames[0]+'</b><br/>'+this.y; }
// Overwrite/Merge default settings with passedsettings
$.extend(true,settings,passedSettings);
return new Highcharts.Chart(settings);
}