<?xml version="1.0" encoding="utf-8"?>
<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->


<!--- The default skin class for the close button of the Spark TitleWindow component.  

@see spark.skins.spark.TitleWindowSkin     
@see spark.components.TitleWindow

@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
			 xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5" initialize="initializeHandler(event)">
	
	<!-- host component -->
	<fx:Metadata>
		<![CDATA[ 
		/** 
		* @copy spark.skins.spark.ApplicationSkin#hostComponent
		*/
		[HostComponent("spark.components.Button")]
		]]>
	</fx:Metadata> 
	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;
			
			import flatspark.utils.AwesomeUtils;
			import flatspark.utils.ColorUtils;
			
			protected function initializeHandler(event:FlexEvent):void
			{
				// TODO Auto-generated method stub
				hostComponent.useHandCursor=true;
				hostComponent.buttonMode=true;
			}
			
		]]>
	</fx:Script>
	
	<!--		<fx:Script fb:purpose="styling">
	<![CDATA[
	import flatspark.utils.AwesomeUtils;
	]]>
	/* Define the skin elements that should not be colorized. 
	For closeButton, the graphics are colorized but the x is not. */
	static private const exclusions:Array = ["xSymbol"];
	
	/** 
	* @private
	*/     
	override public function get colorizeExclusions():Array {return exclusions;}
	
	/* Define the symbol fill items that should be colored by the "symbolColor" style. */
	static private const symbols:Array = ["xFill1", "xFill2"];
	
	/**
	* @private
	*/
	override public function get symbolItems():Array {return symbols};
	</fx:Script>-->
	
	<s:states>
		<s:State name="up" />
		<s:State name="over"/>
		<s:State name="down" />
		<s:State name="disabled" />
	</s:states>
	
	<s:Rect left="0" top="0" right="0" bottom="0" radiusX="6" width="26" height="26" includeIn="up">
		<s:fill>
			<s:SolidColor alpha="0" />
		</s:fill>
	</s:Rect>
	
	<s:Rect left="0" top="0" right="0" bottom="0" radiusX="6" width="26" height="26" includeIn="over">
		<s:fill>
			<s:SolidColor alpha="1" color="{ColorUtils.BelizeHole}" />
		</s:fill>
	</s:Rect>
	
	<s:Rect left="0" top="0" right="0" bottom="0" radiusX="6" width="26" height="26" includeIn="down">
		<s:fill>
			<s:SolidColor alpha="1" color="{ColorUtils.BelizeHole}" />
		</s:fill>
	</s:Rect>
	
	<s:Rect left="0" top="0" right="0" bottom="0" radiusX="6" width="26" height="26" includeIn="disabled">
		<s:fill>
			<s:SolidColor alpha="1" color="{ColorUtils.Clouds}" />
		</s:fill>
	</s:Rect>
	
	<s:Label fontFamily="FontAwesome" fontSize="18" color="#FFFFFF" text="{AwesomeUtils.fa_times}" includeIn="up, down, over, disabled"
			 itemCreationPolicy="immediate" verticalAlign="middle" horizontalCenter="0" verticalCenter="0" />
	

</s:SparkSkin>