http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/cda78507/flex-installer/installer/src/InstallApacheFlex.mxml
----------------------------------------------------------------------
diff --git a/flex-installer/installer/src/InstallApacheFlex.mxml 
b/flex-installer/installer/src/InstallApacheFlex.mxml
new file mode 100644
index 0000000..055e44f
--- /dev/null
+++ b/flex-installer/installer/src/InstallApacheFlex.mxml
@@ -0,0 +1,4019 @@
+<?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.
+
+-->
+
+
+<!--
+
+This app should be used to create an Apache Flex SDK that has the
+directory structure that an IDE expects.
+
+The Adobe AIR SDK and the Adobe Flash Player playerglobal.swc are integrated
+into the directory structure.  The paths in the framework configuration files 
are
+modified to reflect this.  The AIR_HOME and PLAYERGLOBAL_HOME environment
+variables are not required because the locations of these pieces are known.
+
+-->
+
+
+<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009";
+                       xmlns:s="library://ns.adobe.com/flex/spark"
+                       width="800" height="700" maxWidth="800" maxHeight="700" 
minWidth="800" minHeight="700"
+                       backgroundColor="0xDDDDDD"
+                       preinitialize="getInvoke()"
+                       applicationComplete="handleApplicationComplete(event)" 
showStatusBar="false"
+                       
skinClass="ws.tink.spark.skins.controls.InstallApacheFlexSkin"
+                       xmlns:controls="ws.tink.spark.controls.*"
+                       
xmlns:controls1="org.apache.flex.packageflexsdk.view.controls.*"
+                       
xmlns:components="org.apache.flex.packageflexsdk.view.components.*"
+                       
xmlns:controls2="org.apache.flex.utilities.common.controls.*">
+    
+    <fx:Style source="assets/styles/ApacheFlexToolsStyle.css"/>
+    <fx:Style source="assets/styles/InstallApacheFlexStyle.css"/> 
+    
+    <fx:Declarations>
+        <fx:Component className="CacheDialog" >
+            <s:TitleWindow title="Download Cache Configuration" width="400" 
height="130" 
+                           backgroundColor="0xDDDDDD" close="closeUp()">
+                <fx:Script>
+                    <![CDATA[
+                        import mx.managers.PopUpManager;
+                        
+                        private function browseFolders():void
+                        {
+                            var file:File;
+                            if (folder.text.length > 0)
+                                file = 
File.applicationStorageDirectory.resolvePath(folder.text);
+                            else
+                                file = File.applicationStorageDirectory;
+                            file.browseForDirectory("Download Cache Folder");
+                            file.addEventListener(Event.SELECT, 
folderSelected);
+                        }
+                        
+                        private function folderSelected(event:Event):void
+                        {
+                            folder.text = event.target.nativePath;
+                        }
+                        
+                        private function closeUp():void
+                        {
+                            PopUpManager.removePopUp(this);
+                        }
+                        
+                        private function updateCache():void
+                        {
+                            dispatchEvent(new Event(Event.COMPLETE));
+                            closeUp();
+                        }
+                    ]]>
+                </fx:Script>
+                <s:VGroup left="10" top="10" right="10">
+                    <s:CheckBox id="cb" label="Cache Downloaded Files" />
+                    <s:HGroup width="100%" verticalAlign="baseline">
+                        <s:Label text="Cache Folder: " />
+                        <s:TextInput id="folder" width="100%" 
enabled="{cb.selected}"/>
+                        <s:Button label="Browse..." click="browseFolders()" 
styleName="genericBtnStyle" enabled="{cb.selected}"/>
+                    </s:HGroup>
+                    <s:HGroup horizontalAlign="center" width="100%" >
+                        <s:Button label="OK" click="updateCache()" 
enabled="{cb.selected == false || folder.text.length > 0}" 
styleName="genericBtnStyle" />
+                        <s:Button label="Cancel" click="closeUp()" 
styleName="genericBtnStyle" />
+                    </s:HGroup>
+                </s:VGroup>
+            </s:TitleWindow>
+        </fx:Component>
+    </fx:Declarations>
+    <fx:Script><![CDATA[
+        import flash.globalization.LocaleID;
+        import flash.globalization.StringTools;
+
+        import mx.collections.ArrayCollection;
+        import mx.core.IFlexDisplayObject;
+        import mx.events.FlexEvent;
+        import mx.events.PropertyChangeEvent;
+        import mx.managers.CursorManager;
+        import mx.managers.PopUpManager;
+        import mx.resources.ResourceBundle;
+        import mx.rpc.events.FaultEvent;
+        import mx.rpc.events.ResultEvent;
+        import mx.rpc.http.HTTPService;
+        import mx.utils.StringUtil;
+
+        import org.apache.flex.packageflexsdk.util.ApacheURLLoader;
+
+        import spark.events.IndexChangeEvent;
+        import spark.events.TextOperationEvent;
+
+        // This force-links all of the ant task handlers into the Installer.
+        // The Installer doesn't use most of them directly but some script
+        // it runs might.
+        import AntClasses;
+
+        AntClasses;
+
+        import org.apache.flex.ant.Ant;
+        import org.apache.flex.ant.tags.Checksum;
+        import org.apache.flex.ant.tags.Copy;
+        import org.apache.flex.ant.tags.Get;
+        import org.apache.flex.packageflexsdk.model.InstallerComponentVO;
+        import org.apache.flex.packageflexsdk.model.OS;
+        import org.apache.flex.packageflexsdk.resource.ViewResourceConstants;
+        import org.apache.flex.packageflexsdk.util.CalcButtonWidth;
+        import org.apache.flex.packageflexsdk.util.MD5CompareUtil;
+        import org.apache.flex.packageflexsdk.view.UpdaterDialog;
+        import org.apache.flex.packageflexsdk.view.components.AdobeLicense;
+        import org.apache.flex.packageflexsdk.view.components.ConsoleWindow;
+        import org.apache.flex.packageflexsdk.view.components.MPLLicense;
+        import 
org.apache.flex.packageflexsdk.view.events.InstallItemSelectionEvent;
+        import org.apache.flex.utilities.common.Constants;
+        import org.apache.flex.utilities.common.MirrorURLUtil;
+        import org.apache.flex.utilities.common.interfaces.ILog;
+        import org.apache.flex.utilities.common.vo.LogMessagesVO;
+        import org.as3commons.zip.Zip;
+        import org.as3commons.zip.ZipEvent;
+        import org.as3commons.zip.ZipFile;
+        import org.osmf.utils.OSMFStrings;
+
+        import ws.tink.spark.controls.StepItem;
+        import ws.tink.spark.skins.controls.InstallApacheFlexSkin;
+
+        // embed us strings so we can always have them if we can't get to the 
locale files
+        [Embed(source="properties/en_US.properties", 
mimeType="application/octet-stream")]
+        private var en_US_Properties:Class;
+
+        private var cleanedUp:Boolean;
+
+        private var _mirrorURLCGI:String;
+        private var _useMirror:Boolean = true;
+        private var _latestVersion:String;
+        private var loggedVersion:Boolean;
+        private var logFile:String;
+        private var debugMode:Boolean = false;
+        private var logProgressEvents:Boolean = false;
+        private var showDevBuilds:Boolean = false;
+        private var usingDownloadCache:Boolean;
+        private var downloadCacheFolder:String;
+        private var userDefaultLanguage:String;
+        private var firstTime:Boolean = true;
+        private var legacy:Boolean = true;
+        private var nocache:Boolean = true;
+        private var wasAborted:Boolean;
+        private var newSDKSelected:Boolean = true;
+
+        public var installerAppPath:String;
+        public var installerAppFileName:String;
+
+        // loader needs to be in instance var otherwise it can get GC'd.
+        // We only load one thing at a time, so we can all share this
+        // var
+        private var loader:ApacheURLLoader;
+
+        /**
+         * Utility Singleton Instances
+         */
+        private var _md5CompareUtil:MD5CompareUtil = MD5CompareUtil.instance;
+        private var _mirrorURLUtil:MirrorURLUtil = MirrorURLUtil.instance;
+
+        /**
+         * Apache Flex binary distribution
+         *
+         * Values stored in sdk-installer-config.xml edit file to change
+         *
+         */
+        private var APACHE_FLEX_BIN_DISTRO_PATH:String;
+        private var APACHE_FLEX_BIN_DISTRO_FILE:String;
+        private var APACHE_FLEX_BIN_INSTALLER_FILE:String;
+        private var APACHE_FLEX_BIN_DISTRO_FILE_SHORT:String;
+        private var APACHE_FLEX_BIN_DISTRO_URL:String;
+        private var APACHE_FLEX_BIN_INSTALLER_URL:String;
+        [Bindable]
+        private var APACHE_FLEX_BIN_DISTRO_VERSION:String = "";
+        [Bindable]
+        private var APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY:String = "";
+
+        /**
+         * Adobe AIR SDK
+         *
+         * Values stored in sdk-installer-config.xml edit file to change
+         *
+         */
+        [Bindable]
+        private var AIR_VERSIONS:ArrayCollection = new ArrayCollection();
+        private var AIR_VERSION:String = "14.0";
+        private var ADOBE_AIR_SDK_WIN_FILE:String;
+        private var ADOBE_AIR_SDK_WIN_URL:String;
+        private var ADOBE_AIR_SDK_MAC_FILE:String;
+        private var ADOBE_AIR_SDK_MAC_URL:String;
+        private var ADOBE_AIR_SDK_LINUX_FILE:String;
+        private var ADOBE_AIR_SDK_LINUX_URL:String;
+
+        /**
+         * Adobe Flash Player
+         *
+         * Values stored in sdk-installer-config.xml edit file to change
+         *
+         */
+        [Bindable]
+        private var FLASH_PLAYER_VERSIONS:ArrayCollection = new 
ArrayCollection();
+        private var FLASH_PLAYER_VERSION:String = "11.1";
+        private var FLASH_PLAYER_SWF_VERSION:String = "14";
+        private var ADOBE_FB_GLOBALPLAYER_SWC_FILE:String;
+        private var ADOBE_FB_GLOBALPLAYER_SWC_URL:String;
+
+        /**
+         * Apache Flex
+         *
+         * Values stored in sdk-installer-config.xml edit file to change
+         *
+         */
+        [Bindable]
+        private var FLEX_VERSIONS:ArrayCollection = new ArrayCollection();
+
+        /**
+         *
+         * SwfObject
+         *
+         */
+        private var SWF_OBJECT_FILE:String;
+        private var SWF_OBJECT_URL:String;
+
+        /**
+         * Optional installs
+         *
+         */
+        private var OSMF_SWC_FILE:String;
+        private var OSMF_SWC_URL:String;
+        private var OSMF_SWF_FILE:String = "osmf.swf";
+
+        private var BLAZEDS_FILE:String;
+        private var BLAZEDS_URL:String;
+
+        private var AFE_FILE:String;
+        private var AFE_URL:String;
+        private var AGLJ40_FILE:String;
+        private var AGLJ40_URL:String;
+        private var FLEX_FONTKIT_FILE:String;
+        private var FLEX_FONTKIT_URL:String;
+        private var RIDEAU_FILE:String;
+        private var RIDEAU_URL:String;
+
+        [Bindable]
+        private var _flexHome:String;
+        private var _flexTemp:String;
+        private var _flexHomeDir:File;
+        private var _flexTempDir:File;
+        private var _apacheFlexSDKCompressedFile:File;
+        private var _adobeAIRSDKZipFile:File;
+        private var _fbGlobalPlayerDir:File;
+        private var _fbGlobalPlayerFile:File;
+        private var _blazeDSJarFile:File;
+        private var _afeJarFile:File;
+        private var _aglj40JarFile:File;
+        private var _flexFontKitJarFile:File;
+        private var _rideauJarFile:File;
+        private var _osmfSWCFile:File;
+        private var _osmfSWFFile:File;
+
+        private var _os:OS = new OS();
+        private var _loader:ApacheURLLoader;
+        private var _process:NativeProcess;
+        private var _previousDisplayedPercent:int = 0;
+        private var _fileUnzipErrorFunction:Function;
+        private var _numOptionalComponents:int = 4;
+        private var _numOptionalComponentsPermissions:int = 0;
+        private var _useOSMF2:Boolean = true;
+
+        private var languageOverride:String;
+        private var configOverride:String = "";
+        private var stepsOverride:String = "";
+        private var installOverride:String = "";
+
+        private var overlaying:Boolean;
+        private var usingXML:Object;
+        private var additionalProps:Object = {};
+        private var licensePropertyMap:Object = {};
+        private var progressLabels:XML;
+        private var installStepsData:XMLList;
+        private var compList:XMLList;
+        private var stepIDs:Vector.<String> = new Vector.<String>();
+        private var stepLabels:Vector.<String> = new Vector.<String>();
+        private var currentStep:int = 0;
+
+        private var lastLicenseItemSelected:int = 0;
+
+        private var customMenuItem1:ContextMenuItem = new 
ContextMenuItem("Show Dev Builds");
+        private var customMenuItem2:ContextMenuItem = new 
ContextMenuItem("Configure Download Cache...");
+        private var customMenuItem3:ContextMenuItem = new 
ContextMenuItem("Enable Verbose Logging");
+        private var customMenuItem4:ContextMenuItem = new 
ContextMenuItem("Enable Progress Logging");
+
+        [Bindable]
+        private var _viewResourceConstants:ViewResourceConstants;
+        [Bindable]
+        private var supportedLanguages:ArrayCollection = new ArrayCollection();
+        [Bindable]
+        private var _installationSteps:ArrayCollection = new ArrayCollection();
+        [Bindable]
+        private var _installerComponentsDataProvider:ArrayCollection = new 
ArrayCollection();
+        [Bindable]
+        private var _currentLicenseURL:String;
+        [Bindable]
+        private var _currentLicenseLabel:String;
+        [Bindable]
+        public var _messages:ArrayCollection = new ArrayCollection();
+
+        private var _lastTag:String;
+        private var _lastPublicMessage:String;
+        public function set lastPublicMessage(s:String):void
+        {
+            var tag:String;
+            var c:int;
+
+            c = s.indexOf("[");
+            if (c != -1)
+            {
+                var c2:int = s.indexOf("] ");
+                if (c2 != -1)
+                {
+                    tag = s.substring(c + 1, c2);
+                    s = s.substr(c2 + 2);
+                }
+            }
+            if (tag && tag == _lastTag && tag == "get")
+            {
+                _lastPublicMessage += "\n" + s;
+            }
+            else
+            {
+                _lastPublicMessage = s;
+            }
+            _lastTag = tag;
+            dispatchEvent(new Event("messageChanged"));
+        }
+
+        [Bindable("messageChanged")]
+        public function get lastFilteredPublicMessage():String
+        {
+            return _lastPublicMessage;
+        }
+
+        private function getInvoke():void
+        {
+            var nativeApplication:NativeApplication = 
NativeApplication.nativeApplication;
+            nativeApplication.addEventListener(InvokeEvent.INVOKE, parseArgs);
+        }
+
+        [Bindable]
+        private var _standardButtonWidth:Number = 88;
+
+        public function setButtonWidths():void
+        {
+            var calc:CalcButtonWidth = new CalcButtonWidth(hiddenButton);
+
+            calc.buttonWidth(installLogBtn);
+            calc.buttonWidth(openApacheFlexFolderBtn);
+
+            _standardButtonWidth = calc.maxButtonWidth([installBtn, browseBtn, 
closeBtn, nextBtn, firstStepBackBtn, secondStepBackBtn]);
+        }
+
+        private function parseArgs(event:InvokeEvent):void
+        {
+            for each (var s:String in event.arguments)
+            {
+                if (s.indexOf("-language=") == 0)
+                {
+                    languageOverride = s.substring(10);
+                }
+                if (s.indexOf("-config=") == 0)
+                {
+                    configOverride = s.substring(8);
+                }
+                if (s.indexOf("-install=") == 0)
+                {
+                    installOverride = s.substring(9);
+                }
+                if (s.indexOf("-steps=") == 0)
+                {
+                    stepsOverride = s.substring(7);
+                }
+                if (s.indexOf("-debug") == 0)
+                {
+                    debugMode = true;
+                }
+                if (s.indexOf("-log=") == 0)
+                {
+                    debugMode = true;
+                    logFile = s.substring(5);
+                }
+            }
+            var so:SharedObject = SharedObject.getLocal("InstallApacheFlex");
+            usingDownloadCache = so.data.usingDownloadCache;
+            downloadCacheFolder = so.data.downloadCacheFolder;
+            userDefaultLanguage = so.data.userDefaultLanguage;
+        }
+
+        protected function handleApplicationComplete(event:FlexEvent):void
+        {
+            CursorManager.setBusyCursor();
+            
loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,
 uncaughtErrorHandler);
+            addEventListener(Event.CLOSING, closeApplication);
+            updateWindow();
+            var hasInternet:Boolean = false;
+            var networkAdapters:Vector.<NetworkInterface> = 
NetworkInfo.networkInfo.findInterfaces();
+            for each (var networkAdapter:NetworkInterface in networkAdapters)
+            {
+                if (networkAdapter.active)
+                {
+                    hasInternet = true;
+                    break;
+                }
+            }
+            if (hasInternet)
+            {
+                loadXML();
+            }
+            logVersion();
+            if (!hasInternet)
+            {
+                log("Internet connection unavailable");
+                abortInstallation("Internet connection unavailable.");
+            }
+        }
+
+        private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
+        {
+            if (currentStep > 0)
+            {
+                updateActivityStep(stepLabels[currentStep - 1], 
StepItem.ERROR);
+            }
+            if (event.error is Error)
+            {
+                var error:Error = event.error as Error;
+                log(error.message);
+                log(error.getStackTrace(), -1, false);
+                abortInstallation(error.message + "\n" + 
error.getStackTrace());
+            }
+            else if (event.error is ErrorEvent)
+            {
+                var errorEvent:ErrorEvent = event.error as ErrorEvent;
+                log(errorEvent.text);
+                abortInstallation(errorEvent.text);
+            }
+            else
+            {
+                // a non-Error, non-ErrorEvent type was thrown and uncaught
+                log(event.toString());
+                abortInstallation(event.toString());
+            }
+        }
+
+        /**
+         * Define on ResourceManager all keys for translation.
+         * If some key is not present on any other language selected by user, 
the default value will be displayed
+         * on the screen
+         */
+        private function defineResourceManagerDefaultLanguage():void
+        {
+            selectDefaultLanguage();
+        }
+
+        private function getIndexOfEnUS():int
+        {
+            for (var i:int = 0; i < _langSelect.dataProvider.length; i++)
+            {
+                if (_langSelect.dataProvider.getItemAt(i).data == "en_US")
+                {
+                    return i;
+                }
+            }
+            return -1;
+        }
+
+        private function updateWindowTitle():void
+        {
+            if (_viewResourceConstants)
+            {
+                this.nativeWindow.title = 
StringUtil.substitute(_viewResourceConstants.INFO_WINDOW_TITLE, 
[APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY]);
+            }
+        }
+
+        protected function selectDefaultLanguageInEmergency():void
+        {
+            loadLanguage("en_US", loadUSInEmergencyComplete);
+        }
+
+        private function loadUSInEmergencyComplete():void
+        {
+            _viewResourceConstants = ViewResourceConstants.instance;
+            _viewResourceConstants.update();
+        }
+
+        protected function selectDefaultLanguage():void
+        {
+            loadLanguage("en_US", loadUSComplete);
+        }
+
+        private function loadUSComplete():void
+        {
+            var userLocale:String;
+
+            if (userDefaultLanguage)
+            {
+                userLocale = userDefaultLanguage;
+            }
+            else
+            {
+                userLocale = new 
StringTools(LocaleID.DEFAULT).actualLocaleIDName.replace("-", "_");
+            }
+
+            if (languageOverride)
+            {
+                userLocale = languageOverride;
+            }
+
+            loadDefaultLanguage(userLocale);
+        }
+
+        private function loadDefaultLanguage(userLocale:String):void
+        {
+            loadLanguage(userLocale, defaultLanguageLoaded);
+        }
+
+        private var languageURL:String;
+        private var languageID:String;
+
+        private function loadLanguage(userLocale:String, 
completeFunction:Function):void
+        {
+            if (languageURL && loader) // busy loading another language
+            {
+                loader.close();
+            }
+
+            if (userLocale == "en_US")
+            {
+                var ba:ByteArray = new en_US_Properties() as ByteArray;
+                var data:String = ba.readUTFBytes(ba.bytesAvailable);
+                installLanguage(userLocale, data);
+                completeFunction();
+                return;
+            }
+            var n:int = supportedLanguages.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                if (supportedLanguages[i].data == userLocale)
+                {
+                    languageID = userLocale;
+                    languageURL = supportedLanguages[i].path;
+                    var url:URLRequest = new URLRequest(languageURL);
+                    loader = new ApacheURLLoader();
+                    loader.dataFormat = URLLoaderDataFormat.TEXT;
+                    loader.addEventListener(IOErrorEvent.IO_ERROR, 
languageLoadErrorHandler);
+                    loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
languageLoadErrorHandler);
+                    loader.addEventListener(Event.COMPLETE, function 
(e:Event):void
+                    {
+                        languageURL = null;
+                        installLanguage(userLocale, loader.data);
+                        completeFunction();
+                    });
+                    loader.load(url);
+                    return;
+                }
+            }
+            completeFunction();
+        }
+
+        private function installLanguage(userLocale:String, data:String):void
+        {
+            var resource:ResourceBundle = new ResourceBundle(userLocale, 
ViewResourceConstants.BUNDLE_NAME);
+            var variables:Array;
+            if (data.indexOf("\r\n") != -1)
+            {
+                variables = data.split("\r\n");
+            }
+            else
+            {
+                variables = data.split("\n");
+            }
+            for each (var p:String in variables)
+            {
+                if (p.charAt(0) == "#")
+                {
+                    continue;
+                }
+
+                var c:int = p.indexOf("=");
+                if (c != -1)
+                {
+                    var key:String = p.substr(0, c);
+                    var value:String = p.substr(c + 1);
+                    while (value.indexOf("\\n") != -1)
+                    {
+                        value = value.replace("\\n", "\n");
+                    }
+                    resource.content[key] = value;
+                }
+            }
+
+            resourceManager.addResourceBundle(resource);
+        }
+
+        private function languageLoadErrorHandler(event:Event):void
+        {
+            log("Unable to load language file " + languageURL);
+            log(event.toString());
+            abortInstallation("Unable to load language file " + languageURL);
+        }
+
+        private function defaultLanguageLoaded():void
+        {
+            resourceManager.localeChain = 
[ViewResourceConstants.DEFAULT_LANGUAGE];
+
+            var userLocale:String;
+
+            if (userDefaultLanguage)
+            {
+                userLocale = userDefaultLanguage;
+            }
+            else
+            {
+                userLocale = new 
StringTools(LocaleID.DEFAULT).actualLocaleIDName.replace("-", "_");
+            }
+
+            if (languageOverride)
+            {
+                userLocale = languageOverride;
+            }
+            log("Using Locale: " + userLocale);
+
+            var n:int = supportedLanguages.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                if (supportedLanguages[i].data == userLocale)
+                {
+                    _langSelect.selectedIndex = i;
+
+                    resourceManager.localeChain = [userLocale, "en_US"];
+
+                    break;
+                }
+            }
+            _viewResourceConstants = ViewResourceConstants.instance;
+
+            resourceManager.addEventListener(Event.CHANGE, 
_viewResourceConstants.update);
+
+            _viewResourceConstants.update();
+            setButtonWidths();
+            directoryBtn.enabled = true;
+
+            updateWindow();
+
+            _mirrorURLUtil.logMessages = new 
LogMessagesVO(_viewResourceConstants.FETCH_MIRROR_CGI, 
_viewResourceConstants.FETCH_MIRROR_CGI_DONE,
+                    _viewResourceConstants.FETCH_MIRROR_CGI_ERROR);
+
+            _mirrorURLUtil.getMirrorURL(Constants.APACHE_FLEX_URL + 
_mirrorURLCGI, getMirrorURLResultHandler);
+            CursorManager.removeBusyCursor();
+
+            checkValidOS();
+        }
+
+        protected function updateWindow():void
+        {
+            updateWindowTitle();
+
+            this.nativeWindow.x = Screen.mainScreen.bounds.width / 2 - 
this.nativeWindow.width / 2;
+            this.nativeWindow.y = Screen.mainScreen.bounds.height / 2 - 
this.nativeWindow.height / 2;
+        }
+
+        protected function loadXML():void
+        {
+            var request:URLRequest;
+
+            if (configOverride != "")
+            {
+                request = new URLRequest(configOverride);
+            }
+            else
+            {
+                request = new URLRequest(Constants.APACHE_FLEX_URL + 
Constants.CONFIG_XML_NAME);
+                //request = new URLRequest(Constants.CONFIG_XML_NAME);
+            }
+
+            _loader = new ApacheURLLoader();
+
+            try
+            {
+                _loader.load(request);
+            }
+            catch (error:Error)
+            {
+                selectDefaultLanguageInEmergency();
+                log("Unable to load " + Constants.APACHE_FLEX_URL + 
Constants.CONFIG_XML_NAME);
+                log(_viewResourceConstants.ERROR_CONFIG_XML_LOAD + 
error.errorID + " " + error.message);
+                abortInstallation("Unable to load " + 
Constants.APACHE_FLEX_URL + Constants.CONFIG_XML_NAME);
+            }
+
+            _loader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, 
xmlLoadStatus, false, 0, true);
+            _loader.addEventListener(IOErrorEvent.IO_ERROR, xmlError, false, 
0, true);
+            _loader.addEventListener(Event.COMPLETE, xmlLoaded, false, 0, 
true);
+        }
+
+        protected function xmlLoadStatus(event:HTTPStatusEvent):void
+        {
+            if (event.status >= 400)
+            {
+                log("Unable to load " + Constants.APACHE_FLEX_URL + 
Constants.CONFIG_XML_NAME);
+                log("\tServer Status: " + event.status);
+            }
+        }
+
+        protected function xmlError(event:IOErrorEvent):void
+        {
+            selectDefaultLanguageInEmergency();
+            log("Unable to load " + Constants.APACHE_FLEX_URL + 
Constants.CONFIG_XML_NAME);
+            log(_viewResourceConstants.ERROR_CONFIG_XML_LOAD + event.errorID);
+            abortInstallation("Unable to load " + Constants.APACHE_FLEX_URL + 
Constants.CONFIG_XML_NAME + " " + event.toString());
+        }
+
+        protected function xmlLoaded(event:Event):void
+        {
+            if (setXMLVariables())
+            {
+                _langSelect.dataProvider = supportedLanguages;
+                _langSelect.selectedIndex = getIndexOfEnUS();
+                _langSelect.enabled = true;
+                defineResourceManagerDefaultLanguage();
+            }
+        }
+
+        protected function checkValidOS():void
+        {
+            if (_os.isOther())
+            {
+                log(_viewResourceConstants.ERROR_UNSUPPORTED_OPERATING_SYSTEM);
+            }
+        }
+
+        private function devBuildFilterFunction(o:Object):Boolean
+        {
+            return !o.devBuild;
+        }
+
+        private function debugModeHandler(event:Event):void
+        {
+            debugMode = true;
+            customMenuItem3.caption = "Verbose Logging Enabled";
+        }
+
+        private function debugProgressHandler(event:Event):void
+        {
+            logProgressEvents = true;
+            customMenuItem4.caption = "Logging Progress Events";
+        }
+
+        private function devBuildShowHandler(event:Event):void
+        {
+            var item:Object = flexVersion.selectedItem;
+            FLEX_VERSIONS.filterFunction = null;
+            FLEX_VERSIONS.refresh();
+            flexVersion.selectedItem = item;
+            customMenuItem1.caption = "Showing Dev Builds";
+        }
+
+        private function downloadCacheHandler(event:Event):void
+        {
+            var dlg:CacheDialog = new CacheDialog();
+            dlg.addEventListener(Event.COMPLETE, updateDownloadCache);
+            PopUpManager.addPopUp(dlg, this, true);
+            PopUpManager.centerPopUp(dlg);
+            dlg.cb.selected = usingDownloadCache;
+            dlg.folder.text = downloadCacheFolder;
+        }
+
+        private function updateDownloadCache(event:Event):void
+        {
+            downloadCacheFolder = event.target.folder.text;
+            usingDownloadCache = event.target.cb.selected;
+            var so:SharedObject = SharedObject.getLocal("InstallApacheFlex");
+            so.data.usingDownloadCache = usingDownloadCache;
+            so.data.downloadCacheFolder = downloadCacheFolder;
+            so.flush();
+        }
+
+        protected function setXMLVariables():Boolean
+        {
+            try
+            {
+                var data:XML = XML(_loader.data);
+            }
+            catch (e:Error)
+            {
+                log("Error parsing configuration file");
+                abortInstallation("Error parsing configuration file");
+                return false;
+            }
+            var keepGoing:Boolean = true;
+            if (firstTime)
+            {
+                firstTime = false;
+
+                _latestVersion = data.version.latest.toString();
+
+                installerAppPath = data.installer.(@name == 
'SDKInstallerApp')[email protected]();
+                installerAppFileName = data.installer.(@name == 
'SDKInstallerApp')[email protected]();
+
+                _mirrorURLCGI = data.mirror.(@name == 
'MirrorURLCGI')[email protected]();
+
+                
customMenuItem1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
devBuildShowHandler);
+                
customMenuItem2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
downloadCacheHandler);
+                
customMenuItem3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
debugModeHandler);
+                
customMenuItem4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
debugProgressHandler);
+
+                var contextMenuCustomItems:Array = 
ContextMenu(contextMenu).customItems;
+                contextMenuCustomItems.push(customMenuItem1);
+                contextMenuCustomItems.push(customMenuItem2);
+                contextMenuCustomItems.push(customMenuItem3);
+                contextMenuCustomItems.push(customMenuItem4);
+
+                var name:String;
+                var versionString:String;
+                var versionID:String;
+
+                var languages:XMLList = data.languages.children();
+                for each (var lang:XML in languages)
+                {
+                    var item:Object = {
+                        label: [email protected](),
+                        data: [email protected](),
+                        path: [email protected]()
+                    };
+                    supportedLanguages.addItem(item);
+                }
+
+                var airData:XMLList = data.airsdk[_os.os].versions;
+                var airVersionList:XMLList = airData[0].children();
+                var airVersions:Array = [];
+                var selected:String = airData[0]["@default"].toString();
+                for each (var airVersion:XML in airVersionList)
+                {
+                    var displayVersion:String = 
[email protected]();
+                    versionString = [email protected]();
+                    versionID = null;
+                    if ([email protected]() > 0)
+                    {
+                        versionID = [email protected]();
+                    }
+                    airVersions.push(versionString);
+                    var airPath:String = airVersion.path.toString();
+                    var airFile:String = airVersion.file.toString();
+                    AIR_VERSIONS.addItem({
+                        label: "AIR " + displayVersion, version: 
versionString, versionID: versionID,
+                        path: airPath, file: airFile
+                    });
+                }
+
+                if (this.airVersion.selectedIndex == -1)
+                {
+                    this.airVersion.selectedIndex = 
airVersions.indexOf(selected);
+                }
+
+                var flexData:XMLList = data.products.children();
+                var selectedFlexVersion:int;
+                for each (var productData:XML in flexData)
+                {
+                    var productName:String = [email protected]();
+                    var productPrefix:String = [email protected]();
+                    var productVersionList:XMLList = 
productData.versions.children();
+                    var isOverlay:Boolean = [email protected]() == 
"true";
+                    var needsAIR:Boolean = [email protected]() != 
"false";
+                    var needsFlash:Boolean = 
[email protected]() != "false";
+                    var icon:String = [email protected]();
+                    for each (var productVersion:XML in productVersionList)
+                    {
+                        var shortName:String = [email protected]();
+                        var fileName:String = shortName + (_os.isWindows() ? 
Constants.ARCHIVE_EXTENSION_WIN : Constants.ARCHIVE_EXTENSION_MAC);
+                        versionString = [email protected]();
+                        var label:String = productName + " " + versionString;
+                        var ver:String = 
fileName.substr(productPrefix.length).split("-")[0];
+                        var path:String = [email protected]();
+                        var devBuild:Boolean = [email protected]() 
== "true";
+                        var legacy:Boolean = [email protected]() 
== "true";
+                        var nocache:Boolean = 
[email protected]() == "true";
+                        if (productVersion["@default"].length() == 1)
+                        {
+                            selectedFlexVersion = FLEX_VERSIONS.length;
+                        }
+                        FLEX_VERSIONS.addItem({
+                            shortName: shortName, fileName: fileName, label: 
label, version: ver,
+                            path: path, overlay: isOverlay, prefix: 
productPrefix, legacy: legacy, nocache: nocache,
+                            needsAIR: needsAIR, needsFlash: needsFlash, 
devBuild: devBuild, icon: icon
+                        });
+                    }
+                }
+
+                FLEX_VERSIONS.filterFunction = devBuildFilterFunction;
+                FLEX_VERSIONS.refresh();
+                flexVersion.validateNow();
+
+                if (this.flexVersion.selectedIndex == -1)
+                {
+                    this.flexVersion.selectedIndex = selectedFlexVersion;
+                }
+
+                var selectedFlexVersionObject:Object = 
this.flexVersion.selectedItem;
+                updateFlexVersionStrings(selectedFlexVersionObject);
+
+                if (!APACHE_FLEX_BIN_DISTRO_FILE || 
!APACHE_FLEX_BIN_DISTRO_PATH)
+                {
+                    log(_viewResourceConstants.ERROR_INVALID_SDK_URL);
+                    keepGoing = false;
+                }
+
+                var flashData:XMLList = data.flashsdk.versions;
+                var flashVersionList:XMLList = flashData[0].children();
+                var flashPlayerVersions:Array = [];
+                selected = flashData[0]["@default"].toString();
+                for each (var flashVersion:XML in flashVersionList)
+                {
+                    displayVersion = [email protected]();
+                    versionString = [email protected]();
+                    versionID = null;
+                    if ([email protected]() > 0)
+                    {
+                        versionID = [email protected]();
+                    }
+                    flashPlayerVersions.push(versionString);
+                    if (!_os.isLinux() || Number(versionString) <= 11.2)
+                    {
+                        var swfVersion:String = 
flashVersion.swfversion.toString();
+                        var flashPath:String = flashVersion.path.toString();
+                        var flashFile:String = flashVersion.file.toString();
+                        FLASH_PLAYER_VERSIONS.addItem({
+                            label: "Flash Player " + displayVersion, version: 
versionString, swfVersion: swfVersion,
+                            versionID: versionID, path: flashPath, file: 
flashFile
+                        });
+                    }
+                }
+
+                if (this.flashPlayerVersion.selectedIndex == -1)
+                {
+                    this.flashPlayerVersion.selectedIndex = 
flashPlayerVersions.indexOf(selected);
+                }
+            }
+
+            ADOBE_AIR_SDK_WIN_FILE = 
data.airsdk.windows.versions.children().(@version == 
AIR_VERSION).file.toString();
+            ADOBE_AIR_SDK_WIN_URL = 
data.airsdk.windows.versions.children().(@version == 
AIR_VERSION).path.toString();
+            if (_os.isWindows() && (!ADOBE_AIR_SDK_WIN_FILE || 
!ADOBE_AIR_SDK_WIN_URL))
+            {
+                log(_viewResourceConstants.ERROR_INVALID_AIR_SDK_URL_WINDOWS);
+                keepGoing = false;
+            }
+            ADOBE_AIR_SDK_WIN_URL += ADOBE_AIR_SDK_WIN_FILE;
+
+            ADOBE_AIR_SDK_MAC_FILE = 
data.airsdk.mac.versions.children().(@version == AIR_VERSION).file.toString();
+            ADOBE_AIR_SDK_MAC_URL = 
data.airsdk.mac.versions.children().(@version == AIR_VERSION).path.toString();
+            if (_os.isMac() && (!ADOBE_AIR_SDK_MAC_FILE || 
!ADOBE_AIR_SDK_MAC_URL))
+            {
+                log(_viewResourceConstants.ERROR_INVALID_AIR_SDK_URL_MAC);
+                keepGoing = false;
+            }
+            ADOBE_AIR_SDK_MAC_URL += ADOBE_AIR_SDK_MAC_FILE;
+
+            ADOBE_AIR_SDK_LINUX_FILE = 
data.airsdk.linux.versions.children().(@version == AIR_VERSION).file.toString();
+            ADOBE_AIR_SDK_LINUX_URL = 
data.airsdk.linux.versions.children().(@version == AIR_VERSION).path.toString();
+            if (_os.isLinux() && (!ADOBE_AIR_SDK_LINUX_FILE || 
!ADOBE_AIR_SDK_LINUX_URL))
+            {
+                log(_viewResourceConstants.ERROR_INVALID_AIR_SDK_URL_LINUX);
+                keepGoing = false;
+            }
+            ADOBE_AIR_SDK_LINUX_URL += ADOBE_AIR_SDK_LINUX_FILE;
+
+            ADOBE_FB_GLOBALPLAYER_SWC_FILE = 
data.flashsdk.versions.children().(@version == 
FLASH_PLAYER_VERSION).file.toString();
+            ADOBE_FB_GLOBALPLAYER_SWC_URL = 
data.flashsdk.versions.children().(@version == 
FLASH_PLAYER_VERSION).path.toString();
+            FLASH_PLAYER_SWF_VERSION = 
data.flashsdk.versions.children().(@version == 
FLASH_PLAYER_VERSION).swfversion.toString();
+            if (!ADOBE_FB_GLOBALPLAYER_SWC_FILE || 
!ADOBE_FB_GLOBALPLAYER_SWC_URL)
+            {
+                log(_viewResourceConstants.ERROR_INVALID_FLASH_PLAYER_SWC_URL);
+                keepGoing = false;
+            }
+            ADOBE_FB_GLOBALPLAYER_SWC_URL += ADOBE_FB_GLOBALPLAYER_SWC_FILE;
+
+            SWF_OBJECT_FILE = [email protected]();
+            SWF_OBJECT_URL = [email protected]();
+
+            //Supporting OSMF 2.0 from 4.11 onwards.  
+            if (APACHE_FLEX_BIN_DISTRO_VERSION == "4.9.1" || 
APACHE_FLEX_BIN_DISTRO_VERSION == "4.10.0")
+            {
+                OSMF_SWC_FILE = [email protected]();
+                OSMF_SWC_URL = [email protected]();
+                _useOSMF2 = false;
+            }
+            else
+            {
+                OSMF_SWC_FILE = data["OSMF_SWC_2.0"][email protected]();
+                OSMF_SWC_URL = data["OSMF_SWC_2.0"][email protected]();
+                _useOSMF2 = true;
+            }
+
+            BLAZEDS_FILE = [email protected]();
+            BLAZEDS_URL = [email protected]();
+
+            AFE_FILE = [email protected]();
+            AFE_URL = [email protected]();
+
+            AGLJ40_FILE = [email protected]();
+            AGLJ40_URL = [email protected]();
+
+            FLEX_FONTKIT_FILE = data.fontswf["flex-fontkit"][email protected]();
+            FLEX_FONTKIT_URL = data.fontswf["flex-fontkit"][email protected]();
+
+            RIDEAU_FILE = [email protected]();
+            RIDEAU_URL = [email protected]();
+
+
+            return keepGoing;
+        }
+
+        protected function 
updateFlexVersionStrings(selectedFlexVersionObject:Object):void
+        {
+            APACHE_FLEX_BIN_DISTRO_FILE_SHORT = 
selectedFlexVersionObject.shortName;
+            APACHE_FLEX_BIN_DISTRO_VERSION = selectedFlexVersionObject.version;
+            APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY = 
selectedFlexVersionObject.label;
+
+            APACHE_FLEX_BIN_DISTRO_FILE = selectedFlexVersionObject.fileName;
+            APACHE_FLEX_BIN_DISTRO_PATH = selectedFlexVersionObject.path;
+            legacy = selectedFlexVersionObject.legacy;
+            nocache = selectedFlexVersionObject.nocache;
+            APACHE_FLEX_BIN_INSTALLER_FILE = selectedFlexVersionObject.prefix 
+ "installer-config.xml";
+
+            // ApacheFlex is full URL so download directly and dont use mirror 
useful for testing release candidates
+            if (APACHE_FLEX_BIN_DISTRO_PATH.indexOf("http") == 0)
+            {
+                _useMirror = false;
+            }
+            else
+            {
+                _useMirror = true;
+            }
+
+            newSDKSelected = true;
+        }
+
+        private function useMirrorPath(path:String):String
+        {
+            if (_useMirror)
+            {
+                return path;
+            }
+
+            return "";
+        }
+
+        private function getMirrorURLResultHandler():void
+        {
+            var logMessages:ArrayCollection = ILog(_mirrorURLUtil).log;
+            var i:int;
+            var n:int = logMessages.length;
+            for (i = 0; i < n; i++)
+            {
+                log(String(logMessages.getItemAt(i)));
+            }
+
+            if (_mirrorURLUtil.errorOccurred)
+            {
+                abortInstallation("mirrorURLUtil.errorOccurred");
+                main();
+            }
+            else
+            {
+                updatePaths();
+            }
+
+        }
+
+        protected function updatePaths():void
+        {
+            if (APACHE_FLEX_BIN_DISTRO_PATH.substr(0, 
Constants.URL_PREFIX.length) == Constants.URL_PREFIX
+                    || APACHE_FLEX_BIN_DISTRO_PATH.substr(0, 
Constants.FILE_PREFIX.length) == Constants.FILE_PREFIX
+                    || APACHE_FLEX_BIN_DISTRO_PATH.substr(0, 
Constants.HTTPS_PREFIX.length) == Constants.HTTPS_PREFIX)
+            {
+                APACHE_FLEX_BIN_DISTRO_URL = APACHE_FLEX_BIN_DISTRO_PATH + 
APACHE_FLEX_BIN_DISTRO_FILE;
+                if (stepsOverride != "")
+                {
+                    APACHE_FLEX_BIN_INSTALLER_URL = stepsOverride;
+                }
+                else
+                {
+                    APACHE_FLEX_BIN_INSTALLER_URL = 
APACHE_FLEX_BIN_DISTRO_PATH + APACHE_FLEX_BIN_INSTALLER_FILE;
+                }
+            }
+            else
+            {
+                APACHE_FLEX_BIN_DISTRO_URL = 
useMirrorPath(_mirrorURLUtil.mirrorURL) + APACHE_FLEX_BIN_DISTRO_PATH + 
APACHE_FLEX_BIN_DISTRO_FILE;
+                if (stepsOverride != "")
+                {
+                    APACHE_FLEX_BIN_INSTALLER_URL = stepsOverride;
+                }
+                else
+                {
+                    APACHE_FLEX_BIN_INSTALLER_URL = MD5CompareUtil.MD5_DOMAIN 
+ APACHE_FLEX_BIN_DISTRO_PATH + APACHE_FLEX_BIN_INSTALLER_FILE;
+                }
+            }
+
+            if (installerAppPath.substr(0, Constants.URL_PREFIX.length) != 
Constants.URL_PREFIX)
+            {
+                installerAppPath = useMirrorPath(_mirrorURLUtil.mirrorURL) + 
installerAppPath;
+            }
+
+            main();
+        }
+
+        protected function main():void
+        {
+
+            if (shouldUpdate())
+            {
+                doUpdate();
+            }
+        }
+
+        private function logVersion():void
+        {
+            if (!loggedVersion)
+            {
+                //Current version
+                var applicationDescriptor:XML = 
NativeApplication.nativeApplication.applicationDescriptor;
+                var xmlns:Namespace = new 
Namespace(applicationDescriptor.namespace());
+                var currentVersion:String = 
applicationDescriptor.xmlns::versionNumber.toString();
+
+                // Log the Installer version to help with any support issues 
that arise.
+                log("Installer version " + currentVersion + " (" + _os.os + 
")", 0);
+                loggedVersion = true;
+            }
+        }
+
+        protected function shouldUpdate():Boolean
+        {
+            var shouldUpdate:Boolean = false;
+            //Current version
+            var applicationDescriptor:XML = 
NativeApplication.nativeApplication.applicationDescriptor;
+            var xmlns:Namespace = new 
Namespace(applicationDescriptor.namespace());
+            var currentVersion:String = 
applicationDescriptor.xmlns::versionNumber.toString();
+
+            logVersion();
+
+            var availBuildNumbers:Array = _latestVersion.split(".");
+            var currentBuildNumbers:Array = currentVersion.split(".");
+
+            if (parseInt(availBuildNumbers[0]) > 
parseInt(currentBuildNumbers[0]))
+            {
+                return true;
+            }
+            else if (parseInt(availBuildNumbers[0]) == 
parseInt(currentBuildNumbers[0]))
+            {
+                if (parseInt(availBuildNumbers[1]) > 
parseInt(currentBuildNumbers[1]))
+                {
+                    return true;
+                }
+                else if (parseInt(availBuildNumbers[1]) == 
parseInt(currentBuildNumbers[1]))
+                {
+                    if (parseInt(availBuildNumbers[2]) > 
parseInt(currentBuildNumbers[2]))
+                    {
+                        return true;
+                    }
+                }
+            }
+            return false;
+
+        }
+
+        protected function doUpdate():void
+        {
+            var updaterDialog:UpdaterDialog = 
UpdaterDialog(PopUpManager.createPopUp(this, UpdaterDialog, true));
+            updaterDialog.addEventListener("close", handleUpdaterDialogClose);
+            updaterDialog.latestVersion = _latestVersion;
+            PopUpManager.centerPopUp(updaterDialog);
+        }
+
+        protected function handleUpdaterDialogClose(event:Event):void
+        {
+            PopUpManager.removePopUp(IFlexDisplayObject(event.target));
+        }
+
+        protected function handleInstallBtnClick(event:MouseEvent):void
+        {
+            var airVersionID:String = airVersion.selectedItem.versionID;
+            var flashVersionID:String = 
flashPlayerVersion.selectedItem.versionID;
+
+            log("SDK version " + APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY);
+
+            if (flexVersion.selectedItem.needsAIR)
+            {
+                if (airVersionID)
+                {
+                    log("AIR version " + airVersionID);
+                }
+                else
+                {
+                    log("AIR version " + AIR_VERSION);
+                }
+            }
+
+            if (flexVersion.selectedItem.needsFlash)
+            {
+                if (flashVersionID)
+                {
+                    log("Flash Player version " + flashVersionID);
+                }
+                else
+                {
+                    log("Flash Player version " + FLASH_PLAYER_VERSION);
+                }
+            }
+
+            if (flexSDKTxtInput.text == "")
+            {
+                log(_viewResourceConstants.INFO_ENTER_VALID_FLEX_SDK_PATH);
+            }
+            else
+            {
+                _langSelect.enabled = false;
+                _flexHome = flexSDKTxtInput.text;
+                resetInstallStepsActivity();
+                addOptionalComponentsToInstallSteps();
+                this.currentState = "installState";
+                install();
+            }
+        }
+
+        protected function handleZeroStepNextBtnClick(event:MouseEvent):void
+        {
+            directoryBtn.enabled = false;
+
+            AIR_VERSION = airVersion.selectedItem.version;
+            var airVersionID:String = airVersion.selectedItem.versionID;
+            FLASH_PLAYER_VERSION = flashPlayerVersion.selectedItem.version;
+            var flashVersionID:String = 
flashPlayerVersion.selectedItem.versionID;
+
+            setXMLVariables(); // as AIR and Flash version may of changed
+
+            if (!legacy)
+            {
+                if (newSDKSelected)
+                {
+                    var req:URLRequest = new 
URLRequest(APACHE_FLEX_BIN_INSTALLER_URL);
+                    loader = new ApacheURLLoader();
+                    loader.dataFormat = URLLoaderDataFormat.TEXT;
+                    loader.addEventListener(Event.COMPLETE, 
handleInstallerXMLLoaded);
+                    loader.addEventListener(ErrorEvent.ERROR, 
handleInstallerXMLError);
+                    loader.addEventListener(IOErrorEvent.IO_ERROR, 
handleInstallerXMLError);
+
+                    loader.load(req);
+                }
+            }
+            else
+            {
+                showDirectoryState();
+            }
+        }
+
+        protected function handleFirstStepBackBtnClick(event:MouseEvent):void
+        {
+            showDefaultState();
+        }
+
+        protected function handleSecondStepBackBtnClick(event:MouseEvent):void
+        {
+            showDirectoryState();
+        }
+
+        protected function handleFirstStepNextBtnClick(event:MouseEvent):void
+        {
+            // Quick check to see if the selected directory is writable
+            try
+            {
+                var f:File = new File(_flexHome + File.separator + "flex.txt");
+                checkDirWritable(f);
+            }
+            catch (e:Error)
+            {
+                
log(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY);
+                flexSDKTxtInput.errorString = 
_viewResourceConstants.ERROR_DIR_REQUIRE_ADMIN_RIGHTS;
+                flexSDKTxtInput.prompt = 
_viewResourceConstants.ERROR_DIR_REQUIRE_ADMIN_RIGHTS;
+                
updateActivityStep(_viewResourceConstants.STEP_CREATE_DIRECTORIES, 
StepItem.ERROR);
+                return;
+            }
+
+            showOptionsState();
+        }
+
+        protected function handleInstallerXMLLoaded(event:Event):void
+        {
+            var data:XML = XML(event.target.data);
+            var localeList:Array = resourceManager.localeChain;
+            _installerComponentsDataProvider = new ArrayCollection();
+            compList = data.component.copy();
+            for each (var comp:XML in compList)
+            {
+                var vo:InstallerComponentVO = new 
InstallerComponentVO(getLocalizedString(comp, "label"),
+                        getLocalizedString(comp, "message"), 
getLocalizedString(comp, "license"),
+                        getLocalizedString(comp, "licenseURL"),
+                        [email protected](), [email protected]() == 
"true");
+                licensePropertyMap[[email protected]()] = vo;
+                _installerComponentsDataProvider.addItem(vo);
+            }
+            usingXML = true;
+            // progressLabels = data.progressLabels[0];
+            installStepsData = data.steps.step;
+            var strings:XMLList = data.strings.string;
+            for each (var x:XML in strings)
+            {
+                var id:String = [email protected]();
+                if (id in _viewResourceConstants)
+                {
+                    var val:String = getLocalizedString(x, null);
+                    _viewResourceConstants[id] = val;
+                    var pce:PropertyChangeEvent = 
PropertyChangeEvent.createUpdateEvent(this, id, "", val);
+                    _viewResourceConstants.dispatchEvent(pce);
+                }
+            }
+            var props:XMLList = data.properties.property;
+            for each (x in props)
+            {
+                additionalProps[[email protected]()] = [email protected]();
+            }
+            currentState = "directoryState";
+        }
+
+        private function getLocalizedString(xml:XML, propName:String):String
+        {
+            var compBundle:XMLList;
+            for each (var locale:String in resourceManager.localeChain)
+            {
+                compBundle = xml[locale];
+                if (compBundle.length() == 1)
+                {
+                    if (propName)
+                    {
+                        var xmlList:XMLList = compBundle[0][propName];
+                        if (xmlList.length() == 1)
+                        {
+                            return xmlList[0].toString();
+                        }
+                    }
+                    else
+                    {
+                        var s:String = compBundle[0].toString();
+                        if (s.length > 0)
+                        {
+                            return s;
+                        }
+                    }
+                }
+            }
+            return "";
+        }
+
+        protected function handleInstallerXMLError(event:Event):void
+        {
+            log("Unable to load " + APACHE_FLEX_BIN_INSTALLER_URL);
+            abortInstallation("Unable to load " + 
APACHE_FLEX_BIN_INSTALLER_URL);
+        }
+
+        protected function showDefaultState():void
+        {
+            zeroStepGroup.visible = true;
+            directoryBtn.enabled = true;
+            currentState = "default";
+        }
+
+        protected function showDirectoryState():void
+        {
+            initiateInstallStepsActivity();
+            if (currentState != "optionsState")
+            {
+                initializeInstallerComponentsDataProvider();
+            }
+            currentState = "directoryState";
+        }
+
+        protected function showOptionsState():void
+        {
+            currentState = "optionsState";
+            checkIfAllRequiredComponentsPromptsAnswered();
+        }
+
+        protected function initiateInstallStepsActivity():void
+        {
+            _installationSteps = new ArrayCollection();
+
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_CREATE_DIRECTORIES));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_VERIFY_FLEX_SDK));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_UNZIP_FLEX_SDK));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_UNZIP_AIR_RUNTIME_KIT));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_FLASH_PLAYER_GLOBAL_SWC));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_INSTALL_CONFIG_FILES));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_SWFOBJECT));
+            _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_OSMF));
+        }
+
+        protected function resetInstallStepsActivity():void
+        {
+            for each(var step:StepItem in _installationSteps)
+            {
+                step.status = StepItem.NORMAL;
+            }
+        }
+
+        protected function addOptionalComponentsToInstallSteps():void
+        {
+            if (usingXML)
+            {
+                _installationSteps = new ArrayCollection();
+
+                _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_CREATE_DIRECTORIES));
+                _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK));
+                _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_VERIFY_FLEX_SDK));
+                _installationSteps.addItem(new 
StepItem(_viewResourceConstants.STEP_UNZIP_FLEX_SDK));
+
+                for each (var stepData:XML in installStepsData)
+                {
+                    var propName:String = [email protected]();
+                    if (!propName || 
InstallerComponentVO(licensePropertyMap[propName]).selected)
+                    {
+                        var si:StepItem = new 
StepItem(getLocalizedString(stepData, null));
+                        _installationSteps.addItem(si);
+                        stepIDs.push([email protected]());
+                        stepLabels.push(si.label);
+                    }
+                }
+                return;
+            }
+            for each (var obj:InstallerComponentVO in 
_installerComponentsDataProvider)
+            {
+                if (!obj.required && obj.selected)
+                {
+                    _installationSteps.addItem(new StepItem(obj.label));
+                }
+            }
+        }
+
+        protected function initializeInstallerComponentsDataProvider():void
+        {
+            var versionNum:int = 
int(APACHE_FLEX_BIN_DISTRO_VERSION.split('.').join(''));
+            _installerComponentsDataProvider = new ArrayCollection();
+            /**
+             * version 4.13.0 of the SDK is when the installer started using 
the new xml based
+             * way of displaying/updating required or optional components of 
the installer
+             */
+            if (usingXML && (versionNum >= 4130))
+            {
+                for each (var comp:XML in compList)
+                {
+                    var vo:InstallerComponentVO = new 
InstallerComponentVO(getLocalizedString(comp, "label"),
+                            getLocalizedString(comp, "message"), 
getLocalizedString(comp, "license"),
+                            getLocalizedString(comp, "licenseURL"),
+                            [email protected](), [email protected]() == 
"true");
+                    licensePropertyMap[[email protected]()] = vo;
+                    _installerComponentsDataProvider.addItem(vo);
+                }
+            }
+            else
+            {
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
+                        _viewResourceConstants.ASK_APACHE_FLEX, 
_viewResourceConstants.LICENSE_APACHE_V2,
+                        _viewResourceConstants.LICENSE_URL_APACHE_V2,
+                        "STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK", true));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK,
+                        _viewResourceConstants.ASK_ADOBE_AIR_SDK,
+                        _viewResourceConstants.LICENSE_ADOBE_AIR_SDK,
+                        _viewResourceConstants.LICENSE_URL_ADOBE_AIR_SDK,
+                        "STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK", true));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_FLASH_PLAYER_GLOBAL_SWC,
+                        
_viewResourceConstants.ASK_ADOBE_FLASH_PLAYER_GLOBAL_SWC,
+                        _viewResourceConstants.LICENSE_ADOBE_SDK,
+                        _viewResourceConstants.LICENSE_URL_ADOBE_SDK,
+                        "STEP_REQUIRED_INSTALL_FLASH_PLAYER_GLOBAL_SWC", 
true));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_SWFOBJECT,
+                        _viewResourceConstants.ASK_SWFOBJECT,
+                        _viewResourceConstants.LICENSE_SWFOBJECT,
+                        _viewResourceConstants.LICENSE_URL_SWFOBJECT,
+                        "STEP_REQUIRED_INSTALL_SWFOBJECT", true));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_OSMF,
+                        _viewResourceConstants.ASK_OSMF,
+                        _viewResourceConstants.LICENSE_OSMF,
+                        _viewResourceConstants.LICENSE_URL_OSMF,
+                        "STEP_REQUIRED_INSTALL_OSMF", true));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_OPTIONAL_INSTALL_BLAZEDS,
+                        _viewResourceConstants.ASK_BLAZEDS,
+                        _viewResourceConstants.LICENSE_BLAZEDS,
+                        _viewResourceConstants.LICENSE_URL_BLAZEDS,
+                        "STEP_OPTIONAL_INSTALL_BLAZEDS", false));
+                _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_OPTIONAL_INSTALL_FONTSWF,
+                        _viewResourceConstants.ASK_FONTSWF,
+                        _viewResourceConstants.LICENSE_FONTSWF,
+                        _viewResourceConstants.LICENSE_URL_FONTSWF,
+                        "STEP_OPTIONAL_INSTALL_FONTSWF", false));
+//              _installerComponentsDataProvider.addItem(new 
InstallerComponentVO(_viewResourceConstants.STEP_REQUIRED_INSTALL_OFL_FONTS,
+//                      _viewResourceConstants.ASK_OFL_FONTS,
+//                      _viewResourceConstants.LICENSE_OFL_FONTS,
+//                      _viewResourceConstants.LICENSE_URL_OFL_FONTS,
+//                      "STEP_REQUIRED_INSTALL_OFL_FONTS", true));
+            }
+        }
+
+        protected function install():void
+        {
+            createDirectories();
+        }
+
+        protected function handleAirVersionChange(event:Event):void
+        {
+            AIR_VERSION = airVersion.selectedItem.version;
+
+            // Match AIR and Flash versions
+            if (flashPlayerVersion.selectedIndex != airVersion.selectedIndex)
+            {
+                flashPlayerVersion.selectedIndex = airVersion.selectedIndex;
+                FLASH_PLAYER_VERSION = 
FLASH_PLAYER_VERSIONS[airVersion.selectedIndex].version;
+            }
+        }
+
+        protected function handleFlashPlayerVersionChange(event:Event):void
+        {
+            FLASH_PLAYER_VERSION = flashPlayerVersion.selectedItem.version;
+
+            // Match AIR and Flash versions
+            if (airVersion.selectedIndex != flashPlayerVersion.selectedIndex)
+            {
+                airVersion.selectedIndex = flashPlayerVersion.selectedIndex;
+                AIR_VERSION = 
AIR_VERSIONS[flashPlayerVersion.selectedIndex].version;
+            }
+        }
+
+        protected function handleFlexVersionChange(event:Event):void
+        {
+            /*APACHE_FLEX_BIN_DISTRO_VERSION =  
flexVersion.selectedItem.version;
+             APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY = 
flexVersion.selectedItem.label;*/
+            var item:Object = flexVersion.selectedItem;
+            airVersion.enabled = item.needsAIR;
+            flashPlayerVersion.enabled = item.needsFlash;
+            updateFlexVersionStrings(item);
+            updatePaths();
+            updateWindowTitle();
+            InstallApacheFlexSkin(skin).textIcon.source = item.icon;
+        }
+
+        protected function browseForSDK(event:MouseEvent):void
+        {
+            var file:File = new File();
+
+            file.addEventListener(Event.SELECT, flexSDKDirSelected, false, 0, 
true);
+            
file.browseForDirectory(_viewResourceConstants.INFO_SELECT_DIRECTORY);
+        }
+
+        protected function checkDirWritable(file:File):void
+        {
+            var ba:ByteArray = new ByteArray();
+            ba.writeUTFBytes("1");
+            writeFileToDirectory(file, ba);
+            file.deleteFile();
+        }
+
+        protected function flexSDKDirSelected(event:Event):void
+        {
+            var selectedDir:File = File(event.target);
+            var overlay:Boolean = flexVersion.selectedItem.overlay;
+
+            // Quick check to see if the selected directory is writable
+            try
+            {
+                var f:File = new File(selectedDir.nativePath + File.separator 
+ "flex.txt");
+                checkDirWritable(f);
+            }
+            catch (e:Error)
+            {
+                
log(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY);
+                log(_viewResourceConstants.ERROR_DIR_REQUIRE_ADMIN_RIGHTS);
+                flexSDKTxtInput.text = selectedDir.nativePath;
+                flexSDKTxtInput.errorString = 
_viewResourceConstants.ERROR_DIR_REQUIRE_ADMIN_RIGHTS + " : " + 
selectedDir.nativePath; // tooltip
+                flexSDKTxtInput.prompt = 
_viewResourceConstants.ERROR_DIR_REQUIRE_ADMIN_RIGHTS; // field
+                
updateActivityStep(_viewResourceConstants.STEP_CREATE_DIRECTORIES, 
StepItem.ERROR);
+                return;
+            }
+
+            overlaying = overlay;
+            if (!overlay)
+            {
+                if (isDirectoryEmpty(selectedDir))
+                {
+                    _flexHome = selectedDir.nativePath;
+                    flexSDKTxtInput.text = _flexHome;
+                    nextBtn.enabled = true;
+                    _langSelect.enabled = true;
+                    flexSDKTxtInput.errorString = "";
+                    flexSDKTxtInput.prompt = 
_viewResourceConstants.SELECT_PATH_PROMPT;
+                }
+                else
+                {
+                    nextBtn.enabled = false;
+                    flexSDKTxtInput.text = selectedDir.nativePath;
+                    flexSDKTxtInput.errorString = 
_viewResourceConstants.ERROR_DIR_NOT_EMPTY + " : " + selectedDir.nativePath;
+                    flexSDKTxtInput.prompt = 
_viewResourceConstants.ERROR_DIR_NOT_EMPTY;
+                }
+            }
+            else
+            {
+                _flexHome = selectedDir.nativePath;
+                flexSDKTxtInput.text = _flexHome;
+                nextBtn.enabled = true;
+                _langSelect.enabled = true;
+                flexSDKTxtInput.errorString = "";
+                flexSDKTxtInput.prompt = 
_viewResourceConstants.SELECT_PATH_PROMPT;
+            }
+        }
+
+        protected function 
handleFlexSDXTxtInputChange(event:TextOperationEvent):void
+        {
+            var tempDir:File;
+            var path:String = flexSDKTxtInput.text;
+
+            try
+            {
+                tempDir = new File(path);
+
+                if (isDirectoryEmpty(tempDir))
+                {
+                    flexSDKTxtInput.errorString = "";
+                    _flexHome = path;
+                    nextBtn.enabled = true;
+                    _langSelect.enabled = true;
+                }
+                else
+                {
+                    flexSDKTxtInput.errorString = 
_viewResourceConstants.ERROR_INVALID_FLEX_SDK_DIRECTORY;
+                    nextBtn.enabled = false;
+                }
+            }
+            catch (e:Error)
+            {
+                flexSDKTxtInput.errorString = 
_viewResourceConstants.ERROR_INVALID_FLEX_SDK_DIRECTORY;
+                nextBtn.enabled = false;
+            }
+        }
+
+        protected function createDirectories():void
+        {
+            updateActivityStep(_viewResourceConstants.STEP_CREATE_DIRECTORIES, 
StepItem.ACTIVE);
+
+            try
+            {
+                if (!overlaying)
+                {
+                    log(_viewResourceConstants.INFO_CREATING_FLEX_HOME);
+                }
+                _flexHomeDir = createFolder(_flexHome);
+                log(_viewResourceConstants.INFO_CREATING_TEMP_DIR);
+                _flexTemp = _flexHome + File.separator + "temp";
+                _flexTempDir = createFolder(_flexTemp);
+                
updateActivityStep(_viewResourceConstants.STEP_CREATE_DIRECTORIES, 
StepItem.COMPLETE);
+                downloadApacheFlexSDK();
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_CREATE_DIRECTORIES, 
StepItem.ERROR);
+                
log(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY);
+                
abortInstallation(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY);
+            }
+        }
+
+        protected function downloadApacheFlexSDK():void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
 StepItem.ACTIVE);
