<?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:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" 
			   minWidth="955" minHeight="850"
			   creationComplete="initApp()">
	
	<!-- Exercise 2.06: Separating the model, view, and controller -->
	
	<!-- Styles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
	
	<fx:Style source="Styles.css"/>
	
	<!-- Script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
	
	<fx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.controls.Alert;
			import mx.events.CalendarLayoutChangeEvent;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			
			// variable declarations ------------------------------------
			
			[Bindable]
			private var employees:ArrayCollection;
			
			// getter/setters -------------------------------------------
			
			
			// helper methods -------------------------------------------
			
			
			// event handlers -------------------------------------------
			private function dateChangeHandler(event:CalendarLayoutChangeEvent):void
			{
				Alert.show('You have selected ' + event.target.selectedDate.toDateString());
				
				if ((event.target.id == "returnDate") && (pickupDate.selectedDate > returnDate.selectedDate)) 
				{
					Alert.show("Pickup date must be scheduled before return date.");
				}
				
				if ((event.target.id == "pickupDate") && (pickupDate.selectedDate > returnDate.selectedDate) && (returnDate.selectedDate != null)) 
				{
					Alert.show("Pickup date must be scheduled before return date.")
				}
				
			}
			
			private function initApp():void
			{
				employeeService.send();
				pickupDate.addEventListener(CalendarLayoutChangeEvent.CHANGE, dateChangeHandler);
				returnDate.addEventListener(CalendarLayoutChangeEvent.CHANGE, dateChangeHandler);
			}
			
			
			protected function employeeService_resultHandler(event:ResultEvent):void
			{
				employees = event.result.employees.employee;
				
			}
			
			
			protected function employeeService_faultHandler(event:FaultEvent):void
			{
				Alert.show(event.fault.faultString,"Fault Information");
				
			}
			
		]]>
	</fx:Script>
	
	<!-- Declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
	
	<fx:Declarations>

		<s:HTTPService id="employeeService"
					   url="http://adobetes.com/f45iaw100/remoteData/employeeData.cfm"
					   result="employeeService_resultHandler(event)"
					   fault="employeeService_faultHandler(event)"/>
		
	</fx:Declarations>
	
	<!-- UI components ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
	
	<s:Label x="10" y="34" 
			 width="690" height="40" 
			 text="Employee Portal: Vehicle Request Form"
			 styleName="titleHeader"/>
	
	<s:Form x="10" y="70">
		
		<s:FormItem label="Employee:">
			<s:DropDownList id="dropDownList"
							dataProvider="{employees}"
							labelField="lastName"/>
		</s:FormItem>
		
		<s:FormItem label="Office Phone:">
			<s:TextInput id="phone"
						 text="{dropDownList.selectedItem.phone}"/>
		</s:FormItem>
		
		<s:FormItem label="Mobile Phone:">
			<s:TextInput id="mobilePhone"/>
		</s:FormItem>
		
		<s:FormHeading label="Dates Requested"/>
				
		<s:FormItem label="Pickup Date:">
			<mx:DateChooser id="pickupDate"/>
		</s:FormItem>
		
		<s:FormItem label="Return Date:">
			<mx:DateChooser id="returnDate"/>
		</s:FormItem>
		
		<s:FormItem>
			<s:Button id="submitButton" 
					  label="Submit Request"/>
		</s:FormItem>
		
	</s:Form>
	
</s:Application>
