////////////////////////////////////////////////////////////////////////////////
//
//  ADOBE SYSTEMS INCORPORATED
//  Copyright 2004-2007 Adobe Systems Incorporated
//  All Rights Reserved.
//
//  NOTICE: Adobe permits you to use, modify, and distribute this file
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////

package mx.skins.halo
{

import flash.display.Graphics;
import mx.skins.Border;

/**
 *  The skin for all the states of a ColorPicker.
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class ColorPickerSkin extends Border
{
    include "../../core/Version.as";

    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------

    /**
	 *  Constructor.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */    
    public function ColorPickerSkin()
    {
        super();
    }
    
    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------
    
    /**
     *  @private
     */
    private var borderShadowColor:uint = 0x9A9B9D;

    /**
     *  @private
     */
    private var borderHighlightColor:uint = 0xFEFEFE;
    
    /**
     *  @private
     */
	private var backgroundColor:uint = 0xE5E6E7;
    
    /**
     *  @private
     */
	private var borderSize:Number = 1;
    
    /**
     *  @private
     */
	private var bevelSize:Number = 1;
    
    /**
     *  @private
     */
	private var arrowWidth:Number = 7;
    
    /**
     *  @private
     */
	private var arrowHeight:Number = 5;

    //--------------------------------------------------------------------------
    //
    //  Overridden methods
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     */    
	override protected function updateDisplayList(w:Number, h:Number):void
    {
		super.updateDisplayList(w, h);

		var arrowColor:uint = getStyle("iconColor");

        var arrowX:Number = (w - arrowWidth - bevelSize);
        var arrowY:Number = (h - arrowHeight - bevelSize);

        graphics.clear();
        
        if (name == "upSkin" || name == "overSkin")
        {
            // invisible hit area
			drawFill(x, y, w + bevelSize, h + bevelSize, 0xCCCCCC, 0);
            
			// outer border
			drawBorder(x, y, w, h, borderHighlightColor, borderShadowColor,
					   bevelSize, 1.0); 

            // background
			drawBorder(x + bevelSize, y + bevelSize,
					   w - (bevelSize * 2), h - (bevelSize * 2),
					   backgroundColor, backgroundColor, borderSize, 1.0);                      
            
			// inner border
			drawBorder(x + bevelSize + borderSize, y + bevelSize + borderSize,
					   w - ((bevelSize + borderSize) * 2),
					   h - ((bevelSize + borderSize) * 2),
					   borderShadowColor, borderHighlightColor,
					   bevelSize, 1.0);     
            
			// arrow background
			drawFill(arrowX, arrowY, arrowWidth, arrowHeight,
					 backgroundColor, 1.0);                                                     
			
            // arrow
			drawArrow(arrowX + 1.5, arrowY + 1.5,
					  arrowWidth - 3, arrowHeight - 3, arrowColor, 1.0);                                 
        }

        else if (name == "downSkin")
        {
			// invisible hit area
            drawFill(x, y, w, h, 0xCCCCCC, 0);
            
			// outer border
			drawBorder(x, y, w, h, borderHighlightColor, 0xCCCCCC,
					   bevelSize, 1.0);
            
			// background
			drawBorder(x + bevelSize, y + bevelSize,
					   w - 2 * bevelSize, h - 2 * bevelSize,
					   backgroundColor, backgroundColor, borderSize, 1.0);
            
			// inner border
			drawBorder(x + bevelSize + borderSize, y + bevelSize + borderSize,
					   w - 2 * (bevelSize + borderSize),
					   h - 2 * (bevelSize + borderSize),
					   borderShadowColor, borderHighlightColor,
					   bevelSize, 1.0);
            
			// arrow background
			drawFill(arrowX, arrowY, arrowWidth, arrowHeight,
					 backgroundColor, 1.0);
            
			// arrow
			drawArrow(arrowX + 1.5, arrowY + 1.5,
					  arrowWidth - 3, arrowHeight - 3, arrowColor, 1.0);
        }

        else if (name == "disabledSkin")
        {
        	arrowColor = getStyle("disabledIconColor");
        	
			// For blur effect when disabled
            drawRoundRect(
				x, y, w, h, 0,
				0xFFFFFF, 0.6);
            
			// invisible hit area
			drawFill(x, y, w, h, 0xFFFFFF, 0.25);
            
			// outer border
			drawBorder(x, y, w, h, borderHighlightColor, 0xCCCCCC,
					   bevelSize, 1.0);
            
			// background
			drawBorder(x + bevelSize, y + bevelSize,
					   w - (bevelSize * 2), h - (bevelSize * 2),
					   backgroundColor, backgroundColor, borderSize, 1.0);
            
			// inner border        
			drawBorder(x + bevelSize + borderSize, y + bevelSize + borderSize,
					   w - 2 * (bevelSize + borderSize),
					   h - 2 * (bevelSize + borderSize),
					   borderShadowColor, borderHighlightColor,
					   bevelSize, 1.0);
            
			// arrow background                
			drawFill(arrowX, arrowY, arrowWidth, arrowHeight,
					 backgroundColor, 1.0);
            
			// blurred arrow        
			drawArrow(arrowX + 1.5, arrowY + 1.5,
					  arrowWidth - 3, arrowHeight - 3, arrowColor, 1.0);
        }
    }

    //--------------------------------------------------------------------------
    //
    //  Methods
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     */    
    private function drawBorder(x:Number, y:Number, w:Number, h:Number,
							    c1:Number, c2:Number, s:Number, a:Number):void
    {
		// border line on the left side
        drawFill(x, y, s, h, c1, a);

        // border line on the top side
        drawFill(x, y, w, s, c1, a);

        // border line on the right side
        drawFill(x + (w - s), y, s, h, c2, a);

        // border line on the bottom side
        drawFill(x, y + (h - s), w, s, c2, a);
    }

    /**
     *  @private
     */    
    private function drawFill(x:Number, y:Number, w:Number, h:Number,
							  c:Number, a:Number):void
    {
        var g:Graphics = graphics;
        g.moveTo(x, y);
        g.beginFill(c, a);
        g.lineTo(x + w, y);
        g.lineTo(x + w, h + y);
        g.lineTo(x, h + y);
        g.lineTo(x, y);
        g.endFill();
    }

    /**
     *  @private
     */    
    private function drawArrow(x:Number, y:Number, w:Number, h:Number,
							   c:Number, a:Number):void
    {
		var g:Graphics = graphics;    
        g.moveTo(x, y);
        g.beginFill(c, a);
        g.lineTo(x + w, y);
        g.lineTo(x + w / 2, h + y);
        g.lineTo(x, y);
        g.endFill();
    }
}

}
