<?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.

-->
<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   
			   creationCompleteEffect="{addedEffect}"
			   removedEffect="{removedEffect}"
			   >
	
	
	<fx:Script>
		<![CDATA[
			import com.flexcapacitor.controller.Radiate;
			
			import mx.core.mx_internal;
			
			use namespace mx_internal;
			
			[Bindable]
			public var inProgress:Boolean;
			
			public var radiate:Radiate;

			public var closePanelDelay:int = 500;
			
			private var moveAdded:Boolean;
			
			public function addMoveEffect():void {
				if (!moveAdded) {
					//trace("added move effect");
					//setStyle("moveEffect", moveEffect);
					setStyle("moveEffect", "Move");
					moveAdded = true;
				}
			}
		]]>
	</fx:Script>
	
	<fx:Declarations>
				
		<s:Parallel id="removedEffect" target="{this}" suspendBackgroundProcessing="false">
			<s:Scale3D scaleYTo="0" duration="500" startDelay="0" disableLayout="false"
					   autoCenterProjection="true" autoCenterTransform="true" applyChangesPostLayout="true"/>
			<s:Fade alphaFrom="1" alphaTo="0" duration="250" startDelay="50"/>
		</s:Parallel>
		
		<s:Parallel id="addedEffect" target="{this}" suspendBackgroundProcessing="false">
			<s:Scale3D scaleYFrom="0" scaleYTo="1" duration="250" disableLayout="false"
					   autoCenterProjection="true" autoCenterTransform="true" applyChangesPostLayout="true"/>
			<s:Fade alphaFrom="0" alphaTo="1" duration="200"/>
			<!--<core:CallMethod method="addMoveEffect" startDelay="250"/>-->
		</s:Parallel>
		
		<s:Move id="moveEffect" target="{this}" />
		
	</fx:Declarations>
	
	
	
</s:Panel>
