2717 lines
128 KiB
JavaScript
2717 lines
128 KiB
JavaScript
/*Copyright (c) 2013 NTS Corp. All Rights Reserved.
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
obtaining a copy of this software and associated documentation
|
|
files (the "Software"), to deal in the Software without
|
|
restriction, including without limitation the rights to use,
|
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the
|
|
Software is furnished to do so, subject to the following
|
|
conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
/*Developed by Insook Choe (choe.insook@nhn.com), Inho Jung(inho.jung@nhn.com)*/
|
|
|
|
var CONST_SVG_URL = 'http://www.w3.org/2000/svg';
|
|
var VML_NAME_SPACE = 'urn:schemas-microsoft-com:vml'
|
|
var CONST_MAX_RADIUS = 100;
|
|
var CONST_DECREMENT = 20;
|
|
|
|
var Nwagon = {
|
|
|
|
chart: function(options){
|
|
var isIE_old = false;
|
|
if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { //test for MSIE x.x;
|
|
var ieversion = new Number(RegExp.$1); // capture x.x portion and store as a number
|
|
if (ieversion <= 8){
|
|
|
|
isIE_old = true;
|
|
if(!document.namespaces['v']) {
|
|
document.namespaces.add('v', VML_NAME_SPACE);
|
|
}
|
|
}
|
|
}
|
|
var chartObj = new Object();
|
|
chartObj.chartType = options['chartType'];
|
|
chartObj.dataset = options['dataset'];
|
|
chartObj.legend = options['legend'];
|
|
chartObj.width = options['chartSize']['width'];
|
|
chartObj.height = options['chartSize']['height'];
|
|
chartObj.chart_div = options['chartDiv'];
|
|
|
|
//************ values.length should be equal to names.length **************//
|
|
switch (chartObj.chartType)
|
|
{
|
|
case ('radar') :
|
|
isIE_old ? Nwagon_ie.radar.drawRadarChart(chartObj) : this.radar.drawRadarChart(chartObj);
|
|
break;
|
|
case ('polar') :
|
|
case ('polar_pie') :
|
|
chartObj.core_circle_radius = options['core_circle_radius'];
|
|
chartObj.core_circle_value = options['core_circle_value'];
|
|
chartObj.max = options['maxValue'];
|
|
chartObj.increment = options['increment'];
|
|
isIE_old ? Nwagon_ie.polar.drawPolarChart(chartObj) : this.polar.drawPolarChart(chartObj);
|
|
break;
|
|
case ('donut') :
|
|
case ('pie') :
|
|
chartObj.core_circle_radius = 0;
|
|
if(chartObj.chartType == 'donut'){
|
|
chartObj.core_circle_radius = options['core_circle_radius'];
|
|
}
|
|
chartObj.donut_width = options['donut_width'];
|
|
isIE_old ? Nwagon_ie.donut.drawDonutChart(chartObj) : this.donut.drawDonutChart(chartObj);
|
|
break;
|
|
case ('line') :
|
|
case ('area') :
|
|
case ('jira') :
|
|
if (options.hasOwnProperty('bottomOffsetValue')) chartObj.bottomOffsetValue = options['bottomOffsetValue'];
|
|
if (options.hasOwnProperty('leftOffsetValue')) chartObj.leftOffsetValue = options['leftOffsetValue'];
|
|
if (options['maxValue']) chartObj.highest = options['maxValue'];
|
|
if (options['minValue']) chartObj.lowest = options['minValue'];
|
|
if (options['increment']) chartObj.increment = options['increment'];
|
|
if (options['isGuideLineNeeded']) chartObj.isGuideLineNeeded = options['isGuideLineNeeded'];
|
|
isIE_old ? Nwagon_ie.line.drawLineChart(chartObj) : this.line.drawLineChart(chartObj);
|
|
break;
|
|
case ('column'):
|
|
case ('stacked_column') :
|
|
case ('multi_column') :
|
|
if (options.hasOwnProperty('bottomOffsetValue')) chartObj.bottomOffsetValue = options['bottomOffsetValue'];
|
|
if (options.hasOwnProperty('leftOffsetValue')) chartObj.leftOffsetValue = options['leftOffsetValue'];
|
|
if (options.hasOwnProperty('topOffsetValue')) chartObj.topOffsetValue = options['topOffsetValue'];
|
|
if (options.hasOwnProperty('rightOffsetValue')) chartObj.rightOffsetValue = options['rightOffsetValue'];
|
|
if (options['maxValue']) chartObj.highest = options['maxValue'];
|
|
if (options['increment']) chartObj.increment = options['increment'];
|
|
|
|
isIE_old ? Nwagon_ie.column.drawColumnChart(chartObj) : this.column.drawColumnChart(chartObj);
|
|
break;
|
|
}
|
|
},
|
|
|
|
createChartArea: function(parentSVG, chartType, viewbox, width, height){
|
|
|
|
var chartDiv = document.getElementById(parentSVG);
|
|
var textArea = document.createElement('ul');
|
|
textArea.className = 'accessibility';
|
|
chartDiv.appendChild(textArea);
|
|
var attr = {'version':'1.1', 'width':width, 'height':height, 'viewBox':viewbox, 'class':'Nwagon_' + chartType, 'aria-hidden':'true'};
|
|
var svg = Nwagon.createSvgElem('svg', attr);
|
|
chartDiv.appendChild(svg);
|
|
|
|
return svg;
|
|
},
|
|
|
|
createSvgElem: function(elem, attr){
|
|
var svgElem = document.createElementNS(CONST_SVG_URL, elem);
|
|
Nwagon.setAttributes(svgElem, attr);
|
|
return svgElem;
|
|
},
|
|
|
|
setAttributes: function(svgObj, attributes){
|
|
var keys_arr = Object.keys(attributes);
|
|
var len = keys_arr.length;
|
|
for(var i = 0; i<len; i++){
|
|
svgObj.setAttribute(keys_arr[i], attributes[keys_arr[i]]);
|
|
}
|
|
},
|
|
|
|
getMax: function(a){
|
|
var maxValue = 0;
|
|
if(a.length){
|
|
for (var j = 0; j < a.length; j++)
|
|
{
|
|
var a_sub = a[j];
|
|
if(a_sub.length){
|
|
for(var k = 0; k<a_sub.length; k++){
|
|
if (typeof(a_sub[k]) == 'number' && a_sub[k] > maxValue) maxValue = a_sub[k];
|
|
}
|
|
}
|
|
else{
|
|
if (typeof(a[j]) == 'number' && a[j] > maxValue) maxValue = a[j];
|
|
}
|
|
}
|
|
}
|
|
return maxValue;
|
|
},
|
|
|
|
createTooltip: function(){
|
|
var tooltip = Nwagon.createSvgElem('g', {'class':'tooltip'});
|
|
var tooltipbg = Nwagon.createSvgElem('rect', {});
|
|
tooltip.appendChild(tooltipbg);
|
|
|
|
var tooltiptxt = Nwagon.createSvgElem('text', {});
|
|
tooltip.appendChild(tooltiptxt);
|
|
|
|
return tooltip;
|
|
},
|
|
|
|
showToolTip: function(tooltip, px, py, value, height, ytextOffset, yRectOffset){
|
|
return function(){
|
|
tooltip.style.cssText = "display: block";
|
|
var text_el = tooltip.getElementsByTagName('text')[0];
|
|
text_el.textContent = ' '+value;
|
|
Nwagon.setAttributes(text_el, {'x':px, 'y':py-ytextOffset, 'text-anchor':'middle'});
|
|
var width = text_el.getBBox().width;
|
|
Nwagon.setAttributes(tooltip.getElementsByTagName('rect')[0], {'x':(px-width/2)-5, 'y':py-yRectOffset, 'width':width+10,'height':height});
|
|
}
|
|
},
|
|
|
|
hideToolTip: function(tooltip){
|
|
return function(){
|
|
tooltip.style.cssText = "display: none";
|
|
}
|
|
},
|
|
|
|
getAngles: function(arr, angles){
|
|
|
|
var total = 0;
|
|
for(var i=0; i<arr.length; i++){
|
|
total+=arr[i];
|
|
}
|
|
for(i=0; i<arr.length; i++){
|
|
var degree = 360 * (arr[i]/total);
|
|
angles['angles'].push(degree);
|
|
angles['percent'].push(arr[i]/total);
|
|
angles['values'].push(arr[i]);
|
|
}
|
|
return angles;
|
|
},
|
|
getOpacity: function(opa, r, max_r){
|
|
var len = opa.length;
|
|
var interval = max_r/len;
|
|
var value = Math.ceil(r/interval);
|
|
return opa[value-1];
|
|
},
|
|
|
|
line:{
|
|
points:[],
|
|
guide_line: null,
|
|
|
|
drawLabels: function(x, y, labelText){
|
|
var attributes = {'x':x, 'y':y, 'text-anchor':'end'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = labelText;
|
|
return text;
|
|
},
|
|
drawLineChart: function(obj){
|
|
var type = obj.chartType;
|
|
var isAreaChart = (type == 'area'), isJira = (type == 'jira');
|
|
var width = obj.width, height = obj.height;
|
|
var values = obj.dataset['values'];
|
|
var LeftOffsetAbsolute = obj.hasOwnProperty('leftOffsetValue') ? obj.leftOffsetValue : 50;
|
|
var BottomOffsetAbsolute = obj.hasOwnProperty('bottomOffsetValue') ? obj.bottomOffsetValue : 80;
|
|
var TopOffsetAbsolute = obj.hasOwnProperty('topOffsetValue') ? obj.topOffsetValue : 0;
|
|
var RightOffsetAbsolute = obj.hasOwnProperty('rightOffsetValue') ? obj.rightOffsetValue : 0;
|
|
var names = obj.legend['names'];
|
|
var isGuideNeeded = obj.hasOwnProperty('isGuideLineNeeded') ? obj.isGuideLineNeeded : false;
|
|
|
|
RightOffsetAbsolute = obj.dataset['fields'] ? (150 + RightOffsetAbsolute) : RightOffsetAbsolute;
|
|
|
|
var viewbox = (-LeftOffsetAbsolute) + ' ' + (BottomOffsetAbsolute-height) + ' ' + width + ' ' + height;
|
|
var svg = Nwagon.createChartArea(obj.chart_div, obj.chartType, viewbox, width, height);
|
|
var max = obj.highest ? obj.highest : Nwagon.getMax(values);
|
|
var min = obj.lowest ? obj.lowest : 0;
|
|
this.drawBackground(svg, names.length, obj.dataset, obj.increment, max, min, width-LeftOffsetAbsolute-RightOffsetAbsolute, height-BottomOffsetAbsolute-TopOffsetAbsolute);
|
|
this.drawLineForeground(obj.chart_div, svg, obj.legend, obj.dataset, obj.increment, max, min, width-LeftOffsetAbsolute-RightOffsetAbsolute, height-BottomOffsetAbsolute-TopOffsetAbsolute, isAreaChart, isJira, isGuideNeeded);
|
|
|
|
// after guide line is drawn, add eventlistener to svg
|
|
if(Nwagon.line.guide_line){
|
|
var line = Nwagon.line.guide_line;
|
|
var interval = Math.floor((width-LeftOffsetAbsolute-RightOffsetAbsolute)/names.length);
|
|
var x_coord_max = line.x1.animVal.value;
|
|
var text_add = '', index = 0;
|
|
var fields = obj.dataset['fields'];
|
|
var _h = fields ? fields.length * 14 : 14;
|
|
var tool = Nwagon.createTooltip();
|
|
var text_el = tool.getElementsByTagName('text')[0];
|
|
if(text_el){
|
|
for(var i = 0; i<fields.length; i++){
|
|
var ts = Nwagon.createSvgElem('tspan', {});
|
|
text_el.appendChild(ts);
|
|
}
|
|
}
|
|
svg.appendChild(tool);
|
|
|
|
var pt = svg.createSVGPoint();
|
|
function cursorPoint(evt){
|
|
pt.x = evt.clientX; pt.y = evt.clientY;
|
|
return pt.matrixTransform(svg.getScreenCTM().inverse());
|
|
}
|
|
svg.addEventListener('mousemove',function(evt){
|
|
var loc = cursorPoint(evt);
|
|
var x = loc.x;
|
|
if(x < 0) x = 0;
|
|
if(x > x_coord_max) x = x_coord_max;
|
|
if(loc.y < 0){
|
|
line.setAttribute('x1', x);
|
|
line.setAttribute('x2', x);
|
|
index = Math.floor(x/interval);
|
|
tool.style.cssText = 'display: block';
|
|
if(fields && values[index]){
|
|
var ts_group = text_el.getElementsByTagName('tspan');
|
|
for(var i = 0; i<fields.length; i++){
|
|
ts_group[i].setAttribute('x', x);
|
|
if(i>0) ts_group[i].setAttribute('dy', 15);
|
|
ts_group[i].textContent = names[index] + '('+ fields[i] + '): ' + values[index][i];
|
|
}
|
|
}
|
|
Nwagon.setAttributes(text_el, {'x':x, 'y':loc.y-40, 'text-anchor':'start'});
|
|
var _width = text_el.getBBox().width;
|
|
Nwagon.setAttributes(tool.getElementsByTagName('rect')[0], {'x':x-5, 'y':loc.y-50, 'width':_width+10,'height':_h});
|
|
}
|
|
},false);
|
|
svg.addEventListener('mouseout',function(evt){
|
|
tool.style.cssText = 'display:none';
|
|
},false);
|
|
}
|
|
},
|
|
drawJiraForeground:function(parentDiv, _points, colors){
|
|
var getSlopeAndAlpha = function(point_1, point_2){
|
|
var values = {};
|
|
var slope;
|
|
if((point_2[1] == point_1[1])){
|
|
slope = 0;
|
|
}
|
|
else{
|
|
slope = (point_2[1]-point_1[1])/(point_2[0]-point_1[0]);
|
|
}
|
|
values['alpha'] = point_1[1] - (slope * point_1[0]);
|
|
values['slope'] = slope;
|
|
return values;
|
|
};
|
|
var drawPolygons = function(arr1, arr2){
|
|
|
|
if(arr1 && arr2){
|
|
var color, first, second, px, py;
|
|
var points_to_draw = '';
|
|
|
|
var i = 0;
|
|
while ( i < arr1.length){
|
|
if(arr1[i][1] > arr2[i][1]){
|
|
first = arr1;
|
|
second = arr2;
|
|
color = colors[0];
|
|
break;
|
|
}
|
|
if(arr1[i][1] < arr2[i][1]){
|
|
first = arr2;
|
|
second = arr1;
|
|
color = colors[1];
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
var j = 0;
|
|
while(j<first.length){
|
|
px = first[j][0];
|
|
py = first[j][1];
|
|
if(j === 0){
|
|
points_to_draw += 'M '+px + ' -' + py;
|
|
}
|
|
else{
|
|
points_to_draw += ' L '+px + ' -' + py;
|
|
}
|
|
j++;
|
|
}
|
|
var k = second.length-1;
|
|
while(k >=0){
|
|
px = second[k][0];
|
|
py = second[k][1];
|
|
points_to_draw += ' L '+px + ' -' + py;
|
|
k--;
|
|
}
|
|
|
|
points_to_draw +=' Z';
|
|
var unlayered = Nwagon.createSvgElem('path', {'d':points_to_draw, 'fill': color, 'opacity':'0.7'});
|
|
polygons.appendChild(unlayered);
|
|
}
|
|
};
|
|
|
|
var foregrounds = document.getElementById(parentDiv).querySelectorAll('.Nwagon_jira g.foreground');
|
|
var foreground = foregrounds[foregrounds.length-1];
|
|
|
|
var polygons = Nwagon.createSvgElem('g', {'class':'polygon'});
|
|
foreground.appendChild(polygons);
|
|
|
|
var layered_points = [];
|
|
if(_points.length == 2){
|
|
var colorOne = colors[0];
|
|
var colorTwo = colors[1];
|
|
var one = _points[0];
|
|
var two = _points[1];
|
|
var temp_one = [], temp_two = [];
|
|
|
|
if(one.length === two.length){
|
|
var length = one.length;
|
|
|
|
|
|
for(var i = 0; i < length; i++){
|
|
temp_one.push(one[i]);
|
|
temp_two.push(two[i]);
|
|
|
|
if((one[i][1] > two[i][1])) layered_points.push(two[i]);
|
|
else layered_points.push(one[i]);
|
|
|
|
if(i !== length-1){
|
|
if( !((one[i][1] > two[i][1]) && (one[i+1][1] > two[i+1][1])) &&
|
|
!((one[i][1] < two[i][1]) && (one[i+1][1] < two[i+1][1])) &&
|
|
!((one[i][1] == two[i][1]) || (one[i+1][1] == two[i+1][1])) )
|
|
{
|
|
var points_to_push = [];
|
|
var equation1 = getSlopeAndAlpha(one[i], one[i+1]);
|
|
var equation2 = getSlopeAndAlpha(two[i], two[i+1]);
|
|
var slope1 = equation1['slope'];
|
|
var slope2 = equation2['slope'];
|
|
var alpha1 = equation1['alpha'];
|
|
var alpha2 = equation2['alpha'];
|
|
|
|
var px = (alpha2 - alpha1)/(slope1-slope2);
|
|
var py = (px * slope1) + alpha1;
|
|
points_to_push.push(px);
|
|
points_to_push.push(py);
|
|
layered_points.push(points_to_push);
|
|
temp_one.push(points_to_push); // for making splicing easier push the cross _points twice
|
|
temp_one.push(points_to_push);
|
|
temp_two.push(points_to_push);
|
|
temp_two.push(points_to_push);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Draw polygon where two areas are stacked up
|
|
if(layered_points.length){
|
|
|
|
var points_to_draw = '';
|
|
for (var i = 0; i<layered_points.length; i++){
|
|
var px = layered_points[i][0];
|
|
var py = layered_points[i][1];
|
|
if(i === 0){
|
|
points_to_draw += 'M '+px + ' -' + py;
|
|
}
|
|
else{
|
|
points_to_draw += ' L '+px + ' -' + py;
|
|
}
|
|
}
|
|
points_to_draw += ' L '+layered_points[layered_points.length-1][0] + ' -' + 0 + ' L 0 0 Z';
|
|
var layered_line = Nwagon.createSvgElem('path', {'d':points_to_draw, 'class':'layered'});
|
|
polygons.appendChild(layered_line);
|
|
}
|
|
// Draw polygons for non-layered portions
|
|
if(temp_one.length === temp_two.length){
|
|
var i = 0;
|
|
while(i<temp_one.length){
|
|
if((temp_one[i][1] == temp_two[i][1] ) && (i !=0) || (i == temp_one.length-1)) {
|
|
var splice_one = temp_one.splice(i+1);
|
|
var splice_two = temp_two.splice(i+1);
|
|
drawPolygons(temp_one, temp_two);
|
|
|
|
temp_one = splice_one;
|
|
temp_two = splice_two;
|
|
i = 0;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
},
|
|
draw_vertex_and_tooltip:function(parentSVG, data, guide_needed){
|
|
var circles = Nwagon.createSvgElem('g', {'class':'circles'});
|
|
parentSVG.appendChild(circles);
|
|
if(!guide_needed){
|
|
var tooltip = Nwagon.createTooltip();
|
|
parentSVG.appendChild(tooltip);
|
|
}
|
|
for (var i = 0; i<data.length; i++){
|
|
var vertex = Nwagon.createSvgElem('circle', data[i]['attributes']);
|
|
circles.appendChild(vertex);
|
|
if(!guide_needed){
|
|
vertex.onmouseover = Nwagon.showToolTip(tooltip, data[i]['tooltip_x'], data[i]['tooltip_y'], data[i]['text'], 14, 7, 18);
|
|
vertex.onmouseout = Nwagon.hideToolTip(tooltip);
|
|
}
|
|
}
|
|
},
|
|
drawLineForeground: function(parentDiv, parentSVG, legend, dataset, increment, max, min, width, height, isAreaChart, isJira, guide_line_needed){
|
|
var numOfCols = legend['names'].length;
|
|
var colWidth = (width/numOfCols).toFixed(3);
|
|
var yLimit = (Math.ceil((max-min)/increment)+1) * increment;
|
|
var px = '', cw = '', ch = '';
|
|
var names = legend['names'];
|
|
var data = dataset['values'];
|
|
var colors = dataset['colorset'];
|
|
var fields = dataset['fields'];
|
|
var circle_and_tooltips = [];
|
|
var jira_points = [];
|
|
|
|
var foreground = Nwagon.createSvgElem('g', {'class':'foreground'});
|
|
parentSVG.appendChild(foreground);
|
|
|
|
var lines = Nwagon.createSvgElem('g', {'class':'lines'});
|
|
foreground.appendChild(lines);
|
|
|
|
var labels = Nwagon.createSvgElem('g', {'class':'labels'});
|
|
foreground.appendChild(labels);
|
|
|
|
// Draw foreground elements (lines, circles, labels...)
|
|
cw = (3/5*colWidth);
|
|
if(data[0]){
|
|
for (var k = 0; k < data[0].length; k++){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
var textEl = document.createElement('li');
|
|
textEl.innerHTML = fields[k];
|
|
var innerUL = document.createElement('ul');
|
|
textEl.appendChild(innerUL);
|
|
ul.appendChild(textEl);
|
|
}
|
|
|
|
var first_y = 0;
|
|
var points_to_draw = '';
|
|
var line_points = [];
|
|
var start_point = 0;
|
|
for (var i = 0; i<data.length; i++){
|
|
var circle_and_tooltip_data = {};
|
|
var point_pair = [];
|
|
px = colWidth*i;
|
|
|
|
var py = ((data[i][k] - min) / yLimit) * height;
|
|
if(isNaN(py)){
|
|
start_point++;
|
|
}
|
|
else{
|
|
if(i === start_point){
|
|
points_to_draw += 'M '+px + ' -' + py;
|
|
first_y = py;
|
|
}
|
|
else{
|
|
points_to_draw += ' L '+px + ' -' + py;
|
|
}
|
|
point_pair.push(px);
|
|
point_pair.push(py);
|
|
line_points.push(point_pair);
|
|
|
|
var attributes = {'cx':px, 'cy':'-'+py, 'r':2, 'stroke': colors[k], 'fill':colors[k]};
|
|
var tooltip_text = names[i] + '('+ fields[k] + '): ' + data[i][k].toString();
|
|
|
|
circle_and_tooltip_data['attributes'] = attributes;
|
|
circle_and_tooltip_data['text'] = tooltip_text;
|
|
circle_and_tooltip_data['tooltip_x'] = px+cw/2;
|
|
circle_and_tooltip_data['tooltip_y'] = -py;
|
|
circle_and_tooltips.push(circle_and_tooltip_data);
|
|
|
|
if(innerUL){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = 'Label ' + names[i] + ', Value '+ data[i][k].toString();
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
}
|
|
if(k===0){
|
|
var text = Nwagon.line.drawLabels(px + cw/2, 15, names[i], false, 0);
|
|
labels.appendChild(text);
|
|
}
|
|
}
|
|
|
|
var line = Nwagon.createSvgElem('path', {'d':points_to_draw, 'fill': 'none', 'stroke':colors[k]});
|
|
|
|
if (isAreaChart){
|
|
var polygon_to_draw = points_to_draw +' L '+px+ ' ' + 0 + ' L '+0 + ' ' + 0 + ' L '+0 + ' -' + first_y +' Z';
|
|
var polygon = Nwagon.createSvgElem('path', {'d':polygon_to_draw, 'fill':colors[k], 'opacity': '0.8'});
|
|
lines.appendChild(polygon);
|
|
}
|
|
lines.appendChild(line);
|
|
jira_points.push(line_points);
|
|
}
|
|
}
|
|
if(isJira){
|
|
Nwagon.line.drawJiraForeground(parentDiv, jira_points, colors);
|
|
}
|
|
|
|
if(guide_line_needed){
|
|
Nwagon.line.guide_line = Nwagon.createSvgElem('line', {'x1':numOfCols*colWidth, 'y1': 4, 'x2':numOfCols*colWidth, 'y2' : -height, 'class':'guide_line'});
|
|
parentSVG.appendChild(Nwagon.line.guide_line);
|
|
}
|
|
|
|
Nwagon.line.draw_vertex_and_tooltip(foreground, circle_and_tooltips, guide_line_needed);
|
|
|
|
},
|
|
|
|
drawBackground: function(parentSVG, numOfCols, dataset, increment, max, min, width, height){
|
|
|
|
var colWidth = (width/numOfCols).toFixed(3);
|
|
var attributes = {};
|
|
var px = '', yRatio = 1;
|
|
|
|
var background = Nwagon.createSvgElem('g', {'class':'background'});
|
|
parentSVG.appendChild(background);
|
|
|
|
var numOfRows = Math.ceil((max-min)/increment);
|
|
var rowHeight = height/(numOfRows+1);
|
|
|
|
//Vertical lines(Fist line)
|
|
attributes = {'x1':'0', 'y1':'0', 'x2':'0', 'y2':-height + (rowHeight/2), 'class':'v'};
|
|
var line = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(line);
|
|
|
|
//Vertical lines(x-axis)
|
|
for (var i = 0; i < numOfCols; i++)
|
|
{
|
|
px = i * colWidth;
|
|
attributes = {'x1':px, 'y1': 4, 'x2':px, 'y2':-1 , 'class':'v'};
|
|
line = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(line);
|
|
}
|
|
|
|
//Horizontal lines
|
|
var count = 0;
|
|
for (i = 0; i<=numOfRows; i++)
|
|
{
|
|
var class_name = (i === 0) ? 'h' : 'h_dash' ;
|
|
attributes = {'x1':'-3', 'y1':'-'+ i*rowHeight, 'x2':(numOfCols*colWidth).toString(), 'y2':'-'+ i*rowHeight, 'class':class_name};
|
|
line = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(line);
|
|
|
|
attributes = {'x':'-15', 'y':-((count*rowHeight)-3), 'text-anchor':'end'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = ((count*increment) + min).toString();
|
|
|
|
background.appendChild(text);
|
|
count++;
|
|
}
|
|
//Field Names
|
|
if(dataset['fields'])
|
|
{
|
|
var fields = Nwagon.createSvgElem('g', {'class':'fields'});
|
|
background.appendChild(fields);
|
|
|
|
var numOfFields = dataset['fields'].length;
|
|
for (i = 0; i<numOfFields; i++)
|
|
{
|
|
px = width+20;
|
|
py = (30*i) - height + rowHeight;
|
|
|
|
attributes = {'x':px, 'y':py, 'width':20, 'height':15, 'fill':dataset['colorset'][i]};
|
|
var badge = Nwagon.createSvgElem('rect', attributes);
|
|
fields.appendChild(badge);
|
|
|
|
attributes = {'x':px+30, 'y':py+7, 'alignment-baseline':'central'};
|
|
var name = Nwagon.createSvgElem('text', attributes);
|
|
name.textContent = dataset['fields'][i];
|
|
fields.appendChild(name);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
column:{
|
|
|
|
drawColumnChart: function(obj){
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var values = obj.dataset['values'];
|
|
var LeftOffsetAbsolute = obj.hasOwnProperty('leftOffsetValue') ? obj.leftOffsetValue : 50;
|
|
var BottomOffsetAbsolute = obj.hasOwnProperty('bottomOffsetValue') ? obj.bottomOffsetValue : 80;
|
|
var TopOffsetAbsolute = obj.hasOwnProperty('topOffsetValue') ? obj.topOffsetValue : 0;
|
|
var RightOffsetAbsolute = obj.hasOwnProperty('rightOffsetValue') ? obj.rightOffsetValue : 0;
|
|
|
|
RightOffsetAbsolute = obj.dataset['fields'] ? (150 + RightOffsetAbsolute) : RightOffsetAbsolute;
|
|
|
|
var viewbox = (-LeftOffsetAbsolute) + ' ' + (BottomOffsetAbsolute -height) + ' ' + width + ' ' + height;
|
|
var svg = Nwagon.createChartArea(obj.chart_div, obj.chartType, viewbox, width, height);
|
|
var max = obj.highest ? obj.highest : Nwagon.getMax(values);
|
|
|
|
this.drawBackground(svg, obj.legend['names'].length, obj.dataset, obj.increment, max, width-LeftOffsetAbsolute-RightOffsetAbsolute, height-BottomOffsetAbsolute-TopOffsetAbsolute);
|
|
this.drawColumnForeground(obj.chart_div, svg, obj.legend, obj.dataset, obj.increment, max, width-LeftOffsetAbsolute-RightOffsetAbsolute, height-BottomOffsetAbsolute-TopOffsetAbsolute, obj.chartType);
|
|
|
|
},
|
|
|
|
drawColumn: function(parentGroup, width, height){
|
|
|
|
var column = Nwagon.createSvgElem('rect', {'x':'0', 'y':-height, 'width':width, 'height':height});
|
|
parentGroup.appendChild(column);
|
|
|
|
return column;
|
|
},
|
|
|
|
drawLabels: function(x, y, labelText){
|
|
|
|
var attributes = {'x':x, 'y':y, 'text-anchor':'end', 'transform':'rotate(315,'+ x +','+ y + ')'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = labelText;
|
|
|
|
return text;
|
|
},
|
|
|
|
getColorSetforSingleColumnChart: function(max, values, colorset){
|
|
var numOfColors = colorset.length;
|
|
var interval = max/numOfColors;
|
|
var colors = [];
|
|
|
|
for(var index = 0; index < values.length; index++){
|
|
var colorIndex = Math.floor(values[index]/interval);
|
|
if (colorIndex == numOfColors) colorIndex--;
|
|
colors.push(colorset[colorIndex]);
|
|
}
|
|
return colors;
|
|
},
|
|
|
|
drawColumnForeground: function(parentDiv, parentSVG, legend, dataset, increment, max, width, height, chartType){
|
|
|
|
var names = legend['names'];
|
|
var numOfCols = names.length;
|
|
var colWidth = (width/numOfCols).toFixed(3);
|
|
var yLimit = (Math.ceil(max/increment)+1) * increment;
|
|
var px = '', cw = '', ch = '';
|
|
var data = dataset['values'];
|
|
var chart_title = dataset['title'];
|
|
var fields = dataset['fields'];
|
|
|
|
var foreground = Nwagon.createSvgElem('g', {'class':'foreground'});
|
|
parentSVG.appendChild(foreground);
|
|
|
|
var columns = Nwagon.createSvgElem('g', {'class':'columns'});
|
|
foreground.appendChild(columns);
|
|
|
|
var labels = Nwagon.createSvgElem('g', {'class':'labels'});
|
|
foreground.appendChild(labels);
|
|
|
|
var tooltip = Nwagon.createTooltip();
|
|
foreground.appendChild(tooltip);
|
|
|
|
var drawColGroups = function(columns, ch, px, color, tooltipText, isStackedColumn, yValue){
|
|
var colgroup = Nwagon.createSvgElem('g', {});
|
|
columns.appendChild(colgroup);
|
|
|
|
var column = Nwagon.column.drawColumn(colgroup, cw, ch);
|
|
|
|
Nwagon.setAttributes(column, {'x':px, 'style':'fill:'+color});
|
|
if(isStackedColumn)
|
|
{
|
|
var py = yValue - column.getBBox().y;
|
|
if ( py > 0 ) Nwagon.setAttributes(column, {'y':-py});
|
|
ch = py;
|
|
}
|
|
|
|
column.onmouseover = Nwagon.showToolTip(tooltip, px+cw/2, -ch, tooltipText, 14, 7, 18);
|
|
column.onmouseout = Nwagon.hideToolTip(tooltip);
|
|
|
|
column = null; //prevent memory leak (in IE)
|
|
};
|
|
|
|
var create_data_list = function(obj){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if (ul){
|
|
for (var key in obj){
|
|
if(obj.hasOwnProperty(key)){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = key;
|
|
var innerUL = document.createElement('ul');
|
|
li.appendChild(innerUL);
|
|
ul.appendChild(li);
|
|
var innerList = obj[key];
|
|
for (var k = 0; k< innerList.length; k++){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = innerList[k];
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
if(chartType == 'column')
|
|
{
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
ul.innerHTML = chart_title;
|
|
}
|
|
cw = (3/5*colWidth);
|
|
var colors = Nwagon.column.getColorSetforSingleColumnChart(max, data, dataset['colorset']);
|
|
|
|
for(var index = 0; index < data.length; index++){
|
|
px = (colWidth*(index+0.2));// + cw;
|
|
ch = data[index]/yLimit*height;
|
|
drawColGroups(columns, ch, px, colors[index], data[index]);
|
|
|
|
var text = Nwagon.column.drawLabels(px + cw/2, 15, names[index], false, 0);
|
|
labels.appendChild(text);
|
|
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = 'Label ' + names[index] + ', Value '+ data[index];
|
|
if(ul){
|
|
ul.appendChild(innerLI);
|
|
}
|
|
}
|
|
}
|
|
else if(chartType == 'multi_column')
|
|
{
|
|
var colors = dataset['colorset'];
|
|
cw = (3/5*colWidth)/colors.length;
|
|
var chart_data = {};
|
|
for ( var k = 0; k<fields.length; k++){
|
|
chart_data[fields[k]] = [];
|
|
}
|
|
|
|
for(var i = 0; i < data.length; i++){
|
|
var one_data = data[i];
|
|
px = (colWidth*(i+0.2));
|
|
|
|
for(var index = 0; index < one_data.length; index++){
|
|
var pxx = px+ (index*(cw));
|
|
ch = one_data[index]/yLimit*height;
|
|
drawColGroups(columns, ch, pxx, colors[index], one_data[index], false, 0);
|
|
chart_data[fields[index]].push('Label ' + names[i] + ', Value '+ one_data[index]);
|
|
}
|
|
|
|
var text = Nwagon.column.drawLabels(px + cw/2, 15, names[i]);
|
|
labels.appendChild(text);
|
|
}
|
|
create_data_list(chart_data);
|
|
}
|
|
else if(chartType == 'stacked_column')
|
|
{
|
|
cw = (3/5*colWidth);
|
|
var colors = dataset['colorset'];
|
|
var chart_data = {};
|
|
for ( var k = 0; k<fields.length; k++){
|
|
chart_data[fields[k]] = [];
|
|
}
|
|
for(var i = 0; i < data.length; i++){
|
|
var one_data = data[i];
|
|
var yValue = 0;
|
|
|
|
for(var index = 0; index < one_data.length; index++){
|
|
px = (colWidth*(i+0.2));// + cw;
|
|
ch = one_data[index]/yLimit*height;
|
|
|
|
drawColGroups(columns, ch, px, colors[index], one_data[index], true, yValue);
|
|
chart_data[fields[index]].push('Label ' + names[i] + ', Value '+ one_data[index]);
|
|
yValue +=ch;
|
|
}
|
|
|
|
|
|
var text = Nwagon.column.drawLabels(px + cw/2, 15, names[i]);
|
|
labels.appendChild(text);
|
|
}
|
|
create_data_list(chart_data);
|
|
}
|
|
},
|
|
|
|
drawBackground: function(parentSVG, numOfCols, dataset, increment, max, width, height){
|
|
|
|
var colWidth =(width/numOfCols).toFixed(3);
|
|
var attributes = {};
|
|
var px = '', yRatio = 1;
|
|
|
|
var background = Nwagon.createSvgElem('g', {'class':'background'});
|
|
parentSVG.appendChild(background);
|
|
|
|
var numOfRows = Math.ceil(max/increment);
|
|
rowHeight = height/(numOfRows+1);
|
|
|
|
//Vertical lines
|
|
for (var i = 0; i<=numOfCols; i++)
|
|
{
|
|
px = (i * colWidth).toString();
|
|
attributes = {'x1':px, 'y1':'0', 'x2':px, 'y2':rowHeight-height, 'class':'v'};
|
|
var line = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(line);
|
|
}
|
|
//Horizontal lines (draw 1 more extra line to accomodate the max value)
|
|
var count = 0;
|
|
for (var i = 0; i<=numOfRows; i++)
|
|
{
|
|
attributes = {'x1':'0', 'y1':'-'+ i*rowHeight, 'x2':(numOfCols*colWidth).toString(), 'y2':'-'+ i*rowHeight, 'class':'h'};
|
|
var line = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(line);
|
|
|
|
attributes = {'x':'-15', 'y':-((count*rowHeight)-3), 'text-anchor':'end'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = (count*increment).toString();
|
|
|
|
background.appendChild(text);
|
|
count++;
|
|
}
|
|
//Field Names
|
|
if(dataset['fields'])
|
|
{
|
|
var fields = Nwagon.createSvgElem('g', {'class':'fields'});
|
|
background.appendChild(fields);
|
|
|
|
var numOfFields = dataset['fields'].length;
|
|
for (var i = 0; i<numOfFields; i++)
|
|
{
|
|
px = width+20;
|
|
py = (30*i) - height + rowHeight;
|
|
|
|
attributes = {'x':px, 'y':py, 'width':20, 'height':15, 'fill':dataset['colorset'][i]};
|
|
var badge = Nwagon.createSvgElem('rect', attributes);
|
|
fields.appendChild(badge);
|
|
|
|
attributes = {'x':px+25, 'y':py+7, 'alignment-baseline':'central'};
|
|
var name = Nwagon.createSvgElem('text', attributes);
|
|
name.textContent = dataset['fields'][i];
|
|
fields.appendChild(name);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
donut: {
|
|
|
|
drawDonutChart: function(obj){
|
|
var width = obj.width, height = obj.height;
|
|
var viewbox = '-' + width/3 + ' -' + height/2 + ' ' + width + ' ' + height;
|
|
var svg = Nwagon.createChartArea(obj.chart_div, obj.chartType, viewbox, width, height);
|
|
var angles = {'angles':[], 'percent':[], 'values':[]};
|
|
var degree_values = obj.dataset['values'];
|
|
if(degree_values){
|
|
angles = Nwagon.getAngles(degree_values, angles);
|
|
}
|
|
this.drawDonut(obj.chart_div, angles, obj.chartType, svg, obj.dataset, obj.core_circle_radius, obj.donut_width);
|
|
if(obj.core_circle_radius == 0){
|
|
this.drawField(obj.dataset['fields'], obj.dataset['colorset'], svg, obj.donut_width/2);
|
|
}
|
|
else{
|
|
this.drawField(obj.dataset['fields'], obj.dataset['colorset'], svg, obj.donut_width);
|
|
}
|
|
|
|
},
|
|
drawDonut: function(parentDiv, angles, chart_type, parentSVG, data, core_radius, donut_width){
|
|
// var core_circle_radius = core_radius;
|
|
var radius = donut_width + core_radius;
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
var create_data_li = function(text_to_add){
|
|
if(ul){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = text_to_add;
|
|
ul.appendChild(li);
|
|
}
|
|
};
|
|
|
|
var foreground = Nwagon.createSvgElem('g', {'class':'foreground'});
|
|
parentSVG.appendChild(foreground);
|
|
var donuts = Nwagon.createSvgElem('g', {'class':'donuts'});
|
|
foreground.appendChild(donuts);
|
|
var tooltip = Nwagon.createTooltip();
|
|
foreground.appendChild(tooltip);
|
|
|
|
var colors = data['colorset'];
|
|
|
|
var length = angles['angles'].length;
|
|
var arch_end_x = 0, arch_end_y = 0;
|
|
var points_to_draw = '', text_to_add = '';
|
|
var names = data['fields'];
|
|
var angle_to_rotate = 0;
|
|
var sub_angle = angle_in_int = angle_in_int_accumulate = 0;
|
|
|
|
for(var j=0; j<length; j++)
|
|
{
|
|
var path;
|
|
if(angles['percent'][j] < 1){
|
|
sub_angle = (Math.PI*2) * angles['percent'][j];
|
|
angle_in_int = angles['angles'][j];
|
|
if(j > 0){
|
|
angle_in_int_accumulate+=angles['angles'][j-1];
|
|
}
|
|
|
|
if(core_radius > 0) {
|
|
|
|
if(sub_angle){
|
|
|
|
arch_end_x = (radius)*Math.sin(sub_angle);
|
|
arch_end_y = sub_angle ? -(radius*Math.sin(sub_angle)/Math.tan(sub_angle)) : 0;
|
|
|
|
var end_x = core_radius*Math.sin(sub_angle);
|
|
var end_y = sub_angle ? -(core_radius*Math.sin(sub_angle)/Math.tan(sub_angle)) : 0;
|
|
|
|
if(sub_angle > Math.PI){
|
|
points_to_draw = 'M0 '+ -core_radius+ ' L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 1 1 ' + arch_end_x +' '+ arch_end_y +' L '+ end_x +' '+ end_y;
|
|
points_to_draw+= ' A ' + core_radius + ' ' + core_radius + ' 0 1 0 0 '+ -core_radius + ' Z';
|
|
}
|
|
else
|
|
{
|
|
points_to_draw = 'M0 '+ -core_radius+ ' L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 0 1 ' + arch_end_x +' '+ arch_end_y +' L '+ end_x +' '+ end_y;
|
|
points_to_draw+= ' A ' + core_radius + ' ' + core_radius + ' 0 0 0 0 '+ -core_radius + ' Z';
|
|
}
|
|
}
|
|
else{
|
|
points_to_draw = 'M0 0 L 0 0 Z';
|
|
}
|
|
|
|
}
|
|
else{
|
|
if(sub_angle){
|
|
arch_end_x = radius*Math.sin(sub_angle);
|
|
arch_end_y = sub_angle ? -(radius*Math.sin(sub_angle)/Math.tan(sub_angle)) : 0;
|
|
if(sub_angle > Math.PI){
|
|
points_to_draw = 'M0 0 L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 1 1 ' + arch_end_x +' '+ arch_end_y +' L0 0 Z';
|
|
}
|
|
else{
|
|
points_to_draw = 'M0 0 L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 0 1 ' + arch_end_x +' '+ arch_end_y +' L0 0 Z';
|
|
}
|
|
}
|
|
else{
|
|
points_to_draw = 'M0 0 L 0 0 Z';
|
|
}
|
|
}
|
|
path = Nwagon.createSvgElem('path', {'class':'sector','d':points_to_draw, 'fill':colors[j]});
|
|
donuts.appendChild(path);
|
|
}
|
|
else{
|
|
|
|
var attributes = {'cx':0, 'cy':0, 'r':radius, 'stroke':'transparent', 'fill': colors[j]};
|
|
path = Nwagon.createSvgElem('circle', attributes);
|
|
donuts.appendChild(path);
|
|
if(core_radius > 0){
|
|
var inner_attributes = {'cx':0, 'cy':0, 'r':core_radius, 'stroke':'transparent', 'fill-opacity': 1, 'fill': 'white'};
|
|
var inner_circle = Nwagon.createSvgElem('circle', inner_attributes);
|
|
donuts.appendChild(inner_circle);
|
|
}
|
|
}
|
|
|
|
if(angles['angles'].length){
|
|
angle_to_rotate = angle_in_int_accumulate;
|
|
}
|
|
else{
|
|
angle_to_rotate = (angle_in_int*j);
|
|
}
|
|
|
|
var sectors = document.querySelectorAll('#' + parentDiv + ' .Nwagon_'+chart_type+' .foreground .sector');
|
|
if(sectors.length > 0){
|
|
var sector = sectors[sectors.length-1];
|
|
sector.setAttribute('transform','rotate('+ angle_to_rotate +')');
|
|
}
|
|
|
|
var tooltip_angle = (Math.PI * (angle_to_rotate-90))/180;
|
|
var tooltip_y = radius * Math.sin(tooltip_angle);
|
|
var tooltip_x = radius * Math.cos(tooltip_angle);// * Math.cos(angle_to_rotate);
|
|
|
|
var degree_value = angles['values'][j].toFixed(0);
|
|
text_to_add = names[j] ? (names[j]+ '(' +(angles['percent'][j]*100).toFixed(1) +'%) ' + degree_value) : 'undefiend';
|
|
|
|
path.onmouseover = Nwagon.showToolTip(tooltip, tooltip_x, tooltip_y, text_to_add, 14, 7, 18);
|
|
path.onmouseout = Nwagon.hideToolTip(tooltip);
|
|
|
|
create_data_li(text_to_add);
|
|
}
|
|
},
|
|
drawField: function(fields_names, colorset, parentSVG, width){
|
|
if(fields_names.length)
|
|
{
|
|
var fields = Nwagon.createSvgElem('g', {'class':'fields'});
|
|
parentSVG.appendChild(fields);
|
|
var attributes = {};
|
|
var height = 15;
|
|
var numOfFields = fields_names.length;
|
|
for (var i = 0; i<numOfFields; i++)
|
|
{
|
|
var px = width * 4;
|
|
var py = (30*i) - (numOfFields * height); //70 ;
|
|
|
|
attributes = {'x':px, 'y':py, 'width':20, 'height':height, 'fill':colorset[i]};
|
|
var badge = Nwagon.createSvgElem('rect', attributes);
|
|
fields.appendChild(badge);
|
|
|
|
attributes = {'x':px+25, 'y':py+10, 'alignment-baseline':'central'};
|
|
var name = Nwagon.createSvgElem('text', attributes);
|
|
name.textContent = fields_names[i];
|
|
fields.appendChild(name);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
polar: {
|
|
drawPolarChart: function(obj){
|
|
|
|
var BottomOffsetAbsolute = 80;
|
|
var RightOffsetAbsolute = obj.dataset['fields'] ? 150 : 0;
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var viewbox = '-' + width/2 + ' -' + height/2 + ' ' + width + ' ' + height;
|
|
var svg = Nwagon.createChartArea(obj.chart_div, obj.chartType, viewbox, width, height);
|
|
var angles = {'angles':[], 'percent':[], 'values':[]};
|
|
if(obj.chartType == 'polar_pie'){
|
|
var degree_values = obj.dataset['degree_values'];
|
|
if(degree_values){
|
|
angles = Nwagon.getAngles(degree_values, angles);
|
|
}
|
|
}
|
|
|
|
if(svg && obj.legend['names'] && obj.dataset){
|
|
this.drawBackground(svg, angles['angles'], obj.chartType, obj.legend['names'], obj.dataset, obj.increment, obj.max, obj.core_circle_radius, (width/2)-RightOffsetAbsolute, (height/2)-BottomOffsetAbsolute);
|
|
this.drawLabels(svg, angles, obj.legend, CONST_MAX_RADIUS, obj.core_circle_radius);
|
|
if(obj.core_circle_radius > 0 && obj.core_circle_value){
|
|
this.drawCoreCircleValue(svg, obj.core_circle_value, obj.core_circle_radius);
|
|
}
|
|
this.drawForeground(obj.chart_div, angles, obj.chartType, svg, obj.legend, obj.dataset, obj.core_circle_radius, obj.max);
|
|
}
|
|
this.drawCoordinates(svg, obj.increment, obj.max, obj.core_circle_radius);
|
|
},
|
|
|
|
|
|
drawCoordinates: function(parentSVG, decrement, maxRadius, core_circle_radius){
|
|
|
|
var g = Nwagon.createSvgElem('g', {'class':'xAxis'});
|
|
var i = maxRadius, y=0.0, point=0.0;
|
|
|
|
while (i > 0)
|
|
{
|
|
point = y+',' + -(i+core_circle_radius);
|
|
|
|
var attributes = {'points': point, 'x':y, 'y':-(i+core_circle_radius), 'text-anchor':'middle'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = i.toString();
|
|
g.appendChild(text);
|
|
i-=decrement;
|
|
}
|
|
parentSVG.appendChild(g);
|
|
},
|
|
|
|
drawCoreCircleValue: function(parentSVG, value, core_circle_radius){
|
|
|
|
var core = Nwagon.createSvgElem('g', {'class':'core'});
|
|
parentSVG.appendChild(core);
|
|
var attributes = {'x':'0', 'y':core_circle_radius/4, 'text-anchor':'middle', 'class':'core_text'};
|
|
var core_text = Nwagon.createSvgElem('text', attributes);
|
|
core_text.textContent = value;
|
|
core.appendChild(core_text);
|
|
},
|
|
|
|
drawLabels: function(parentSVG, angles, legend, maxRadius, core_circle_radius){
|
|
|
|
var labels = Nwagon.createSvgElem('g', {'class':'labels'});
|
|
parentSVG.appendChild(labels);
|
|
var names = legend.names;
|
|
var length = names.length;
|
|
var angle = angle_accumulate = 0;
|
|
|
|
for(var i = 0; i<length; i++){
|
|
if(angles['percent'].length){
|
|
angle = (Math.PI*2) * angles['percent'][i];
|
|
if(i>0){
|
|
angle_accumulate += (Math.PI*2) * angles['percent'][i-1];
|
|
}
|
|
}
|
|
else{
|
|
angle = (Math.PI*2)/length;
|
|
angle_accumulate = angle*i;
|
|
}
|
|
var sub_names = names[i];
|
|
if(sub_names){
|
|
var sub_len = sub_names.length;
|
|
for(var k = 0; k<sub_len; k++){
|
|
var sub_angle = angle/sub_len;
|
|
var total_angle = angle_accumulate + (sub_angle * k) + sub_angle/2;
|
|
var y = -(maxRadius+core_circle_radius+12) * Math.cos(total_angle);
|
|
var x = (maxRadius+core_circle_radius+12) * Math.sin(total_angle);
|
|
|
|
var align = (x < 0) ? 'end' : 'start';
|
|
if(x < 1 && x > -1) align = 'middle';
|
|
|
|
var attributes = {'x':x, 'y':y, 'text-anchor':align, 'class':'chart_label'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = sub_names[k];
|
|
labels.appendChild(text);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
drawForeground: function(parentDiv, angles, chart_type, parentSVG, legend, data, core_circle_radius, max){
|
|
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
var create_data_li = function(text_to_add){
|
|
if(ul){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = text_to_add;
|
|
ul.appendChild(li);
|
|
}
|
|
};
|
|
var foreground = Nwagon.createSvgElem('g', {'class':'foreground'});
|
|
parentSVG.appendChild(foreground);
|
|
var pies = Nwagon.createSvgElem('g', {'class':'pies'});
|
|
foreground.appendChild(pies);
|
|
var tooltip = Nwagon.createTooltip();
|
|
foreground.appendChild(tooltip);
|
|
|
|
var colors = data['colorset'];
|
|
var dataGroup = data['values'];
|
|
var opacities = data ['opacity'];
|
|
var length = dataGroup.length;
|
|
var arch_end_x = 0, arch_end_y = 0;
|
|
var points_to_draw = '', text_to_add = '';
|
|
var names = legend.names;
|
|
var angle_to_rotate = 0;
|
|
var angle = angle_in_int = angle_in_int_accumulate = 0;
|
|
if(length){
|
|
for(var j=0; j<length; j++)
|
|
{
|
|
if(angles['angles'].length){
|
|
angle = (Math.PI*2) * angles['percent'][j];
|
|
angle_in_int = angles['angles'][j];
|
|
if(j > 0){
|
|
angle_in_int_accumulate+=angles['angles'][j-1];
|
|
}
|
|
}
|
|
else{
|
|
angle = (Math.PI*2)/length;
|
|
angle_in_int = 360/length;
|
|
}
|
|
|
|
var sub_data = dataGroup[j];
|
|
var sub_len = sub_data.length;
|
|
|
|
for (var k = 0; k<sub_len; k++){
|
|
var radius = sub_data[k];
|
|
var opacity = 0.8;
|
|
if(opacities.length){
|
|
opacity = Nwagon.getOpacity(opacities, radius, max);
|
|
}
|
|
|
|
var sub_angle = angle/sub_len;
|
|
var sub_angle_in_int = angle_in_int/sub_len;
|
|
|
|
if(core_circle_radius > 0) {
|
|
radius = radius+core_circle_radius;
|
|
arch_end_x = (radius)*Math.sin(sub_angle);
|
|
arch_end_y = -(radius*Math.sin(sub_angle)/Math.tan(sub_angle));
|
|
|
|
var end_x = core_circle_radius*Math.sin(sub_angle);
|
|
var end_y = -(core_circle_radius*Math.sin(sub_angle)/Math.tan(sub_angle));
|
|
if(sub_angle > Math.PI){
|
|
points_to_draw = 'M0 '+ -core_circle_radius+ ' L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 1 1 ' + arch_end_x +' '+ arch_end_y +' L '+ end_x +' '+ end_y;
|
|
points_to_draw+= ' A ' + core_circle_radius + ' ' + core_circle_radius + ' 0 1 0 0 '+ -core_circle_radius + ' Z';
|
|
}
|
|
else
|
|
{
|
|
points_to_draw = 'M0 '+ -core_circle_radius+ ' L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 0 1 ' + arch_end_x +' '+ arch_end_y +' L '+ end_x +' '+ end_y;
|
|
points_to_draw+= ' A ' + core_circle_radius + ' ' + core_circle_radius + ' 0 0 0 0 '+ -core_circle_radius + ' Z';
|
|
}
|
|
|
|
}
|
|
else{
|
|
arch_end_x = radius*Math.sin(sub_angle);
|
|
arch_end_y = -(radius*Math.sin(sub_angle)/Math.tan(sub_angle));
|
|
points_to_draw = 'M0 0 L0 ' +'-'+radius +' A ' + radius + ' ' + radius + ' 0 0 1 ' + arch_end_x +' '+ arch_end_y +' L0 0 Z';
|
|
}
|
|
|
|
var path = Nwagon.createSvgElem('path', {'class':'sector','d':points_to_draw, 'fill':colors[j], 'opacity': opacity});
|
|
pies.appendChild(path);
|
|
if(angles['angles'].length){
|
|
angle_to_rotate = angle_in_int_accumulate + (sub_angle_in_int*k);
|
|
}
|
|
else{
|
|
angle_to_rotate = (angle_in_int*j)+(sub_angle_in_int*k);
|
|
}
|
|
|
|
var sectors = document.querySelectorAll('#' + parentDiv + ' .Nwagon_'+chart_type+' .foreground .sector');
|
|
if(sectors.length > 0){
|
|
var sector = sectors[sectors.length-1];
|
|
sector.setAttribute('transform','rotate('+ angle_to_rotate +')');
|
|
}
|
|
|
|
|
|
var tooltip_angle = (Math.PI * (angle_to_rotate-90))/180;
|
|
var tooltip_y = (core_circle_radius+max) * Math.sin(tooltip_angle);
|
|
var tooltip_x = (core_circle_radius+max) * Math.cos(tooltip_angle);// * Math.cos(angle_to_rotate);
|
|
|
|
if(angles['values'].length){
|
|
var degree_value = angles['values'][j].toFixed(0);
|
|
text_to_add = names[j][k] ? (names[j][k] +' (' + degree_value + '), Value: '+ (radius-core_circle_radius).toFixed(1)) : 'undefiend';
|
|
}
|
|
else{
|
|
text_to_add = names[j][k] ? (names[j][k] + ', Value: '+ (radius-core_circle_radius).toFixed(1)) : 'undefiend';
|
|
}
|
|
|
|
path.onmouseover = Nwagon.showToolTip(tooltip, tooltip_x, tooltip_y, text_to_add, 14, 7, 18);
|
|
path.onmouseout = Nwagon.hideToolTip(tooltip);
|
|
|
|
create_data_li(text_to_add);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
drawBackground: function(parentSVG, angles, chart_type, obj_names, obj_values, decrement, max_radius, core_circle_radius, width, height){
|
|
var background = Nwagon.createSvgElem('g', {'class':'background'});
|
|
parentSVG.appendChild(background);
|
|
|
|
var data = obj_values['values'];
|
|
if(data.length)
|
|
{
|
|
var angle = 360/data.length;
|
|
|
|
//Draw arch
|
|
var draw_bg_circles = function(radius){
|
|
var points_to_draw = 'M0 ' + radius + 'A ' + radius + ' ' + radius + ' 0 0 0 0' + ' -'+radius;
|
|
var path = Nwagon.createSvgElem('path', {'d':points_to_draw});
|
|
background.appendChild(path);
|
|
|
|
points_to_draw = 'M0 ' + radius + 'A ' + radius + ' ' + radius + ' 0 0 1 0' + ' -'+radius;
|
|
path = Nwagon.createSvgElem('path', {'d':points_to_draw});
|
|
background.appendChild(path);
|
|
};
|
|
|
|
if(core_circle_radius > 0){
|
|
draw_bg_circles(core_circle_radius);
|
|
}
|
|
var radius = max_radius + core_circle_radius;
|
|
while (radius > core_circle_radius){
|
|
draw_bg_circles(radius);
|
|
radius-= decrement;
|
|
}
|
|
//Draw lines
|
|
var rotate_angle = 0;
|
|
for(var j=0; j<data.length; j++)
|
|
{
|
|
if(angles.length){
|
|
rotate_angle+= angles[j];
|
|
}
|
|
else{
|
|
rotate_angle = angle * j;
|
|
}
|
|
var attributes = {'x1':'0', 'y1':-core_circle_radius, 'x2':'0', 'y2':-(max_radius+core_circle_radius), 'class':'v'};
|
|
var bgStraightLine = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(bgStraightLine);
|
|
|
|
bgStraightLine.setAttribute('transform', 'rotate('+ rotate_angle +')');
|
|
|
|
var sub_data = data[j];
|
|
if(sub_data){
|
|
var sub_len = sub_data.length;
|
|
for (var k = 1; k < sub_len; k++)
|
|
{
|
|
var inner_rotate_angle = rotate_angle + (angle/sub_len*k);
|
|
bgStraightLine = Nwagon.createSvgElem('line', attributes);
|
|
background.appendChild(bgStraightLine);
|
|
|
|
bgStraightLine.setAttribute('transform', 'rotate('+ inner_rotate_angle +')');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var fields_names = obj_values['fields'];
|
|
var colorset = obj_values['colorset'];
|
|
if(fields_names.length)
|
|
{
|
|
var fields = Nwagon.createSvgElem('g', {'class':'fields'});
|
|
background.appendChild(fields);
|
|
|
|
var numOfFields = fields_names.length;
|
|
for (var i = 0; i<numOfFields; i++)
|
|
{
|
|
px = width+20;
|
|
py = (30*i) - height ;
|
|
|
|
attributes = {'x':px, 'y':py, 'width':20, 'height':15, 'fill':colorset[i]};
|
|
var badge = Nwagon.createSvgElem('rect', attributes);
|
|
fields.appendChild(badge);
|
|
|
|
attributes = {'x':px+25, 'y':py+10, 'alignment-baseline':'central'};
|
|
var name = Nwagon.createSvgElem('text', attributes);
|
|
name.textContent = fields_names[i];
|
|
fields.appendChild(name);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
radar: {
|
|
|
|
drawRadarChart: function(obj){
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var viewbox = '-' + width/2 + ' -' + height/2 + ' ' + width + ' ' + height;
|
|
var svg = Nwagon.createChartArea(obj.chart_div, obj.chartType, viewbox, width, height);
|
|
|
|
this.drawBackground(svg, obj.legend['names'].length, obj.dataset['bgColor'], CONST_DECREMENT, CONST_MAX_RADIUS);
|
|
this.drawLabels(svg, obj.legend, CONST_MAX_RADIUS);
|
|
this.drawCoordinates(svg, CONST_DECREMENT, CONST_MAX_RADIUS);
|
|
this.drawPolygonForeground(obj.chart_div, svg, obj.legend, obj.dataset);
|
|
},
|
|
|
|
drawCoordinates: function(parentSVG, decrement, maxRadius){
|
|
|
|
var g = Nwagon.createSvgElem('g', {'class':'xAxis'});
|
|
var i = maxRadius, y=0.0, point=0.0;
|
|
|
|
while (i > 0)
|
|
{
|
|
point = i+',' + y;
|
|
|
|
var attributes = {'points': point, 'x':i, 'y':y, 'text-anchor':'middle'};
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = i.toString();
|
|
g.appendChild(text);
|
|
i-=decrement;
|
|
}
|
|
parentSVG.appendChild(g);
|
|
},
|
|
|
|
drawLabels: function(parentSVG, legend, maxRadius){
|
|
|
|
var labels = Nwagon.createSvgElem('g', {'class':'labels'});
|
|
var hrefs = legend['hrefs'], names = legend['names'];
|
|
var numOfRadars = names.length;
|
|
var attributes = {};
|
|
|
|
for(var index = 0; index < names.length; index++){
|
|
var angle = (Math.PI*2)/numOfRadars; // (2*PI)/numOfRadars
|
|
var x = 0 + (maxRadius+12) * Math.cos(((Math.PI*2)/numOfRadars) * (index));
|
|
var y = 0 + (maxRadius+12) * Math.sin(((Math.PI*2)/numOfRadars) * (index));
|
|
var align = (x < 0) ? 'end' : 'start';
|
|
if(x < 1 && x > -1) align = 'middle';
|
|
|
|
if(hrefs){
|
|
attributes = {'onclick':'location.href="' + hrefs[index] + '"', 'x':x, 'y':y, 'text-anchor':align, 'class':'chart_label'};
|
|
}else{
|
|
attributes = {'x':x, 'y':y, 'text-anchor':align, 'class':'chart_label'};
|
|
}
|
|
var text = Nwagon.createSvgElem('text', attributes);
|
|
text.textContent = names[index];
|
|
|
|
labels.appendChild(text);
|
|
}
|
|
parentSVG.appendChild(labels);
|
|
},
|
|
|
|
drawPie: function(parentGroup, numOfRadars, maxRadius, decrement, bg_color){
|
|
/* Draw outer solid line and then inner dotted lines */
|
|
|
|
var angle = (Math.PI*2)/numOfRadars;
|
|
var p0='', p1='', p2='';
|
|
var attributes = {}, points ='';
|
|
var radius = maxRadius;
|
|
|
|
var pie = Nwagon.createSvgElem('g', {'class':'pie'});
|
|
|
|
while (radius > 0)
|
|
{
|
|
p0 = radius+',0'; //'100,0';
|
|
p1 = '0,0';
|
|
p2 = (radius*Math.sin(angle)/Math.tan(angle)) + ',' + (-radius*Math.sin(angle));
|
|
|
|
if (radius == maxRadius)
|
|
{
|
|
points = p0 + ' ' + p1 + ' ' + p2;
|
|
var lr = Nwagon.createSvgElem('polyline', {'points':points, 'fill': bg_color});
|
|
pie.appendChild(lr);
|
|
}
|
|
|
|
points = p0 + ' ' + p2;
|
|
attributes = {'points':points, 'stroke-dasharray':'2px,2px', 'fill': bg_color};
|
|
var la = Nwagon.createSvgElem('polyline', attributes);
|
|
|
|
pie.appendChild(la);
|
|
radius-=decrement;
|
|
}
|
|
|
|
parentGroup.appendChild(pie);
|
|
return pie;
|
|
|
|
},
|
|
|
|
drawBackground: function(parentSVG, numOfRadars, bg_color, decrement, maxRadius){
|
|
var bg = bg_color ? bg_color : '#F9F9F9';
|
|
var angle = 360/numOfRadars;
|
|
|
|
var background = Nwagon.createSvgElem('g', {'class':'background'});
|
|
parentSVG.appendChild(background);
|
|
|
|
for(var j=1; j<=numOfRadars; j++)
|
|
{
|
|
var current_pie = this.drawPie(background, numOfRadars, maxRadius, decrement, bg);
|
|
current_pie.setAttribute('transform','rotate('+angle * (j-1)+')');
|
|
}
|
|
},
|
|
|
|
dimmedPie: function(parentGroup, index, length)
|
|
{
|
|
var angle = (360/length) * index;
|
|
var last_pie = this.drawPie(parentGroup, length, CONST_MAX_RADIUS, CONST_DECREMENT);
|
|
last_pie.setAttribute('transform','rotate('+angle +')');
|
|
var polylines = last_pie.querySelectorAll('polyline');
|
|
for(var i = 0; i<polylines.length; i++){
|
|
polylines[i].setAttribute('class','dim');
|
|
}
|
|
|
|
if (((index+1)%length)== 0)
|
|
{
|
|
this.drawPie(parentGroup, length, CONST_MAX_RADIUS, CONST_DECREMENT);
|
|
}
|
|
else
|
|
{
|
|
angle = (360/length) * (index+1);
|
|
last_pie = this.drawPie(parentGroup, length, CONST_MAX_RADIUS, CONST_DECREMENT);
|
|
last_pie.setAttribute('transform','rotate('+angle +')');
|
|
}
|
|
|
|
var polylines = last_pie.querySelectorAll('polyline');
|
|
for(var i = 0; i<polylines.length; i++){
|
|
polylines[i].setAttribute('class','dim');
|
|
}
|
|
},
|
|
|
|
drawPolygonForeground: function(parentDiv, parentSVG, legend, data){
|
|
|
|
var dataGroup = data['values'];
|
|
var title = data['title'];
|
|
var fg_color = data['fgColor'] ? data['fgColor'] : '#30A1CE';
|
|
var istooltipNeeded = (dataGroup.length == 1) ? true : false;
|
|
var names = legend['names'];
|
|
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
ul.innerHTML = title;
|
|
}
|
|
|
|
for(var i=0; i<dataGroup.length; i++){
|
|
if(ul)
|
|
{
|
|
var textEl = document.createElement('li');
|
|
textEl.innerHTML = 'Data set number ' + (i+1).toString();
|
|
var innerUL = document.createElement('ul');
|
|
textEl.appendChild(innerUL);
|
|
ul.appendChild(textEl);
|
|
}
|
|
var dataset = dataGroup[i];
|
|
var length = dataset.length;
|
|
var coordinate = [];
|
|
var angle = (Math.PI/180)*(360/length);
|
|
var pointValue = 0.0, px=0.0; py=0, attributes = {};
|
|
var vertexes = [], tooltips =[];
|
|
|
|
var foreground = Nwagon.createSvgElem('g', {'class':'foreground'});
|
|
parentSVG.appendChild(foreground);
|
|
|
|
var polygon = Nwagon.createSvgElem('polyline', {'class':'polygon'});
|
|
foreground.appendChild(polygon);
|
|
|
|
var tooltip = {};
|
|
if (istooltipNeeded)
|
|
{
|
|
tooltip = Nwagon.createTooltip();
|
|
}
|
|
|
|
for(var index =0; index < dataset.length; index++){
|
|
if(innerUL){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = names[index] + ': ' + dataset[index];
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
pointValue = dataset[index];
|
|
pointDisplay = dataset[index];
|
|
if (typeof(dataset[index]) != 'number')
|
|
{
|
|
Nwagon.radar.dimmedPie(foreground, index, length);
|
|
pointValue = 0;
|
|
pointDisplay = dataset[index];
|
|
}
|
|
|
|
px = (index == 0) ? pointValue : pointValue*Math.sin(angle*index)/Math.tan(angle*index);
|
|
py = (index == 0) ? 0 : pointValue*Math.sin(angle*index);
|
|
coordinate.push(px + ',' + py);
|
|
|
|
attributes = {'cx':px, 'cy':py, 'r':3, 'stroke-width':8, 'stroke':'transparent', 'fill': fg_color};
|
|
var vertex = Nwagon.createSvgElem('circle', attributes);
|
|
|
|
if (istooltipNeeded)
|
|
{
|
|
vertex.onmouseover = Nwagon.showToolTip(tooltip, px, py, names[index] + ' : ' + pointDisplay, 20, 15, 28);
|
|
vertex.onmouseout = Nwagon.hideToolTip(tooltip);
|
|
}
|
|
foreground.appendChild(vertex);
|
|
vertex = null;
|
|
}
|
|
|
|
var coordinates = coordinate.join(' ');
|
|
var attributes = {'points':coordinates, 'class':'polygon', 'fill': fg_color, 'stroke':fg_color};
|
|
Nwagon.setAttributes(polygon, attributes);
|
|
|
|
if (istooltipNeeded) foreground.appendChild(tooltip);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var Nwagon_ie = {
|
|
|
|
setStyles: function(obj, styles){
|
|
for (var key in styles) {
|
|
if (styles.hasOwnProperty(key)) {
|
|
obj.style[key] = styles[key];
|
|
}
|
|
}
|
|
},
|
|
|
|
setAttributes: function(obj, attributes){
|
|
for (var key in attributes) {
|
|
if (attributes.hasOwnProperty(key)) {
|
|
obj.setAttribute(key, attributes[key]);
|
|
}
|
|
}
|
|
},
|
|
createChartArea: function(id, width, height){
|
|
|
|
var chartDiv = document.getElementById(id);
|
|
chartDiv.style.cssText = 'width: '+ width+'px; height:'+ height + 'px';
|
|
var textArea = document.createElement('ul');
|
|
textArea.className = 'accessibility';
|
|
chartDiv.appendChild(textArea);
|
|
|
|
var vml = document.createElement("v:group");
|
|
vml.setAttribute('class', id);
|
|
vml.setAttribute("coordsize", width + " " + height);
|
|
vml.setAttribute('aria-hidden', 'true');
|
|
vml.style.cssText = 'width: '+ width+'px; height:'+ height + 'px;position:absolute;';
|
|
|
|
var rect = document.createElement('v:rect');
|
|
var style_attr = {'width': width + 'px', 'height': height + 'px'};
|
|
Nwagon_ie.setStyles(rect, style_attr);
|
|
rect.setAttribute('stroked','true');
|
|
vml.appendChild(rect);
|
|
chartDiv.appendChild(vml);
|
|
return vml;
|
|
},
|
|
|
|
createTooltip: function(parentCanvas){
|
|
var tip = document.createElement('div');
|
|
var textNode = document.createTextNode('');
|
|
tip.appendChild(textNode);
|
|
parentCanvas.appendChild(tip);
|
|
return tip;
|
|
},
|
|
|
|
showToolTip: function(tooltip, px, py, value){
|
|
return function(){
|
|
tooltip.style.cssText = 'display: block; padding: 0 5px 0 5px; background-color:#f9f9f9; border: 1px solid #666; position:absolute; z-index:100';
|
|
tooltip.lastChild.nodeValue = value;
|
|
tooltip.style.left = px + 'px';
|
|
tooltip.style.top = (py -15) + 'px';
|
|
tooltip.style.fontSize = '12px';
|
|
}
|
|
},
|
|
|
|
hideToolTip: function(tooltip){
|
|
return function(){
|
|
tooltip.style.cssText = "display: none";
|
|
}
|
|
},
|
|
drawWedges: function(cx, cy, r, fillcolor, start_a, end_a, s_attr){
|
|
var wedge = document.createElement("v:shape");
|
|
var sa = Math.round(start_a * 65535);
|
|
var a = -Math.round(end_a * 65536);
|
|
var path = "M " + cx + " " + cy + " AE " + cx + " " + cy + " " + r + " " + r + " " + sa + " " + a + " X E";
|
|
|
|
attributes = {'path': path, 'fillcolor': fillcolor, 'strokecolor': '#FFFFFF', 'strokeweight':'0px'};
|
|
Nwagon_ie.setAttributes(wedge, attributes);
|
|
Nwagon_ie.setStyles(wedge, s_attr);
|
|
return wedge;
|
|
},
|
|
drawVertex: function(x, y, fill){
|
|
var circle = document.createElement('v:oval');
|
|
circle.setAttribute('fillcolor', fill);
|
|
circle.setAttribute('strokecolor', fill);
|
|
circle.setAttribute('strokeweight', '1px');
|
|
circle.style.cssText = 'z-index:99; width:6px; height:6px';
|
|
circle.style.top = (y-3) + 'px';
|
|
circle.style.left = (x-3) + 'px';
|
|
|
|
return circle;
|
|
},
|
|
drawFields_for_circular_type_chart: function(fields, colors, canvas, h){
|
|
var style_attr = {};
|
|
if(fields.length){
|
|
var lx = 5, ly=10;
|
|
var field_div = document.createElement('div');
|
|
|
|
style_attr = {'width':Math.round(h/2) + 'px', 'height': Math.round(h*(2/3)) + 'px', 'left': h + 'px', 'top': '70px', 'position':'absolute'};
|
|
Nwagon_ie.setStyles(field_div, style_attr);
|
|
field_div.className = 'fields_area';
|
|
canvas.appendChild(field_div);
|
|
var attributes = {};
|
|
|
|
for(var i = 0; i<fields.length; i++){
|
|
var badge = document.createElement("v:rect");
|
|
style_attr = {'width':'20px', 'height': '15px', 'left':'5px', 'top': (ly+i*30) + 'px'};
|
|
Nwagon_ie.setStyles(badge, style_attr);
|
|
attributes = {'fillcolor':colors[i], 'strokecolor': '#FFFFFF', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(badge, attributes);
|
|
field_div.appendChild(badge);
|
|
|
|
var name = document.createElement('div');
|
|
name.appendChild(document.createTextNode(fields[i]));
|
|
style_attr = {'position':'absolute', 'left': (lx + 30) + 'px', 'top': (ly + 30*i) + 'px', 'fontSize': '12px'};
|
|
Nwagon_ie.setStyles(name, style_attr);
|
|
field_div.appendChild(name);
|
|
}
|
|
}
|
|
},
|
|
column:{
|
|
|
|
drawColumnChart: function(obj){
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var canvas = Nwagon_ie.createChartArea(obj.chart_div, width, height);
|
|
|
|
var values = obj.dataset['values'];
|
|
var left = obj.hasOwnProperty('leftOffsetValue') ? obj.leftOffsetValue : 50;
|
|
var bottom = obj.hasOwnProperty('bottomOffsetValue') ? obj.bottomOffsetValue : 80;
|
|
|
|
var max = obj.highest ? obj.highest : Nwagon.getMax(values);
|
|
var fields = obj.dataset['fields'];
|
|
var fieldsExist = ((fields && (obj.chartType !='column')) || (obj.chartType =='column' && obj.dataset['colorset'].length == 1)) ;
|
|
this.drawBackground(canvas, obj.legend['names'], obj.dataset, obj.increment, max, width, height, left, bottom, fieldsExist);
|
|
this.drawColumnForeground(obj.chart_div, canvas, obj.legend, obj.dataset, obj.increment, max, width, height, left, bottom, obj.chartType, fieldsExist);
|
|
|
|
},
|
|
|
|
drawColumnForeground: function(parentDiv, canvas, legend, dataset, increment, max, width, height, left, bottom, chart_type, isFields){
|
|
var names = legend['names'];
|
|
var numOfCols = names.length;
|
|
var data = dataset['values'];
|
|
var chart_title = dataset['title'];
|
|
var fields = dataset['fields'];
|
|
var right = isFields ? 150 : 0;
|
|
var colWidth = Math.floor((width-left-right)/numOfCols);
|
|
var x1 = 0, x2 = 0, y1 = 0, y2 = 0, cw = 0;
|
|
var yLimit = (Math.ceil(max/increment)+1) * increment; //let's check if it's used in here
|
|
var numOfRows = max/increment;
|
|
var rowHeight = Math.round((height-bottom)/(numOfRows+1));
|
|
var yRatio = rowHeight/increment;
|
|
var colors = [];
|
|
var attributes = {}, style_attr={};
|
|
var tooltip = Nwagon_ie.createTooltip(canvas);
|
|
var text_to_add = '';
|
|
|
|
var drawColumn = function(attr, w, h, x, y, text, tip){
|
|
var column = document.createElement('v:shape');
|
|
Nwagon_ie.setAttributes(column, attr);
|
|
style_attr = {'position':'absolute', 'width': w, 'height': h, 'filter':'alpha(opacity=80)'};
|
|
Nwagon_ie.setStyles(column, style_attr);
|
|
column.onmouseover = Nwagon_ie.showToolTip(tip, x, y, text);
|
|
column.onmouseout = Nwagon_ie.hideToolTip(tip);
|
|
return column;
|
|
};
|
|
var create_data_list = function(obj){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if (ul){
|
|
for (var key in obj){
|
|
if(obj.hasOwnProperty(key)){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = key;
|
|
var innerUL = document.createElement('ul');
|
|
li.appendChild(innerUL);
|
|
ul.appendChild(li);
|
|
var innerList = obj[key];
|
|
for (var k = 0; k< innerList.length; k++){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = innerList[k];
|
|
// console.log('innerList['+k+'] : '+ innerList[k]);
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
if(chart_type == 'column'){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
ul.innerHTML = chart_title;
|
|
}
|
|
cw = colWidth * 1/5;
|
|
colors = Nwagon.column.getColorSetforSingleColumnChart(max, data, dataset['colorset']);
|
|
for(var i = 0; i<data.length; i++){
|
|
x1 = left + Math.round(colWidth * (i+0.2));
|
|
x2 = Math.round(left + (colWidth * (i+1)) - cw);
|
|
y1 = height - bottom;
|
|
y2 = height - bottom - Math.round(yRatio * data[i]);
|
|
|
|
var path = 'M ' + x1 + ' ' + y1 + ' L ' + x1 + ' ' + y2 + ' L ' + x2 + ' ' + y2 + ' L ' + x2 + ' ' + y1 +' X E';
|
|
attributes = {'path': path, 'strokecolor': colors[i], 'strokeweight':'1px', 'fillcolor': colors[i]};
|
|
text_to_add = data[i].toString();
|
|
var c = drawColumn(attributes, canvas.style.width, canvas.style.height, x1+5, y2+rowHeight, text_to_add, tooltip);
|
|
canvas.appendChild(c);
|
|
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = 'Label ' + names[i] + ', Value '+ data[i];
|
|
if(ul){
|
|
ul.appendChild(innerLI);
|
|
}
|
|
}
|
|
}
|
|
if(chart_type == 'multi_column'){
|
|
colors = dataset['colorset'];
|
|
cw = (3/5*colWidth)/colors.length;
|
|
var chart_data = {};
|
|
for ( var k = 0; k<fields.length; k++){
|
|
chart_data[fields[k]] = [];
|
|
}
|
|
|
|
for(var i = 0; i < data.length; i++){
|
|
var one_data = data[i];
|
|
var px = left + Math.round(colWidth * (i+0.2));
|
|
|
|
for(var k = 0; k < one_data.length; k++){
|
|
x1 = px + Math.round((k*(cw)));
|
|
x2 = px + Math.round((k+1)*cw);
|
|
y1 = height - bottom;
|
|
y2 = height - bottom - Math.round(yRatio * one_data[k]);
|
|
|
|
var path = 'M ' + x1 + ' ' + y1 + ' L ' + x1 + ' ' + y2 + ' L ' + x2 + ' ' + y2 + ' L ' + x2 + ' ' + y1 +' X E';
|
|
attributes = {'path': path, 'strokecolor': colors[k], 'strokeweight':'1px', 'fillcolor': colors[k]};
|
|
text_to_add = one_data[k].toString();
|
|
var c = drawColumn(attributes, canvas.style.width, canvas.style.height, x1+5, y2+rowHeight, text_to_add, tooltip);
|
|
canvas.appendChild(c);
|
|
chart_data[fields[k]].push('Label ' + names[i] + ', Value '+ one_data[k]);
|
|
}
|
|
}
|
|
create_data_list(chart_data);
|
|
}
|
|
if(chart_type == 'stacked_column'){
|
|
colors = dataset['colorset'];
|
|
cw = colWidth * 1/5;
|
|
var chart_data = {};
|
|
for ( var k = 0; k<fields.length; k++){
|
|
chart_data[fields[k]] = [];
|
|
}
|
|
for(var i = 0; i < data.length; i++){
|
|
var one_data = data[i];
|
|
var yValue = height-bottom;
|
|
var px = left + Math.round(colWidth * (i+0.2));
|
|
|
|
for(var k = 0; k < one_data.length; k++){
|
|
|
|
x1 = left + Math.round(colWidth * (i+0.2));
|
|
x2 = Math.round(left + (colWidth * (i+1)) - cw);
|
|
y1 = yValue;
|
|
y2 = yValue - Math.round(yRatio * one_data[k]);
|
|
|
|
var path = 'M ' + x1 + ' ' + y1 + ' L ' + x1 + ' ' + y2 + ' L ' + x2 + ' ' + y2 + ' L ' + x2 + ' ' + y1 +' X E';
|
|
attributes = {'path': path, 'strokecolor': colors[k], 'strokeweight':'1px', 'fillcolor': colors[k]};
|
|
text_to_add = one_data[k].toString();
|
|
var c = drawColumn(attributes, canvas.style.width, canvas.style.height, x1+5, y2+rowHeight, text_to_add, tooltip);
|
|
canvas.appendChild(c);
|
|
|
|
chart_data[fields[k]].push('Label ' + names[i] + ', Value '+ one_data[k]);
|
|
yValue -=Math.round(yRatio * one_data[k]);
|
|
}
|
|
}
|
|
create_data_list(chart_data);
|
|
}
|
|
if((fields && (chart_type !='column')) || (chart_type =='column' && dataset['colorset'].length == 1)) {
|
|
for(var i = 0; i<fields.length; i++){
|
|
var lx = width - right +30, ly= 30;
|
|
var badge = document.createElement("v:rect");
|
|
style_attr = {'position':'absolute', 'width': '20px', 'height':'15px', 'top':(ly+i*30) + 'px', 'left':lx + 'px'};
|
|
Nwagon_ie.setStyles(badge, style_attr);
|
|
attributes = {'fillcolor': colors[i], 'strokecolor':'#FFFFFF', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(badge, attributes);
|
|
canvas.appendChild(badge);
|
|
|
|
var name = document.createElement('div');
|
|
name.appendChild(document.createTextNode(fields[i]));
|
|
style_attr = {'position':'absolute', 'top':(ly + 30*i) + 'px', 'left': (lx + 30) + 'px', 'fontSize':'12px'};
|
|
Nwagon_ie.setStyles(name, style_attr);
|
|
canvas.appendChild(name);
|
|
}
|
|
}
|
|
},
|
|
|
|
drawBackground: function(canvas, names, dataset, increment, max, width, height, left, bottom, isFields){
|
|
var numOfCols = names.length;
|
|
var numOfRows = Math.ceil(max/increment);
|
|
var right = 0, line_width=0, colWidth = 0;
|
|
if(isFields){
|
|
var right = 150;
|
|
}
|
|
if(numOfCols){
|
|
var colWidth = Math.floor((width-left-right)/numOfCols);
|
|
}
|
|
var rowHeight = Math.round((height-bottom)/(numOfRows+1));
|
|
var values = dataset['values'];
|
|
var attributes = {}, style_attr = {};
|
|
|
|
for (var i = 0; i<=values.length; i++){
|
|
var v_line = document.createElement('v:shape');
|
|
var v_height_start = height - bottom;
|
|
var v_height_end = height - bottom -(rowHeight*(numOfRows+1));
|
|
var px = left + (colWidth*i);
|
|
var v_path = 'M '+ px + ' '+ v_height_start + 'L ' + px +' ' + v_height_end;
|
|
|
|
attributes = {'path': v_path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(v_line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(v_line, style_attr);
|
|
canvas.appendChild(v_line);
|
|
|
|
// draw text as well (x coord)
|
|
if(i<values.length){
|
|
var x_label = document.createElement('div');
|
|
x_label.appendChild(document.createTextNode(names[i]));
|
|
x_label.setAttribute('class', 'label_ie')
|
|
style_attr = {'position':'absolute', 'left': (px + (colWidth/4))+ 'px', 'top': (height - bottom + 15)+ 'px', 'fontSize':'13px'};
|
|
Nwagon_ie.setStyles(x_label, style_attr);
|
|
canvas.appendChild(x_label);
|
|
}
|
|
if(i == values.length){
|
|
line_width = px;
|
|
}
|
|
}
|
|
|
|
//Horizontal lines & labels
|
|
var count = 0;
|
|
for (i = 0; i<=numOfRows; i++){
|
|
var line = document.createElement('v:shape');
|
|
var line_height = height - bottom - (rowHeight * i);
|
|
var path = 'M '+ left + ' '+ line_height + 'L ' + line_width +' ' + line_height;
|
|
|
|
attributes = {'path': path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
line.style.position = "absolute";
|
|
line.style.width = canvas.style.width;
|
|
line.style.height = canvas.style.height;
|
|
canvas.appendChild(line);
|
|
|
|
// label
|
|
var label = document.createElement('div');
|
|
var label_text = (increment*i).toString();
|
|
label.setAttribute('class', 'label_ie')
|
|
label.appendChild(document.createTextNode(label_text));
|
|
style_attr = {'position':'absolute', 'right':(width - left +15) + 'px', 'top':line_height - 6 + 'px', 'fontSize':'13px' };
|
|
Nwagon_ie.setStyles(label, style_attr);
|
|
canvas.appendChild(label);
|
|
}
|
|
}
|
|
},
|
|
line: {
|
|
guide_line: null,
|
|
guide_line_max_left: 0,
|
|
drawLineChart: function(obj){
|
|
var type = obj.chartType;
|
|
var isAreaChart = false, isJira = false;
|
|
var width = obj.width, height = obj.height;
|
|
var canvas = Nwagon_ie.createChartArea(obj.chart_div, width, height);
|
|
var left = obj.leftOffsetValue ? obj.leftOffsetValue : 50;
|
|
var bottom = obj.bottomOffsetValue ? obj.bottomOffsetValue : 80;
|
|
var names = obj.legend['names'];
|
|
var fields = obj.dataset['fields'];
|
|
var values = obj.dataset['values'];
|
|
var max = obj.highest ? obj.highest : Nwagon.getMax(values);
|
|
var min = obj.lowest ? obj.lowest : 0;
|
|
isAreaChart = (type == 'area');
|
|
isJira = (type == 'jira');
|
|
var isGuideNeeded = obj.hasOwnProperty('isGuideLineNeeded') ? obj.isGuideLineNeeded : false;
|
|
|
|
this.drawBackground(canvas, names, obj.dataset, obj.increment, max, min, width, height, left, bottom);
|
|
this.drawLineForeground(obj.chart_div, canvas, obj.legend, obj.dataset, obj.increment, max, min, width, height, left, bottom, isAreaChart , isJira, isGuideNeeded);
|
|
if(isGuideNeeded && Nwagon_ie.line.guide_line){
|
|
var right = fields ? 150 : 0;
|
|
var interval = Math.round(width-left-right)/names.length;
|
|
var tool = document.createElement('div');
|
|
canvas.appendChild(tool);
|
|
|
|
var g = Nwagon_ie.line.guide_line;
|
|
var d = document.getElementById(obj.chart_div);
|
|
var x_offset = canvas.offsetLeft + canvas.clientLeft;
|
|
var y_offset = canvas.offsetTop + canvas.clientTop;
|
|
function moveGuideLine(e) {
|
|
var xPosition = e.clientX - x_offset;
|
|
var yPosition = e.clientY - y_offset;
|
|
if((xPosition-left) > 0 ){
|
|
var index = (Math.floor((xPosition-left)/interval));
|
|
if(xPosition > Nwagon_ie.line.guide_line_max_left){
|
|
xPosition = Nwagon_ie.line.guide_line_max_left -left;
|
|
}
|
|
if(xPosition >= left && (index < names.length)){
|
|
g.style.left = xPosition+'px';
|
|
tool.innerHTML = '';
|
|
tool.style.cssText = 'display: block; float:left; padding: 0 5px 0 5px; background-color:#f9f9f9; border: 1px solid #666; position:absolute; z-index:100';
|
|
tool.style.fontSize = '12px';
|
|
tool.style.left = xPosition + 'px';
|
|
tool.style.top = ( yPosition-(fields.length*14) + document.body.scrollTop )+ 'px';
|
|
for(var i = 0; i<fields.length; i++){
|
|
var s = names[index] + '('+ fields[i] + '): ' + values[index][i];
|
|
var textDiv = document.createElement('div');
|
|
if(textDiv){
|
|
textDiv.innerHTML = s;
|
|
tool.appendChild(textDiv);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function hideTool(e){
|
|
tool.style.cssText = 'display:none';
|
|
}
|
|
d.attachEvent('onmousemove', moveGuideLine);
|
|
d.attachEvent('onmouseout', hideTool);
|
|
}
|
|
},
|
|
|
|
drawJiraForeground:function(points, colors, canvas, left_off, bottom_off){
|
|
var getSlopeAndAlpha = function(point_1, point_2){
|
|
var values = {};
|
|
var slope;
|
|
if((point_2[1] == point_1[1])){
|
|
slope = 0;
|
|
}
|
|
else{
|
|
slope = (point_2[1]-point_1[1])/(point_2[0]-point_1[0]);
|
|
}
|
|
values['alpha'] = point_1[1] - (slope * point_1[0]);
|
|
values['slope'] = slope;
|
|
return values;
|
|
};
|
|
var drawPolygons = function(arr1, arr2){
|
|
|
|
if(arr1 && arr2){
|
|
var color, first, second, px, py;
|
|
var points_to_draw = '';
|
|
|
|
var i = 0;
|
|
while ( i < arr1.length){
|
|
if(arr1[i][1]< arr2[i][1]){
|
|
first = arr1;
|
|
second = arr2;
|
|
color = colors[0];
|
|
break;
|
|
}
|
|
if(arr1[i][1]> arr2[i][1]){
|
|
first = arr2;
|
|
second = arr1;
|
|
color = colors[1];
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
var j = 0;
|
|
while(j<first.length){
|
|
px = Math.round(first[j][0]);
|
|
var y_coord = bottom_off - first[j][1];
|
|
py = Math.round(bottom_off - y_coord);
|
|
// py = first[j][1];
|
|
if(j === 0){
|
|
points_to_draw += 'M '+px + ' ' + py;
|
|
}
|
|
else{
|
|
points_to_draw += ' L '+px + ' ' + py;
|
|
}
|
|
j++;
|
|
}
|
|
var k = second.length-1;
|
|
while(k >= 0){
|
|
px = Math.round(second[k][0]);
|
|
var y_coord = bottom_off - second[k][1];
|
|
py = Math.round(bottom_off - y_coord);
|
|
points_to_draw += ' L '+px + ' ' + py;
|
|
k--;
|
|
}
|
|
|
|
points_to_draw +=' X E';
|
|
var unlayered = document.createElement('v:shape');
|
|
var attributes = {'path': points_to_draw, 'strokecolor': '#CCC', 'fillcolor':color};
|
|
Nwagon_ie.setAttributes(unlayered, attributes);
|
|
var style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height, 'filter':'alpha(opacity=80)'};
|
|
Nwagon_ie.setStyles(unlayered, style_attr);
|
|
canvas.appendChild(unlayered);
|
|
}
|
|
};
|
|
|
|
var layered_points = [];
|
|
|
|
if(points.length == 2){
|
|
var colorOne = colors[0];
|
|
var colorTwo = colors[1];
|
|
var one = points[0];
|
|
var two = points[1];
|
|
var temp_one = [], temp_two = [];
|
|
|
|
if(one.length === two.length){
|
|
var length = one.length;
|
|
|
|
|
|
for(var i = 0; i < length; i++){
|
|
temp_one.push(one[i]);
|
|
temp_two.push(two[i]);
|
|
|
|
if((one[i][1] < two[i][1])) layered_points.push(two[i]);
|
|
else layered_points.push(one[i]);
|
|
|
|
if(i !== length-1){
|
|
if( !((one[i][1] > two[i][1]) && (one[i+1][1] > two[i+1][1])) &&
|
|
!((one[i][1] < two[i][1]) && (one[i+1][1] < two[i+1][1])) &&
|
|
!((one[i][1] == two[i][1]) || (one[i+1][1] == two[i+1][1])) )
|
|
{
|
|
var points_to_push = [];
|
|
var equation1 = getSlopeAndAlpha(one[i], one[i+1]);
|
|
var equation2 = getSlopeAndAlpha(two[i], two[i+1]);
|
|
var slope1 = equation1['slope'];
|
|
var slope2 = equation2['slope'];
|
|
var alpha1 = equation1['alpha'];
|
|
var alpha2 = equation2['alpha'];
|
|
|
|
var px = (alpha2 - alpha1)/(slope1-slope2)
|
|
var py = (px * slope1) + alpha1;
|
|
points_to_push.push(px);
|
|
points_to_push.push(py);
|
|
layered_points.push(points_to_push);
|
|
temp_one.push(points_to_push); // for making splicing easier push the cross points twice
|
|
temp_one.push(points_to_push);
|
|
temp_two.push(points_to_push);
|
|
temp_two.push(points_to_push);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Draw polygon where two areas are stacked up
|
|
if(layered_points.length){
|
|
var points_to_draw = '';
|
|
for (var i = 0; i<layered_points.length; i++){
|
|
var px = Math.round(layered_points[i][0]);
|
|
var y_coord = bottom_off - layered_points[i][1];
|
|
var py = Math.round(bottom_off - y_coord);
|
|
if(i === 0){
|
|
points_to_draw += 'M '+px + ' ' + py;
|
|
}
|
|
else{
|
|
points_to_draw += ' L '+px + ' ' + py;
|
|
}
|
|
}
|
|
points_to_draw += ' L '+layered_points[layered_points.length-1][0] + ' ' + bottom_off + ' L '+ left_off + ' '+ bottom_off + ' X E';
|
|
var layered_line = document.createElement('v:shape');
|
|
var attributes = {'path': points_to_draw, 'strokecolor': '#CCC', 'fillcolor':'#FFF'};
|
|
Nwagon_ie.setAttributes(layered_line, attributes);
|
|
var style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height, 'filter':'alpha(opacity=80)'};
|
|
Nwagon_ie.setStyles(layered_line, style_attr);
|
|
canvas.appendChild(layered_line);
|
|
}
|
|
// Draw polygons for non-layered portions
|
|
if(temp_one.length === temp_two.length){
|
|
var i = 0;
|
|
while(i<temp_one.length){
|
|
|
|
if((temp_one[i][1] == temp_two[i][1] ) && (i !=0) || (i == temp_one.length-1)) {
|
|
var splice_one = temp_one.splice(i+1, temp_one.length-1);
|
|
var splice_two = temp_two.splice(i+1, temp_two.length-1);
|
|
|
|
drawPolygons(temp_one, temp_two);
|
|
|
|
temp_one = splice_one;
|
|
temp_two = splice_two;
|
|
i = 0;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
},
|
|
|
|
drawLineForeground: function(parentDiv, canvas, legend, dataset, increment, max, min, width, height, left, bottom, isArea, isJira, guide_line_needed){
|
|
var names = legend['names'];
|
|
var colors = dataset['colorset'];
|
|
var fields = dataset['fields'];
|
|
var values = dataset['values'];
|
|
var numOfCols = values.length;
|
|
var right = fields ? 150 : 0;
|
|
var colWidth = Math.round((width-left-right)/numOfCols);
|
|
var px = left, py = height-bottom;
|
|
var numOfRows = ((max-min)/increment);
|
|
var rowHeight = Math.round((height-bottom)/(numOfRows+1));
|
|
var yRatio = rowHeight/increment;
|
|
var paths = [], polygon_paths = [];
|
|
var text_to_add = '';
|
|
var value = values[0];
|
|
var tooltip = Nwagon_ie.createTooltip(canvas);
|
|
var style_attr = {};
|
|
var jira_points = [];
|
|
|
|
for(var k = 0; k<value.length; k++){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
var textEl = document.createElement('li');
|
|
textEl.innerHTML = fields[k];
|
|
var innerUL = document.createElement('ul');
|
|
textEl.appendChild(innerUL);
|
|
ul.appendChild(textEl);
|
|
}
|
|
var first_y = 0;
|
|
var start_point = 0;
|
|
var path = '';
|
|
var polygon_path = '';
|
|
var line_points = [];
|
|
var x = 0, y = 0;
|
|
for(var i = 0; i<values.length; i++){
|
|
var point_pair = [];
|
|
x = px + (colWidth * i);
|
|
y = py - Math.round((values[i][k]-0.5 - min)*yRatio);
|
|
if(isNaN(y)){
|
|
start_point++;
|
|
}
|
|
else {
|
|
if(i == start_point){
|
|
path += 'M '+x + ' ' + y;
|
|
first_y = y;
|
|
}
|
|
else{
|
|
path += 'L '+x + ' ' + y;
|
|
}
|
|
point_pair.push(x);
|
|
point_pair.push(y);
|
|
line_points.push(point_pair);
|
|
|
|
var vertex = Nwagon_ie.drawVertex(x, y, colors[k]);
|
|
text_to_add = fields ? names[i] + '('+ fields[k] + '): ' + values[i][k].toString() : names[i] + ': ' + values[i][k].toString();
|
|
if(!guide_line_needed){
|
|
vertex.onmouseover = Nwagon_ie.showToolTip(tooltip, x, y, text_to_add);
|
|
vertex.onmouseout = Nwagon_ie.hideToolTip(tooltip);
|
|
}
|
|
canvas.appendChild(vertex);
|
|
if(innerUL){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = 'Label ' + names[i] + ', Value '+ values[i][k].toString();
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
}
|
|
}
|
|
paths.push(path);
|
|
if(isArea){
|
|
polygon_path = path + 'L ' + x + ' '+ py +' L '+ px + ' ' + py +' L '+ px + ' ' + y +' X E';
|
|
polygon_paths.push(polygon_path);
|
|
}
|
|
jira_points.push(line_points);
|
|
}
|
|
|
|
for(var k = 0; k<value.length; k++){
|
|
|
|
var line = document.createElement('v:shape');
|
|
var attributes = {'path': paths[k], 'strokecolor': colors[k], 'strokeweight':'2px'};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(line, style_attr);
|
|
var fill = document.createElement('v:fill');
|
|
fill.setAttribute('on', 'false');
|
|
line.appendChild(fill);
|
|
canvas.appendChild(line);
|
|
|
|
if(isArea){
|
|
var polygon = document.createElement('v:shape');
|
|
attributes = {'path': polygon_paths[k], 'strokecolor': colors[k], 'fillcolor':colors[k]};
|
|
Nwagon_ie.setAttributes(polygon, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height, 'filter':'alpha(opacity=80)'};
|
|
Nwagon_ie.setStyles(polygon, style_attr);
|
|
canvas.appendChild(polygon);
|
|
}
|
|
|
|
if(fields){
|
|
/*
|
|
var lx = width - right +30, ly= 30;
|
|
var badge = document.createElement("v:rect");
|
|
style_attr = {'position':'absolute', 'width': '20px', 'height': '15px', 'left':lx + 'px', 'top':(ly+k*30) + 'px'};
|
|
Nwagon_ie.setStyles(badge, style_attr);
|
|
|
|
attributes = {'fillcolor': colors[k], 'strokecolor':'#FFFFFF', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(badge, attributes);
|
|
canvas.appendChild(badge);
|
|
|
|
var name = document.createElement('div');
|
|
name.appendChild(document.createTextNode(fields[k]));
|
|
style_attr = {'position':'absolute', 'left':(lx + 30) + 'px', 'top':(ly + 30*k) + 'px', 'fontSize':'12px'};
|
|
Nwagon_ie.setStyles(name, style_attr);
|
|
|
|
canvas.appendChild(name);
|
|
*/
|
|
}
|
|
}
|
|
if(isJira){
|
|
Nwagon_ie.line.drawJiraForeground(jira_points, colors, canvas, left, height-bottom);
|
|
}
|
|
if(guide_line_needed){
|
|
Nwagon_ie.line.guide_line = document.createElement('div');
|
|
var x_max = left + (colWidth*numOfCols);
|
|
Nwagon_ie.line.guide_line_max_left = x_max;
|
|
Nwagon_ie.setStyles(Nwagon_ie.line.guide_line, {'position':'absolute', 'width': '2px', 'height': (height-bottom+5)+'px', 'left':x_max + 'px', 'background':'#4010ad'});
|
|
canvas.appendChild(Nwagon_ie.line.guide_line);
|
|
}
|
|
},
|
|
|
|
drawBackground: function(canvas, names, dataset, increment, max, min, width, height, left, bottom){
|
|
var numOfCols = dataset['values'].length;
|
|
var numOfRows = Math.ceil((max-min)/increment);
|
|
var right = 0;
|
|
var fields = dataset['fields'];
|
|
if(fields){
|
|
right = 150;
|
|
}
|
|
if(numOfCols){
|
|
var colWidth = Math.round((width-left-right)/numOfCols);
|
|
}
|
|
var rowHeight = Math.round((height-bottom)/(numOfRows+1));
|
|
var values = dataset['values'];
|
|
var yRatio = (height-bottom)/100;
|
|
var attributes = {}, style_attr = {};
|
|
|
|
for (var i = 0; i<values.length; i++){
|
|
var v_line = document.createElement('v:shape');
|
|
var v_height_start = height - bottom + 5;
|
|
var v_height_end = (i == 0) ? height - bottom -(rowHeight*(numOfRows+1)) : height - bottom -5;
|
|
var px = left + (colWidth*i);
|
|
var v_path = 'M '+ px + ' '+ v_height_start + 'L ' + px +' ' + v_height_end;
|
|
|
|
attributes = {'path': v_path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(v_line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(v_line, style_attr);
|
|
canvas.appendChild(v_line);
|
|
|
|
// draw text as well (x coord)
|
|
var x_label = document.createElement('div');
|
|
x_label.appendChild(document.createTextNode(names[i]));
|
|
style_attr = {'position':'absolute', 'left': px+ 'px', 'top': (height - bottom + 15)+ 'px', 'fontSize': '13px'};
|
|
Nwagon_ie.setStyles(x_label, style_attr);
|
|
canvas.appendChild(x_label);
|
|
}
|
|
|
|
//Horizontal lines & labels
|
|
var count = 0;
|
|
var line_width = width-right+3;
|
|
for (i = 0; i<=numOfRows; i++){
|
|
var line = document.createElement('v:shape');
|
|
var line_height = height - bottom - (rowHeight * i);
|
|
var path = 'M '+ (left-3) + ' '+ line_height + 'L ' + line_width +' ' + line_height;
|
|
|
|
attributes = {'path': path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(line, style_attr);
|
|
var stroke = document.createElement('v:stroke');
|
|
stroke.setAttribute('dashstyle', 'dash');
|
|
line.appendChild(stroke);
|
|
canvas.appendChild(line);
|
|
|
|
// label
|
|
var label = document.createElement('div');
|
|
var label_text = ((increment*i) + min).toString();
|
|
label.appendChild(document.createTextNode(label_text));
|
|
|
|
style_attr = {'position':'absolute', 'right': (width - left +15) + 'px', 'top': line_height - 3 + 'px', 'fontSize': '13px'};
|
|
Nwagon_ie.setStyles(label, style_attr);
|
|
canvas.appendChild(label);
|
|
}
|
|
}
|
|
},
|
|
|
|
polar: {
|
|
drawPolarChart: function(obj){
|
|
var width = obj.width, height = obj.height;
|
|
var values = obj.dataset['values'];
|
|
var canvas = Nwagon_ie.createChartArea(obj.chart_div, width, height);
|
|
var angles = {'angles':[], 'percent':[], 'values':[]};
|
|
if(obj.chartType == 'polar_pie'){
|
|
var degree_values = obj.dataset['degree_values'];
|
|
if(degree_values){
|
|
angles = Nwagon.getAngles(degree_values, angles);
|
|
}
|
|
}
|
|
if(canvas && obj.legend['names'] && obj.dataset){
|
|
this.drawBackground(canvas, angles['angles'], obj.chartType, obj.legend['names'], obj.dataset, obj.increment, obj.max, obj.core_circle_radius, height);
|
|
this.drawForeground(canvas, obj.chart_div, angles, obj.chartType, obj.legend, obj.dataset, obj.core_circle_radius, obj.core_circle_value, obj.max, height);
|
|
if(obj.dataset['fields']){
|
|
Nwagon_ie.drawFields_for_circular_type_chart(obj.dataset['fields'], obj.dataset['colorset'], canvas, height);
|
|
}
|
|
}
|
|
},
|
|
drawForeground: function(canvas, parentDiv, angles, chart_type, legend, dataset, core_circle_radius, core_value, max, h){
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
var create_data_li = function(text_to_add){
|
|
if(ul){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = text_to_add;
|
|
ul.appendChild(li);
|
|
}
|
|
};
|
|
var cx = Math.round(h/2), cy=Math.round(h/2);
|
|
var names = legend['names']; //names' dimension should match dataset['values']'s dimension
|
|
var data = dataset['values'];
|
|
var colors = dataset['colorset'];
|
|
var opacities = dataset['opacity'];
|
|
var len = data.length;
|
|
var start_angle = 90;
|
|
var style_attr = {};
|
|
var opacity = 80;
|
|
var angle_accumulate = Math.PI/2;
|
|
if(len){
|
|
var angle = Math.round(360/len);
|
|
var angle_in_pie = (Math.PI*2/len);
|
|
var _text_to_add = '';
|
|
for(var j=0; j<len; j++){
|
|
if(angles['angles'].length){ //polar area chart
|
|
angle = angles['angles'][j];
|
|
angle_in_pie = (angles['angles'][j] * Math.PI)/180;
|
|
}
|
|
var sub_data = data[j];
|
|
var sub_len = sub_data.length;
|
|
var sub_angle = angle/sub_len;
|
|
var sub_angle_in_pie = angle_in_pie/sub_len;
|
|
for(var k = 0; k < sub_len; k++){
|
|
if(opacities.length){
|
|
opacity = Nwagon.getOpacity(opacities, sub_data[k], max) * 100;
|
|
}
|
|
style_attr = {'cssText':'position:absolute', 'width': canvas.style.width, 'height': canvas.style.height, 'filter': 'alpha(opacity='+ opacity +')' };
|
|
var wedge = Nwagon_ie.drawWedges(cx, cy, sub_data[k]+core_circle_radius, colors[j], start_angle, sub_angle, style_attr);
|
|
canvas.appendChild(wedge);
|
|
start_angle-=sub_angle;
|
|
|
|
// draw labels
|
|
var label_angle = angle_accumulate + (sub_angle_in_pie/2);
|
|
var line_width = max + core_circle_radius + 20;
|
|
var x_cord = (cx - 5 - Math.round(line_width * Math.cos(label_angle)));
|
|
var y_cord = (h - 5 - cy - Math.round((line_width) * Math.sin(label_angle)));
|
|
var label = document.createElement('div');
|
|
label.appendChild(document.createTextNode(names[j][k]));
|
|
style_attr = {'position':'absolute', 'left': x_cord + 'px', 'top': y_cord + 'px', 'fontSize': '13px'};
|
|
Nwagon_ie.setStyles(label, style_attr);
|
|
canvas.appendChild(label);
|
|
_text_to_add = names[j][k] + '('+ sub_data[k] +')';
|
|
angle_accumulate+=sub_angle_in_pie;
|
|
create_data_li(_text_to_add);
|
|
}
|
|
|
|
}
|
|
if(core_circle_radius > 0){ //draw core circle and value
|
|
style_attr = {'cssText':'position:absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
var inner_circle = Nwagon_ie.drawWedges(cx, cy, core_circle_radius, '#FFFFFF', 0, 360, style_attr);
|
|
canvas.appendChild(inner_circle);
|
|
//TODO: core text
|
|
var label = document.createElement('div');
|
|
label.appendChild(document.createTextNode(core_value));
|
|
style_attr = {'cssText':'position:absolute; z-index:100', 'left': cx-(core_circle_radius/2) + 'px', 'top': cy-5 + 'px', 'fontSize': '12px'};
|
|
Nwagon_ie.setStyles(label, style_attr);
|
|
canvas.appendChild(label);
|
|
}
|
|
}
|
|
},
|
|
drawBackground: function(canvas, angles, chart_type, obj_names, dataset, increment, max_radius, core_circle_radius, h){
|
|
var cx = Math.round(h/2), cy=Math.round(h/2);
|
|
var data = dataset['values'];
|
|
var len = data.length;
|
|
|
|
var draw_bg_circles = function(radius){
|
|
var sa = Math.round(90 * 65535);
|
|
var a = -Math.round((360)* 65536);
|
|
var circle = document.createElement("v:shape");
|
|
var path = 'AE ' + cx + ' ' + cy + ' ' + radius + ' ' + radius + ' ' + sa + ' ' + a + ' X E';
|
|
var attributes = {'path': path, 'fillcolor': '#FFFFFF', 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(circle, attributes);
|
|
var style_attr = {'cssText':'position:absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(circle, style_attr);
|
|
canvas.appendChild(circle);
|
|
};
|
|
|
|
//draw bg circles and y labels
|
|
var r = max_radius + core_circle_radius;
|
|
while(r > core_circle_radius){
|
|
draw_bg_circles(r);
|
|
var label = document.createElement('div');
|
|
label.appendChild(document.createTextNode((r-core_circle_radius).toString()));
|
|
style_attr = {'cssText':'position:absolute; z-index:100', 'left': cx + 'px', 'top': (h-cy-r-10) + 'px', 'fontSize': '12px'};
|
|
Nwagon_ie.setStyles(label, style_attr);
|
|
canvas.appendChild(label);
|
|
r-=increment;
|
|
}
|
|
|
|
//straight lines
|
|
var rotate_angle = 0, tweak_angle = Math.PI/2; //start at 90 degree
|
|
if(len){
|
|
var angle = (2*Math.PI)/len;
|
|
for(var j=0; j<len; j++)
|
|
{
|
|
if(angles.length){ // for(polar_pie)
|
|
rotate_angle += (angles[j] * Math.PI)/180;
|
|
}
|
|
else{
|
|
rotate_angle = angle * j;
|
|
}
|
|
var line_width = max_radius + core_circle_radius;
|
|
var line = document.createElement('v:shape');
|
|
var path = 'M '+ cx + ' '+ cy + 'L ' + (cx- Math.round(line_width * Math.cos(rotate_angle + tweak_angle))) +' ' + (h - cy - Math.round((line_width) * Math.sin(rotate_angle+tweak_angle)));
|
|
var attributes = {'path': path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(line, style_attr);
|
|
canvas.appendChild(line);
|
|
|
|
var sub_data = data[j];
|
|
if(sub_data){
|
|
var sub_len = sub_data.length;
|
|
for (var k = 1; k < sub_len; k++)
|
|
{
|
|
var inner_rotate_angle = rotate_angle + (angle/sub_len*k) +tweak_angle;
|
|
|
|
var inner_line = document.createElement('v:shape');
|
|
var path = 'M '+ cx + ' '+ cy + 'L ' + (cx- Math.round(line_width * Math.cos(inner_rotate_angle))) +' ' + (h - cy - Math.round((line_width) * Math.sin(inner_rotate_angle)));
|
|
var attributes = {'path': path, 'strokecolor': '#CCC', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(inner_line, attributes);
|
|
style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
Nwagon_ie.setStyles(inner_line, style_attr);
|
|
canvas.appendChild(inner_line);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
donut:{
|
|
|
|
drawDonutChart: function(obj){
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var canvas = Nwagon_ie.createChartArea(obj.chart_div, width, height);
|
|
var angles = {'angles':[], 'percent':[], 'values':[]};
|
|
var degree_values = obj.dataset['values'];
|
|
if(degree_values){
|
|
angles = Nwagon.getAngles(degree_values, angles);
|
|
}
|
|
this.drawDonut(obj.chart_div, angles, obj.chartType, canvas, obj.dataset, obj.core_circle_radius, obj.donut_width, height);
|
|
Nwagon_ie.drawFields_for_circular_type_chart(obj.dataset['fields'], obj.dataset['colorset'], canvas, height);
|
|
},
|
|
|
|
drawDonut: function(parentDiv, angles, chartType, canvas, data, core_radius, donut_width, h){
|
|
var radius = donut_width + core_radius;
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
var create_data_li = function(text_to_add){
|
|
if(ul){
|
|
var li = document.createElement('li');
|
|
li.innerHTML = text_to_add;
|
|
ul.appendChild(li);
|
|
}
|
|
};
|
|
|
|
var tooltip = Nwagon_ie.createTooltip(canvas);
|
|
var values = data['values'];
|
|
var colors = data['colorset'];
|
|
var fields = data['fields'];
|
|
var angle_int = angles['angles'];
|
|
var attributes = {}, style_attr = {};;
|
|
var start_angle = 90; // Tweak the angles so that our pie goes clockwise from 12 o'clock.
|
|
var text_to_add = '';
|
|
var cx = Math.round(h/2), cy = Math.round(h/2);
|
|
|
|
for(var i = 0; i < angle_int.length; i++) {
|
|
|
|
style_attr = {'cssText':'position:absolute', 'width': canvas.style.width, 'height': canvas.style.height /*,'filter': 'alpha(opacity=80)' */};
|
|
var wedge = Nwagon_ie.drawWedges(cx, cy, radius, colors[i], start_angle, angle_int[i], style_attr);
|
|
|
|
canvas.appendChild(wedge);
|
|
|
|
var tooltip_angle = (Math.PI * start_angle)/180;
|
|
var tooltip_x = cx + radius * Math.cos(tooltip_angle);
|
|
var tooltip_y = cy + radius * Math.sin(tooltip_angle);
|
|
var degree_value = angles['values'][i].toFixed(0);
|
|
text_to_add = fields[i] ? (fields[i]+ '(' +(angles['percent'][i]*100).toFixed(1) +'%) ' + degree_value) : 'undefiend';
|
|
wedge.onmouseover = Nwagon_ie.showToolTip(tooltip, tooltip_x, tooltip_y, text_to_add);
|
|
wedge.onmouseout = Nwagon_ie.hideToolTip(tooltip);
|
|
|
|
if(chartType == 'donut'){
|
|
style_attr = {'cssText':'position:absolute; z-index:50', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
var wedge2 = Nwagon_ie.drawWedges(cx, cy, core_radius, '#FFFFFF', start_angle, angle_int[i], style_attr);
|
|
canvas.appendChild(wedge2);
|
|
}
|
|
start_angle -= angle_int[i];
|
|
create_data_li(text_to_add);
|
|
}
|
|
}
|
|
},
|
|
|
|
radar: {
|
|
|
|
drawRadarChart: function(obj){
|
|
|
|
var width = obj.width, height = obj.height;
|
|
var canvas = Nwagon_ie.createChartArea(obj.chart_div, width, height);
|
|
|
|
this.drawBackground(canvas, obj.legend['names'], obj.dataset['bgColor'], CONST_DECREMENT, CONST_MAX_RADIUS, height, width);
|
|
// this.drawLabels(svg, obj.legend, CONST_MAX_RADIUS);
|
|
this.drawPolygonForeground(obj.chart_div, canvas, obj.legend, obj.dataset, height, width);
|
|
},
|
|
|
|
drawBackground: function(canvas, names, bg_color, decrement, maxRadius, h, w){
|
|
var numOfRadars = names.length;
|
|
var bg = bg_color ? bg_color : '#F9F9F9';
|
|
var cx = Math.round(w/2), cy = Math.round(h/2);
|
|
var sector_angle = (Math.PI*2)/numOfRadars, tweak_angle = Math.PI; //start on 180 degree
|
|
var rotate_angle = 0, prev_angle = 0;
|
|
var p0= cx + ' '+ cy , p1='', p2='';
|
|
var style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height};
|
|
var style_label = {};
|
|
|
|
var drawline = function(start, end, style, isdashed){
|
|
var line = document.createElement('v:shape');
|
|
var path = 'M '+start+ 'L ' + end;
|
|
var attributes = {'path': path, 'strokecolor':'#666', 'strokeweight':'1px'};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
Nwagon_ie.setStyles(line, style);
|
|
if(isdashed){
|
|
var stroke = document.createElement('v:stroke');
|
|
stroke.setAttribute('dashstyle', 'dash');
|
|
line.appendChild(stroke);
|
|
}
|
|
return line;
|
|
};
|
|
var draw_x_coord = function(text_to_add, x, y){
|
|
var label = document.createElement('div');
|
|
label.appendChild(document.createTextNode(text_to_add));
|
|
Nwagon_ie.setStyles(label, {'cssText':'position:absolute; z-index:100', 'left': x + 'px', 'top': (y-5)+ 'px', 'fontSize': '10px'});
|
|
return label;
|
|
};
|
|
|
|
for(var j= 1 ; j<=numOfRadars; j++){
|
|
var label_location_off = 0;
|
|
var radius = maxRadius;
|
|
prev_angle = (sector_angle * (j-1)) + tweak_angle;
|
|
rotate_angle = (sector_angle * j) + tweak_angle;
|
|
var x_off = Math.round((maxRadius+20) * Math.cos(rotate_angle));
|
|
var y_off = Math.round((maxRadius+20) * Math.sin(rotate_angle));
|
|
p1 = (cx- Math.round(maxRadius * Math.cos(rotate_angle))) +' ' + (h - cy - Math.round((maxRadius) * Math.sin(rotate_angle)));
|
|
var straight_line = drawline(p0, p1, style_attr, false);
|
|
canvas.appendChild(straight_line);
|
|
|
|
// add labels
|
|
var label = document.createElement('div');
|
|
if(j == numOfRadars) label.appendChild(document.createTextNode(names[0]));
|
|
else label.appendChild(document.createTextNode(names[j]));
|
|
style_label = {'cssText':'position:absolute; z-index:100', 'fontSize': '12px'};
|
|
Nwagon_ie.setStyles(label, style_label);
|
|
canvas.appendChild(label);
|
|
if(x_off > 0) {
|
|
label_location_off = label.clientWidth;
|
|
}
|
|
if (x_off == 0) {
|
|
label_location_off = Math.round(label.clientWidth/2);
|
|
}
|
|
label.style.left = (cx- x_off - label_location_off) + 'px';
|
|
label.style.top = (h - cy - (y_off+5)) + 'px';
|
|
|
|
while(radius>0){
|
|
if(j == 1){
|
|
//draw coordinate labels
|
|
var x_coord = draw_x_coord(radius.toString(), (cx + radius), (h-cy));
|
|
canvas.appendChild(x_coord);
|
|
}
|
|
//draw dotted bg lines &&
|
|
p1 = (cx- Math.round(radius * Math.cos(rotate_angle))) +' ' + (h - cy - Math.round((radius) * Math.sin(rotate_angle)));
|
|
p2 = (cx- Math.round(radius * Math.cos(prev_angle))) +' ' + (h - cy - Math.round((radius) * Math.sin(prev_angle)));
|
|
|
|
var dashed_line = drawline(p1, p2, style_attr, true);
|
|
canvas.appendChild(dashed_line);
|
|
radius-=decrement;
|
|
}
|
|
}
|
|
},
|
|
dimmedPie: function(index, len, height, c_x, c_y, a, tweak_a){
|
|
var before = 0, after = 0;
|
|
var dimmed_pie = document.createElement('v:shape');
|
|
before = (index == 0) ? len-1 : index-1;
|
|
after = (index==len) ? 0 : index + 1;
|
|
var gray_pie_path = 'M '+ c_x + ' ' + c_y +
|
|
' L ' + (c_x- Math.round(CONST_MAX_RADIUS * Math.cos((a * before) + tweak_a))) + ' ' + (height - c_y - Math.round((CONST_MAX_RADIUS) * Math.sin((a * before) + tweak_a))) +
|
|
' L ' + (c_x- Math.round(CONST_MAX_RADIUS * Math.cos((a * index) + tweak_a))) + ' ' + (height - c_y - Math.round((CONST_MAX_RADIUS) * Math.sin((a * index) + tweak_a))) +
|
|
' L ' + (c_x- Math.round(CONST_MAX_RADIUS * Math.cos((a * after) + tweak_a))) + ' ' + (height - c_y - Math.round((CONST_MAX_RADIUS) * Math.sin((a * after) + tweak_a))) +
|
|
' X E';
|
|
|
|
var attributes = {'path': gray_pie_path, 'strokecolor':'#000000', 'strokeweight':'1px', 'fillcolor':'#000000'};
|
|
Nwagon_ie.setAttributes(dimmed_pie, attributes);
|
|
return dimmed_pie;
|
|
},
|
|
drawPolygonForeground: function(parentDiv, canvas, legend, data, h, w){
|
|
var style_attr = {'position':'absolute', 'width': canvas.style.width, 'height': canvas.style.height, 'filter': ''};
|
|
var cx = Math.round(w/2), cy = Math.round(h/2);
|
|
var dataGroup = data['values'];
|
|
var title = data['title'];
|
|
var fg_color = data['fgColor'] ? data['fgColor'] : '#30A1CE';
|
|
var istooltipNeeded = (dataGroup.length == 1);
|
|
var names = legend['names'];
|
|
|
|
var radius = 0;
|
|
var path = '';
|
|
var ul = document.getElementById(parentDiv).getElementsByTagName('ul')[0];
|
|
if(ul){
|
|
ul.innerHTML = title;
|
|
}
|
|
if(istooltipNeeded){
|
|
var tooltip = Nwagon_ie.createTooltip(canvas);
|
|
}
|
|
for(var i = 0; i<dataGroup.length; i++){
|
|
if(ul)
|
|
{
|
|
var textEl = document.createElement('li');
|
|
textEl.innerHTML = 'Data set number ' + (i+1).toString();
|
|
var innerUL = document.createElement('ul');
|
|
textEl.appendChild(innerUL);
|
|
ul.appendChild(textEl);
|
|
}
|
|
var dataset = dataGroup[i];
|
|
var length = dataset.length;
|
|
var coordinate = [];
|
|
var angle = (Math.PI*2)/length;
|
|
var tweak_angle = Math.PI, point_angle=0;
|
|
var p='';
|
|
|
|
for (var k = 0; k<dataset.length; k++){
|
|
if(typeof(dataset[k]) != 'number'){
|
|
radius = 0;
|
|
var gray_pie = Nwagon_ie.radar.dimmedPie(k, dataset.length, h, cx, cy, angle, tweak_angle);
|
|
style_attr.filter = 'alpha(opacity=10)';
|
|
Nwagon_ie.setStyles(gray_pie, style_attr);
|
|
canvas.appendChild(gray_pie);
|
|
}
|
|
else{
|
|
radius = dataset[k];
|
|
}
|
|
if(innerUL){
|
|
var innerLI = document.createElement('li');
|
|
innerLI.innerHTML = names[k] + ': ' + dataset[k];
|
|
innerUL.appendChild(innerLI);
|
|
}
|
|
point_angle = (angle * k) + tweak_angle;
|
|
if(k==0){
|
|
p +='M ' + (cx- Math.round(radius * Math.cos(point_angle))) +' ' + (h - cy - Math.round((radius) * Math.sin(point_angle)));
|
|
}
|
|
else{
|
|
p +=' L ' + (cx- Math.round(radius * Math.cos(point_angle))) +' ' + (h - cy - Math.round((radius) * Math.sin(point_angle)));
|
|
}
|
|
//draw vertex
|
|
var vertex = Nwagon_ie.drawVertex(cx- Math.round(radius * Math.cos(point_angle)), (h - cy - Math.round((radius) * Math.sin(point_angle))), fg_color) ;
|
|
text_to_add = names[k] + ': ' + dataset[k];
|
|
if(istooltipNeeded){
|
|
vertex.onmouseover = Nwagon_ie.showToolTip(tooltip, cx- Math.round(radius * Math.cos(point_angle)), (h - cy - Math.round((radius) * Math.sin(point_angle))), text_to_add);
|
|
vertex.onmouseout = Nwagon_ie.hideToolTip(tooltip);
|
|
}
|
|
canvas.appendChild(vertex);
|
|
}
|
|
p+=' X E';
|
|
|
|
var line = document.createElement('v:shape');
|
|
var attributes = {'path': p, 'strokecolor':fg_color, 'strokeweight':'1px', 'fillcolor':fg_color};
|
|
Nwagon_ie.setAttributes(line, attributes);
|
|
style_attr.filter = 'alpha(opacity=80)';
|
|
Nwagon_ie.setStyles(line, style_attr);
|
|
canvas.appendChild(line);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|