blob: a76c2f804e3aaf75c15e4666810180fff995cb80 [file] [log] [blame]
<?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.
-->
<windows:AnimatedPanelWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:handlers="com.flexcapacitor.handlers.*"
xmlns:fc="com.flexcapacitor.effects.popup.*"
xmlns:controls="com.flexcapacitor.controls.*"
xmlns:c="com.flexcapacitor.views.windows.*"
xmlns:core="com.flexcapacitor.effects.core.*"
xmlns:windows="com.flexcapacitor.views.windows.*"
title.login="Login"
title.logout="Logout"
title.register="Register"
title.registrationWithSite="Register"
title.lostPassword="Lost Password"
title.lostPasswordConfirmation="Change Password"
title.loginAfterPasswordChanged="Login"
title.changePassword="Change Password"
creationComplete="creationCompleteHandler(event)"
stateChangeComplete="stateChangeCompleteHandler(event)"
>
<fx:Style>
@namespace s "library://ns.adobe.com/flex/spark";
@namespace c "com.flexcapacitor.controls.*";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace handlers "com.flexcapacitor.handlers.*";
@namespace fc "com.flexcapacitor.effects.popup.*";
</fx:Style>
<fx:Script>
<![CDATA[
import com.flexcapacitor.controller.Radiate;
import com.flexcapacitor.events.RadiateEvent;
import com.flexcapacitor.utils.StoreLogin;
import mx.core.Singleton;
import mx.core.mx_internal;
import mx.events.FlexEvent;
import mx.events.ResizeEvent;
import mx.managers.PopUpData;
import mx.managers.PopUpManager;
import mx.managers.PopUpManagerImpl;
use namespace mx_internal;
private var username:String;
public static const REGISTER:String = "register";
public static const LOGIN:String = "login";
public static const LOGOUT:String = "logout";
public static const LOST_PASSWORD:String = "lostPassword";
public static const LOST_PASSWORD_CONFIRMATION:String = "lostPasswordConfirmation";
public static const LOGIN_AFTER_PASSWORD_CHANGED:String = "loginAfterPasswordChanged";
public static const LOGIN_AFTER_REGISTRATION:String = "loginAfterRegistration";
public static const REGISTRATION_WITH_SITE:String = "registrationWithSite";
// There should be a form on our HTML page.
// The browser will fill the form with values if the user logged in before
// If there are multiple users it will fill it with the last user
// Or if it's blank it will autofill the password when a username is entered into the form
//
// What we do is this:
//
// 1. add scripts to the page when the application loads
// 2. check for existing form values set by the browser
// 3. fill in our Flash form with those values
protected function creationCompleteHandler(event:FlexEvent):void {
var savePassword:StoreLogin = new StoreLogin();
var savePasswordCreated:Boolean;
savePasswordCreated = savePassword.initialize(); // places our javascript onto the page
checkForValues();
radiate = Radiate.getInstance();
//trace("creation");
// apply after opened
//setStyle("moveEffect", moveEffect);
}
/**
* Gets form values from page
* */
protected function checkForValues():void {
var savePassword:StoreLogin = new StoreLogin();
var loginItems:Array;
loginItems = savePassword.getFormValues(); // gets existing form values
if (loginItems.length>0) {
if (currentState=="login") {
usernameTextInput.text = loginItems[0];
passwordTextInput.text = loginItems[1];
}
}
}
/**
* To get the browser to save our login we need to submit the form.
*
* 4. Copy our login information to the form on the HTML page
* 5. Submit the form - the form is benign (it doesn't go anywhere).
* this causes the browser to display a save password dialog
* 6. After calling submit form continue to handle the login procedure as
* you normally would. IE Continue to use HTTPService, URLRequest, etc
**/
protected function login():void {
var savePassword:StoreLogin = new StoreLogin();
var setValues:Boolean = savePassword.setFormValues(usernameTextInput.text, passwordTextInput.text);
var results:Boolean;
if (rememberLoginCheckbox.selected) {
results = savePassword.submitForm();
}
loginWarningsLabel.text = "";
radiate.login(usernameTextInput.text, passwordTextInput.text);
radiate.addEventListener(RadiateEvent.LOGIN_RESULTS, loginResultsHandler, false, 0, true);
inProgress = true;
}
// OPTIONAL - support multiple accounts or username required to autofill browsers
// - does not work in chrome. the only solution so far is to login with a user
// for that user to be remembered the next time
//
// If the form is blank then it may be because we have multiple accounts
// Let the user type in a name / username and then when they tab to password
// 7. check if the browser has filled in the password after username is entered
// 8. fill in our password field with the password
protected function username_focusOutHandler(event:FocusEvent):void {
var savePassword:StoreLogin = new StoreLogin();
var results:Object;
var value:String;
// if username or password is blank check for password after supplying username
value = savePassword.checkForPassword(usernameTextInput.text);
if (value!="") {
passwordTextInput.text = value;
passwordTextInput.selectAll();
}
// set focus on our text field
passwordTextInput.setFocus();
// we have to focus back on flash because of the javascript we use
results = savePassword.setFocusOnFlash();
}
private function logout():void {
logoutWarningsLabel.text = "";
radiate = Radiate.getInstance();
radiate.addEventListener(RadiateEvent.LOGOUT_RESULTS, logoutResultsHandler, false, 0, true);
radiate.logout();
inProgress = true;
}
private function register():void {
registrationWarningsLabel.text = "";
radiate = Radiate.getInstance();
radiate.addEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler, false, 0, true);
radiate.register(newUsernameTextInput.text, emailTextInput.text);
inProgress = true;
}
private function registerUserAndSite():void {
registrationWarningsLabel.text = "";
radiate.addEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler, false, 0, true);
radiate.registerUserAndSite(newUsernameTextInput.text, emailTextInput.text, newSiteTextInput.text, newSiteTitleTextInput.text);
inProgress = true;
}
protected function goToLoginAfterRegistrationState():void {
currentState = LOGIN_AFTER_REGISTRATION;
}
protected function goToRegistrationWithSiteState():void {
currentState = REGISTRATION_WITH_SITE;
}
protected function goToRegistrationState():void {
currentState = REGISTER;
}
protected function goToLogoutState():void {
currentState = LOGOUT;
}
protected function goToLoginState():void {
currentState = LOGIN;
checkForValues();
}
protected function goToLostPasswordState():void {
currentState = LOST_PASSWORD;
}
protected function goToLostPasswordConfirmationState():void {
currentState = LOST_PASSWORD_CONFIRMATION;
}
private function createRandomPassword(hashLen:uint,
includeLowercase:Boolean = true,
includeUppercase:Boolean = true,
includeNumbers:Boolean = true,
includeCharacters:Boolean = true):String {
var strHash:String = "";
if (includeLowercase) strHash += "abchefghjkmnpqrstuvwxyz";
if (includeNumbers) strHash += "0123456789";
if (includeUppercase) strHash += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (includeCharacters) strHash += "~!@#$%^&*()-_=+[{]}\|;:/?.>,<";
var maskPick:Number;
var passwordStr:String = "";
var maskLen:uint = strHash.length;
for (var i:uint = 0; i < hashLen; i++) {
maskPick = Math.floor(Math.random() * maskLen);
passwordStr += strHash.charAt(maskPick);
}
return passwordStr;
}
///////////////////////////////////////////////////////////
//
// HANDLERS
//
///////////////////////////////////////////////////////////
protected function getNewPasswordButton_clickHandler(event:MouseEvent = null):void {
inProgress = true;
lostPasswordWarningsLabel.text = "";
username = usernameOrEmailTextInput.text;
radiate.addEventListener(RadiateEvent.LOST_PASSWORD_RESULTS, onLostPasswordResults, false, 0, true);
radiate.lostPassword(usernameOrEmailTextInput.text);
}
protected function changePasswordButton_clickHandler(event:MouseEvent):void {
inProgress = true;
changePasswordWarningsLabel.text = "";
radiate.addEventListener(RadiateEvent.CHANGE_PASSWORD_RESULTS, onChangePasswordResults, false, 0, true);
radiate.changePassword(confirmationCodeTextInput.text, username, newPasswordTextInput.text, newPasswordTextInput2.text);
}
protected function generatePasswordButton_clickHandler(event:MouseEvent):void {
var password:String = createRandomPassword(12, true, true, true, false);
newPasswordTextInput.text = password;
newPasswordTextInput2.text = password;
}
protected function panel1_resizeHandler(event:ResizeEvent):void {
if (stage && !addedEffect.isPlaying) {
// to fix bug on line 505 of PopUpManagerImpl
var popUpImp:PopUpManagerImpl = PopUpManagerImpl(Singleton.getInstance("mx.managers::IPopUpManager"));
var popupInfo:Array = popUpImp.popupInfo;
const n:int = popupInfo.length;
var instanceIndex:int = -1;
for (var i:int = 0; i < n; i++) {
var o:PopUpData = popupInfo[i];
if (o.owner == this) {
instanceIndex = i;
}
}
if (instanceIndex!=-1) {
PopUpManager.centerPopUp(this);
}
}
}
protected function cancelButton_clickHandler(event:MouseEvent):void {
callLater(PopUpManager.removePopUp, [this]);
}
protected function usernameOrEmailTextInput_keyUpHandler(event:KeyboardEvent):void {
if (event.keyCode==Keyboard.ENTER) {
getNewPasswordButton_clickHandler(null);
}
}
/**
* Handle logout
* */
protected function logoutResultsHandler(event:RadiateEvent):void {
var data:Object = event.data;
var error:String;
var label:Label;
var message:String = "";
radiate.removeEventListener(RadiateEvent.LOGOUT_RESULTS, logoutResultsHandler);
logoutWarningsLabel.text = "";
if (data && data is Object) {
for each (error in data.errors) {
message += error + " ";
}
}
inProgress = false;
if (event.faultEvent is IOErrorEvent) {
message = "Are you connected to the internet? ";
if (event.faultEvent is IOErrorEvent) {
message = IOErrorEvent(event.faultEvent).text;
}
else if (event.faultEvent is SecurityErrorEvent) {
if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
}
message += SecurityErrorEvent(event.faultEvent).text;
}
}
if (data && data is Object && data.loggedIn==false) {
closePopUp.startDelay = closePanelDelay;
closePopUp.play();
}
logoutWarningsLabel.text = message;
}
/**
* Handle register
* */
protected function registerResultsHandler(event:RadiateEvent):void {
var data:Object = event.data;
var error:String;
var label:Label;
var message:String = "";
var successful:Boolean = event.successful;
var errors:Array;
radiate.removeEventListener(RadiateEvent.REGISTER_RESULTS, registerResultsHandler);
registrationWarningsLabel.text = "";
for (error in data.errors) {
// user_email, user_name
if (error=="incorrect_password") {
message += "The password you entered is incorrect. "
}
else if (error=="invalid_username") {
message += "The username you entered is not found. "
}
else if (data.errors[error] is Array) {
errors = data.errors[error] as Array;
if (error=="blogname" && errors.indexOf("Only lowercase letters")!=-1) {
message += "Only lowercase letters (a-z) and numbers are allowed in the site name.";
}
else {
message += errors.join(" ") + " ";
}
}
else {
message += error + " ";
}
}
inProgress = false;
message = message.replace(/<strong>ERROR<\/strong>: /i, "");
if (event.faultEvent is IOErrorEvent) {
message = "Are you connected to the internet? ";
if (event.faultEvent is IOErrorEvent) {
message = IOErrorEvent(event.faultEvent).text;
}
else if (event.faultEvent is SecurityErrorEvent) {
if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
}
message += SecurityErrorEvent(event.faultEvent).text;
}
}
if (data && data is Object && successful) {
goToLoginAfterRegistrationState();
validateNow();
if (usernameTextInput) {
usernameTextInput.text = newUsernameTextInput.text;
}
if (data.site) {
message = data.site.message;
message = message ? message.replace(/site/g, "account") : null;
}
else {
message = "You have successfully registered your username.";
}
loginAfterRegistrationLabel.text = message;
return;
}
registrationWarningsLabel.text = message;
}
/**
* Login results handler
* */
protected function loginResultsHandler(event:RadiateEvent):void {
var data:Object = event.data;
var error:String;
var label:Label;
var message:String = "";
var successful:Boolean = event.successful;
radiate.removeEventListener(RadiateEvent.LOGIN_RESULTS, loginResultsHandler);
loginWarningsLabel.text = "";
for (error in data.errors) {
if (error=="incorrect_password") {
message += "The password you entered is incorrect. "
}
else if (error=="invalid_username") {
message += "The username you entered is not found. "
}
else {
error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
message += error + " ";
}
}
inProgress = false;
if (event.faultEvent is IOErrorEvent) {
message = "Are you connected to the internet? ";
if (event.faultEvent is IOErrorEvent) {
message = IOErrorEvent(event.faultEvent).text;
}
else if (event.faultEvent is SecurityErrorEvent) {
if (SecurityErrorEvent(event.faultEvent).errorID==2048) {
}
message += SecurityErrorEvent(event.faultEvent).text;
}
}
if (data && data is Object && successful) {
dispatchEvent(new Event(LOGIN));
closePopUp.startDelay = 250;
closePopUp.play();
}
loginWarningsLabel.text = message;
}
protected function onLostPasswordResults(event:RadiateEvent):void {
var data:Object = event.data;
var error:String;
var message:String = "";
inProgress = false;
if (data && data is Object && data.sent==true) {
loginWarningsLabel.text = "";
currentState = LOST_PASSWORD_CONFIRMATION;
//logoutWarningsLabel.text = "";
//closePopUp.startDelay = 250;
//closePopUp.play();
return;
}
lostPasswordWarningsLabel.text = "";
for (error in data.errors) {
if (error=="incorrect_password") {
lostPasswordWarningsLabel.text += "The password you entered is incorrect."
}
else if (error=="invalid_username") {
lostPasswordWarningsLabel.text += "The username you entered is not found."
}
else {
error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
lostPasswordWarningsLabel.text += error;
}
}
radiate.removeEventListener(RadiateEvent.LOST_PASSWORD_RESULTS, onLostPasswordResults);
}
protected function onChangePasswordResults(event:RadiateEvent):void {
var data:Object = event.data;
var error:String;
var message:String = "";
inProgress = false;
if (data && data is Object && data.reset==true) {
currentState = LOGIN_AFTER_PASSWORD_CHANGED;
usernameTextInput.text = username;
passwordTextInput.text = newPasswordTextInput.text;
//logoutWarningsLabel.text = "";
//closePopUp.startDelay = 250;
//closePopUp.play();
return;
}
changePasswordWarningsLabel.text = "";
for (error in data.errors) {
if (error=="invalid_key") {
changePasswordWarningsLabel.text += "The key you entered is invalid."
}
else if (error=="expired_key") {
changePasswordWarningsLabel.text += "The key you entered has expired."
}
else if (error=="invalid_login") {
changePasswordWarningsLabel.text += "The username is invalid."
}
else if (error=="password_not_set") {
changePasswordWarningsLabel.text += "The password is not set."
}
else if (error=="password_reset_mismatch") {
changePasswordWarningsLabel.text += "The passwords do not match."
}
else {
error = data.errors[error][0].replace(/<strong>ERROR<\/strong>: /i, "");
changePasswordWarningsLabel.text += error;
}
}
radiate.removeEventListener(RadiateEvent.CHANGE_PASSWORD_RESULTS, onChangePasswordResults);
}
protected function stateChangeCompleteHandler(event:FlexEvent):void {
addMoveEffect();
PopUpManager.centerPopUp(this);
}
]]>
</fx:Script>
<fx:Declarations>
<!--- hide about popup -->
<handlers:EventHandler targets="{cancelButton}" eventName="clickNOT">
<fc:ClosePopUp id="closePopUp" popUp="{this}" />
</handlers:EventHandler>
<!--- hide about popup -->
<!--<handlers:EventHandler targets="{importButton}" eventName="click">
<s:SetAction property="action" target="{this}" value="import"/>
<fc:ClosePopUp popUp="{this}" />
</handlers:EventHandler>-->
<fx:String id="action"></fx:String>
</fx:Declarations>
<c:states>
<s:State name="login" />
<s:State name="logout" />
<s:State name="loginAfterPasswordChanged" basedOn="login" />
<s:State name="loginAfterRegistration" basedOn="login" />
<s:State name="register" />
<s:State name="registrationWithSite" basedOn="register"/>
<s:State name="lostPassword" />
<s:State name="lostPasswordConfirmation" />
<s:State name="changePassword" />
</c:states>
<!-- REGISTRATION -->
<s:Label text.register="Please enter a user name and email."
text.registrationWithSite="Please enter a user name, email, site name and title. If you leave the site name and site title blank your username will be used. "
fontSize="13"
top="70"
right="20"
width="45%"
includeIn="register,registrationWithSite" />
<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="register,registrationWithSite"/>
<s:VGroup left="15"
top="20"
right="20"
bottom="20"
gap="10"
includeIn="register, registrationWithSite"
>
<s:Label text="Username" fontSize="18" styleName="textInputStyles"/>
<s:TextInput id="newUsernameTextInput"
text=""
prompt="Username"
minWidth="220"
fontSize="18"
styleName="textInputStyles"
/>
<s:Label text="E-mail" fontSize="18" styleName="textInputStyles"/>
<s:TextInput id="emailTextInput"
text=""
prompt="Email"
fontSize="18"
minWidth="220"
styleName="textInputStyles"
/>
<!-- registration of site -->
<s:Label text="Site Name"
fontSize="18"
styleName="textInputStyles"
includeIn="registrationWithSite"/>
<s:TextInput id="newSiteTextInput"
text=""
prompt="Site name"
minWidth="220"
fontSize="18"
styleName="textInputStyles"
includeIn="registrationWithSite"
/>
<s:Label text="Site Title"
fontSize="18"
styleName="textInputStyles"
includeIn="registrationWithSite"/>
<s:TextInput id="newSiteTitleTextInput"
text=""
prompt="Title"
fontSize="18"
minWidth="220"
styleName="textInputStyles"
includeIn="registrationWithSite"
/>
<s:Label id="registrationWarningsLabel"
x="15" y="15"
text=""
fontWeight="bold"
color="red"
width="50%"/>
<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
<s:Label text="Login"
styleName="stateLabel"
click="goToLoginState()"
useHandCursor="true"
buttonMode="true"/>
<s:Label text="Please wait..."
visible="{inProgress}"
/>
<s:Spacer width="100%"/>
<s:Button label="Register"
click.register="register()"
click.registrationWithSite="registerUserAndSite()"/>
</s:HGroup>
</s:VGroup>
<!-- LOGIN AFTER REGISTRATION -->
<s:TextArea id="loginAfterRegistrationLabel"
text="A password will be emailed to you. Check your email for login information. If you don't see the email check your spam folder. "
fontSize="13"
top="30"
right="20"
width="45%"
height="130"
includeIn="loginAfterRegistration"
editable="false"
borderVisible="false"/>
<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="loginAfterRegistration"/>
<!-- LOGIN -->
<s:VGroup left="15"
top="20"
right="20"
bottom="20"
gap="10"
includeIn="login"
>
<s:Label text="Username" fontSize="18" />
<s:TextInput id="usernameTextInput"
text=""
focusOut="username_focusOutHandler(event)"
prompt="Username"
fontSize="18" styleName="textInputStyles"
/>
<s:Label text="Password" fontSize="18" />
<s:TextInput id="passwordTextInput"
text=""
displayAsPassword="true"
prompt="Password"
fontSize="18" styleName="textInputStyles"
/>
<s:Label id="loginWarningsLabel"
x="15" y="15"
text=""
fontWeight="bold"
color="red"
width="100%"/>
<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
<s:Label text="Register"
styleName="stateLabel"
click="goToRegistrationWithSiteState()"
useHandCursor="true"
buttonMode="true"/>
<controls:VerticalLine />
<s:Label text="Lost Password"
styleName="stateLabel"
click="goToLostPasswordState()"
useHandCursor="true"
buttonMode="true"/>
<s:Label text="Logging in..."
visible="{inProgress}"
/>
<s:Spacer width="100%"/>
<s:CheckBox id="rememberLoginCheckbox" label="Remember Me" selected="true" />
<s:Button id="cancelButton" label="Cancel" click="cancelButton_clickHandler(event)" />
<s:Button label="Login" click="login()" />
</s:HGroup>
</s:VGroup>
<!-- LOST PASSWORD -->
<s:Label text="Please enter your username or email address. You will receive a passkey to create a new password via email."
fontSize="14"
top="30"
right="20"
width="45%"
includeIn="lostPassword"/>
<controls:VerticalLine height="60%" horizontalCenter="-20" top="20" includeIn="lostPassword"/>
<!-- LOST PASSWORD -->
<s:VGroup left="15"
top="20"
right="20"
bottom="20"
gap="10"
includeIn="lostPassword"
>
<s:Label text="Username or email" fontSize="18" />
<s:TextInput id="usernameOrEmailTextInput"
text=""
prompt="Username or email"
fontSize="18" styleName="textInputStyles"
width="240"
keyUp="usernameOrEmailTextInput_keyUpHandler(event)"
/>
<s:Label id="lostPasswordWarningsLabel"
x="15" y="15"
text=""
fontWeight="bold"
color="red"
width="100%"/>
<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
<s:Label text="Login"
styleName="stateLabel"
click="goToLoginState()"
useHandCursor="true"
buttonMode="true"/>
<s:Label text="Please wait..."
visible="{inProgress}"
/>
<s:Spacer width="100%"/>
<s:Button id="lostPasswordButton" label="Get New Password" click="getNewPasswordButton_clickHandler(event)" />
</s:HGroup>
</s:VGroup>
<!-- LOST PASSWORD CONFIRMATION -->
<s:Label text="Check your email.&#xd;&#xd;A message was sent containing a confirmation code. Enter the code here and choose a new password."
fontSize="14"
top="70"
right="20"
width="45%"
includeIn="lostPasswordConfirmation"/>
<controls:VerticalLine height="75%" horizontalCenter="-10" top="20" includeIn="lostPasswordConfirmation"/>
<s:VGroup left="15"
top="20"
right="20"
bottom="20"
gap="10"
includeIn="lostPasswordConfirmation"
>
<s:Label text="Confirmation Code" fontSize="18" />
<s:TextInput id="confirmationCodeTextInput"
text=""
fontSize="18" styleName="textInputStyles"
width="240"
/>
<s:Label text="New Password" fontSize="18" />
<s:TextInput id="newPasswordTextInput"
text=""
fontSize="18" styleName="textInputStyles"
width="240"
displayAsPassword="true"
/>
<s:Label text="Confirm Password" fontSize="18" />
<s:TextInput id="newPasswordTextInput2"
text=""
fontSize="18" styleName="textInputStyles"
width="240"
displayAsPassword="true"
/>
<s:Label id="changePasswordWarningsLabel"
x="15" y="15"
text=""
fontWeight="bold"
color="red"
width="100%"/>
<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
<s:Label text="Lost Password"
styleName="stateLabel"
click="goToLostPasswordState()"
useHandCursor="true"
buttonMode="true"/>
<s:Label text="Please wait..."
visible="{inProgress}"
/>
<s:Spacer width="100%"/>
<s:Button id="generatePasswordButton" label="Generate Password For Me" click="generatePasswordButton_clickHandler(event)" />
<s:Button id="changePasswordButton" label="Change Password" click="changePasswordButton_clickHandler(event)" />
</s:HGroup>
</s:VGroup>
<!-- PASSWORD CHANGED -->
<s:Label text="Your password has been changed!&#xd;&#xd;Please store it in a safe place. Your password has been filled in for you. You may now login. "
fontSize="13"
top="50"
right="20"
width="45%"
includeIn="loginAfterPasswordChanged"/>
<controls:VerticalLine height="60%" horizontalCenter="0" top="20" includeIn="loginAfterPasswordChanged"/>
<!-- LOGOUT -->
<s:VGroup left="15"
top="20"
right="20"
bottom="20"
gap="10"
includeIn="logout"
>
<s:Label text="Are you sure you want to logout?" fontSize="18" />
<s:Spacer height="100%"/>
<s:HGroup width="100%" horizontalAlign="right" verticalAlign="baseline">
<s:Label text="Logging out..."
visible="{inProgress}"
includeInLayout="{inProgress}"
/>
<s:Label id="logoutWarningsLabel"
x="15" y="15"
text=""
fontWeight="bold"
color="red"
width="100%"/>
<s:Spacer width="100%"/>
<s:Button id="cancelLogoutButton" label="Cancel" click="cancelButton_clickHandler(event)" />
<s:Button label="Logout" click="logout()" />
</s:HGroup>
</s:VGroup>
</windows:AnimatedPanelWindow>