/*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 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 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; i0) 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=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 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 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 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; i0){ 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 -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 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 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 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 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 arr2[i][1]){ first = arr2; second = arr1; color = colors[1]; break; } i++; } var j = 0; while(j= 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 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 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