+
+            try
+            {
+                log(_viewResourceConstants.INFO_DOWNLOADING_FLEX_SDK + 
APACHE_FLEX_BIN_DISTRO_URL);
+                _apacheFlexSDKCompressedFile = 
File.userDirectory.resolvePath(_flexTemp + File.separator + 
APACHE_FLEX_BIN_DISTRO_FILE);
+                copyOrDownload(APACHE_FLEX_BIN_DISTRO_URL, 
handleApacheFlexSDKDownload, _apacheFlexSDKCompressedFile, 
handleApacheFlexSDKDownloadError, nocache);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
 StepItem.ERROR);
+                
log(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY + "(error: " + 
e.message);
+                
abortInstallation(_viewResourceConstants.ERROR_UNABLE_TO_CREATE_TEMP_DIRECTORY 
+ "(error: " + e.message);
+            }
+
+        }
+
+        protected function handleApacheFlexSDKDownload(event:Event):void
+        {
+            try
+            {
+                writeFileToDirectory(_apacheFlexSDKCompressedFile, 
event.target.data);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
 StepItem.ERROR);
+                abortInstallation("handleApacheFlexSDKDownload " + e.message);
+            }
+
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
 StepItem.COMPLETE);
+
+            updateActivityStep(_viewResourceConstants.STEP_VERIFY_FLEX_SDK, 
StepItem.ACTIVE);
+
+            log(_viewResourceConstants.STEP_VERIFY_FLEX_SDK);
+
+            _md5CompareUtil.addEventListener(ProgressEvent.PROGRESS, 
md5VerificationProgressHandler);
+            _md5CompareUtil.verifyMD5(_apacheFlexSDKCompressedFile, 
APACHE_FLEX_BIN_DISTRO_PATH + APACHE_FLEX_BIN_DISTRO_FILE, 
uncompressApacheFlexSDK);
+        }
+
+        protected function 
md5VerificationProgressHandler(event:ProgressEvent):void
+        {
+            if (logProgressEvents)
+            {
+                log("md5 progress " + event.bytesLoaded + "  " + 
event.bytesTotal, -1, false);
+            }
+            if (event.bytesTotal > 0)
+            {
+                progressBar.percent = Math.round((event.bytesLoaded / 
event.bytesTotal) * 100);
+            }
+        }
+
+        protected function handleApacheFlexSDKDownloadError(event:* = 
null):void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_APACHE_FLEX_SDK,
 StepItem.ERROR);
