You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by jm...@apache.org on 2014/08/23 05:41:36 UTC

[50/51] [partial] trying to merge TourDeFlex develop release into master

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/Config.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/Config.as b/TourDeFlex/TourDeFlex/src/Config.as
index 85a6384..ba2a287 100644
--- a/TourDeFlex/TourDeFlex/src/Config.as
+++ b/TourDeFlex/TourDeFlex/src/Config.as
@@ -16,142 +16,142 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package
-{
-	import classes.LocalQuickStart;
-	
-	import flash.filesystem.File;
-	import flash.filesystem.FileMode;
-	import flash.filesystem.FileStream;
-	import flash.system.Capabilities;
-	
-	public class Config
-	{
-		[Bindable] public static var PROGRAM_TITLE:String = "Tour de Flex";
-		[Bindable] public static var APP_VERSION:String = "0";
-		[Bindable] public static var OBJECTS_FILE_VERSION:String = "0";	
-		[Bindable] public static var OBJECTS_TOTAL:int = 0;	
-		[Bindable] public static var ABOUT_MENU_LIST:XMLList;
-		[Bindable] public static var IS_ONLINE:Boolean = false;
-		[Bindable] public static var USE_SPLASH:Boolean = true;		
-
-		//public static var SETTINGS_FILE:String = "settings.xml";
-		//public static function get SETTINGS_URL():String {return "data/" + SETTINGS_FILE;}
-		//public static var settingsXml:XML;
-		
-		[Bindable] public static var ABOUT_MENU_TITLE:String = "Flex Resources";
-		
-		[Bindable] public static var SPLASH_URL:String = "data/assets/intro.flv";
-		[Bindable] public static var QUICK_START_REMOTE_URL:String = "http://tourdeflex.blogspot.com";		
-		[Bindable] public static var QUICK_START_LOCAL_URL:String = "data/quickstart.html";
-		
-		public static var OBJECTS_FILE:String = "objects-desktop2.xml";
-		public static function get OBJECTS_URL():String {return "data/" + OBJECTS_FILE;}	
-		public static var LOCAL_OBJECTS_ROOT_PATH:String = "objects/";		
-		
-		public static var OBJECTS_UPDATER_FILE:String = "objects-desktop2-update.xml";	
-		public static function get OBJECTS_UPDATER_URL():String {return "http://tourdeflex.adobe.com/download/" + OBJECTS_UPDATER_FILE;}
-		public static var APP_UPDATER_URL:String = "http://tourdeflex.adobe.com/download/update4.xml";
-		
-		public static var ONLINE_STATUS_URL:String = "http://tourdeflex.adobe.com/ping.html";
-		public static var OFFLINE_URL:String = "data/offline.html";
-		
-		private static var BASE_URL:String = "http://tourdeflex.adobe.com/server/";				
-		[Bindable] public static var DATA_EXCHANGE_URL:String = BASE_URL + "main.php";
-
-		private static var COMENTS_URL_QUERY_STRING:String = "main.php?Request=GetComments&ObjectId=";
-		public static var COMMENTS_URL:String = BASE_URL + COMENTS_URL_QUERY_STRING;		
-			
-		public static var HEADER_GRADIENT_IMAGE:String = "images/header_gradient.png";
-		public static var HEADER_IMAGE:String = "images/header_logo.png";		
-		
-		public static var TREE_NO_ICON:String = "images/tree_noIcon.png";
-		
-		public function Config()
-		{
-		}
-		
-		/*		
-		public static function loadSettings():void
-		{
-			setLocalization();
-			
-			var loader:URLLoader = new URLLoader(new URLRequest(Config.SETTINGS_URL));
-			loader.addEventListener(Event.COMPLETE, settingsXmlLoaded);	
-			
-			var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
-			var ns:Namespace = appXml.namespace();
-			APP_VERSION = appXml.ns::version;					
-		}		
-		*/
-		
-		public static function setLocalization():void
-		{
-			//var localLanguage:String = Capabilities.languages[0].toString().toLowerCase(); //for 'en-us'
-			var localLanguage:String = Capabilities.language.toLowerCase(); //for 'en'
- 			trace("LANG=" + localLanguage);
- 			//localLanguage = "jp"; //for testing
- 			//trace(localLanguage);
-
-			if(localLanguage != "en" && localLanguage != "en-us")
-			{				
-				//Config.QUICK_START_REMOTE_URL = appendLanguage(Config.QUICK_START_REMOTE_URL, localLanguage);
-				//Config.QUICK_START_LOCAL_URL = appendLanguage(Config.QUICK_START_LOCAL_URL, localLanguage);
-				
-				var localizedObjectFile:String = "objects-desktop_" + localLanguage + ".xml";
-				var staticObjectFile:File = File.applicationDirectory.resolvePath("data/" + localizedObjectFile);
-				if(staticObjectFile.exists)
-				{
-					OBJECTS_FILE = localizedObjectFile;
-					Config.OBJECTS_UPDATER_FILE = "objects-desktop-update_" + localLanguage + ".xml";
-					//SETTINGS_FILE = "settings_" + localLanguage + ".xml";
-				}
-			} 
-		}		
-		
-		public static function appendLanguage(oldPath:String, lang:String):String
-		{
-			var newPath:String = oldPath;
-			
-			var pos:int = oldPath.lastIndexOf(".");
-			if(pos > 0)
-			{
-				var ext:String = oldPath.substring(pos, oldPath.length);
-				newPath = oldPath.substring(0, pos);
-				newPath += "_" + lang + ext;
-			}
-			
-			return newPath;
-		}
-
-		/*
-		private static function settingsXmlLoaded(event:Event):void
-		{
-			var loader:URLLoader = URLLoader(event.target);
-			settingsXml = new XML(loader.data);
-			PROGRAM_TITLE = settingsXml.@title;
-			ABOUT_MENU_LIST = settingsXml.AboutMenu.Item;
-			ABOUT_MENU_TITLE = settingsXml.AboutMenu.@title;
-		}
-		*/
-		
-		public static function isAppFirstTimeRun():Boolean
-		{
-			var isFirstTime:Boolean = false;
-			var appFirstTimeRunFile:File = File.applicationStorageDirectory.resolvePath("versions/" + APP_VERSION);
-			
-			if(!appFirstTimeRunFile.exists)
-			{
-				var fileStream:FileStream = new FileStream();
-				fileStream.open(appFirstTimeRunFile, FileMode.WRITE);
-				fileStream.writeUTFBytes(APP_VERSION);
-				fileStream.close();
-				
-				isFirstTime = true;
-			}
-			
-			return isFirstTime;
-		}
-
-	}
+package
+{
+	import classes.LocalQuickStart;
+	
+	import flash.filesystem.File;
+	import flash.filesystem.FileMode;
+	import flash.filesystem.FileStream;
+	import flash.system.Capabilities;
+	
+	public class Config
+	{
+		[Bindable] public static var PROGRAM_TITLE:String = "Tour de Flex";
+		[Bindable] public static var APP_VERSION:String = "0";
+		[Bindable] public static var OBJECTS_FILE_VERSION:String = "0";	
+		[Bindable] public static var OBJECTS_TOTAL:int = 0;	
+		[Bindable] public static var ABOUT_MENU_LIST:XMLList;
+		[Bindable] public static var IS_ONLINE:Boolean = false;
+		[Bindable] public static var USE_SPLASH:Boolean = true;		
+
+		//public static var SETTINGS_FILE:String = "settings.xml";
+		//public static function get SETTINGS_URL():String {return "data/" + SETTINGS_FILE;}
+		//public static var settingsXml:XML;
+		
+		[Bindable] public static var ABOUT_MENU_TITLE:String = "Flex Resources";
+		
+		[Bindable] public static var SPLASH_URL:String = "data/assets/intro.flv";
+		[Bindable] public static var QUICK_START_REMOTE_URL:String = "http://tourdeflex.blogspot.com";		
+		[Bindable] public static var QUICK_START_LOCAL_URL:String = "data/quickstart.html";
+		
+		public static var OBJECTS_FILE:String = "objects-desktop2.xml";
+		public static function get OBJECTS_URL():String {return "data/" + OBJECTS_FILE;}	
+		public static var LOCAL_OBJECTS_ROOT_PATH:String = "objects/";		
+		
+		public static var OBJECTS_UPDATER_FILE:String = "objects-desktop2-update.xml";	
+		public static function get OBJECTS_UPDATER_URL():String {return "http://tourdeflex.adobe.com/download/" + OBJECTS_UPDATER_FILE;}
+		public static var APP_UPDATER_URL:String = "http://tourdeflex.adobe.com/download/update4.xml";
+		
+		public static var ONLINE_STATUS_URL:String = "http://tourdeflex.adobe.com/ping.html";
+		public static var OFFLINE_URL:String = "data/offline.html";
+		
+		private static var BASE_URL:String = "http://tourdeflex.adobe.com/server/";				
+		[Bindable] public static var DATA_EXCHANGE_URL:String = BASE_URL + "main.php";
+
+		private static var COMENTS_URL_QUERY_STRING:String = "main.php?Request=GetComments&ObjectId=";
+		public static var COMMENTS_URL:String = BASE_URL + COMENTS_URL_QUERY_STRING;		
+			
+		public static var HEADER_GRADIENT_IMAGE:String = "images/header_gradient.png";
+		public static var HEADER_IMAGE:String = "images/header_logo.png";		
+		
+		public static var TREE_NO_ICON:String = "images/tree_noIcon.png";
+		
+		public function Config()
+		{
+		}
+		
+		/*		
+		public static function loadSettings():void
+		{
+			setLocalization();
+			
+			var loader:URLLoader = new URLLoader(new URLRequest(Config.SETTINGS_URL));
+			loader.addEventListener(Event.COMPLETE, settingsXmlLoaded);	
+			
+			var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
+			var ns:Namespace = appXml.namespace();
+			APP_VERSION = appXml.ns::version;					
+		}		
+		*/
+		
+		public static function setLocalization():void
+		{
+			//var localLanguage:String = Capabilities.languages[0].toString().toLowerCase(); //for 'en-us'
+			var localLanguage:String = Capabilities.language.toLowerCase(); //for 'en'
+ 			trace("LANG=" + localLanguage);
+ 			//localLanguage = "jp"; //for testing
+ 			//trace(localLanguage);
+
+			if(localLanguage != "en" && localLanguage != "en-us")
+			{				
+				//Config.QUICK_START_REMOTE_URL = appendLanguage(Config.QUICK_START_REMOTE_URL, localLanguage);
+				//Config.QUICK_START_LOCAL_URL = appendLanguage(Config.QUICK_START_LOCAL_URL, localLanguage);
+				
+				var localizedObjectFile:String = "objects-desktop_" + localLanguage + ".xml";
+				var staticObjectFile:File = File.applicationDirectory.resolvePath("data/" + localizedObjectFile);
+				if(staticObjectFile.exists)
+				{
+					OBJECTS_FILE = localizedObjectFile;
+					Config.OBJECTS_UPDATER_FILE = "objects-desktop-update_" + localLanguage + ".xml";
+					//SETTINGS_FILE = "settings_" + localLanguage + ".xml";
+				}
+			} 
+		}		
+		
+		public static function appendLanguage(oldPath:String, lang:String):String
+		{
+			var newPath:String = oldPath;
+			
+			var pos:int = oldPath.lastIndexOf(".");
+			if(pos > 0)
+			{
+				var ext:String = oldPath.substring(pos, oldPath.length);
+				newPath = oldPath.substring(0, pos);
+				newPath += "_" + lang + ext;
+			}
+			
+			return newPath;
+		}
+
+		/*
+		private static function settingsXmlLoaded(event:Event):void
+		{
+			var loader:URLLoader = URLLoader(event.target);
+			settingsXml = new XML(loader.data);
+			PROGRAM_TITLE = settingsXml.@title;
+			ABOUT_MENU_LIST = settingsXml.AboutMenu.Item;
+			ABOUT_MENU_TITLE = settingsXml.AboutMenu.@title;
+		}
+		*/
+		
+		public static function isAppFirstTimeRun():Boolean
+		{
+			var isFirstTime:Boolean = false;
+			var appFirstTimeRunFile:File = File.applicationStorageDirectory.resolvePath("versions/" + APP_VERSION);
+			
+			if(!appFirstTimeRunFile.exists)
+			{
+				var fileStream:FileStream = new FileStream();
+				fileStream.open(appFirstTimeRunFile, FileMode.WRITE);
+				fileStream.writeUTFBytes(APP_VERSION);
+				fileStream.close();
+				
+				isFirstTime = true;
+			}
+			
+			return isFirstTime;
+		}
+
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/Preferences.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/Preferences.as b/TourDeFlex/TourDeFlex/src/Preferences.as
index 49c7e35..4144fd5 100644
--- a/TourDeFlex/TourDeFlex/src/Preferences.as
+++ b/TourDeFlex/TourDeFlex/src/Preferences.as
@@ -16,53 +16,53 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package
-{
-	import flash.filesystem.File;
-	import flash.filesystem.FileMode;
-	import flash.filesystem.FileStream;
-	
-	public class Preferences
-	{
-		//--------------------------------------------------------------------------
-		//  Variables
-		//--------------------------------------------------------------------------
-		private static var filePath:String = "preferences.xml";
-		[Bindable] public static var preferencesXml:XML = <Preferences />;
-		
-		//--------------------------------------------------------------------------
-		//  Loading/setup
-		//--------------------------------------------------------------------------
-		public function Preferences()
-		{
-
-		}
-		
-		public static function load():void
-		{
-			var preferencesFile:File = File.applicationStorageDirectory.resolvePath(filePath);
-			if(preferencesFile.exists)
-			{
-				var fileStream:FileStream = new FileStream();
-				fileStream.open(preferencesFile, FileMode.READ);
-				preferencesXml = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
-				fileStream.close();
-			}
-		}
-		
-		//--------------------------------------------------------------------------
-		//  Saving
-		//--------------------------------------------------------------------------		
-		public static function save():void
-		{			
-			var preferencesFile:File = File.applicationStorageDirectory.resolvePath(filePath);
-			var fileStream:FileStream = new FileStream();
-			fileStream.open(preferencesFile, FileMode.WRITE);
-			fileStream.writeUTFBytes(preferencesXml.toXMLString());
-			fileStream.close();
-		}
-		
-		//--------------------------------------------------------------------------
-		//--------------------------------------------------------------------------
-	}
+package
+{
+	import flash.filesystem.File;
+	import flash.filesystem.FileMode;
+	import flash.filesystem.FileStream;
+	
+	public class Preferences
+	{
+		//--------------------------------------------------------------------------
+		//  Variables
+		//--------------------------------------------------------------------------
+		private static var filePath:String = "preferences.xml";
+		[Bindable] public static var preferencesXml:XML = <Preferences />;
+		
+		//--------------------------------------------------------------------------
+		//  Loading/setup
+		//--------------------------------------------------------------------------
+		public function Preferences()
+		{
+
+		}
+		
+		public static function load():void
+		{
+			var preferencesFile:File = File.applicationStorageDirectory.resolvePath(filePath);
+			if(preferencesFile.exists)
+			{
+				var fileStream:FileStream = new FileStream();
+				fileStream.open(preferencesFile, FileMode.READ);
+				preferencesXml = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));
+				fileStream.close();
+			}
+		}
+		
+		//--------------------------------------------------------------------------
+		//  Saving
+		//--------------------------------------------------------------------------		
+		public static function save():void
+		{			
+			var preferencesFile:File = File.applicationStorageDirectory.resolvePath(filePath);
+			var fileStream:FileStream = new FileStream();
+			fileStream.open(preferencesFile, FileMode.WRITE);
+			fileStream.writeUTFBytes(preferencesXml.toXMLString());
+			fileStream.close();
+		}
+		
+		//--------------------------------------------------------------------------
+		//--------------------------------------------------------------------------
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/TourDeFlex-app.xml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/TourDeFlex-app.xml b/TourDeFlex/TourDeFlex/src/TourDeFlex-app.xml
index 3f5594d..102abff 100644
--- a/TourDeFlex/TourDeFlex/src/TourDeFlex-app.xml
+++ b/TourDeFlex/TourDeFlex/src/TourDeFlex-app.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
 
 Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,8 +17,8 @@ See the License for the specific language governing permissions and
 limitations under the License.
 
 -->
-<application xmlns="http://ns.adobe.com/air/application/2.0">
-
+<application xmlns="http://ns.adobe.com/air/application/2.0">
+
 <!-- Adobe AIR Application Descriptor File Template.
 
 	Specifies parameters for identifying, installing, and launching AIR applications.
@@ -30,128 +30,128 @@ limitations under the License.
 			
 	minimumPatchLevel - The minimum patch level of the AIR runtime required to run 
 			the application. Optional.
--->
-
-	<!-- The application identifier string, unique to this application. Required. -->
-	<id>TourDeFlex</id>
-
-	<!-- Used as the filename for the application. Required. -->
-	<filename>TourDeFlex</filename>
-
-	<!-- The name that is displayed in the AIR application installer. Optional. -->
-	<name>TourDeFlex</name>
-
-
-	<publisherID>E7BED6E5DDA59983786DD72EBFA46B1598278E07.1</publisherID>
-	<!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
-	<version>2.0</version>
-
-	<!-- Description, displayed in the AIR application installer. Optional. -->
-	<description>Tour de Flex - Adobe Systems, Inc.</description>
-
-	<!-- Copyright information. Optional -->
-	<!-- <copyright>Copyright 2010, Adobe Systems, Inc.</copyright> -->
-
-	<!-- Settings for the application's initial window. Required. -->
-	<initialWindow>
-		<!-- The main SWF or HTML file of the application. Required. -->
-		<!-- Note: In Flex Builder, the SWF reference is set automatically. -->
-		<content>[This value will be overwritten by Flex Builder in the output app.xml]</content>
-		
-		<!-- The title of the main window. Optional. -->
-		<!-- <title></title> -->
-
-		<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
-		<!-- <systemChrome></systemChrome> -->
-		<systemChrome>none</systemChrome>
-		
-		<!-- Whether the window is transparent. Only applicable when systemChrome is false. Optional. Default false. -->
-		<!-- <transparent></transparent> -->
-				
-		<!-- Whether the window is initially visible. Optional. Default false. -->
-		<!-- <visible></visible> -->
-
-		<!-- Whether the user can minimize the window. Optional. Default true. -->
-		<!-- <minimizable></minimizable> -->
-
-		<!-- Whether the user can maximize the window. Optional. Default true. -->
-		<!-- <maximizable></maximizable> -->
-
-		<!-- Whether the user can resize the window. Optional. Default true. -->
-		<!-- <resizable></resizable> -->
-
-		<!-- The window's initial width. Optional. -->
-		<!-- <width></width> -->
-
-		<!-- The window's initial height. Optional. -->
-		<!-- <height></height> -->
-
-		<!-- The window's initial x position. Optional. -->
-		<!-- <x></x> -->
-
-		<!-- The window's initial y position. Optional. -->
-		<!-- <y></y> -->
-
-		<!-- The window's minimum size, specified as a width/height pair, such as "400 200". Optional. -->
-		<!-- <minSize></minSize> -->
-
-		<!-- The window's initial maximum size, specified as a width/height pair, such as "1600 1200". Optional. -->
-		<!-- <maxSize></maxSize> -->
-	</initialWindow>
-
-	<!-- The subpath of the standard default installation location to use. Optional. -->
-	<!-- <installFolder></installFolder> -->
-
-	<!-- The subpath of the Windows Start/Programs menu to use. Optional. -->
-	<!-- <programMenuFolder></programMenuFolder> -->
-
+-->
+
+	<!-- The application identifier string, unique to this application. Required. -->
+	<id>TourDeFlex</id>
+
+	<!-- Used as the filename for the application. Required. -->
+	<filename>TourDeFlex</filename>
+
+	<!-- The name that is displayed in the AIR application installer. Optional. -->
+	<name>TourDeFlex</name>
+
+
+	<publisherID>E7BED6E5DDA59983786DD72EBFA46B1598278E07.1</publisherID>
+	<!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
+	<version>2.0</version>
+
+	<!-- Description, displayed in the AIR application installer. Optional. -->
+	<description>Tour de Flex - Adobe Systems, Inc.</description>
+
+	<!-- Copyright information. Optional -->
+	<!-- <copyright>Copyright 2010, Adobe Systems, Inc.</copyright> -->
+
+	<!-- Settings for the application's initial window. Required. -->
+	<initialWindow>
+		<!-- The main SWF or HTML file of the application. Required. -->
+		<!-- Note: In Flex Builder, the SWF reference is set automatically. -->
+		<content>[This value will be overwritten by Flex Builder in the output app.xml]</content>
+		
+		<!-- The title of the main window. Optional. -->
+		<!-- <title></title> -->
+
+		<!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
+		<!-- <systemChrome></systemChrome> -->
+		<systemChrome>none</systemChrome>
+		
+		<!-- Whether the window is transparent. Only applicable when systemChrome is false. Optional. Default false. -->
+		<!-- <transparent></transparent> -->
+				
+		<!-- Whether the window is initially visible. Optional. Default false. -->
+		<!-- <visible></visible> -->
+
+		<!-- Whether the user can minimize the window. Optional. Default true. -->
+		<!-- <minimizable></minimizable> -->
+
+		<!-- Whether the user can maximize the window. Optional. Default true. -->
+		<!-- <maximizable></maximizable> -->
+
+		<!-- Whether the user can resize the window. Optional. Default true. -->
+		<!-- <resizable></resizable> -->
+
+		<!-- The window's initial width. Optional. -->
+		<!-- <width></width> -->
+
+		<!-- The window's initial height. Optional. -->
+		<!-- <height></height> -->
+
+		<!-- The window's initial x position. Optional. -->
+		<!-- <x></x> -->
+
+		<!-- The window's initial y position. Optional. -->
+		<!-- <y></y> -->
+
+		<!-- The window's minimum size, specified as a width/height pair, such as "400 200". Optional. -->
+		<!-- <minSize></minSize> -->
+
+		<!-- The window's initial maximum size, specified as a width/height pair, such as "1600 1200". Optional. -->
+		<!-- <maxSize></maxSize> -->
+	</initialWindow>
+
+	<!-- The subpath of the standard default installation location to use. Optional. -->
+	<!-- <installFolder></installFolder> -->
+
+	<!-- The subpath of the Windows Start/Programs menu to use. Optional. -->
+	<!-- <programMenuFolder></programMenuFolder> -->
+
 	<!-- The icon the system uses for the application. For at least one resolution,
-		 specify the path to a PNG file included in the AIR package. Optional. -->
+		 specify the path to a PNG file included in the AIR package. Optional. -->
 	<icon>
 		<image16x16>images/icons/tdfx_16.png</image16x16>
 		<image32x32>images/icons/tdfx_32.png</image32x32>
 		<image48x48>images/icons/tdfx_48.png</image48x48>
 		<image128x128>images/icons/tdfx_128.png</image128x128>
-	</icon>
-
+	</icon>
+
 	<!-- Whether the application handles the update when a user double-clicks an update version
 	of the AIR file (true), or the default AIR application installer handles the update (false).
-	Optional. Default false. -->
-	<!-- <customUpdateUI></customUpdateUI> -->
-	
+	Optional. Default false. -->
+	<!-- <customUpdateUI></customUpdateUI> -->
+	
 	<!-- Whether the application can be launched when the user clicks a link in a web browser.
-	Optional. Default false. -->
-	<allowBrowserInvocation>true</allowBrowserInvocation>
-
-	<!-- Listing of file types for which the application can register. Optional. -->
-	<!-- <fileTypes> -->
-
-		<!-- Defines one file type. Optional. -->
-		<!-- <fileType> -->
-
-			<!-- The name that the system displays for the registered file type. Required. -->
-			<!-- <name></name> -->
-
-			<!-- The extension to register. Required. -->
-			<!-- <extension></extension> -->
-			
-			<!-- The description of the file type. Optional. -->
-			<!-- <description></description> -->
-			
-			<!-- The MIME type. Optional. -->
-			<!-- <contentType></contentType> -->
-			
-			<!-- The icon to display for the file type. Optional. -->
-			<!-- 			
-			<icon>
-				<image16x16>images/icons/16x16-Icon.png</image16x16>
-				<image32x32>images/icons/32x32-Icon.png</image32x32>
-				<image48x48>images/icons/48x48-Icon.png</image48x48>
-				<image128x128>images/icons/128x128-Icon.png</image128x128>
-			</icon> 
-			-->		
-				
-		<!-- </fileType> -->
-	<!-- </fileTypes> -->
-
-</application>
+	Optional. Default false. -->
+	<allowBrowserInvocation>true</allowBrowserInvocation>
+
+	<!-- Listing of file types for which the application can register. Optional. -->
+	<!-- <fileTypes> -->
+
+		<!-- Defines one file type. Optional. -->
+		<!-- <fileType> -->
+
+			<!-- The name that the system displays for the registered file type. Required. -->
+			<!-- <name></name> -->
+
+			<!-- The extension to register. Required. -->
+			<!-- <extension></extension> -->
+			
+			<!-- The description of the file type. Optional. -->
+			<!-- <description></description> -->
+			
+			<!-- The MIME type. Optional. -->
+			<!-- <contentType></contentType> -->
+			
+			<!-- The icon to display for the file type. Optional. -->
+			<!-- 			
+			<icon>
+				<image16x16>images/icons/16x16-Icon.png</image16x16>
+				<image32x32>images/icons/32x32-Icon.png</image32x32>
+				<image48x48>images/icons/48x48-Icon.png</image48x48>
+				<image128x128>images/icons/128x128-Icon.png</image128x128>
+			</icon> 
+			-->		
+				
+		<!-- </fileType> -->
+	<!-- </fileTypes> -->
+
+</application>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/ApplicationUpdaterManager.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ApplicationUpdaterManager.as b/TourDeFlex/TourDeFlex/src/classes/ApplicationUpdaterManager.as
index 4a69b36..20a3b38 100644
--- a/TourDeFlex/TourDeFlex/src/classes/ApplicationUpdaterManager.as
+++ b/TourDeFlex/TourDeFlex/src/classes/ApplicationUpdaterManager.as
@@ -16,40 +16,40 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	import air.update.ApplicationUpdaterUI;
-	import air.update.events.UpdateEvent;
-	
-	import flash.desktop.NativeApplication;
-	import flash.events.ErrorEvent;
-	import flash.events.Event;
-	
-	import mx.controls.Alert;
-	
-	public class ApplicationUpdaterManager
-	{
-		private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
-		
-		public function ApplicationUpdaterManager()
-		{
-			appUpdater.updateURL = Config.APP_UPDATER_URL;
-			appUpdater.isCheckForUpdateVisible = false;
-			//appUpdater.isInstallUpdateVisible = false;
-			appUpdater.addEventListener(ErrorEvent.ERROR, appUpdater_error);
-			appUpdater.addEventListener(UpdateEvent.INITIALIZED, appUpdater_update);
-			appUpdater.initialize();			
-		}
-		
-		private function appUpdater_update(event:UpdateEvent):void 
-		{
-			appUpdater.checkNow();
-		}
-		
-		private function appUpdater_error(event:ErrorEvent):void
-		{
-			Alert.show(event.toString());
-		}
-		
-	}
+package classes
+{
+	import air.update.ApplicationUpdaterUI;
+	import air.update.events.UpdateEvent;
+	
+	import flash.desktop.NativeApplication;
+	import flash.events.ErrorEvent;
+	import flash.events.Event;
+	
+	import mx.controls.Alert;
+	
+	public class ApplicationUpdaterManager
+	{
+		private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
+		
+		public function ApplicationUpdaterManager()
+		{
+			appUpdater.updateURL = Config.APP_UPDATER_URL;
+			appUpdater.isCheckForUpdateVisible = false;
+			//appUpdater.isInstallUpdateVisible = false;
+			appUpdater.addEventListener(ErrorEvent.ERROR, appUpdater_error);
+			appUpdater.addEventListener(UpdateEvent.INITIALIZED, appUpdater_update);
+			appUpdater.initialize();			
+		}
+		
+		private function appUpdater_update(event:UpdateEvent):void 
+		{
+			appUpdater.checkNow();
+		}
+		
+		private function appUpdater_error(event:ErrorEvent):void
+		{
+			Alert.show(event.toString());
+		}
+		
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/Document.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/Document.as b/TourDeFlex/TourDeFlex/src/classes/Document.as
index e029609..909ae65 100644
--- a/TourDeFlex/TourDeFlex/src/classes/Document.as
+++ b/TourDeFlex/TourDeFlex/src/classes/Document.as
@@ -16,20 +16,20 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	public class Document
-	{
-		public var name:String = "";		
-		public var path:String = "";
-		public var openLinksExternal:String = "";
-		
-		public function Document(name:String = "", path:String = "", openLinksExternal:String = "")
-		{
-			this.name = name;
-			this.path = path;			
-			this.openLinksExternal = openLinksExternal;
-		}		
-
-	}
+package classes
+{
+	public class Document
+	{
+		public var name:String = "";		
+		public var path:String = "";
+		public var openLinksExternal:String = "";
+		
+		public function Document(name:String = "", path:String = "", openLinksExternal:String = "")
+		{
+			this.name = name;
+			this.path = path;			
+			this.openLinksExternal = openLinksExternal;
+		}		
+
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/LocalQuickStart.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/LocalQuickStart.as b/TourDeFlex/TourDeFlex/src/classes/LocalQuickStart.as
index f3cbdbf..3e44e8b 100644
--- a/TourDeFlex/TourDeFlex/src/classes/LocalQuickStart.as
+++ b/TourDeFlex/TourDeFlex/src/classes/LocalQuickStart.as
@@ -16,144 +16,144 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	/********************************
-	 * This class has been deprecated	
-	*********************************/
-	
-	
-	import flash.events.Event;
-	import flash.events.IOErrorEvent;
-	import flash.filesystem.File;
-	import flash.filesystem.FileMode;
-	import flash.filesystem.FileStream;
-	import flash.net.SharedObject;
-	import flash.net.URLLoader;
-	import flash.net.URLRequest;
-	import flash.system.Capabilities;
-	
-	public class LocalQuickStart
-	{
-		
-		//--------------------------------------------------------------------------
-		//  Variables
-		//--------------------------------------------------------------------------			
-		public static var url:String = "quickstart.html";
-		
-		private static var cookieName:String = "TourDeFlex";
-		private static var onlineVersion:String = "";
-		private static var localLanguage:String = "en";
-		private static var onlineVersionUrl:String = "";
-		
-		
-		//--------------------------------------------------------------------------
-		//  Load/setup
-		//--------------------------------------------------------------------------	
-		public function LocalQuickStart()
-		{
-		}
-		
-		public static function update():void
-		{						
-			var staticContainerPath:String = "data/";
-			var updatableFile:File = File.applicationStorageDirectory.resolvePath(url);
-			var staticFile:File = File.applicationDirectory.resolvePath(staticContainerPath + url);	
-					
-			localLanguage = Capabilities.language.toLowerCase();
-			//localLanguage = "jp";
-			
-			if(localLanguage != "en")
-			{
-				var newUrl:String = Config.appendLanguage(url, localLanguage);
-				var newStaticFile:File = File.applicationDirectory.resolvePath(staticContainerPath + newUrl);
-				if(newStaticFile.exists)
-					staticFile = newStaticFile;
-			}
-
-			if(Config.isAppFirstTimeRun() || !updatableFile.exists)
-				staticFile.copyTo(updatableFile, true);
-				
-			url = updatableFile.url;
-			
-			checkForNewLocalQuickStart();
-		}
-		
-		//--------------------------------------------------------------------------
-		//  Helper/shared functions
-		//--------------------------------------------------------------------------		
-		private static function checkForNewLocalQuickStart():void
-		{
-			var loader:URLLoader = new URLLoader(new URLRequest(Config.QUICK_START_LOCAL_UPDATER_URL));
-			loader.addEventListener(Event.COMPLETE, updaterXmlLoaded);
-			loader.addEventListener(IOErrorEvent.IO_ERROR, updaterXmlLoadedError);
-		}
-		
-		private static function updaterXmlLoadedError(event:IOErrorEvent):void
-		{
-		}
-				
-		private static function updaterXmlLoaded(event:Event):void
-		{
-			var loader:URLLoader = URLLoader(event.target);
-			var updaterXml:XML = new XML(loader.data);
-			
-			var currentVersion:String = "0";
-			var cookie:SharedObject = SharedObject.getLocal(cookieName);			
-			if(cookie.data.localQuickStartVersion != null)
-				currentVersion = cookie.data.localQuickStartVersion;
-			
-			onlineVersion = updaterXml.version;
-			var onlineVersionDescription:String = updaterXml.description;			
-			
-			if(onlineVersion > currentVersion)
-			{
-				onlineVersionUrl = updaterXml.url;
-				downloadNewVersion(onlineVersionUrl);
-				if(onlineVersionDescription.length > 0)
-				{
-					// Only show notice if a description was provided, otherwise, silent install
-					//Alert.show(onlineVersionDescription, "Updated to Version " + onlineVersion);
-				}
-			}
-		}
-		
-		private static function downloadNewVersion(path:String):void
-		{
-			if(localLanguage != "en")
-				path = Config.appendLanguage(path, localLanguage);
-			
-			var loader:URLLoader = new URLLoader(new URLRequest(path));
-			loader.addEventListener(Event.COMPLETE, updatedVersionLoaded);	
-			loader.addEventListener(IOErrorEvent.IO_ERROR, updatedVersionLoadingError);
-		}
-		
-		private static function updatedVersionLoadingError(event:IOErrorEvent):void
-		{
-			var loader:URLLoader = new URLLoader(new URLRequest(onlineVersionUrl));
-			loader.addEventListener(Event.COMPLETE, updatedVersionLoaded);	
-			loader.addEventListener(IOErrorEvent.IO_ERROR, updatedVersionLoadingError);			
-		}
-		
-		private static function updatedVersionLoaded(event:Event):void
-		{
-			var file:File = File.applicationStorageDirectory;
-			file = file.resolvePath(url);
-			if(file.exists)
-				file.deleteFile();
-
-			var loader:URLLoader = URLLoader(event.target);
-
-			var fileStream:FileStream = new FileStream();
-			fileStream.open(file, FileMode.WRITE);
-			fileStream.writeUTFBytes(loader.data);
-			fileStream.close();		
-			
-			var cookie:SharedObject = SharedObject.getLocal(cookieName);
-			cookie.data.localQuickStartVersion = onlineVersion;
-			cookie.flush();		
-		}		
-		//--------------------------------------------------------------------------
-		//--------------------------------------------------------------------------	
-	}
+package classes
+{
+	/********************************
+	 * This class has been deprecated	
+	*********************************/
+	
+	
+	import flash.events.Event;
+	import flash.events.IOErrorEvent;
+	import flash.filesystem.File;
+	import flash.filesystem.FileMode;
+	import flash.filesystem.FileStream;
+	import flash.net.SharedObject;
+	import flash.net.URLLoader;
+	import flash.net.URLRequest;
+	import flash.system.Capabilities;
+	
+	public class LocalQuickStart
+	{
+		
+		//--------------------------------------------------------------------------
+		//  Variables
+		//--------------------------------------------------------------------------			
+		public static var url:String = "quickstart.html";
+		
+		private static var cookieName:String = "TourDeFlex";
+		private static var onlineVersion:String = "";
+		private static var localLanguage:String = "en";
+		private static var onlineVersionUrl:String = "";
+		
+		
+		//--------------------------------------------------------------------------
+		//  Load/setup
+		//--------------------------------------------------------------------------	
+		public function LocalQuickStart()
+		{
+		}
+		
+		public static function update():void
+		{						
+			var staticContainerPath:String = "data/";
+			var updatableFile:File = File.applicationStorageDirectory.resolvePath(url);
+			var staticFile:File = File.applicationDirectory.resolvePath(staticContainerPath + url);	
+					
+			localLanguage = Capabilities.language.toLowerCase();
+			//localLanguage = "jp";
+			
+			if(localLanguage != "en")
+			{
+				var newUrl:String = Config.appendLanguage(url, localLanguage);
+				var newStaticFile:File = File.applicationDirectory.resolvePath(staticContainerPath + newUrl);
+				if(newStaticFile.exists)
+					staticFile = newStaticFile;
+			}
+
+			if(Config.isAppFirstTimeRun() || !updatableFile.exists)
+				staticFile.copyTo(updatableFile, true);
+				
+			url = updatableFile.url;
+			
+			checkForNewLocalQuickStart();
+		}
+		
+		//--------------------------------------------------------------------------
+		//  Helper/shared functions
+		//--------------------------------------------------------------------------		
+		private static function checkForNewLocalQuickStart():void
+		{
+			var loader:URLLoader = new URLLoader(new URLRequest(Config.QUICK_START_LOCAL_UPDATER_URL));
+			loader.addEventListener(Event.COMPLETE, updaterXmlLoaded);
+			loader.addEventListener(IOErrorEvent.IO_ERROR, updaterXmlLoadedError);
+		}
+		
+		private static function updaterXmlLoadedError(event:IOErrorEvent):void
+		{
+		}
+				
+		private static function updaterXmlLoaded(event:Event):void
+		{
+			var loader:URLLoader = URLLoader(event.target);
+			var updaterXml:XML = new XML(loader.data);
+			
+			var currentVersion:String = "0";
+			var cookie:SharedObject = SharedObject.getLocal(cookieName);			
+			if(cookie.data.localQuickStartVersion != null)
+				currentVersion = cookie.data.localQuickStartVersion;
+			
+			onlineVersion = updaterXml.version;
+			var onlineVersionDescription:String = updaterXml.description;			
+			
+			if(onlineVersion > currentVersion)
+			{
+				onlineVersionUrl = updaterXml.url;
+				downloadNewVersion(onlineVersionUrl);
+				if(onlineVersionDescription.length > 0)
+				{
+					// Only show notice if a description was provided, otherwise, silent install
+					//Alert.show(onlineVersionDescription, "Updated to Version " + onlineVersion);
+				}
+			}
+		}
+		
+		private static function downloadNewVersion(path:String):void
+		{
+			if(localLanguage != "en")
+				path = Config.appendLanguage(path, localLanguage);
+			
+			var loader:URLLoader = new URLLoader(new URLRequest(path));
+			loader.addEventListener(Event.COMPLETE, updatedVersionLoaded);	
+			loader.addEventListener(IOErrorEvent.IO_ERROR, updatedVersionLoadingError);
+		}
+		
+		private static function updatedVersionLoadingError(event:IOErrorEvent):void
+		{
+			var loader:URLLoader = new URLLoader(new URLRequest(onlineVersionUrl));
+			loader.addEventListener(Event.COMPLETE, updatedVersionLoaded);	
+			loader.addEventListener(IOErrorEvent.IO_ERROR, updatedVersionLoadingError);			
+		}
+		
+		private static function updatedVersionLoaded(event:Event):void
+		{
+			var file:File = File.applicationStorageDirectory;
+			file = file.resolvePath(url);
+			if(file.exists)
+				file.deleteFile();
+
+			var loader:URLLoader = URLLoader(event.target);
+
+			var fileStream:FileStream = new FileStream();
+			fileStream.open(file, FileMode.WRITE);
+			fileStream.writeUTFBytes(loader.data);
+			fileStream.close();		
+			
+			var cookie:SharedObject = SharedObject.getLocal(cookieName);
+			cookie.data.localQuickStartVersion = onlineVersion;
+			cookie.flush();		
+		}		
+		//--------------------------------------------------------------------------
+		//--------------------------------------------------------------------------	
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectData.as b/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
index 01ef169..e9125fd 100644
--- a/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
@@ -16,321 +16,321 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	import flash.desktop.NativeApplication;
-	import flash.events.Event;
-	import flash.events.IOErrorEvent;
-	import flash.filesystem.File;
-	import flash.filesystem.FileMode;
-	import flash.filesystem.FileStream;
-	import flash.net.URLLoader;
-	import flash.net.URLRequest;
-	
-	import mx.collections.ArrayCollection;
-	import mx.collections.Sort;
-	import mx.collections.SortField;
-	import mx.collections.XMLListCollection;
-	import mx.controls.Alert;
-	import mx.managers.CursorManager;
-	
-	import plugin.Component; //HS
-	
-	public class ObjectData
-	{		
-		//--------------------------------------------------------------------------
-		//  Variables
-		//--------------------------------------------------------------------------
-		[Bindable] public var topLevelCategoriesXml:XMLList;		
-		[Bindable] public var listXml:XMLListCollection;
-		[Bindable] public var treeXml:XMLListCollection;
-		[Bindable] public var featuredTreeXml:XMLListCollection;		
-		[Bindable] public var searchTags:Array;
-		private var objectXml:XML;
-		private var selectedTopLevelCategory:String = "";
-		private var previousSortType:String;
-
-		//--------------------------------------------------------------------------
-		//  Loading/setup
-		//--------------------------------------------------------------------------		
-		public function ObjectData()
-		{		
-			loadData();
-		}
-		
-		public function loadData():void
-		{
-			var objectsUrl:String = Config.OBJECTS_URL;
-			trace(objectsUrl);
-			var updatableObjectFile:File = File.applicationStorageDirectory.resolvePath(Config.OBJECTS_FILE);
-			var staticObjectFile:File = File.applicationDirectory.resolvePath(Config.OBJECTS_URL);
-					
-			if(Config.isAppFirstTimeRun() || !updatableObjectFile.exists)
-				staticObjectFile.copyTo(updatableObjectFile, true);
-		
-			var loader:URLLoader = new URLLoader(new URLRequest("file://" + updatableObjectFile.nativePath));
-			loader.addEventListener(Event.COMPLETE, objectsXmlLoaded);			
-		}		
-		
-		private function objectsXmlLoaded(event:Event):void
-		{
-			trace("OBJECTS LOADED");
-			var loader:URLLoader = URLLoader(event.target);
-			objectXml = new XML(loader.data);
-			
-			loadSettings();
-			loadCategoriesAndObjects()
-			checkForNewObjectXml();
-		}
-		
-		private function loadCategoriesAndObjects():void
-		{
-			Config.OBJECTS_FILE_VERSION = objectXml.@version;
-			Config.OBJECTS_TOTAL = XMLList(objectXml..Object).length();
-			
-			var searchTagsLabels:Array = String(objectXml.@searchTags).split(",");
-			var searchTagsTotals:Array = String(objectXml.@searchTagsTotals).split(",");
-			var searchTagsCombined:Array = new Array();
-
-			for(var i:int=0; i<searchTagsLabels.length; i++)
-				searchTagsCombined.push([searchTagsLabels[i], searchTagsTotals[i]]);
-				
-			searchTags = searchTagsCombined;
-											
-			topLevelCategoriesXml = new XMLList(objectXml.children().@name);
-			selectedTopLevelCategory = topLevelCategoriesXml[0];
-			filterTopLevelCategory(selectedTopLevelCategory);	
-		}
-
-		//--------------------------------------------------------------------------
-		//  Filtering
-		//--------------------------------------------------------------------------		
-		public function filterTopLevelCategory(category:String):void
-		{
-			selectedTopLevelCategory = category;
-			listXml = new XMLListCollection(objectXml.Category.(@name == category)..Object);
-			//treeXml = new XMLListCollection(XMLList(objectXml.Category.(@name == category)));
-			treeXml = new XMLListCollection(XMLList(objectXml.Category));
-		}
-		
-		public function filterList(filterText:String, onlyTags:Boolean = false):XMLList // HS
-		{
-			filterText = filterText.toLowerCase();
-			var filterTextTerms:Array = filterText.split(" ");
-			var filteredList:XMLList = new XMLList();
-			
-			//for each(var objectItem:XML in objectXml.Category.(@name == selectedTopLevelCategory)..Object)
-			//for each(var objectItem:XML in objectXml..Object)
-			
-			var objectsToSearch:XML = objectXml.copy();
-			delete objectsToSearch.Category.(@name == "Featured").*;
-			
-			for each(var objectItem:XML in objectsToSearch..Object)
-			{
-				var name:String = objectItem.@name.toLowerCase();
-				var tags:String = objectItem.@tags.toLowerCase();
-				var author:String = objectItem.@author.toLowerCase();
-				
-				for each(var term:String in filterTextTerms)
-				{								
-					var found:Boolean = false;
-					if(onlyTags)
-					{
-						if(tags.indexOf(term) != -1)
-							found = true;
-					}
-					else
-					{
-						if(name.indexOf(term) != -1 || author.indexOf(term) != -1 || tags.indexOf(term) != -1)
-							found = true;
-					}
-					
-					if(found)
-					{
-						filteredList += objectItem;
-						break;					
-					}					
-				}
-			}
-			
-			listXml = new XMLListCollection(filteredList);
-			sort(previousSortType);
-			return filteredList; //HS
-		}
-
-		public function sort(sortType:String = ObjectListSortTypes.ALPHABETICAL):void
-		{
-			previousSortType = sortType;
-			var sortField:String = "@name";
-			var descending:Boolean = false;
-			var numeric:Boolean = false;
-			
-			switch(sortType)
-			{
-				case ObjectListSortTypes.ALPHABETICAL:
-					sortField = "@name";
-					break;
-				case ObjectListSortTypes.MOST_RECENT:
-					sortField = "@dateAdded";
-					descending = true;
-					break;
-				case ObjectListSortTypes.MOST_POPULAR:
-					sortField = "@viewCount";
-					descending = true;
-					numeric = true;
-					break;
-			}
-
-			var sort:Sort = new Sort();
-			sort.fields = [new SortField(sortField, true, descending, numeric)];
-			listXml.sort = sort;
-			listXml.refresh();
-		}
-			
-		//--------------------------------------------------------------------------
-		//  Settings / localization
-		//--------------------------------------------------------------------------	
-		private function loadSettings():void
-		{			
-			Config.PROGRAM_TITLE = objectXml.Settings.@title;
-			Config.ABOUT_MENU_LIST = objectXml.Settings.AboutMenu.Item;
-			Config.ABOUT_MENU_TITLE = objectXml.Settings.AboutMenu.@title;
-			
-			var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
-			var ns:Namespace = appXml.namespace();
-			Config.APP_VERSION = appXml.ns::version;					
-		}		
-		
-		//--------------------------------------------------------------------------
-		//  Checking for new objects.xml and updating it 
-		//--------------------------------------------------------------------------		
-		private function checkForNewObjectXml():void
-		{
-			var loader:URLLoader = new URLLoader(new URLRequest(Config.OBJECTS_UPDATER_URL));
-			loader.addEventListener(Event.COMPLETE, objectsUpdaterXmlLoaded);
-			loader.addEventListener(IOErrorEvent.IO_ERROR, objectsUpdaterXmlLoadedError);
-		}
-		
-		private function objectsUpdaterXmlLoadedError(event:IOErrorEvent):void
-		{
-		}
-				
-		private function objectsUpdaterXmlLoaded(event:Event):void
-		{
-			var loader:URLLoader = URLLoader(event.target);
-			var objectsUpdaterXml:XML = new XML(loader.data);
-			
-			var currentVersion:String = objectXml.@version;
-			var onlineVersion:String = objectsUpdaterXml.version;
-			var onlineVersionDescription:String = objectsUpdaterXml.description;
-			
-			if(onlineVersion > currentVersion) {
-				downloadNewObjectXml(objectsUpdaterXml.url);
-				if(onlineVersionDescription.length > 0) {
-					// Only show notice if a description was provided, otherwise, silent install
-					var myPattern:RegExp = /\r\n/g;  
-					onlineVersionDescription = onlineVersionDescription.replace(myPattern,"\n");					
-					Alert.show(onlineVersionDescription, "Samples Database Updated to Version " + onlineVersion);
-				}
-			}
-		}
-		
-		private function downloadNewObjectXml(path:String):void
-		{
-			var loader:URLLoader = new URLLoader(new URLRequest(path));
-			loader.addEventListener(Event.COMPLETE, updatedObjectsXmlLoaded);
-			CursorManager.setBusyCursor();	
-		}
-		
-		public function updatedObjectsXmlLoaded(event:Event):void
-		{
-			var file:File = File.applicationStorageDirectory;
-			file = file.resolvePath(Config.OBJECTS_FILE);
-			if(file.exists)
-				file.deleteFile();
-
-			var loader:URLLoader = URLLoader(event.target);
-
-			objectXml = new XML(loader.data);	
-			loadSettings();	
-			loadCategoriesAndObjects();			
-
-			var fileStream:FileStream = new FileStream();
-			fileStream.open(file, FileMode.WRITE);
-			fileStream.writeUTFBytes(objectXml.toXMLString());
-			fileStream.close();	
-			CursorManager.removeBusyCursor();	
-
-		}			
-		//--------------------------------------------------------------------------
-		//--------------------------------------------------------------------------	
-		//------------------------------------------------------------------------
-		// Convert the XML objects into Component objects so they map to the remote 
-		// java object for easier processing by plug-in. HS
-		//------------------------------------------------------------------------
-		private function createComponentsFromXML(xmlList:XMLList):ArrayCollection 
-		{	
-			var objectsAsComponents:ArrayCollection = new ArrayCollection();
-			for each(var object:XML in xmlList)
-			{
-				trace("Component name " + object.attribute("name") + " id " + object.attribute("id"));	
-				var c:Component = new Component();
-				c.id = object.attribute("id");
-				c.name = object.attribute("name");	
-				c.author = object.attribute("author");
-				c.description = object.attribute("description");
-				objectsAsComponents.addItem(c);	
-			}
-			return objectsAsComponents;
-		}
-		//-----------------------------------------------------
-		// Find the matching components based on the search string
-		// passed from the Eclipse plug-in and add them to an Array
-		// Collection as component objects for return via Merapi. HS
-		//-----------------------------------------------------
-		public function getFilteredComponents(filter:String):ArrayCollection
-		{
-			// First setup the XML list based on the search string from the plugin
-			var resultList:XMLList = filterList(filter);			
-			var objectsAsComponents:ArrayCollection = createComponentsFromXML(resultList);
-			return objectsAsComponents;
-		}
-		//-----------------------------------------------------
-		// Fetch the list of featured components and convert them
-		// to component objects and add them to the array collection
-		// that will be returned to the eclipse plug-in. HS
-		//-----------------------------------------------------
-		public function getFeaturedComponents():ArrayCollection
-		{
-			// First setup the XML list based on the search string from the plugin
-			// Featured Components are the first child in the object XML...
-
-			var featXml:XML = objectXml.children()[0];
-			trace("Top level categories: " + featXml + objectXml.contains("Category"));
-			var featObjsList:XMLList = featXml.descendants("Object")
-			var objectsAsComponents:ArrayCollection = createComponentsFromXML(featObjsList);			
-			return objectsAsComponents;
-			
-		}
-		//-----------------------------------------------------
-		// Fetch the XML object for the id that was passed in
-		// from the Eclipse plug-in so we can navigate to that
-		// object for display. HS
-		//-----------------------------------------------------
-		public function getXMLForObjectId(matchId:String):XML {
-			var objects:XMLList = XMLList(objectXml..Object);
-			for each(var objectItem:XML in objects) {
-				var id:String = objectItem.@id.toLowerCase();
-				var name:String = objectItem.@name.toLowerCase();
-				var tags:String = objectItem.@tags.toLowerCase();
-				var author:String = objectItem.@author.toLowerCase();
-				if (id == matchId) {
-					trace("NAME: " + name + " id " + id);
-					return objectItem;
-				}
-			}
-			return null;
-		}
-
-	}
+package classes
+{
+	import flash.desktop.NativeApplication;
+	import flash.events.Event;
+	import flash.events.IOErrorEvent;
+	import flash.filesystem.File;
+	import flash.filesystem.FileMode;
+	import flash.filesystem.FileStream;
+	import flash.net.URLLoader;
+	import flash.net.URLRequest;
+	
+	import mx.collections.ArrayCollection;
+	import mx.collections.Sort;
+	import mx.collections.SortField;
+	import mx.collections.XMLListCollection;
+	import mx.controls.Alert;
+	import mx.managers.CursorManager;
+	
+	import plugin.Component; //HS
+	
+	public class ObjectData
+	{		
+		//--------------------------------------------------------------------------
+		//  Variables
+		//--------------------------------------------------------------------------
+		[Bindable] public var topLevelCategoriesXml:XMLList;		
+		[Bindable] public var listXml:XMLListCollection;
+		[Bindable] public var treeXml:XMLListCollection;
+		[Bindable] public var featuredTreeXml:XMLListCollection;		
+		[Bindable] public var searchTags:Array;
+		private var objectXml:XML;
+		private var selectedTopLevelCategory:String = "";
+		private var previousSortType:String;
+
+		//--------------------------------------------------------------------------
+		//  Loading/setup
+		//--------------------------------------------------------------------------		
+		public function ObjectData()
+		{		
+			loadData();
+		}
+		
+		public function loadData():void
+		{
+			var objectsUrl:String = Config.OBJECTS_URL;
+			trace(objectsUrl);
+			var updatableObjectFile:File = File.applicationStorageDirectory.resolvePath(Config.OBJECTS_FILE);
+			var staticObjectFile:File = File.applicationDirectory.resolvePath(Config.OBJECTS_URL);
+					
+			if(Config.isAppFirstTimeRun() || !updatableObjectFile.exists)
+				staticObjectFile.copyTo(updatableObjectFile, true);
+		
+			var loader:URLLoader = new URLLoader(new URLRequest("file://" + updatableObjectFile.nativePath));
+			loader.addEventListener(Event.COMPLETE, objectsXmlLoaded);			
+		}		
+		
+		private function objectsXmlLoaded(event:Event):void
+		{
+			trace("OBJECTS LOADED");
+			var loader:URLLoader = URLLoader(event.target);
+			objectXml = new XML(loader.data);
+			
+			loadSettings();
+			loadCategoriesAndObjects()
+			checkForNewObjectXml();
+		}
+		
+		private function loadCategoriesAndObjects():void
+		{
+			Config.OBJECTS_FILE_VERSION = objectXml.@version;
+			Config.OBJECTS_TOTAL = XMLList(objectXml..Object).length();
+			
+			var searchTagsLabels:Array = String(objectXml.@searchTags).split(",");
+			var searchTagsTotals:Array = String(objectXml.@searchTagsTotals).split(",");
+			var searchTagsCombined:Array = new Array();
+
+			for(var i:int=0; i<searchTagsLabels.length; i++)
+				searchTagsCombined.push([searchTagsLabels[i], searchTagsTotals[i]]);
+				
+			searchTags = searchTagsCombined;
+											
+			topLevelCategoriesXml = new XMLList(objectXml.children().@name);
+			selectedTopLevelCategory = topLevelCategoriesXml[0];
+			filterTopLevelCategory(selectedTopLevelCategory);	
+		}
+
+		//--------------------------------------------------------------------------
+		//  Filtering
+		//--------------------------------------------------------------------------		
+		public function filterTopLevelCategory(category:String):void
+		{
+			selectedTopLevelCategory = category;
+			listXml = new XMLListCollection(objectXml.Category.(@name == category)..Object);
+			//treeXml = new XMLListCollection(XMLList(objectXml.Category.(@name == category)));
+			treeXml = new XMLListCollection(XMLList(objectXml.Category));
+		}
+		
+		public function filterList(filterText:String, onlyTags:Boolean = false):XMLList // HS
+		{
+			filterText = filterText.toLowerCase();
+			var filterTextTerms:Array = filterText.split(" ");
+			var filteredList:XMLList = new XMLList();
+			
+			//for each(var objectItem:XML in objectXml.Category.(@name == selectedTopLevelCategory)..Object)
+			//for each(var objectItem:XML in objectXml..Object)
+			
+			var objectsToSearch:XML = objectXml.copy();
+			delete objectsToSearch.Category.(@name == "Featured").*;
+			
+			for each(var objectItem:XML in objectsToSearch..Object)
+			{
+				var name:String = objectItem.@name.toLowerCase();
+				var tags:String = objectItem.@tags.toLowerCase();
+				var author:String = objectItem.@author.toLowerCase();
+				
+				for each(var term:String in filterTextTerms)
+				{								
+					var found:Boolean = false;
+					if(onlyTags)
+					{
+						if(tags.indexOf(term) != -1)
+							found = true;
+					}
+					else
+					{
+						if(name.indexOf(term) != -1 || author.indexOf(term) != -1 || tags.indexOf(term) != -1)
+							found = true;
+					}
+					
+					if(found)
+					{
+						filteredList += objectItem;
+						break;					
+					}					
+				}
+			}
+			
+			listXml = new XMLListCollection(filteredList);
+			sort(previousSortType);
+			return filteredList; //HS
+		}
+
+		public function sort(sortType:String = ObjectListSortTypes.ALPHABETICAL):void
+		{
+			previousSortType = sortType;
+			var sortField:String = "@name";
+			var descending:Boolean = false;
+			var numeric:Boolean = false;
+			
+			switch(sortType)
+			{
+				case ObjectListSortTypes.ALPHABETICAL:
+					sortField = "@name";
+					break;
+				case ObjectListSortTypes.MOST_RECENT:
+					sortField = "@dateAdded";
+					descending = true;
+					break;
+				case ObjectListSortTypes.MOST_POPULAR:
+					sortField = "@viewCount";
+					descending = true;
+					numeric = true;
+					break;
+			}
+
+			var sort:Sort = new Sort();
+			sort.fields = [new SortField(sortField, true, descending, numeric)];
+			listXml.sort = sort;
+			listXml.refresh();
+		}
+			
+		//--------------------------------------------------------------------------
+		//  Settings / localization
+		//--------------------------------------------------------------------------	
+		private function loadSettings():void
+		{			
+			Config.PROGRAM_TITLE = objectXml.Settings.@title;
+			Config.ABOUT_MENU_LIST = objectXml.Settings.AboutMenu.Item;
+			Config.ABOUT_MENU_TITLE = objectXml.Settings.AboutMenu.@title;
+			
+			var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
+			var ns:Namespace = appXml.namespace();
+			Config.APP_VERSION = appXml.ns::version;					
+		}		
+		
+		//--------------------------------------------------------------------------
+		//  Checking for new objects.xml and updating it 
+		//--------------------------------------------------------------------------		
+		private function checkForNewObjectXml():void
+		{
+			var loader:URLLoader = new URLLoader(new URLRequest(Config.OBJECTS_UPDATER_URL));
+			loader.addEventListener(Event.COMPLETE, objectsUpdaterXmlLoaded);
+			loader.addEventListener(IOErrorEvent.IO_ERROR, objectsUpdaterXmlLoadedError);
+		}
+		
+		private function objectsUpdaterXmlLoadedError(event:IOErrorEvent):void
+		{
+		}
+				
+		private function objectsUpdaterXmlLoaded(event:Event):void
+		{
+			var loader:URLLoader = URLLoader(event.target);
+			var objectsUpdaterXml:XML = new XML(loader.data);
+			
+			var currentVersion:String = objectXml.@version;
+			var onlineVersion:String = objectsUpdaterXml.version;
+			var onlineVersionDescription:String = objectsUpdaterXml.description;
+			
+			if(onlineVersion > currentVersion) {
+				downloadNewObjectXml(objectsUpdaterXml.url);
+				if(onlineVersionDescription.length > 0) {
+					// Only show notice if a description was provided, otherwise, silent install
+					var myPattern:RegExp = /\r\n/g;  
+					onlineVersionDescription = onlineVersionDescription.replace(myPattern,"\n");					
+					Alert.show(onlineVersionDescription, "Samples Database Updated to Version " + onlineVersion);
+				}
+			}
+		}
+		
+		private function downloadNewObjectXml(path:String):void
+		{
+			var loader:URLLoader = new URLLoader(new URLRequest(path));
+			loader.addEventListener(Event.COMPLETE, updatedObjectsXmlLoaded);
+			CursorManager.setBusyCursor();	
+		}
+		
+		public function updatedObjectsXmlLoaded(event:Event):void
+		{
+			var file:File = File.applicationStorageDirectory;
+			file = file.resolvePath(Config.OBJECTS_FILE);
+			if(file.exists)
+				file.deleteFile();
+
+			var loader:URLLoader = URLLoader(event.target);
+
+			objectXml = new XML(loader.data);	
+			loadSettings();	
+			loadCategoriesAndObjects();			
+
+			var fileStream:FileStream = new FileStream();
+			fileStream.open(file, FileMode.WRITE);
+			fileStream.writeUTFBytes(objectXml.toXMLString());
+			fileStream.close();	
+			CursorManager.removeBusyCursor();	
+
+		}			
+		//--------------------------------------------------------------------------
+		//--------------------------------------------------------------------------	
+		//------------------------------------------------------------------------
+		// Convert the XML objects into Component objects so they map to the remote 
+		// java object for easier processing by plug-in. HS
+		//------------------------------------------------------------------------
+		private function createComponentsFromXML(xmlList:XMLList):ArrayCollection 
+		{	
+			var objectsAsComponents:ArrayCollection = new ArrayCollection();
+			for each(var object:XML in xmlList)
+			{
+				trace("Component name " + object.attribute("name") + " id " + object.attribute("id"));	
+				var c:Component = new Component();
+				c.id = object.attribute("id");
+				c.name = object.attribute("name");	
+				c.author = object.attribute("author");
+				c.description = object.attribute("description");
+				objectsAsComponents.addItem(c);	
+			}
+			return objectsAsComponents;
+		}
+		//-----------------------------------------------------
+		// Find the matching components based on the search string
+		// passed from the Eclipse plug-in and add them to an Array
+		// Collection as component objects for return via Merapi. HS
+		//-----------------------------------------------------
+		public function getFilteredComponents(filter:String):ArrayCollection
+		{
+			// First setup the XML list based on the search string from the plugin
+			var resultList:XMLList = filterList(filter);			
+			var objectsAsComponents:ArrayCollection = createComponentsFromXML(resultList);
+			return objectsAsComponents;
+		}
+		//-----------------------------------------------------
+		// Fetch the list of featured components and convert them
+		// to component objects and add them to the array collection
+		// that will be returned to the eclipse plug-in. HS
+		//-----------------------------------------------------
+		public function getFeaturedComponents():ArrayCollection
+		{
+			// First setup the XML list based on the search string from the plugin
+			// Featured Components are the first child in the object XML...
+
+			var featXml:XML = objectXml.children()[0];
+			trace("Top level categories: " + featXml + objectXml.contains("Category"));
+			var featObjsList:XMLList = featXml.descendants("Object")
+			var objectsAsComponents:ArrayCollection = createComponentsFromXML(featObjsList);			
+			return objectsAsComponents;
+			
+		}
+		//-----------------------------------------------------
+		// Fetch the XML object for the id that was passed in
+		// from the Eclipse plug-in so we can navigate to that
+		// object for display. HS
+		//-----------------------------------------------------
+		public function getXMLForObjectId(matchId:String):XML {
+			var objects:XMLList = XMLList(objectXml..Object);
+			for each(var objectItem:XML in objects) {
+				var id:String = objectItem.@id.toLowerCase();
+				var name:String = objectItem.@name.toLowerCase();
+				var tags:String = objectItem.@tags.toLowerCase();
+				var author:String = objectItem.@author.toLowerCase();
+				if (id == matchId) {
+					trace("NAME: " + name + " id " + id);
+					return objectItem;
+				}
+			}
+			return null;
+		}
+
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as b/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
index 166cbd4..6466fab 100644
--- a/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
@@ -16,23 +16,23 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	import mx.collections.ArrayCollection;
-	
-	public final class ObjectListSortTypes
-	{
-		
-		public static const ALPHABETICAL:String = "Alphabetical";
-		public static const MOST_RECENT:String = "Most Recent";
-		public static const MOST_POPULAR:String = "Most Popular";	
-		
-		[Bindable]
-		public static var ObjectListSortTypeArray:Array = [ALPHABETICAL, MOST_RECENT, MOST_POPULAR];
-		
-		public function ObjectListSortTypes()
-		{
-		}		
-
-	}
+package classes
+{
+	import mx.collections.ArrayCollection;
+	
+	public final class ObjectListSortTypes
+	{
+		
+		public static const ALPHABETICAL:String = "Alphabetical";
+		public static const MOST_RECENT:String = "Most Recent";
+		public static const MOST_POPULAR:String = "Most Popular";	
+		
+		[Bindable]
+		public static var ObjectListSortTypeArray:Array = [ALPHABETICAL, MOST_RECENT, MOST_POPULAR];
+		
+		public function ObjectListSortTypes()
+		{
+		}		
+
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
index 17394f2..7afbafd 100644
--- a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
@@ -16,176 +16,176 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	import mx.collections.ArrayCollection;
-	import mx.collections.CursorBookmark;
-	import mx.collections.ICollectionView;
-	import mx.collections.IViewCursor;
-	import mx.collections.XMLListCollection;
-	import mx.controls.treeClasses.ITreeDataDescriptor;
-	import mx.events.CollectionEvent;
-	import mx.events.CollectionEventKind;
-	
-	public class ObjectTreeDataDescriptor implements ITreeDataDescriptor
-	{
-		public function ObjectTreeDataDescriptor()
-		{
-		}
-
-		public function getChildren(node:Object, model:Object=null):ICollectionView
-		{
-			try
-			{		
-				return new XMLListCollection(XMLList(node).children());
-			}
-			catch (e:Error)
-			{
-				trace("[Descriptor] exception checking for getChildren:" + e.toString());
-			}
-			return null;
-		}
-		
-		// The isBranch method simply returns true if the node is an
-		// Object with a children field.
-		// It does not support empty branches, but does support null children
-		// fields.
-		public function isBranch(node:Object, model:Object=null):Boolean
-		{
-			try
-			{
-				if(node is Object)
-				{
-					if(node.children != null && XML(node).name().toString() != "Object")
-						return true;
-				}
-			}
-			catch (e:Error)
-			{
-				trace("[Descriptor] exception checking for isBranch");
-			}
-			
-			return false;
-		}
-		
-		// The hasChildren method Returns true if the
-		// node actually has children. 
-		public function hasChildren(node:Object, model:Object=null):Boolean
-		{
-			if(node == null) 
-				return false;
-			
-			var children:ICollectionView = getChildren(node, model);
-			
-			try
-			{
-				if(children.length > 0)
-					return true;
-			}
-			catch(e:Error)
-			{
-				trace("hasChildren: " + e.toString());
-			}
-			
-			return false;
-		}
-		
-		// The getData method simply returns the node as an Object.
-		public function getData(node:Object, model:Object=null):Object
-		{
-			try
-			{
-				return node;
-			}
-			catch (e:Error)
-			{
-				trace("getData: " + e.toString());
-			}
-			
-			return null;
-		}
-		
-		// The addChildAt method does the following:
-		// If the parent parameter is null or undefined, inserts
-		// the child parameter as the first child of the model parameter.
-		// If the parent parameter is an Object and has a children field,
-		// adds the child parameter to it at the index parameter location.
-		// It does not add a child to a terminal node if it does not have
-		// a children field.
-		public function addChildAt(parent:Object, child:Object, index:int, model:Object=null):Boolean
-		{
-			var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
-			event.kind = CollectionEventKind.ADD;
-			event.items = [child];
-			event.location = index;
-			
-			if (!parent)
-			{
-				var iterator:IViewCursor = model.createCursor();
-				iterator.seek(CursorBookmark.FIRST, index);
-				iterator.insert(child);
-			}
-			else if (parent is Object)
-			{
-				if (parent.children != null)
-				{
-					if(parent.children is ArrayCollection)
-					{
-						parent.children.addItemAt(child, index);
-						if (model)
-						{
-							model.dispatchEvent(event);
-							model.itemUpdated(parent);
-						}
-						return true;
-					}
-					else
-					{
-						parent.children.splice(index, 0, child);
-						if(model)
-							model.dispatchEvent(event);
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-		
-		// The removeChildAt method does the following:
-		// If the parent parameter is null or undefined,
-		// removes the child at the specified index
-		// in the model.
-		// If the parent parameter is an Object and has a children field,
-		// removes the child at the index parameter location in the parent.
-		public function removeChildAt(parent:Object, child:Object, index:int, model:Object=null):Boolean
-		{
-			var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
-			event.kind = CollectionEventKind.REMOVE;
-			event.items = [child];
-			event.location = index;
-		
-			//handle top level where there is no parent
-			if (!parent)
-			{
-				var iterator:IViewCursor = model.createCursor();
-				iterator.seek(CursorBookmark.FIRST, index);
-				iterator.remove();
-				if (model)
-						model.dispatchEvent(event);
-				return true;
-			}
-			else if (parent is Object)
-			{
-				if (parent.children != undefined)
-				{
-					parent.children.splice(index, 1);
-					if(model) 
-						model.dispatchEvent(event);
-					return true;
-				}
-			}
-			return false;
-		}
-
-	}
+package classes
+{
+	import mx.collections.ArrayCollection;
+	import mx.collections.CursorBookmark;
+	import mx.collections.ICollectionView;
+	import mx.collections.IViewCursor;
+	import mx.collections.XMLListCollection;
+	import mx.controls.treeClasses.ITreeDataDescriptor;
+	import mx.events.CollectionEvent;
+	import mx.events.CollectionEventKind;
+	
+	public class ObjectTreeDataDescriptor implements ITreeDataDescriptor
+	{
+		public function ObjectTreeDataDescriptor()
+		{
+		}
+
+		public function getChildren(node:Object, model:Object=null):ICollectionView
+		{
+			try
+			{		
+				return new XMLListCollection(XMLList(node).children());
+			}
+			catch (e:Error)
+			{
+				trace("[Descriptor] exception checking for getChildren:" + e.toString());
+			}
+			return null;
+		}
+		
+		// The isBranch method simply returns true if the node is an
+		// Object with a children field.
+		// It does not support empty branches, but does support null children
+		// fields.
+		public function isBranch(node:Object, model:Object=null):Boolean
+		{
+			try
+			{
+				if(node is Object)
+				{
+					if(node.children != null && XML(node).name().toString() != "Object")
+						return true;
+				}
+			}
+			catch (e:Error)
+			{
+				trace("[Descriptor] exception checking for isBranch");
+			}
+			
+			return false;
+		}
+		
+		// The hasChildren method Returns true if the
+		// node actually has children. 
+		public function hasChildren(node:Object, model:Object=null):Boolean
+		{
+			if(node == null) 
+				return false;
+			
+			var children:ICollectionView = getChildren(node, model);
+			
+			try
+			{
+				if(children.length > 0)
+					return true;
+			}
+			catch(e:Error)
+			{
+				trace("hasChildren: " + e.toString());
+			}
+			
+			return false;
+		}
+		
+		// The getData method simply returns the node as an Object.
+		public function getData(node:Object, model:Object=null):Object
+		{
+			try
+			{
+				return node;
+			}
+			catch (e:Error)
+			{
+				trace("getData: " + e.toString());
+			}
+			
+			return null;
+		}
+		
+		// The addChildAt method does the following:
+		// If the parent parameter is null or undefined, inserts
+		// the child parameter as the first child of the model parameter.
+		// If the parent parameter is an Object and has a children field,
+		// adds the child parameter to it at the index parameter location.
+		// It does not add a child to a terminal node if it does not have
+		// a children field.
+		public function addChildAt(parent:Object, child:Object, index:int, model:Object=null):Boolean
+		{
+			var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
+			event.kind = CollectionEventKind.ADD;
+			event.items = [child];
+			event.location = index;
+			
+			if (!parent)
+			{
+				var iterator:IViewCursor = model.createCursor();
+				iterator.seek(CursorBookmark.FIRST, index);
+				iterator.insert(child);
+			}
+			else if (parent is Object)
+			{
+				if (parent.children != null)
+				{
+					if(parent.children is ArrayCollection)
+					{
+						parent.children.addItemAt(child, index);
+						if (model)
+						{
+							model.dispatchEvent(event);
+							model.itemUpdated(parent);
+						}
+						return true;
+					}
+					else
+					{
+						parent.children.splice(index, 0, child);
+						if(model)
+							model.dispatchEvent(event);
+						return true;
+					}
+				}
+			}
+			return false;
+		}
+		
+		// The removeChildAt method does the following:
+		// If the parent parameter is null or undefined,
+		// removes the child at the specified index
+		// in the model.
+		// If the parent parameter is an Object and has a children field,
+		// removes the child at the index parameter location in the parent.
+		public function removeChildAt(parent:Object, child:Object, index:int, model:Object=null):Boolean
+		{
+			var event:CollectionEvent = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
+			event.kind = CollectionEventKind.REMOVE;
+			event.items = [child];
+			event.location = index;
+		
+			//handle top level where there is no parent
+			if (!parent)
+			{
+				var iterator:IViewCursor = model.createCursor();
+				iterator.seek(CursorBookmark.FIRST, index);
+				iterator.remove();
+				if (model)
+						model.dispatchEvent(event);
+				return true;
+			}
+			else if (parent is Object)
+			{
+				if (parent.children != undefined)
+				{
+					parent.children.splice(index, 1);
+					if(model) 
+						model.dispatchEvent(event);
+					return true;
+				}
+			}
+			return false;
+		}
+
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
index 4133b00..e58fc5c 100644
--- a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
@@ -16,79 +16,79 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package classes
-{
-	import mx.controls.Image;
-	import mx.controls.treeClasses.TreeItemRenderer;
-	import mx.controls.treeClasses.TreeListData;
-
-	public class ObjectTreeItemRenderer extends TreeItemRenderer
-	{
-		protected var iconImage:Image;
-		private var imageWidth:Number	= 18;
-		private var imageHeight:Number	= 18;
-		private var imageToLabelMargin:Number = 2;
-		
-		public function ObjectTreeItemRenderer()
-		{
-			super();
-		}
-		
-		override protected function createChildren():void
-		{	
-			iconImage = new Image();	
-			iconImage.width = imageWidth;
-			iconImage.height = imageHeight;
-			addChild(iconImage);	
-	
-			super.createChildren();
-		} 
-		
-		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
-		{
-			super.updateDisplayList(unscaledWidth, unscaledHeight);
-			if(super.data)
-			{
-				if(!TreeListData(super.listData).hasChildren)
-				{
-					iconImage.x = super.label.x - imageWidth - imageToLabelMargin;
-					
-					var tmp:XMLList = new XMLList(TreeListData(super.listData).item);					
-					var iconPath:String = tmp.@iconPath.toString();
-					if(tmp.@localIconPath.toString().length > 0)
-						iconPath = tmp.@localIconPath;
-						
-					if(iconPath.length > 0)
-					{
-						if(hasFullPath(iconPath)) {
-							if (Config.IS_ONLINE) {
-								iconImage.source = iconPath;
-							} else {
-								iconImage.source = Config.TREE_NO_ICON;
-							}
-						}
-						else
-							iconImage.source = Config.LOCAL_OBJECTS_ROOT_PATH + iconPath;
-					}
-					else
-					{
-						iconImage.source = Config.TREE_NO_ICON;
-					}										
-				}
-				else
-				{
-					iconImage.source = null;
-				}
-			}
-		}
-		
-		private function hasFullPath(path:String):Boolean
-		{
-			if(path.indexOf("//") >= 0 || path.indexOf(":") >= 0)
-				return true;
-			else
-				return false;
-		}
-		
-	}
+package classes
+{
+	import mx.controls.Image;
+	import mx.controls.treeClasses.TreeItemRenderer;
+	import mx.controls.treeClasses.TreeListData;
+
+	public class ObjectTreeItemRenderer extends TreeItemRenderer
+	{
+		protected var iconImage:Image;
+		private var imageWidth:Number	= 18;
+		private var imageHeight:Number	= 18;
+		private var imageToLabelMargin:Number = 2;
+		
+		public function ObjectTreeItemRenderer()
+		{
+			super();
+		}
+		
+		override protected function createChildren():void
+		{	
+			iconImage = new Image();	
+			iconImage.width = imageWidth;
+			iconImage.height = imageHeight;
+			addChild(iconImage);	
+	
+			super.createChildren();
+		} 
+		
+		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+		{
+			super.updateDisplayList(unscaledWidth, unscaledHeight);
+			if(super.data)
+			{
+				if(!TreeListData(super.listData).hasChildren)
+				{
+					iconImage.x = super.label.x - imageWidth - imageToLabelMargin;
+					
+					var tmp:XMLList = new XMLList(TreeListData(super.listData).item);					
+					var iconPath:String = tmp.@iconPath.toString();
+					if(tmp.@localIconPath.toString().length > 0)
+						iconPath = tmp.@localIconPath;
+						
+					if(iconPath.length > 0)
+					{
+						if(hasFullPath(iconPath)) {
+							if (Config.IS_ONLINE) {
+								iconImage.source = iconPath;
+							} else {
+								iconImage.source = Config.TREE_NO_ICON;
+							}
+						}
+						else
+							iconImage.source = Config.LOCAL_OBJECTS_ROOT_PATH + iconPath;
+					}
+					else
+					{
+						iconImage.source = Config.TREE_NO_ICON;
+					}										
+				}
+				else
+				{
+					iconImage.source = null;
+				}
+			}
+		}
+		
+		private function hasFullPath(path:String):Boolean
+		{
+			if(path.indexOf("//") >= 0 || path.indexOf(":") >= 0)
+				return true;
+			else
+				return false;
+		}
+		
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml b/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
index 02293a2..da94159 100644
--- a/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
+++ b/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!--
 
   Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,41 +17,41 @@
   limitations under the License.
 
 -->
-<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="500" height="430" horizontalScrollPolicy="off" verticalScrollPolicy="off" click="closeAbout()">
-	
-	<mx:Script>
-	<![CDATA[
-		import mx.managers.PopUpManager;
-		
-		public var isOpen:Boolean = false;
-		
-		public function set url(value:String):void
-		{
-			html_view.htmlLoader.navigateInSystemBrowser = true;
-			html_view.location = value;			
-		}
-		
-		public function closeAbout():void {
-			isOpen = false;
-			parentApplication.setFocus(); 
-			PopUpManager.removePopUp(this)
-		}
-		
-	]]>
-	</mx:Script>
-
-	<mx:Parallel id="aboutEffect">
-		<mx:Fade alphaFrom="0" alphaTo="1" duration="300"/>
-		<mx:Blur blurXFrom="300" blurXTo="0" duration="700"/>
-	</mx:Parallel>
-
-	<mx:Parallel id="shadowEffect">
-		<mx:Fade duration="1000"/>
-		<mx:Blur blurXFrom="0" blurYFrom="0" blurXTo="20" blurYTo="20" duration="500"/>
-		<mx:Fade duration="1000"/>
-	</mx:Parallel>
-
-	<mx:Canvas x="15" y="15" backgroundColor="black" backgroundAlpha="0.5" width="434" height="368" addedEffect="shadowEffect"/>
-	<mx:HTML x="0" y="0" id="html_view" width="439" height="368" addedEffect="aboutEffect" verticalScrollPolicy="off" horizontalScrollPolicy="off" />
-	
-</mx:Canvas>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="500" height="430" horizontalScrollPolicy="off" verticalScrollPolicy="off" click="closeAbout()">
+	
+	<mx:Script>
+	<![CDATA[
+		import mx.managers.PopUpManager;
+		
+		public var isOpen:Boolean = false;
+		
+		public function set url(value:String):void
+		{
+			html_view.htmlLoader.navigateInSystemBrowser = true;
+			html_view.location = value;			
+		}
+		
+		public function closeAbout():void {
+			isOpen = false;
+			parentApplication.setFocus(); 
+			PopUpManager.removePopUp(this)
+		}
+		
+	]]>
+	</mx:Script>
+
+	<mx:Parallel id="aboutEffect">
+		<mx:Fade alphaFrom="0" alphaTo="1" duration="300"/>
+		<mx:Blur blurXFrom="300" blurXTo="0" duration="700"/>
+	</mx:Parallel>
+
+	<mx:Parallel id="shadowEffect">
+		<mx:Fade duration="1000"/>
+		<mx:Blur blurXFrom="0" blurYFrom="0" blurXTo="20" blurYTo="20" duration="500"/>
+		<mx:Fade duration="1000"/>
+	</mx:Parallel>
+
+	<mx:Canvas x="15" y="15" backgroundColor="black" backgroundAlpha="0.5" width="434" height="368" addedEffect="shadowEffect"/>
+	<mx:HTML x="0" y="0" id="html_view" width="439" height="368" addedEffect="aboutEffect" verticalScrollPolicy="off" horizontalScrollPolicy="off" />
+	
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/5ed4d983/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml b/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
index 2524d89..430629d 100644
--- a/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
+++ b/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!--
 
   Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,46 +17,46 @@
   limitations under the License.
 
 -->
-<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" width="100%" height="30" styleName="applicationFooter">
-
-	<mx:Script >
-	<![CDATA[
-		import mx.managers.PopUpManager;
-		
-		private var popup:AboutWindow;
-		
-		private function init():void
-		{
-			popup = new AboutWindow();
-		}
-		
-		private function showAbout():void
-		{
-			if(!popup.isOpen)
-			{				
-				PopUpManager.addPopUp(popup, DisplayObject(this.parentApplication), false);
-				popup.url = "data/about.html";
-				popup.isOpen = true;
-				PopUpManager.centerPopUp(popup);
-				popup.move(popup.x + 70, popup.y + 50);
-			}
-			else
-			{			
-				popup.isOpen = false;	
-				PopUpManager.removePopUp(popup);
-			}
-		}
-		
-	]]>
-	</mx:Script>
-	<mx:Button x="4" y="1" id="aboutBtn" styleName="aboutButton" click="showAbout();" />
-	<mx:HBox x="70" width="100%" height="100%" verticalAlign="middle">
-		<mx:Label text="©2010 Adobe Inc, All Rights Reserved" width="25%" textAlign="center" />
-		<mx:Label id="label_version" text="Version: {Config.APP_VERSION}" width="25%" textAlign="center" />
-		<mx:Label id="label_objectsDataVersion" text="List Version: {Config.OBJECTS_FILE_VERSION}" width="25%" textAlign="center" />
-		<mx:Label id="label_objectsTotal" text="Samples: {Config.OBJECTS_TOTAL}" width="25%" textAlign="center" />		
-	</mx:HBox>	
-	
-	<mx:Image bottom="5" right="4" source="@Embed('/images/button_clear.png')" mouseDown="stage.nativeWindow.startResize()" buttonMode="true" mouseEnabled="true" useHandCursor="true" />
-	
-</mx:Canvas>
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()" width="100%" height="30" styleName="applicationFooter">
+
+	<mx:Script >
+	<![CDATA[
+		import mx.managers.PopUpManager;
+		
+		private var popup:AboutWindow;
+		
+		private function init():void
+		{
+			popup = new AboutWindow();
+		}
+		
+		private function showAbout():void
+		{
+			if(!popup.isOpen)
+			{				
+				PopUpManager.addPopUp(popup, DisplayObject(this.parentApplication), false);
+				popup.url = "data/about.html";
+				popup.isOpen = true;
+				PopUpManager.centerPopUp(popup);
+				popup.move(popup.x + 70, popup.y + 50);
+			}
+			else
+			{			
+				popup.isOpen = false;	
+				PopUpManager.removePopUp(popup);
+			}
+		}
+		
+	]]>
+	</mx:Script>
+	<mx:Button x="4" y="1" id="aboutBtn" styleName="aboutButton" click="showAbout();" />
+	<mx:HBox x="70" width="100%" height="100%" verticalAlign="middle">
+		<mx:Label text="©2010 Adobe Inc, All Rights Reserved" width="25%" textAlign="center" />
+		<mx:Label id="label_version" text="Version: {Config.APP_VERSION}" width="25%" textAlign="center" />
+		<mx:Label id="label_objectsDataVersion" text="List Version: {Config.OBJECTS_FILE_VERSION}" width="25%" textAlign="center" />
+		<mx:Label id="label_objectsTotal" text="Samples: {Config.OBJECTS_TOTAL}" width="25%" textAlign="center" />		
+	</mx:HBox>	
+	
+	<mx:Image bottom="5" right="4" source="@Embed('/images/button_clear.png')" mouseDown="stage.nativeWindow.startResize()" buttonMode="true" mouseEnabled="true" useHandCursor="true" />
+	
+</mx:Canvas>