/* * cssCharts v0.1.0 * https://github.com/sultantarimo * * (c)2015 Sultan Tarimo - sultantarimo@me.com * Released under the MIT license */ var thychart = { donut: function(node){ var $chart = $(node); var val = $(node).attr("data-percent"); var title = $(node).attr("data-title"); $chart.parent().addClass("donut"); if(!title) title = "%"; if(val > 1 || val < 0) return("between 0 - 1 please"); var r = 180; var c = 360; var val = parseFloat(val).toFixed(2)*c; var $temp = $('
').addClass("pie spinner"); var $title = $("

"); $title.find("p").text(val/360*100); $title.find("span").text(title); $chart.on('show-donut-chart', function(){ $title.find("p").text(0); $({countNum: $title.find("p").text()}).animate({countNum: val/360*100}, { duration: 500, easing:'linear', step: function() { $title.find("p").text(Math.floor(this.countNum)); }, complete: function() { $title.find("p").text(this.countNum); } }); $chart.on('hide-donut-chart', function(){ $title.find("p").text(0); }); }); $chart.append($title); var chart = { nodes: { spinner: function(){ return $temp.clone().attr( "style", '-webkit-transform: rotate('+ chart.values.spinner +'deg);' + '-moz-transform: rotate('+ chart.values.spinner +'deg);' + 'transform: rotate('+ chart.values.spinner +'deg);' ); }, mask: function(){ return $temp.clone().addClass(chart.values.selector).attr( "style", '-webkit-transform: rotate('+ chart.values.mask + 'deg);' + '-moz-transform: rotate('+ chart.values.mask + 'deg);' + 'transform: rotate('+ chart.values.mask + 'deg);' ); } }, values: {spinner: val, mask: c, selector: "" } }; var prependNodes = function(data){ $.each(data, function(i, _node) {$chart.prepend(_node());}); }; // IF LESS THAN 50% if(val < r){ var val1 = val; var chart$clone = jQuery.extend({}, chart); chart$clone.values.spinner = val1; chart$clone.values.selector = "mask"; prependNodes(chart$clone.nodes); } // IF GREATER THAN 50% else{ var val2 = val - r; var val1 = val - val2; val2 = val2 + r; var chart$clone = jQuery.extend({}, chart); chart$clone.values.spinner = val1; chart$clone.values.mask = val2; prependNodes(chart$clone.nodes); } }, bar: function(node){ var $node = $(node); $node.parent().addClass("bar"); var data = $node.attr("data-bars"); var unit = $node.attr("data-unit"); var height = $node.height(); var grid = $node.attr("data-grid"); var barWidth = $node.attr("data-width"); var max = $node.attr("data-max"); if(parseInt(grid) === 0) $node.css("background", "none"); if(!data) return("No data to work with"); if(!unit) unit = "%"; // get max data point var maxData = function(){ var arr = JSON.parse("[" + data + "]"); return Math.max.apply(Math, arr.map(function(i) { return i[0]; })); }; // If "data-max" is not specified or if the heighest data-point is greater than data-max if(maxData() > max || !max){ max = maxData(); } data = JSON.parse("[[" + data + "]]"); var barsNo = data[0].length; $.each(data, function(i, v) { // first dimension var uls = $(""); var lis = $("
  • ").height(height); for (i = 0; i < data[0].length; i++){ var ul = uls.clone(); $.each(v[i], function(index, val) { // second dimension var li = lis.clone(); var value = (data[0][i][index]); var title = value + unit; var percent = (value/max) * 100; li.find("span").attr("title", title); if(!barWidth){ li.find("span").attr( "style", "height:" + percent + "%" ); }else{ li.find("span").attr( "style", "height:" + percent + "%;" + "width:" + barWidth + "px" ); } ul.append(li); }); $node.append(ul); } }); var grid = $("
    "); $node.parent().append(grid); for(var i = 0; i <= 10; i++) { var toPerc = (i*10).toFixed(0); var converter = max/100; var toUnit = (toPerc * converter).toFixed(0); if(i % 2 == 0){ var line = $("
    ").css({bottom: toPerc+"%"}).attr("data-y", toUnit + unit); $node.parent().find(".grid").append(line); } } $node.parent().width($node.width()); }, line: function(node){ var setAngle = function(cord, area, node){ var hypotenuse = Math.round( Math.sqrt(Math.pow(area.width, 2) + Math.pow(area.height, 2)) ); var angSin = area.height / hypotenuse; var ang = Math.round(Math.asin(angSin) * 180/Math.PI); ang = -ang; var $node = $(node).clone() .attr("style", 'width:'+ hypotenuse +'px;' ) .attr("data-height", area.height) .attr("data-width", area.width) .attr("data-hypotenuse", hypotenuse) .attr("data-angle", ang) .attr("data-x", cord.x) .attr("data-y", cord.y); $node.find("span") .attr( "style", 'width:'+ hypotenuse +'px;' + '-webkit-transform: rotate('+ ang +'deg);' + '-moz-transform: rotate('+ ang +'deg);' + 'transform: rotate('+ ang +'deg);' ) .attr("data-height", area.height) .attr("data-width", area.width) .attr("data-hypotenuse", hypotenuse) .attr("data-angle", ang); $node.find("a") .attr( "style", 'height:'+ 40 +'px;'+ 'width:'+ 40 +'px;' ) .attr("data-x", cord.x) .attr("data-y", cord.y); return({ angle: ang, hypo: hypotenuse, width: area.width, height: area.height, node: $node }); }; var setPosition = function(data){ var prevNode = $("ul").find(data).prev(); var totalWidth = parseInt($("ul").find(data).attr("data-width").replace("-", "")); var totalHeight = parseInt($("ul").find(data).attr("data-height").replace("-", "")); var totalY = parseInt($("ul").find(data).attr("data-y").replace("-", "")); if(prevNode.length === 0){ $("ul").find(data).attr("data-total-width",totalWidth); $("ul").find(data).css("left",0 + "px"); $("ul").find(data).attr("data-total-height", totalY - totalHeight ); $("ul").find(data).css("bottom",totalY + "px"); $("ul").find(data).attr("data-y",totalY); $("ul").find(data).attr("data-x",0); }else{ var currentWidth = parseInt(prevNode.attr("data-total-width").replace("-", "")); totalWidth = parseInt(prevNode.attr("data-total-width").replace("-", "")) + parseInt(data.attr("data-width").replace("-", "")); $("ul").find(data).attr("data-total-width",totalWidth); $("ul").find(data).css("left",currentWidth + "px"); var currentHeight = parseInt(prevNode.attr("data-total-height").replace("-", "")); totalHeight = parseInt(prevNode.attr("data-total-height")) + parseInt(data.attr("data-height")); $("ul").find(data).attr("data-total-height",totalHeight); $("ul").find(data).css("bottom",currentHeight + "px"); $("ul").find(data).attr("data-y",currentHeight); $("ul").find(data).attr("data-x",currentWidth); } }; var setContWidth = function($chart,data){ var width = Math.floor($chart.find("li:last-child").attr("data-x")) + 20; var height = data[1]; height = Math.max.apply(Math, height) + 20; $chart.css({width: width, height: height}); $chart.parent().css({width: width, height: height}); $chart.parent().addClass("line"); }; var drawSVG = function(){ var svg = $( ''+ '' + '' ); $chart.parent().append(svg); function convertToArrayOfObjects(data) { var keys = data.shift(), i = 0, k = 0, obj = null, output = []; for (i = 0; i < data.length; i++) { obj = {}; for (k = 0; k < keys.length; k++) { obj[k] = { x: keys[k], y: $chart.parent().find(".grid hr:last-child").attr("data-y")-data[i][k] } } output.push(obj); } return output[0]; } var points = convertToArrayOfObjects(data); var counter = 0; function addPoint(x, y, isFirst){ if(isFirst == "last"){ var last = Object.keys(points).length-1; var x1 = points[last].x; var y1 = points[0].y; var x2 = points[0].x; var y2 = points[last].y; console.log(x1,y1,x2,y2); var new_point = "L" + x1 + "," + x1 + " L" + 0 + "," + x1 + " Z"; }else{ var new_point = (isFirst? "M" : " L")+x+","+y; } $chart.parent().find("path").attr("d", $chart.parent().find("path").attr("d")+""+new_point); counter++; if(counter < Object.keys(points).length){ setTimeout(addPoint(points[counter].x, points[counter].y, false),200); // Add a new point after 200 milliseconds } if(counter == Object.keys(points).length){ setTimeout(addPoint(null, null, "last"),200); } } addPoint(points[0].x, points[0].y, true); }; var $chart = $(node); var fill = $chart.attr("data-fill"); var cord = $chart.attr("data-cord"); cord = JSON.parse("[" + cord + "]"); var data = cord; var grid = $("
    "); $chart.parent().append(grid); for (var i = 0; i < data[0].length; i++) { cord = { x: data[0][i], y: data[1][i] }; var area = { width: data[0][i+1] - data[0][i], height: data[1][i+1] - data[1][i] }; var triangle = setAngle(cord, area, $("
  • ")); $chart.append(triangle.node); setPosition(triangle.node); setContWidth($chart, data); if(i % 2 === 0){ var gridSpace = $chart.height() / 10; var line = $("
    ").css({bottom: i*gridSpace}).attr("data-y", i*gridSpace); $chart.parent().find(".grid").append(line); } } if(fill){ drawSVG(); } } };