class BarChart extends MovieClip { /* notes movieClip hierachy: background (draw on init? or pre-draw?) chart (registary point at bottom left) --> group (registary point at bottom left) --> bar(registerary point at bottom left) data: chartData --> rowData --> row chartData --> colData --> col */ //PROPERTIES/////////////////////////////////////// //Objects public var chart:MovieClip; //Data private var chartData:Object; public var groups:Number = 0; public var categories:Number = 0; //Attributes public var barMargin:Number = 2; public var chartHeight:Number = 100; public var chartWidth:Number = 100; public var chartX:Number = 0; public var chartY:Number = 0; public var shadowDistance:Number = 1; //Apperance public var backgroundColors:Array = [0x9BAFB9, 0x68808C]; public var backgroundAlphas:Array = [100, 100]; public var barShadows:Boolean = true; public var highlightAlphas:Array = [75, 10]; public var keyFormat:TextFormat; public var labelFormat:TextFormat; //METHODS////////////////////////////////////////// //CONSTRUCTOR public function BarChart() { //On initialize create text formats keyFormat = new TextFormat(); keyFormat.size = 5; keyFormat.align = "right"; keyFormat.font = "Arial"; labelFormat = new TextFormat(); labelFormat.size = 5; labelFormat.align = "center"; labelFormat.font = "Arial"; labelFormat.color = 0xFFFFFF; } //Draw the complete chart public function drawChart():Void { initializeChart(); //Initialize for drawing drawAll(); //Draw all bars drawKeys(); //Draw all keys drawLabels(); //Draw all labels } //Initialize Chart public function initializeChart():Void { try { removeChart(); //Remove old if exsists } finally { //create new holder clip chart = this.createEmptyMovieClip("chart", this.getNextHighestDepth()); //position chart._x = chartX; chart._y = chartY; //Set init properties chart.lineStyle(0.1,0x000000,100); //line style groups = chartData.row.length; //Number of groups categories = chartData.col.length; //Number of categories drawBackground(); //Draw background //getColours(); //Get colours for categories } } //Rectangle drawing function, subjugates code private function drawRectangle(mc:MovieClip,colour:Array,alpha:Array,a:Number,b:Number,c:Number,d:Number):Void { //Draw generic rectangle using data passed in var matrix = {matrixType:"box", x:a, y:0, w:(c-a), h:(d-b), r:(0/180)*Math.PI}; mc.beginGradientFill("linear", colour, alpha, [0, 0xFF], matrix); mc.moveTo(a, b); mc.lineTo(c, b); mc.lineTo(c, d); mc.lineTo(a, d); mc.lineTo(a, b); mc.endFill(); } //Draw background details public function drawBackground():Void { //Draw backgrounds: main, overlay and hinting drawRectangle(chart,backgroundColors,backgroundAlphas, 0,0,chartWidth,chartHeight); drawRectangle(chart,backgroundColors,backgroundAlphas,0,chartHeight+1,chartWidth,chartHeight+11); drawRectangle(chart,backgroundColors,backgroundAlphas,101,0,chartWidth+41,(categories*15)); //Attach gridlines, if do not desire remove the gridLines movieClip from your fla's library chart.attachMovie("gridLines","grid",chart.getNextHighestDepth()); chart.grid.x = 0; chart.grid.y = 1; } //Draw a single bar public function drawBar(i:Number,j:Number):Void { //Create empty movie clip to store bar in var target:MovieClip = this["chart"]["group"+i]; if (target == undefined) { chart.createEmptyMovieClip("group"+i,chart.getNextHighestDepth()); target = this["chart"]["group"+i]; } target.createEmptyMovieClip("bar"+String(j),target.getNextHighestDepth()); var bar = this["chart"]["group"+i]["bar"+String(j)]; //Calculate positions to draw to var a:Number = barMargin/2; //Initial x var b:Number = chartHeight - (((chartData.row[i].percs[j])/100)*chartHeight); //Initial y (value of data) var c:Number = ((chartWidth/groups)/categories)-(barMargin/2); //End x var d:Number = chartHeight; //Initial y //Draw Shadow Fill if ((barShadows == true) && (b < chartHeight)) { drawRectangle(bar,[0x000000,0x000000],[40,40],a+shadowDistance,b+shadowDistance,c+shadowDistance,d); } //Draw base bar and highlight bar drawRectangle(bar,[chartData.colours[j],chartData.colours[j]],[100,100],a,b,c,d); drawRectangle(bar,[0xFFFFFF,0xFFFFFF],highlightAlphas,a+0.2,b,c/2,d); //Move To correct position bar._y = 0; // y always 0 var groupPos:Number = chartWidth/groups; //Width of single group var cataPos:Number = groupPos/categories; //Width of single catagory within group bar._x = (i*groupPos)+(j*cataPos); //x Position = (bar group number * group width) + (bar catagory number * catagory width) } //Create holder movieClip for a new group (i.e. Rock / R&B) public function drawGroup(no:Number):Void { chart.createEmptyMovieClip("group"+no,chart.getNextHighestDepth()); for (var i=0; i