﻿    package charts.series.bars {
       import flash.filters.DropShadowFilter;
       import flash.geom.Matrix;
       
       public class PlasticFlat extends Base
       {
          
          public function PlasticFlat( index:Number, props:Properties, group:Number ) {
             
             super(index, props, group);
             //super(index, {'top':props.get('top')}, props.get_colour('colour'), props.get('tip'), props.get('alpha'), group);
             
             var dropShadow:DropShadowFilter = new flash.filters.DropShadowFilter();
             dropShadow.blurX = 5;
             dropShadow.blurY = 5;
             dropShadow.distance = 3;
             dropShadow.angle = 45;
             dropShadow.quality = 2;
             dropShadow.alpha = 0.4;
             // apply shadow filter
             this.filters = [dropShadow];
          }
          
          public override function resize( sc:ScreenCoordsBase ):void {
             
             this.graphics.clear();
             var h:Object = this.resize_helper( sc as ScreenCoords );
             
             this.bg( h.width, h.height, h.upside_down );
             this.glass( h.width, h.height, h.upside_down );
          }
          
          private function bg( w:Number, h:Number, upside_down:Boolean ):void {

             var rad:Number = w/3;
             if ( rad > ( w / 2 ) )
                rad = w / 2;
                
             this.graphics.lineStyle(0, 0, 0);// this.outline_colour, 100);
             
             var allcolors:Array = GetColours(this.colour);
             var lowlight:Number = allcolors[2];
             var highlight:Number = allcolors[0];
             var bgcolors:Array = [allcolors[1], allcolors[2], allcolors[2]];
             var bgalphas:Array = [1, 1, 1];
             var bgratios:Array = [0, 115, 255];
             //var bgcolors:Array = [allcolors[1], allcolors[2]];
             //var bgalphas:Array = [1, 1];
             //var bgratios:Array = [0, 255];
             var bgmatrix:Matrix = new Matrix();
             var xRadius:Number;
             var yRadius:Number;
             var x:Number;
             var y:Number;
             var bevel:Number = 0.02 * w;
             var div:Number = 3;
             
             bgmatrix.createGradientBox(w, h, (180 / 180) * Math.PI );
             this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, bgcolors, bgalphas, bgratios, bgmatrix, 'pad'/*SpreadMethod.PAD*/ );
             
                if ( h > 0 || h < 0)
                { /* height is not zero */
                   
                   /* draw outline darker rounded rectangle */
                   this.graphics.beginFill(0x000000, 1);         
                   this.graphics.drawRoundRect(0, 0, w, h, w/div, w/div);
                   
                   /* draw inner highlight rounded rectangle */
                   this.graphics.beginFill(highlight, 1);
                   this.graphics.drawRoundRect(0 + bevel, 0 + bevel, w - 2 * bevel, h - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                   /* draw inner gradient rounded rectangle */
                   bevel = bevel * 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, bgcolors, bgalphas, bgratios, bgmatrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRoundRect(0 + bevel, 0 + bevel, w - 2 * bevel, h - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                }
                else
                {
                   
                   /* draw outline darker rounded rectangle */
                   this.graphics.beginFill(0x000000, 1);         
                   this.graphics.drawRoundRect(0, 0 - 2*bevel, w, h + 4*bevel, w/div, w/div);
                   
                   /* draw inner highlight rounded rectangle */
                   this.graphics.beginFill(highlight, 1);
                   this.graphics.drawRoundRect(0 + bevel, 0 - 2*bevel + bevel, w - 2 * bevel, h + 4*bevel - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                   /* draw inner gradient rounded rectangle */
                   bevel = bevel * 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, bgcolors, bgalphas, bgratios, bgmatrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRoundRect(0 + bevel, 0 - 2*bevel + bevel, w - 2 * bevel, h + 4*bevel - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                }
                
                
             this.graphics.endFill();
          }
          
          private function glass( w:Number, h:Number, upside_down:Boolean ): void {
             
             /* if this section is commented out, the white shine overlay will not be drawn */
             
             this.graphics.lineStyle(0, 0, 0);
             var allcolors:Array = GetColours(this.colour);
             var lowlight:Number = allcolors[2];
             var highlight:Number = allcolors[0];
             var bgcolors:Array = [allcolors[1], allcolors[2], allcolors[2]];
             var bgalphas:Array = [1, 1, 1];
             var bgratios:Array = [0, 115, 255];
             var bgmatrix:Matrix = new Matrix();
             /*var colors:Array = [0xFFFFFF, 0xFFFFFF];
             var alphas:Array = [0, 0.75];
             var ratios:Array = [127,255];   */
             var colors:Array = [0xFFFFFF, 0xFFFFFF, 0xFFFFFF];
             var alphas:Array = [0, 0.05, 0.75];
             var ratios:Array = [0, 123, 255];         
             var xRadius:Number;
             var yRadius:Number;
             var x:Number;
             var y:Number;
             var matrix:Matrix = new Matrix();
             var bevel:Number = 0.02 * w;
             var div:Number = 3;
             
             bgmatrix.createGradientBox(w, h, (180 / 180) * Math.PI );
             matrix.createGradientBox(width, height, (180 / 180) * Math.PI );
             this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, colors, alphas, ratios, matrix, 'pad'/*SpreadMethod.PAD*/ );
             var rad:Number = w / 3;
                
                if ( h > 0 && !upside_down )
                { /* draw bar upwards */
                
                   /* draw shine rounded rectangle */      
                   this.graphics.drawRoundRect(0 + bevel, 0 + bevel, w - 2 * bevel, h - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                   /* draw outline darker rectangle */
                   this.graphics.beginFill(0x000000, 1);         
                   this.graphics.drawRect(0, h - h / 2, w, h/2);
                   
                   /* draw inner highlight rectangle */
                   this.graphics.beginFill(highlight, 1);
                   this.graphics.drawRect(0 + bevel, h - h / 2, w - 2 * bevel, h /2 - bevel);
                   
                   /* draw inner gradient rectangle */
                   bevel = bevel * 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, bgcolors, bgalphas, bgratios, bgmatrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRect(0 + bevel, h - h / 2, w - 2 * bevel, h / 2 - bevel);
                   
                   /* draw shine rounded rectangle */      
                   bevel = bevel / 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, colors, alphas, ratios, matrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRect(0 + bevel, h - h / 2, w - 2 * bevel, h / 2 - bevel);
                   
                }
                else if ( h > 0 )
                {/* draw bar downwards */
                
                   /* draw shine rounded rectangle */      
                   this.graphics.drawRoundRect(0 + bevel, 0 + bevel, w - 2 * bevel, h - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                   /* draw outline darker rectangle */
                   this.graphics.beginFill(0x000000, 1);         
                   this.graphics.drawRect(0, 0, w, h/2);
                   
                   /* draw inner highlight rectangle */
                   this.graphics.beginFill(highlight, 1);
                   this.graphics.drawRect(0 + bevel, 0 + bevel, w - 2 * bevel, h /2 - bevel);
                   
                   /* draw inner gradient rectangle */
                   bevel = bevel * 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, bgcolors, bgalphas, bgratios, bgmatrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRect(0 + bevel, 0 + bevel, w - 2 * bevel, h / 2 - bevel);
                   
                   /* draw shine rounded rectangle */      
                   bevel = bevel / 3;
                   this.graphics.beginGradientFill('linear' /*GradientType.Linear*/, colors, alphas, ratios, matrix, 'pad'/*SpreadMethod.PAD*/ );
                   this.graphics.drawRect(0 + bevel, 0 + bevel, w - 2 * bevel, h / 2 - bevel);
                   
                }
                else
                {
                   
                   /* draw shine rounded rectangle */      
                   this.graphics.drawRoundRect(0 + bevel, 0 - 2*bevel + bevel, w - 2 * bevel, h + 4*bevel - 2 * bevel, w/div - 2*bevel, w/div - 2 * bevel);
                   
                }
                   this.graphics.endFill();
                
          }
          
          /* function to process colors */
          /* returns a base color, a lowlight color, and a highlight color for the gradients based on the color passed in */
          public static function GetColours( col:Number):Array {
             var rgb:Number = col; /* decimal value for color */
             var red:Number = (rgb & 16711680) >> 16; /* extacts the red channel */
             var green:Number = (rgb & 65280) >> 8; /* extacts the green channel */
             var blue:Number = rgb & 255; /* extacts the blue channel */
             var shift:Number = 0.15; /* shift factor */
             var loshift:Number = 1.75; /* lowlight shift factor */
             var basecolor:Number = col; /* base color to be returned */
             var lowlight:Number = col; /* lowlight color to be returned */
             var highlight:Number = col; /* highlight color to be returned */
             var bgred:Number = (rgb & 16711680) >> 16; /* red channel for highlight */
             var bggreen:Number = (rgb & 65280) >> 8; /* green channel for highlight */
             var bgblue:Number = rgb & 255; /* blue channel for highlight */
             var lored:Number = (rgb & 16711680) >> 16; /* red channel for lowlight */
             var logreen:Number = (rgb & 65280) >> 8; /* green channel for lowlight */
             var loblue:Number = rgb & 255; /* blue channel for lowlight */
             var hired:Number = (rgb & 16711680) >> 16; /* red channel for highlight */
             var higreen:Number = (rgb & 65280) >> 8; /* green channel for highlight */
             var hiblue:Number = rgb & 255; /* blue channel for highlight */
             
             /* set base color components based on ability to shift lighter and darker */   
             if (red + red * shift < 255 && red - loshift * red * shift > 0)
             { /* red can be shifted both lighter and darker */
                bgred = red;
             }
             else
             { /* red can be shifter either lighter or darker */
                if (red + red * shift < 255)
                { /* red can be shifter lighter */
                   bgred = red + red / shift;
                }
                else
                { /* red can be shifted darker */
                   bgred = red - loshift * red * shift;
                }
             }
                
             if (blue + blue * shift < 255 && blue - loshift * blue * shift > 0)
             { /* blue can be shifted both lighter and darker */
                bgblue = blue;
             }
             else
             { /* blue can be shifter either lighter or darker */
                if (blue + blue * shift < 255)
                { /* blue can be shifter lighter */
                   bgblue = blue + blue * shift;
                }
                else
                { /* blue can be shifted darker */
                   bgblue = blue - loshift * blue * shift;
                }
             }
                
             if (green + green * shift < 255 && green - loshift * green * shift > 0)
             { /* green can be shifted both lighter and darker */
                bggreen = green;
             }
             else
             { /* green can be shifted either lighter or darker */
                if (green + green * shift < 255)
                { /* green can be shifter lighter */
                   bggreen = green + green * shift;
                }
                else
                { /* green can be shifted darker */
                   bggreen = green - loshift * green * shift;
                }
             }
             
             /* set highlight and lowlight components based on base colors */   
             hired = bgred + red * shift;
             lored = bgred - loshift * (red * shift);
             hiblue = bgblue + blue * shift;
             loblue = bgblue - loshift * (blue * shift);
             higreen = bggreen + green * shift;
             logreen = bggreen - loshift * (green * shift);
             
             /* reconstruct base and highlight */
             basecolor = bgred << 16 | bggreen << 8 | bgblue;
             highlight = hired << 16 | higreen << 8 | hiblue;
             lowlight = lored << 16 | logreen << 8 | loblue;
                      
             /* return base, lowlight, and highlight */
             return [highlight, basecolor, lowlight];
          }
          
          /* ellipse cos helper function */
          public static function magicTrigFunctionX (pointRatio:Number):Number{
             return Math.cos(pointRatio*2*Math.PI);
          }
          
          /* ellipse sin helper function */
          public static function magicTrigFunctionY (pointRatio:Number):Number{
             return Math.sin(pointRatio*2*Math.PI);
          }
          
          /* ellipse function */
          /* draws an ellipse from passed center coordinates, x and y radii, and number of sides */
          public function Ellipse(centerX:Number, centerY:Number, xRadius:Number, yRadius:Number, sides:Number):Number{
             
             /* move to first point on ellipse */
             this.graphics.moveTo(centerX + xRadius,  centerY);
             
             /* loop through sides and draw curves */
             for(var i:Number=0; i<=sides; i++){
                var pointRatio:Number = i/sides;
                var xSteps:Number = magicTrigFunctionX(pointRatio);
                var ySteps:Number = magicTrigFunctionY(pointRatio);
                var pointX:Number = centerX + xSteps * xRadius;
                var pointY:Number = centerY + ySteps * yRadius;
                this.graphics.lineTo(pointX, pointY);
             }
             
             /* return 1 */
             return 1;
          }
                
       }
    }