<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication 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:sas="http://www.springactionscript.org/mxml/config"
					   preinitialize="windowedapplication1_preinitializeHandler(event)"
					   applicationComplete="windowedapplication1_applicationCompleteHandler(event)"
					   title="Apache Flex Installer Locale Editor"
					   xmlns:view="org.apache.flex.runtimelocale.view.*"
					   currentState="appInitState"
					   close="windowedapplication1_closeHandler(event)">
	<s:states>
		<s:State name="appInitState"/>
		<s:State name="appReadyState"/>
	</s:states>
	<fx:Script>
		<![CDATA[
			import flash.utils.setTimeout;
			import mx.events.FlexEvent;
			import mx.utils.ObjectUtil;
			import org.apache.flex.runtimelocale.context.MainConfiguration;
			import org.apache.flex.runtimelocale.event.ApplicationStatusEvent;
			import org.apache.flex.runtimelocale.event.InitializeApplicationEvent;
			import org.apache.flex.runtimelocale.event.SaveConfigurationEvent;
			import org.apache.flex.runtimelocale.event.ShowHelpRequestEvent;
			import org.apache.flex.runtimelocale.event.ShowLocaleFileSelectorViewEvent;
			import org.as3commons.logging.api.ILogSetup;
			import org.as3commons.logging.api.ILogger;
			import org.as3commons.logging.api.LOGGER_FACTORY;
			import org.as3commons.logging.api.getClassLogger;
			import org.as3commons.logging.setup.SimpleTargetSetup;
			import org.as3commons.logging.setup.target.AirFileTarget;
			import org.as3commons.logging.setup.target.TraceTarget;
			import org.as3commons.logging.setup.target.mergeTargets;
			import org.as3commons.logging.util.xml.xmlToSetup;

			private static const logger:ILogger = getClassLogger(Main);

			protected function handleUncaught(event:UncaughtErrorEvent):void {
				if (applicationContext) {
					trace(event.error);
					applicationContext.eventBus.dispatchEvent(new ApplicationStatusEvent(ApplicationStatusEvent.APPLICATION_ERROR_STATUS, "An expected error occured: " + event.text, "Unexpected error"));
				}
			}

			protected function windowedapplication1_applicationCompleteHandler(event:FlexEvent):void {
				pruneLogFiles();
				loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, handleUncaught);
				statusText.setStyle("color", 0x008800);
				statusText.setStyle("fontWeight", "bold");
				//Pfff, ugly, but I want to center the popup after the window has been
				//maximised, and this was the only way I could get it do so.
				//(I secretly suck)
				setTimeout(function():void {
					applicationContext.eventBus.dispatchEvent(new InitializeApplicationEvent(InitializeApplicationEvent.APP_INITIALIZE));
					setUpLogging();
					applicationContext.eventBus.dispatchEvent(new ShowLocaleFileSelectorViewEvent(ShowLocaleFileSelectorViewEvent.SHOW_LOCALE_FILE_SELECTOR));
					if (applicationContext.propertiesProvider.getProperty("showhelp") == "true") {
						applicationContext.eventBus.dispatchEvent(new ShowHelpRequestEvent(ShowHelpRequestEvent.SHOW_HELP_REQUEST));
					}
				}, 500);
			}

			protected function windowedapplication1_closeHandler(event:Event):void {
				applicationContext.eventBus.dispatchEvent(new SaveConfigurationEvent(SaveConfigurationEvent.SAVE_CONFIGURATION_REQUEST));
			}

			protected function windowedapplication1_preinitializeHandler(event:FlexEvent):void {
				maximize();
			}

			private function compareCreationDates(f1:File, f2:File):Number {
				return ObjectUtil.dateCompare(f1.creationDate, f2.creationDate);
			}

			private function pruneLogFiles():void {
				var listing:Array = File.applicationStorageDirectory.getDirectoryListing();
				var logListing:Array = [];
				for each (var file:File in listing) {
					if (file.extension == "log") {
						logListing[logListing.length] = file;
					}
				}
				if (logListing.length > 5) {
					logListing.sort(compareCreationDates, Array.NUMERIC);
					var len:int = logListing.length - 5;
					var logFile:File;
					for (var i:int = 0; i < len; ++i) {
						logFile = logListing[i];
						logFile.deleteFile();
						logger.info("Deleted old logfile: {0}", [logFile.nativePath]);
					}
				}
			}

			private function setUpLogging():void {
				if (applicationContext.propertiesProvider.getProperty('logging') == "true") {
					var file:File = File.applicationDirectory.resolvePath("logging-config.xml");
					if (file.exists) {
						try {
							var fileStream:FileStream = new FileStream();
							fileStream.open(file, FileMode.READ);
							fileStream.position = 0;
							var content:String = fileStream.readMultiByte(fileStream.bytesAvailable, "utf-8");
							var xml:XML = new XML(content);
							var mergedSetup:ILogSetup = xmlToSetup(xml, {}, {console: new TraceTarget(), file: new AirFileTarget()});
							LOGGER_FACTORY.setup = mergedSetup;
						} catch (e:Error) {
							LOGGER_FACTORY.setup = new SimpleTargetSetup(mergeTargets(new TraceTarget(), new AirFileTarget()));
							logger.error("Error encountered while reading XML logging configuration: {0}", [e.message]);
							logger.info("Logging defaults used");
						} finally {
							fileStream.close();
						}
					} else {
						LOGGER_FACTORY.setup = new SimpleTargetSetup(mergeTargets(new TraceTarget(), new AirFileTarget()));
						logger.info("Logging defaults used");
					}
					logger.info("Application initializing");
					pruneLogFiles();
				}
			}
			//
			{
				MainConfiguration;
			}
		]]>
	</fx:Script>
	<fx:Declarations>
		<sas:MXMLApplicationContext configurations="{[MainConfiguration]}"
									id="applicationContext"/>
	</fx:Declarations>
	<view:MainView id="mainView"
				   width="100%"
				   height="100%"
				   includeIn="appReadyState"/>
</s:WindowedApplication>
