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

-->
<mx:Application layout="vertical" backgroundGradientColors="[0x000000,0x323232]" verticalAlign="middle" horizontalAlign="center"
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:sides="view.sides.*" 
	creationComplete="onCreationComplete();" viewSourceURL="srcview/index.html">	
	
	<!-- Using a distortion effect using a custom state change. 
	Listen to the distortion effect's EffectEvent.EFFECT_END event, 
	and apply your state change afterwards. In this example the state change 
	is a removeChild, addChild method call on the VBox container. -->
	
	<mx:Script>
		<![CDATA[
			import view.sides.Registration;
			import mx.events.EffectEvent;
			import com.adobe.ac.mxeffects.Flip;
			import com.adobe.ac.mxeffects.DistortionConstants;
			
			private var registration : Registration;
			
			private function onCreationComplete()  : void
			{
				registration = new Registration();
				registration.title = "Registration";
				registration.addEventListener( Event.CHANGE, onStartBack );
			}
			
			private function flipToRegistration() : void
			{
				var e : Flip = new Flip( login );
				e.siblings = [ registration ];
				e.direction = DistortionConstants.RIGHT;
				e.duration = 1000;
				e.addEventListener( EffectEvent.EFFECT_END, onEndLoginEffect );
				e.play();
			}
			
			private function onEndLoginEffect( event : EffectEvent ) : void
			{
				removeChild( login );
				addChild( registration );
			}
			
			private function onStartBack( event : Event ) : void
			{
				flipToLogin();
			}
			
			private function flipToLogin() : void
			{
				var e : Flip = new Flip( registration );
				e.siblings = [ login ];
				e.direction = DistortionConstants.LEFT;
				e.duration = 1000;
				e.addEventListener( EffectEvent.EFFECT_END, onEndRegistrationEffect );
				e.play();
			}
			
			private function onEndRegistrationEffect( event : EffectEvent ) : void
			{
				removeChild( registration );
				addChild( login );
			}
		]]>
	</mx:Script>
			
	<sides:Login id="login" title="Login" change="flipToRegistration();"/>

</mx:Application>