+            log(_viewResourceConstants.ERROR_UNABLE_TO_DOWNLOAD_FLEX_SDK);
+            
abortInstallation(_viewResourceConstants.ERROR_UNABLE_TO_DOWNLOAD_FLEX_SDK);
+        }
+
+        protected function uncompressApacheFlexSDK():void
+        {
+            if (_md5CompareUtil.validMD5)
+            {
+                if (!_md5CompareUtil.fileIsVerified)
+                {
+                    
updateActivityStep(_viewResourceConstants.STEP_VERIFY_FLEX_SDK, StepItem.ERROR);
+
+                    log(_viewResourceConstants.ERROR_VERIFY_FLEX_SDK);
+
+                    
abortInstallation(_viewResourceConstants.ERROR_VERIFY_FLEX_SDK);
+                    return;
+                }
+                else
+                {
+                    
updateActivityStep(_viewResourceConstants.STEP_VERIFY_FLEX_SDK, 
StepItem.COMPLETE);
+                    log(_viewResourceConstants.INFO_VERIFY_FLEX_SDK_DONE);
+                }
+            }
+            else
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_VERIFY_FLEX_SDK, 
StepItem.COMPLETE);
+
+                log(_viewResourceConstants.INFO_VERIFY_FLEX_SDK_DONE);
+            }
+
+            updateActivityStep(_viewResourceConstants.STEP_UNZIP_FLEX_SDK, 
StepItem.ACTIVE);
+
+            try
+            {
+                log(_viewResourceConstants.INFO_UNZIPPING + 
_apacheFlexSDKCompressedFile.nativePath);
+
+                if (_os.isWindows())
+                {
+                    unzip(_apacheFlexSDKCompressedFile, 
handleApacheFlexSDKZipFileUnzipComplete, handleApacheFlexSDKZipFileUnzipError);
+                }
+                else
+                {
+                    untar(_apacheFlexSDKCompressedFile, _flexTempDir, 
handleApacheFlexSDKZipFileUnzipComplete, handleApacheFlexSDKZipFileUnzipError);
+                }
+            }
+            catch (e:Error)
+            {
+                updateActivityStep(_viewResourceConstants.STEP_UNZIP_FLEX_SDK, 
StepItem.ERROR);
+                abortInstallation(_viewResourceConstants.STEP_UNZIP_FLEX_SDK + 
" " + e.message);
+            }
+        }
+
+        protected function 
handleApacheFlexSDKZipFileUnzipComplete(event:Event):void
+        {
+            log(_viewResourceConstants.INFO_FINISHED_UNZIPPING + 
_apacheFlexSDKCompressedFile.nativePath);
+            updateActivityStep(_viewResourceConstants.STEP_UNZIP_FLEX_SDK, 
StepItem.COMPLETE);
+
+            if (_os.isWindows())
+            {
+                if (usingXML)
+                {
+                    runInstallerScript();
+                }
+                else
+                {
+                    downloadAIRRuntimeKitForWindows();
+                }
+            }
+            else
+            {
+                if (!overlaying)
+                {
+                    /* Copy all files from the unarchived directory to the 
root */
+                    var directory:File = 
_flexTempDir.resolvePath(APACHE_FLEX_BIN_DISTRO_FILE_SHORT);
+                    var files:Array = directory.getDirectoryListing();
+                    for each(var file:File in files)
+                    {
+                        file.copyTo(_flexHomeDir.resolvePath(file.name));
+                    }
+                }
+                if (usingXML)
+                {
+                    runInstallerScript();
+                }
+                else
+                {
+                    if (_os.isMac())
+                    {
+                        downloadAIRRuntimeKitForMac();
+                    }
+                    else
+                    {
+                        downloadAIRRuntimeKitForLinux();
+                    }
+                }
+            }
+        }
+
+        protected function 
handleApacheFlexSDKZipFileUnzipError(error:ErrorEvent = null):void
+        {
+            updateActivityStep(_viewResourceConstants.STEP_UNZIP_FLEX_SDK, 
StepItem.ERROR);
+            abortInstallation(_viewResourceConstants.STEP_UNZIP_FLEX_SDK + " " 
+ error.toString());
+        }
+
+        protected function runInstallerScript():void
+        {
+            ant = new Ant();
+            ant.output = output;
+
+            var file:File;
+            if (installOverride != "")
+            {
+                file = new File(installOverride);
+            }
+            else if (overlaying)
+            {
+                var directory:File = 
_flexTempDir.resolvePath(APACHE_FLEX_BIN_DISTRO_FILE_SHORT);
+                if (_os.isWindows())
+                {
+                    file = _flexTempDir.resolvePath("installer.xml");
+                }
+                else
+                {
+                    file = directory.resolvePath("installer.xml");
+                }
+            }
+            else
+            {
+                file = _flexHomeDir.resolvePath("installer.xml");
+            }
+            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
+            var context:Object = {installer: true};
+            if (usingDownloadCache)
+            {
+                context["usingDownloadCache"] = usingDownloadCache;
+                context["downloadCacheFolder"] = downloadCacheFolder;
+            }
+            if (configOverride != "")
+            {
+                context["xml.properties"] = configOverride;
+            }
+            if (resourceManager.localeChain.length > 1)
+            {
+                context["bundle"] = resourceManager.localeChain[0];
+            }
+            for (var p:String in licensePropertyMap)
+            {
+                if (InstallerComponentVO(licensePropertyMap[p]).selected)
+                {
+                    context[p] = true;
+                }
+            }
+            for (p in additionalProps)
+            {
+                context[p] = additionalProps[p];
+            }
+
+            context["air.sdk.version"] = AIR_VERSION;
+            if (airVersion.selectedItem.versionID)
+            {
+                context["air.sdk.versionID"] = 
airVersion.selectedItem.versionID;
+            }
+            context["air.sdk.url.path"] = airVersion.selectedItem.path;
+            context["air.sdk.url.file"] = airVersion.selectedItem.file;
+            context["flash.sdk.version"] = FLASH_PLAYER_VERSION;
+            if (flashPlayerVersion.selectedItem.versionID)
+            {
+                context["flash.sdk.versionID"] = 
flashPlayerVersion.selectedItem.versionID;
+            }
+            if (debugMode)
+            {
+                context["verbose"] = true;
+            }
+            if (flashPlayerVersion.selectedItem.path)
+            {
+                context["flash.sdk.url.path"] = 
flashPlayerVersion.selectedItem.path;
+                context["flash.sdk.url.file"] = 
flashPlayerVersion.selectedItem.file;
+            }
+
+            if (file.exists && !ant.processXMLFile(file, context, true))
+            {
+                ant.addEventListener(Event.COMPLETE, completeHandler);
+                ant.addEventListener(ProgressEvent.PROGRESS, 
progressEventHandler);
+            }
+            else
+            {
+                completeHandler(null);
+            }
+        }
+
+        private function progressEventHandler(event:ProgressEvent):void
+        {
+            if (logProgressEvents)
+            {
+                log("progress " + event.bytesLoaded + "  " + event.bytesTotal, 
-1, false);
+            }
+            if (event.bytesTotal > 0)
+            {
+                progressBar.percent = Math.round((event.bytesLoaded / 
event.bytesTotal) * 100);
+            }
+            /*
+             if (ant.progressClass is Copy)
+             {
+             progressBar.label = getLocalizedString(progressLabels, "Copy");
+             }
+             else if (ant.progressClass is Get)
+             {
+             progressBar.label = getLocalizedString(progressLabels, "Get");
+             }
+             else if (ant.progressClass is Checksum)
+             {
+             progressBar.label = getLocalizedString(progressLabels, 
"Checksum");
+             }
+             */
+        }
+
+        private function completeHandler(event:Event):void
+        {
+            if (Ant.currentAnt && !Ant.currentAnt.project.status)
+            {
+                var msg:String = Ant.currentAnt.project.failureMessage;
+                log(msg ? msg : "no failure message provided");
+                if (currentStep > 0)
+                {
+                    updateActivityStep(stepLabels[currentStep - 1], 
StepItem.ERROR);
+                }
+            }
+            else if (currentStep == stepLabels.length && currentStep > 0)
+            {
+                updateActivityStep(stepLabels[currentStep - 1], 
StepItem.COMPLETE);
+            }
+
+            if (Ant.currentAnt)
+            {
+                if (Ant.currentAnt.project.status)
+                {
+                    
tracker.trackInstallerSuccess(APACHE_FLEX_BIN_DISTRO_VERSION_DISPLAY, 
APACHE_FLEX_BIN_DISTRO_VERSION, _os.os);
+                }
+                if (Ant.currentAnt.project.failureMessage)
+                {
+                    cleanup(!Ant.currentAnt.project.status, "&info=" + 
escape(Ant.currentAnt.project.failureMessage));
+                }
+                else
+                {
+                    cleanup(!Ant.currentAnt.project.status);
+                }
+            }
+            else
+            {
+                cleanup();
+            }
+        }
+
+        private var ant:Ant;
+
+        private function output(s:String):void
+        {
+            var isPublic:Boolean = false;
+            var skipLog:Boolean = !debugMode;
+            if (s.indexOf(":") != -1 && s.charAt(0) == "\n")
+            {
+                // target output is a newline then the target name then a colon
+                if (currentStep < stepLabels.length && "\n" + 
stepIDs[currentStep] + ":" == s)
+                {
+                    if (currentStep > 0)
+                    {
+                        updateActivityStep(stepLabels[currentStep - 1], 
StepItem.COMPLETE);
+                    }
+                    if (currentStep < stepLabels.length)
+                    {
+                        updateActivityStep(stepLabels[currentStep++], 
StepItem.ACTIVE);
+                    }
+                }
+                isPublic = false;
+            }
+            else if (s.indexOf("[echo] ") != -1)
+            {
+                s = s.substr(s.indexOf("[echo] ") + 7);
+                isPublic = true;
+                skipLog = false;
+            }
+            else if (s.indexOf("[fail] ") != -1)
+            {
+                s = s.substr(s.indexOf("[fail] ") + 7);
+                isPublic = true;
+                skipLog = false;
+            }
+            log(s, -1, isPublic, skipLog);
+        }
+
+        private function enterFrameHandler(event:Event):void
+        {
+            ant.doCallback();
+        }
+
+        protected function downloadAIRRuntimeKitForWindows():void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ACTIVE);
+
+            try
+            {
+                
log(_viewResourceConstants.INFO_DOWNLOADING_AIR_RUNTIME_KIT_WINDOWS + 
ADOBE_AIR_SDK_WIN_URL);
+                _adobeAIRSDKZipFile = File.userDirectory.resolvePath(_flexTemp 
+ File.separator + ADOBE_AIR_SDK_WIN_FILE);
+                copyOrDownload(ADOBE_AIR_SDK_WIN_URL, handleAIRSDKDownload, 
_adobeAIRSDKZipFile, handleAIRSDKDownloadError);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ERROR);
+                abortInstallation();
+            }
+        }
+
+        protected function downloadAIRRuntimeKitForMac():void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ACTIVE);
+
+            try
+            {
+                
log(_viewResourceConstants.INFO_DOWNLOADING_AIR_RUNTIME_KIT_MAC + 
ADOBE_AIR_SDK_MAC_URL);
+                _adobeAIRSDKZipFile = File.userDirectory.resolvePath(_flexTemp 
+ File.separator + ADOBE_AIR_SDK_MAC_FILE);
+                copyOrDownload(ADOBE_AIR_SDK_MAC_URL, handleAIRSDKDownload, 
_adobeAIRSDKZipFile, handleAIRSDKDownloadError);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ERROR);
+                abortInstallation();
+            }
+        }
+
+        protected function downloadAIRRuntimeKitForLinux():void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ACTIVE);
+
+            try
+            {
+                
log(_viewResourceConstants.INFO_DOWNLOADING_AIR_RUNTIME_KIT_MAC + 
ADOBE_AIR_SDK_LINUX_URL);
+                _adobeAIRSDKZipFile = File.userDirectory.resolvePath(_flexTemp 
+ File.separator + ADOBE_AIR_SDK_LINUX_FILE);
+                copyOrDownload(ADOBE_AIR_SDK_LINUX_URL, handleAIRSDKDownload, 
_adobeAIRSDKZipFile, handleAIRSDKDownloadError);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ERROR);
+                abortInstallation();
+            }
+        }
+
+        protected function handleAIRSDKDownload(event:Event):void
+        {
+            try
+            {
+                writeFileToDirectory(_adobeAIRSDKZipFile, event.target.data);
+            }
+            catch (e:Error)
+            {
+                
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ERROR);
+                abortInstallation();
+            }
+
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.COMPLETE);
+
+            unzipAdobeAIRSDK();
+        }
+
+        protected function handleAIRSDKDownloadError(error:* = null):void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_REQUIRED_INSTALL_ADOBE_AIR_SDK, 
StepItem.ERROR);
+            log(_viewResourceConstants.ERROR_UNABLE_TO_DOWNLOAD_AIR_SDK);
+            abortInstallation();
+        }
+
+        protected function unzipAdobeAIRSDK():void
+        {
+            
updateActivityStep(_viewResourceConstants.STEP_UNZIP_AIR_RUNTIME_KIT, StepI

<TRUNCATED>
http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/cda78507/flex-installer/installer/src/assets/icons/114.png
----------------------------------------------------------------------
diff --git a/flex-installer/installer/src/assets/icons/114.png 
b/flex-installer/installer/src/assets/icons/114.png
new file mode 100644
index 0000000..8f59da9
Binary files /dev/null and b/flex-installer/installer/src/assets/icons/114.png 
differ

Reply via email to