package skins
{
    import flash.display.GradientType;
    
    import mx.skins.halo.ButtonSkin;

    public class CustomButtonSkin extends ButtonSkin
    {
        public function CustomButtonSkin()
        {
            super();
        }
        
        override protected function updateDisplayList(w:Number, h:Number):void
        {
            super.updateDisplayList(w,h);
            
            // User-defined styles.
            var outBorderColors:Array     = getStyle("outBorderColors");
            var inBorderColors:Array     = getStyle("inBorderColors");
            
            var cornerRadius:Number     = getStyle("cornerRadius");
            
            var upFillAlphas:Array         = getStyle("upFillAlphas");
            var upFillColors:Array         = getStyle("upFillColors");
            var upFillRatios:Array        = getStyle("upFillRatios");
            
            var overFillAlphas:Array    = getStyle("overFillAlphas");
            var overFillColors:Array    = getStyle("overFillColors");
            var overFillRatios:Array    = getStyle("overFillRatios");
            
            var downFillAlphas:Array    = getStyle("downFillAlphas");
            var downFillColors:Array    = getStyle("downFillColors");
            var downFillRatios:Array    = getStyle("downFillRatios");
                        
            var cr:Number = Math.max(0, cornerRadius);
            var cr1:Number = Math.max(0, cornerRadius - 1);
            var cr2:Number = Math.max(0, cornerRadius - 2);
            
            
            graphics.clear();
            
            // button border/edge
            drawRoundRect(
                0, 0, w, h, cr,
                outBorderColors, [1,1],
                verticalGradientMatrix(0, 0, w, h ),
                GradientType.LINEAR, [0,255]); 
            drawRoundRect(
                1, 1, w-2, h-2, cr1,
                inBorderColors, [1,1],
                verticalGradientMatrix(0, 0, w, h ),
                GradientType.LINEAR, [0,255]); 
            
            switch (name)
            {            
                case "selectedUpSkin":
                case "selectedOverSkin":
                {
                    // button fill
                    drawRoundRect(
                        2, 2, w - 4, h - 4, cr2,
                        downFillColors, downFillAlphas,
                        verticalGradientMatrix(0, 0, w - 2, h - 2),
                        GradientType.LINEAR, downFillRatios); 
                                                          
                    break;
                }
    
                case "upSkin":
                {
                    // button fill
                    drawRoundRect(
                        2, 2, w - 4, h - 4, cr2,
                        upFillColors, upFillAlphas,
                        verticalGradientMatrix(0, 0, w - 2, h - 2),
                        GradientType.LINEAR, upFillRatios); 
                    break;
                }
                            
                case "overSkin":
                {
                    // button fill
                    drawRoundRect(
                        2, 2, w - 4, h - 4, cr2,
                        overFillColors, overFillAlphas,
                        verticalGradientMatrix(0, 0, w - 2, h - 2),
                        GradientType.LINEAR, overFillRatios); 
                    break;
                }
                                        
                case "downSkin":
                case "selectedDownSkin":
                {
                    // button fill
                    drawRoundRect(
                        2, 2, w - 4, h - 4, cr2,
                        downFillColors, downFillAlphas,
                        verticalGradientMatrix(0, 0, w - 2, h - 2),
                        GradientType.LINEAR, downFillRatios);
                    break; 
                }                
            }
        }
        
    }
}