http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectData.as 
b/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
new file mode 100644
index 0000000..01ef169
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectData.as
@@ -0,0 +1,336 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+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/e1f9d1df/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as 
b/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
new file mode 100644
index 0000000..166cbd4
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectListSortTypes.as
@@ -0,0 +1,38 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+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/e1f9d1df/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as 
b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
new file mode 100644
index 0000000..17394f2
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeDataDescriptor.as
@@ -0,0 +1,191 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+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/e1f9d1df/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as 
b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
new file mode 100644
index 0000000..4133b00
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/classes/ObjectTreeItemRenderer.as
@@ -0,0 +1,94 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+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/e1f9d1df/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
new file mode 100644
index 0000000..02293a2
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/AboutWindow.mxml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<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/e1f9d1df/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml 
b/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
new file mode 100644
index 0000000..2524d89
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/ApplicationFooter.mxml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<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>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/ApplicationHeader.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/ApplicationHeader.mxml 
b/TourDeFlex/TourDeFlex/src/components/ApplicationHeader.mxml
new file mode 100644
index 0000000..a01947c
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/ApplicationHeader.mxml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"; width="100%" height="42"
+        verticalScrollPolicy="off" horizontalScrollPolicy="off" 
backgroundAlpha="0">
+       
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.Alert;
+               import mx.managers.PopUpManager;
+               import mx.events.ListEvent;
+               
+               [Bindable]
+               private var resourceTitle:String = " ";
+               
+               /*
+               private function comboBox_about_change(event:ListEvent):void
+               {       
+                       
if(comboBox_about.selectedItem.@data.toString().toLowerCase().indexOf("http") 
== 0)
+                       {
+                               navigateToURL(new 
URLRequest(comboBox_about.selectedItem.@data));
+                       }
+                       else if(comboBox_about.selectedItem.@data == 
"SplashWindow")
+                       {
+                               var splashWindow:SplashWindow = new 
SplashWindow();
+                               PopUpManager.addPopUp(splashWindow, 
DisplayObject(this.parentApplication), false);
+                               PopUpManager.centerPopUp(splashWindow);
+                       }
+                       else
+                       {
+                               var popup:AboutWindow = new AboutWindow();
+                               PopUpManager.addPopUp(popup, 
DisplayObject(this.parentApplication), false);
+                               popup.url = comboBox_about.selectedItem.@data;
+                               PopUpManager.centerPopUp(popup);
+                               popup.move(popup.x + 70, popup.y + 50);  // 
move it 50 pixels right - GAW                                               
+                       }
+                       comboBox_about.selectedIndex = -1; // Reset menu
+               }
+               */
+               
+               private function button_quickStart_click(event:MouseEvent):void
+               {                               
+                       TourDeFlex(this.parentApplication).showQuickStart();
+               }
+               
+       ]]>
+       </mx:Script>
+       
+       <mx:HBox styleName="applicationHeader" width="100%" height="100%"  
mouseDown="stage.nativeWindow.startMove()" />
+       
+       <!--<mx:VBox right="37" y="2" height="100%" verticalAlign="middle" 
horizontalAlign="right">-->
+               <mx:HBox right="6" y="10" paddingTop="2" width="214" 
horizontalGap="2" horizontalScrollPolicy="off">
+                       <mx:Button styleName="aboutComboBox" width="103" 
height="14" click="button_quickStart_click(event)" />
+                       <!--<mx:ComboBox id="comboBox_about" 
prompt="{resourceTitle}" width="103" height="14" 
change="comboBox_about_change(event)" rowCount="20" styleName="aboutComboBox" 
dataProvider="{Config.ABOUT_MENU_LIST}" labelField="@label" />-->   
+                       <!--prompt="{Config.ABOUT_MENU_TITLE}" -->
+                       <mx:Spacer width="30" />
+                       <mx:Button width="20" 
styleName="applicationMinimizeButton" click="parentApplication.minimize()" 
tabEnabled="false" toolTip="Minimize" buttonMode="true" mouseEnabled="true" 
useHandCursor="true" />
+                       <mx:Button width="20" 
styleName="applicationMaximizeButton" click="if(stage.displayState == 
StageDisplayState.FULL_SCREEN_INTERACTIVE) stage.displayState = 
StageDisplayState.NORMAL; else stage.displayState = 
StageDisplayState.FULL_SCREEN_INTERACTIVE" tabEnabled="false" toolTip="Full 
Screen" buttonMode="true" mouseEnabled="true" useHandCursor="true" />
+                       <mx:Button width="20" 
styleName="applicationCloseButton" 
+                               
click="NativeApplication.nativeApplication.dispatchEvent(new 
Event(Event.EXITING,true,true));" 
+                               tabEnabled="false" toolTip="Close" 
buttonMode="true" mouseEnabled="true" useHandCursor="true" />
+                               
+               </mx:HBox>
+       <!--</mx:VBox>-->       
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/CommentsWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/CommentsWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/CommentsWindow.mxml
new file mode 100644
index 0000000..67094d5
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/CommentsWindow.mxml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<WipeWindow xmlns="components.*" xmlns:mx="http://www.adobe.com/2006/mxml"; 
horizontalAlign="right">
+
+       <mx:Script>
+       <![CDATA[
+               
+               private var commentsInitiallyLoaded:Boolean = false;
+               
+               public function loadComments(objectId:int, 
isOnline:Boolean):void
+               {
+                       if(isOnline)
+                               this.html_comments.location = 
Config.COMMENTS_URL + objectId;
+                       else
+                               this.html_comments.location = 
Config.OFFLINE_URL;
+               }
+               
+               private function html_comments_loaded(event:Event):void
+               {                       
+                       if(commentsInitiallyLoaded)
+                               
this.parentApplication.HTTP_GetCommentsTotal.send();
+                       
+                       commentsInitiallyLoaded = true;
+               }
+               
+       ]]>
+       </mx:Script>
+       
+       <mx:Button click="{this.visible = false}" styleName="closeButton"/>
+       
+       <mx:HTML id="html_comments" width="100%" height="100%" 
complete="html_comments_loaded(event)" />
+       
+</WipeWindow>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/DocumentTabs.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/DocumentTabs.mxml 
b/TourDeFlex/TourDeFlex/src/components/DocumentTabs.mxml
new file mode 100644
index 0000000..e9b1251
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/DocumentTabs.mxml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:TabNavigator xmlns:mx="http://www.adobe.com/2006/mxml"; 
xmlns:local="components.*"
+                                          width="100%" height="100%" 
styleName="documentTabs" selectedTabTextStyleName="documentTabSelected">
+
+       <mx:Script>
+       <![CDATA[
+               import classes.Document;
+               import mx.controls.HTML;
+               import mx.containers.VBox;
+               
+               public var needHtmlHack:Boolean = false; // This is a total 
hack to work around TWO bugs in Flex.  Ask Greg Wilson for details
+                               
+               public function addTabs(documents:Array, 
localRootPath:String):void
+               {
+                       this.selectedIndex = 0;
+                       this.validateNow();
+                       this.removeAllChildren();
+                                               
+                       for each(var document:Document in documents)
+                               this.addTab(document.name, document.path, 
document.openLinksExternal, localRootPath);
+               }
+               
+               // There is a bug in the Flex 3.2 html control where the 
default font is set too large.  This method puts it back to the desired default 
of 11px.
+               public function changeDefaultFont(e:Event):void {
+                       var frames:Object = 
e.target.htmlLoader.window.document.getElementsByTagName("frame");
+                       if (frames.length == 0)
+                       {
+                               // document does not have frames
+                               
if(e.target.htmlLoader.window.document.getElementsByTagName("body")[0])
+                                       
e.target.htmlLoader.window.document.getElementsByTagName("body")[0].style.fontSize="11px";
+                       }
+                       else
+                       {
+                               // document has frames... change style for 
document in each frame
+                               for (var i:int=0;i<frames.length;i++)
+                               {
+                                       
if(frames[i].contentDocument.getElementsByTagName("body")[0])
+                                               
frames[i].contentDocument.getElementsByTagName("body")[0].style.fontSize="11px";
+                               }
+                       }
+                       e.target.visible = true;
+               }
+       
+               public function removeCleanup(e:Event):void {
+                       if (this.needHtmlHack) {
+                               //trace("CLEANUP");
+                               e.target.htmlText = ""; // Hack - GAW - forces 
any loaded SWFs to stop
+                       }
+               }
+
+               
+               public function addTab(name:String, path:String, 
openLinksExternal:String, localRootPath:String):void
+               {
+                       var tab:VBox = new VBox();
+                       tab.percentWidth = 100;
+                       tab.percentHeight = 100;
+                       if(name.length == 0)
+                               tab.label = getFileName(path);
+                       else
+                               tab.label = name;
+                       this.addChild(tab);
+                       
+                       var html_illustration:HTML = new HTML();
+                       html_illustration.percentWidth = 100;
+                       html_illustration.percentHeight = 100;
+                       html_illustration.visible = false;   // Set to true 
after changeDefaultFont
+                       
html_illustration.addEventListener(Event.COMPLETE,changeDefaultFont);
+                       
html_illustration.addEventListener(Event.REMOVED_FROM_STAGE, removeCleanup);
+                       tab.addChild(html_illustration);        
+                       
+                       if (openLinksExternal.toLowerCase() == "true") 
+                       {
+                               
html_illustration.htmlLoader.navigateInSystemBrowser = true; // Open links in 
default browser
+                       }
+                       
+                       if(path.toLowerCase().indexOf("http") == 0)
+                       {
+                               if(Config.IS_ONLINE)
+                                       html_illustration.location = path;
+                               else
+                                       html_illustration.location = 
Config.OFFLINE_URL;
+                       }
+                       else
+                       {
+                               html_illustration.location = localRootPath + 
path;
+                       }
+               }
+               
+               private function getFileName(path:String):String
+               {
+                       var fileName:String = "";
+                       var slashPos:int = path.lastIndexOf("/");
+                       var backslashPos:int = path.lastIndexOf("\\");
+                       
+                       if(slashPos > 0)
+                               fileName = path.substr(slashPos+1); 
+                       else if(backslashPos > 0)       
+                               fileName = path.substr(backslashPos+1); 
+                       else
+                               fileName = "Document";
+                               
+                       return fileName;
+               }
+               
+       ]]>
+       </mx:Script>
+
+</mx:TabNavigator>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/DownloadWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/DownloadWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/DownloadWindow.mxml
new file mode 100644
index 0000000..e0b7be8
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/DownloadWindow.mxml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"; layout="vertical" 
horizontalAlign="center" verticalAlign="middle" styleName="downloadWindow" 
width="300" height="150" creationComplete="init()">
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.Alert;
+               import mx.managers.PopUpManager;
+               
+               private var fileReference:FileReference;
+               private var localFileToSave:File;
+               private var fileToSave:File;
+                               
+               private function init():void
+               {
+                       fileReference = new FileReference();
+               }
+               
+               public function download(path:String, localRootPath:String):void
+               {
+                       if(path.toLowerCase().indexOf("http") == 0)
+                               downloadHttp(path);
+                       else
+                               downloadLocal(localRootPath + path);            
        
+               }
+               
+               private function downloadLocal(path:String):void
+               {               
+                       localFileToSave = 
File.applicationDirectory.resolvePath(path);
+                       
+                       fileToSave = new 
File(File.documentsDirectory.nativePath + File.separator + 
localFileToSave.name);
+                       fileToSave.addEventListener(Event.SELECT, 
downloadLocal_directorySelect);
+                       fileToSave.addEventListener(Event.CANCEL, 
downloadLocal_directorySelectCancel);
+                       fileToSave.browseForSave("Save As");                    
+               }
+               
+               private function 
downloadLocal_directorySelect(event:Event):void 
+               {                       
+                       
localFileToSave.addEventListener(ProgressEvent.PROGRESS, 
download_progressHandler);
+                       localFileToSave.addEventListener(Event.COMPLETE, 
download_completeHandler);
+                       localFileToSave.copyToAsync(fileToSave, true);
+                       progressBar_download.setProgress(100,100);
+               }       
+               
+               private function 
downloadLocal_directorySelectCancel(event:Event):void 
+               {
+                       PopUpManager.removePopUp(this);
+               }               
+
+               private function downloadHttp(path:String):void
+               {
+                       var request:URLRequest = new URLRequest(path);
+                       fileReference = new FileReference();
+                       fileReference.addEventListener(Event.OPEN, 
download_openHandler);
+                       fileReference.addEventListener(ProgressEvent.PROGRESS, 
download_progressHandler);
+                       fileReference.addEventListener(Event.COMPLETE, 
download_completeHandler);
+                       
+                       try
+                       {
+                               fileReference.download(request);
+                       }
+                       catch (error:Error)
+                       {
+                               Alert.show(error.message, "Download Error");
+                       }
+               }
+               
+               private function download_openHandler(event:Event):void
+    {
+                       progressBar_download.label = "DOWNLOADING %3%%";
+                       button_cancel.visible = true;
+                       button_close.visible = false;
+    }
+               
+               private function 
download_progressHandler(event:ProgressEvent):void
+               {
+                       progressBar_download.setProgress(event.bytesLoaded, 
event.bytesTotal);
+               }       
+               
+               private function download_cancel(event:MouseEvent):void
+               {
+                       fileReference.cancel();
+                       progressBar_download.label = "CANCELLED";
+                       button_close.visible = true;
+                       button_cancel.visible = false;
+                       
+                       PopUpManager.removePopUp(this);
+               }                       
+               
+               private function download_completeHandler(event:Event):void
+               {
+                       progressBar_download.label = "DOWNLOAD COMPLETE";
+                       button_close.visible = true;
+                       button_cancel.visible = false;
+               }
+               
+       ]]>
+       </mx:Script>    
+       
+       <mx:ProgressBar id="progressBar_download" width="90%" mode="manual" 
label="DOWNLOADING..." />   
+       
+       <mx:Canvas>
+               <mx:Button id="button_cancel" label="Cancel" visible="false" 
click="download_cancel(event)" horizontalCenter="0" />             
+               <mx:Button id="button_close" label="Close" 
click="{PopUpManager.removePopUp(this)}" horizontalCenter="0"/>
+       </mx:Canvas>
+       
+</mx:TitleWindow>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/IllustrationTab.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/IllustrationTab.mxml 
b/TourDeFlex/TourDeFlex/src/components/IllustrationTab.mxml
new file mode 100644
index 0000000..7095a69
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/IllustrationTab.mxml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"; width="100%" 
height="100%" remove="unloadIllustration();">
+       
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.Alert;
+               import mx.core.Application;
+               import mx.core.FlexGlobals;
+               import mx.modules.ModuleLoader;
+               
+               public var downloadPath:String = "";
+               public var illustrationURL:String = "";
+               public var autoExpand:Boolean = false;
+
+               public function setLocation(path:String, isModule:String):void
+               {                       
+                       //mx.core.Application.application.button_expand.enabled 
= true;
+                       FlexGlobals.topLevelApplication.button_expand.enabled = 
true;
+                       
+                       if(isModule.toLowerCase() == "true")
+                       {
+                               this.removeChild(html_illustration);
+                               module_swfs.url = path;
+                               illustrationURL = "";
+                               
FlexGlobals.topLevelApplication.button_browser.enabled = false;
+                       }
+                       else
+                       {                               
+                               this.removeChild(module_swfs);
+                               html_illustration.location = path;
+                               illustrationURL = path;
+                               
FlexGlobals.topLevelApplication.button_browser.enabled = true;
+
+                       }                       
+               }
+               
+               public function unloadIllustration():void {
+                       if (this.contains(html_illustration)) 
+                       {
+                               html_illustration.htmlText = ""; // hack - GAW
+                               this.removeChild(html_illustration); // hack - 
GAW                              
+                       } 
+                       else
+                       {       
+                               module_swfs.unloadModule();
+                       }
+               }
+               
+       ]]>
+       </mx:Script>
+       
+       <mx:Parallel id="arrowShow">
+               <mx:Fade alphaFrom="0.5" alphaTo="1.0" duration="500"/>
+       </mx:Parallel>
+
+       <mx:Parallel id="arrowDim">     
+               <mx:Fade alphaFrom="1.0" alphaTo="0.5" duration="500"/>
+       </mx:Parallel>
+               
+       <mx:HTML id="html_illustration" width="100%" height="100%" 
horizontalScrollPolicy="off" verticalScrollPolicy="off" />
+       <mx:ModuleLoader id="module_swfs" height="100%" width="100%" 
backgroundColor="#323232" horizontalAlign="center" verticalAlign="middle" />
+
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/IllustrationTabs.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/IllustrationTabs.mxml 
b/TourDeFlex/TourDeFlex/src/components/IllustrationTabs.mxml
new file mode 100644
index 0000000..1d4e226
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/IllustrationTabs.mxml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<local:TDFTabNavigator xmlns:mx="http://www.adobe.com/2006/mxml"; 
xmlns:local="components.*" width="100%" height="100%"  
+       creationComplete="init()" styleName="illustrationTabs"  
selectedTabTextStyleName="illustrationTabSelected">
+
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.Image;
+               import mx.collections.ArrayCollection;
+               import mx.controls.HTML;
+               import mx.containers.VBox;
+               
+               public var associatedDocumentsCollection:ArrayCollection;
+               
+               private function init():void
+               {
+                       var t:TDFTabNavigator = new TDFTabNavigator();
+                       associatedDocumentsCollection = new ArrayCollection();
+               }
+               
+               public function addTab(name:String, path:String, 
localRootPath:String, isModule:String, downloadPath:String, autoExpand:String, 
openLinksExternal:String, scrollBars:String, associatedDocuments:Array):void
+               {
+                       
this.associatedDocumentsCollection.addItem(associatedDocuments);
+                                               
+                       var tab:IllustrationTab = new IllustrationTab();
+                       tab.downloadPath = downloadPath;        
+                       tab.autoExpand = (autoExpand.toLowerCase() == "true")? 
true:false;
+                       
+                       if(name.length == 0)
+                               tab.label = "Sample " + 
(this.getChildren().length + 1);
+                       else
+                               tab.label = name;
+                               
+                       this.addChild(tab);
+
+                       if(scrollBars.toLowerCase() == "true") {
+                               tab.html_illustration.verticalScrollPolicy = 
"auto";
+                               tab.html_illustration.horizontalScrollPolicy = 
"auto";
+                       }
+                       
+                       if(openLinksExternal.toLowerCase() == "true") 
+                               
tab.html_illustration.htmlLoader.navigateInSystemBrowser = true;
+
+                       if(path.toLowerCase().indexOf("http") == 0)
+                               tab.setLocation(path, isModule);
+                       else
+                               tab.setLocation(localRootPath + path, isModule);
+               }
+               
+               public function removeAllIllustrations():void
+               {
+                       //reset selected tab due to tab selection issue - HS - 
took out, use TDFTabNavigator class now instead.
+                       //this.selectedIndex = 0;
+                       //this.validateNow();
+                       
+                       this.removeAllChildren();
+                       this.associatedDocumentsCollection.removeAll();
+                       
+               }
+               
+               public function hideSwf():void
+               {
+                       this.selectedChild.visible = false;
+               }
+               
+       ]]>
+       </mx:Script>
+
+</local:TDFTabNavigator>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/ObjectList.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/ObjectList.mxml 
b/TourDeFlex/TourDeFlex/src/components/ObjectList.mxml
new file mode 100644
index 0000000..b79ea67
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/ObjectList.mxml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"; width="98%" height="98%">
+       
+       <mx:Script>
+       <![CDATA[
+               import classes.ObjectListSortTypes;
+               import classes.ObjectTreeItemRenderer;
+               import classes.ObjectTreeDataDescriptor;
+               import mx.events.FlexEvent;
+               import mx.collections.XMLListCollection;
+               import mx.events.ListEvent;
+
+               [Bindable] public var treeDataProvider:Object;
+               [Bindable] public var listDataProvider:Object;
+               [Bindable] public var selectedId:int = -1;
+               [Bindable] public var selectedObject:XML;       
+               [Bindable] public var sortType:String = "";             
+               public static const SORT_CHANGE:String = "sortChange";
+
+               private function list_objects_change(event:ListEvent):void
+               {
+                       dispatchEvent(event);
+               }
+
+               private function comboBox_sort_change(event:ListEvent):void
+               {
+                       sortType = comboBox_sort.selectedLabel;
+                       var sortEvent:ListEvent = new ListEvent(SORT_CHANGE, 
event.bubbles, event.cancelable, event.columnIndex, event.rowIndex, 
event.reason, event.itemRenderer);
+                       dispatchEvent(sortEvent);
+               }
+                               
+               private function tree_dataChange(event:FlexEvent):void
+               {
+                       if(treeDataProvider && treeDataProvider[0].@autoExpand 
== true)
+                               
tree_objects.expandChildrenOf(treeDataProvider[0], true);
+               }
+               
+               public function showTreeView(show:Boolean):void
+               {
+                       tree_objects.visible = show;
+                       box_list_objects.visible = !show;
+               }
+               
+               public function setDescription(description:String, 
dateAdded:String, author:String):void
+               {
+                       text_description.htmlText = description + 
"<br><b>Author:</b> " + author + "<br><b>Date Added:</b> " + dateAdded; 
+               }
+                                               
+       ]]>
+       </mx:Script>
+       
+       <mx:Metadata>
+               [Event(name="change", type="mx.events.ListEvent")]
+               [Event(name="sortChange", type="mx.events.ListEvent")]          
+       </mx:Metadata>
+
+       <mx:Canvas width="100%" height="100%">
+               
+               <mx:VBox id="box_list_objects" width="100%" height="100%">      
                
+                       <mx:ComboBox id="comboBox_sort" width="100%" 
change="comboBox_sort_change(event)" 
dataProvider="{ObjectListSortTypes.ObjectListSortTypeArray}" /> 
+                       <mx:List id="list_objects" fontSize="11" 
fontAntiAliasType="advanced" labelField="@name" 
itemRenderer="components.ObjectListItemRenderer" 
change="list_objects_change(event)" dataProvider="{listDataProvider}" 
width="100%" height="100%" />
+               </mx:VBox>
+               
+               <mx:Tree id="tree_objects"  fontSize="11" 
fontAntiAliasType="advanced" labelField="@name" showRoot="true" 
defaultLeafIcon="{null}" valueCommit="tree_dataChange(event)" 
itemRenderer="classes.ObjectTreeItemRenderer" 
change="list_objects_change(event)" dataProvider="{treeDataProvider}" 
dataDescriptor="{new ObjectTreeDataDescriptor()}" height="100%" width="100%" 
openDuration="0" />
+       
+       </mx:Canvas>
+
+       <mx:Text id="text_description" width="100%" />
+       
+</mx:VBox>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/ObjectListItemRenderer.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/ObjectListItemRenderer.mxml 
b/TourDeFlex/TourDeFlex/src/components/ObjectListItemRenderer.mxml
new file mode 100644
index 0000000..d3d052e
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/ObjectListItemRenderer.mxml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"; 
implements="mx.controls.listClasses.IDropInListItemRenderer" 
horizontalScrollPolicy="off">
+       
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.listClasses.BaseListData;
+
+               private var _listData:BaseListData;             
+               
+               public function get listData():BaseListData
+               {
+                       return _listData;
+               }
+               
+               public function set listData(value:BaseListData):void
+               {
+                       _listData = value;
+               }       
+               
+               override protected function 
updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+               {
+                       super.updateDisplayList(unscaledWidth, unscaledHeight);
+                       
+                       if(data)
+                       {
+                               label_name.text = data.@name;
+                               var iconPath:String = data.@iconPath;
+                               if(data.@localIconPath.toString().length > 0)
+                                       iconPath = data.@localIconPath;
+                                       
+                               //Config.IS_ONLINE
+                               if(iconPath.length > 0)
+                               {
+                                       if(hasFullPath(data.@iconPath) && 
data.@localIconPath.toString().length == 0)
+                                       {
+                                               if(Config.IS_ONLINE) {
+                                                       image_icon.source = 
iconPath;
+                                               } else {
+                                                       image_icon.source = 
Config.TREE_NO_ICON;
+                                               }
+                                       } 
+                                       else
+                                       {
+                                               image_icon.source = 
Config.LOCAL_OBJECTS_ROOT_PATH + iconPath;
+                                       }
+                               }
+                               else
+                               {
+                                       image_icon.source = Config.TREE_NO_ICON;
+                               }       
+                       }               
+               }
+               
+               private function hasFullPath(path:String):Boolean
+               {
+                       if(path.indexOf("//") >= 0 || path.indexOf(":") >= 0)
+                               return true;
+                       else
+                               return false;
+               }
+                       
+       ]]>
+       </mx:Script>
+       
+       <mx:Image id="image_icon" width="18" height="18" />
+       <mx:Label id="label_name" x="20" />
+       
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/PluginDownloadWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/PluginDownloadWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/PluginDownloadWindow.mxml
new file mode 100644
index 0000000..82b5297
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/PluginDownloadWindow.mxml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"; layout="vertical" 
horizontalAlign="center" verticalAlign="middle" styleName="downloadWindow" 
width="300" height="150" creationComplete="init()">
+       <mx:Script>
+       <![CDATA[
+               import mx.controls.Alert;
+               import mx.managers.PopUpManager;
+               
+               private var fileReference:FileReference;
+               private var localFileToSave:File;
+               private var fileToSave:File;
+                               
+               private function init():void
+               {
+                       fileReference = new FileReference();
+               }
+               
+               public function download(samplePath:String, pluginPath:String, 
localRootPath:String):void
+               {
+                       if(samplePath.toLowerCase().indexOf("http") == 0)
+                               downloadHttp(samplePath);
+                       else
+                               downloadLocal(localRootPath + samplePath, 
pluginPath);                  
+               }
+               
+               private function downloadLocal(samplePath:String, 
path:String):void
+               {               
+                       var sampleFile:File = 
File.applicationDirectory.resolvePath(samplePath);
+                       localFileToSave = 
File.documentsDirectory.resolvePath(path);
+                       
+                       fileToSave = new File(localFileToSave.nativePath + 
File.separator +  sampleFile.name);
+                       //fileToSave.resolvePath(path);
+                       fileToSave.nativePath = path;
+                       fileToSave.addEventListener(Event.SELECT, 
downloadLocal_directorySelect);               
+                       fileToSave.addEventListener(Event.CANCEL, 
downloadLocal_directorySelectCancel);
+                       fileToSave.browseForSave("Save to project:");
+                       
+               }
+               
+               private function 
downloadLocal_directorySelect(event:Event):void 
+               {                       
+                       
localFileToSave.addEventListener(ProgressEvent.PROGRESS, 
download_progressHandler);
+                       localFileToSave.addEventListener(Event.COMPLETE, 
download_completeHandler);
+                       localFileToSave.copyToAsync(fileToSave, true);
+                       progressBar_download.setProgress(100,100);
+               }               
+               private function 
downloadLocal_directorySelectCancel(event:Event):void 
+               {
+                       PopUpManager.removePopUp(this);
+               }       
+               private function downloadHttp(path:String):void
+               {
+                       var request:URLRequest = new URLRequest(path);
+                       fileReference = new FileReference();
+                       fileReference.addEventListener(Event.OPEN, 
download_openHandler);
+                       fileReference.addEventListener(ProgressEvent.PROGRESS, 
download_progressHandler);
+                       fileReference.addEventListener(Event.COMPLETE, 
download_completeHandler);
+                       
+                       try
+                       {
+                               fileReference.download(request);
+                       }
+                       catch (error:Error)
+                       {
+                               Alert.show(error.message, "Download Error");
+                       }
+               }
+               
+               private function download_openHandler(event:Event):void
+    {
+                       progressBar_download.label = "DOWNLOADING %3%%";
+                       button_cancel.visible = true;
+                       button_close.visible = false;
+    }
+               
+               private function 
download_progressHandler(event:ProgressEvent):void
+               {
+                       progressBar_download.setProgress(event.bytesLoaded, 
event.bytesTotal);
+               }       
+               
+               private function download_cancel(event:MouseEvent):void
+               {
+                       fileReference.cancel();
+                       progressBar_download.label = "CANCELLED";
+                       button_close.visible = true;
+                       button_cancel.visible = false;
+                       
+                       PopUpManager.removePopUp(this);
+               }                       
+               
+               private function download_completeHandler(event:Event):void
+               {
+                       progressBar_download.label = "DOWNLOAD COMPLETE";
+                       button_close.visible = true;
+                       button_cancel.visible = false;
+               }
+               
+       ]]>
+       </mx:Script>    
+       
+       <mx:ProgressBar id="progressBar_download" width="90%" mode="manual" 
label="DOWNLOADING..." />   
+       
+       <mx:Canvas>
+               <mx:Button id="button_cancel" label="Cancel" visible="false" 
click="download_cancel(event)" horizontalCenter="0" />             
+               <mx:Button id="button_close" label="Close" 
click="{PopUpManager.removePopUp(this)}" horizontalCenter="0"/>
+       </mx:Canvas>
+       
+</mx:TitleWindow>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/QuickStartWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/QuickStartWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/QuickStartWindow.mxml
new file mode 100644
index 0000000..e35f3bb
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/QuickStartWindow.mxml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"; creationComplete="init()" 
width="100%" height="100%" verticalGap="0" styleName="qStartStyle"  >
+       
+       <mx:Script>
+       <![CDATA[
+               import mx.events.CloseEvent;
+               import mx.core.FlexSprite;
+               import mx.managers.PopUpManager;
+               import TopPanels4_fla.MainTimeline;
+               
+               public static const CLOSE_EVENT:String = "close";
+               
+               private function init():void
+               {
+                       html_quickStart.htmlLoader.navigateInSystemBrowser = 
true;
+                       html_quickStart.htmlText = 
"<BR><BR><BR><CENTER>Loading...</CENTER>";
+                       this.systemManager.addEventListener(MouseEvent.CLICK, 
modal_click);             
+               }               
+               
+               private function modal_click(event:MouseEvent):void
+               {
+                       if(event.target is FlexSprite && 
FlexSprite(event.target).name == "modalWindow")
+                               PopUpManager.removePopUp(this);
+               }
+               
+               public function set location(value:String):void
+               {
+                       if(html_quickStart)
+                               html_quickStart.location = value;
+               }
+               
+               public function clearContents():void
+               {
+                       html_quickStart.htmlText = "";
+               }
+       ]]>
+       </mx:Script>
+       
+       <mx:Style>
+               .qStartStyle{
+                       backgroundImage: Embed(skinClass='QuickStartPanel');
+                       backgroundSize: "100%";
+               }
+               .closeHTML{
+                       skin: Embed(skinClass='CloseHTMLButton');
+               }
+               .linkButton{
+                       icon: Embed(skinClass='LinkIcon');
+                       color: #314983;
+                       textRollOverColor: #323232;
+                       fontWeight: normal;
+               }
+       </mx:Style>
+
+       <mx:Metadata>
+               [Event(name="close", type="mx.events.CloseEvent")]
+       </mx:Metadata>
+       
+       <mx:VBox height="100%" width="100%" paddingBottom="5" paddingLeft="6" 
paddingRight="6" paddingTop="5">
+               <mx:HTML id="html_quickStart" height="100%" width="100%" 
horizontalScrollPolicy="off" />
+       </mx:VBox>              
+
+
+</mx:VBox>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/SearchWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/SearchWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/SearchWindow.mxml
new file mode 100644
index 0000000..4b017be
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/SearchWindow.mxml
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<WipeWindow xmlns="components.*" xmlns:mx="http://www.adobe.com/2006/mxml"; 
horizontalAlign="right" creationComplete="init()">
+       
+       <mx:Script>
+       <![CDATA[               
+               
//--------------------------------------------------------------------------
+               //  Imports
+               
//--------------------------------------------------------------------------    
+               import classes.ObjectData;
+               import mx.core.EdgeMetrics;
+               import mx.containers.GridItem;
+               import mx.containers.GridRow;
+               import mx.utils.StringUtil;
+               import mx.events.CollectionEvent;
+               import mx.controls.CheckBox;
+
+               
//--------------------------------------------------------------------------
+               //  Variables/properties
+               
//--------------------------------------------------------------------------    
        
+               public var objectData:ObjectData;
+               public static const SEARCH_SUBMIT:String = "searchSubmit";
+
+               public function set searchTagsData(tags:Array):void
+               {
+                       var tagCounter:int = 0;
+                       
+                       for each(var row:GridRow in grid_tags.getChildren())
+                       {
+                               for each(var col:GridItem in row.getChildren())
+                               {
+                                       var checkBox:CheckBox = 
CheckBox(col.getChildAt(0));
+                                       
+                                       var tagTotal:String = "";
+                                       if(tags[tagCounter][1] && 
tags[tagCounter][1].toString().length > 0)
+                                               tagTotal = "  (" + 
tags[tagCounter][1] + ")";
+                                               
+                                       checkBox.label = tags[tagCounter][0] + 
tagTotal;
+                                       checkBox.data = tags[tagCounter][0];
+                                       checkBox.addEventListener(Event.CHANGE, 
checkBox_tag_change);
+                                       checkBox.styleName = "tagCheckBox";
+                                       checkBox.visible = true;                
        
+                                       tagCounter++;
+                                       if(tagCounter == tags.length)
+                                               break;
+                               }
+                               if(tagCounter == tags.length)
+                                       break;                          
+                       }                               
+               }
+               
+               
//--------------------------------------------------------------------------
+               //  Grid creation
+               
//--------------------------------------------------------------------------    
+               private function init():void
+               {
+                       createTagGrid();
+               }
+               
+               private function createTagGrid():void
+               {
+                       for(var rows:int=0; rows<14; rows++)
+                       {
+                               var row:GridRow = new GridRow();
+                               row.percentWidth = 100;
+                               row.percentHeight = 100;                        
+                               
+                               for(var cols:int=0; cols<4; cols++)
+                               {
+                                       var col:GridItem = new GridItem();
+                                       col.percentWidth = 100;
+                                       col.percentHeight = 100;
+                                       
+                                       if(cols == 0 && rows == 0)
+                                               col.styleName = 
"tagGridFirstRowItem"
+                                       else if(rows == 0)
+                                               col.styleName = 
"tagGridFirstRow";
+                                       else if(cols == 0)
+                                               col.styleName = 
"tagGridFirstItem";
+                                       else
+                                               col.styleName = "tagGridItem";  
        
+
+                                       var checkBox:CheckBox = new CheckBox();
+                                       checkBox.visible = false;
+                                       
+                                       col.addChild(checkBox);
+                                       row.addChild(col);
+                               }
+                               grid_tags.addChild(row);
+                       }
+               }
+               
+               
//--------------------------------------------------------------------------
+               //  Search controls
+               
//--------------------------------------------------------------------------    
        
+               public function clear():void
+               {
+                       textInput_search.text = "";                     
+                       clearGridTags();
+               }
+               
+               private function button_clear_click(event:MouseEvent):void
+               {
+                       objectData.filterList("");
+                       clear();
+               }
+               
+               private function clearGridTags():void
+               {
+                       for each(var row:GridRow in grid_tags.getChildren())
+                       {
+                               for each(var col:GridItem in row.getChildren())
+                               {                                       
+                                       var checkBox:CheckBox = 
CheckBox(col.getChildAt(0));
+                                       checkBox.selected = false;
+                               }
+                       }
+               }
+               
+               private function textBox_submit(event:Event):void
+               {
+                       clearGridTags();
+                       
+                       objectData.filterList(textInput_search.text);
+                       dispatchEvent(new Event(SEARCH_SUBMIT, true));
+               }
+               
+               private function checkBox_tag_change(event:Event):void
+               {       
+                       textInput_search.text = "";             
+                       var searchTerms:String = "";
+                       
+                       for each(var row:GridRow in grid_tags.getChildren())
+                       {
+                               for each(var col:GridItem in row.getChildren())
+                               {                                       
+                                       var checkBox:CheckBox = 
CheckBox(col.getChildAt(0));
+                                       if(checkBox.visible && 
checkBox.selected)
+                                               searchTerms += checkBox.data + 
" ";
+                               }
+                       }
+       
+                       objectData.filterList(StringUtil.trim(searchTerms), 
true);
+                       dispatchEvent(new Event(SEARCH_SUBMIT, true));          
        
+               }
+               
+               
//--------------------------------------------------------------------------
+               
//--------------------------------------------------------------------------    
        
+               
+       ]]>
+       </mx:Script>
+       
+       <mx:Metadata>
+               [Event(name="searchSubmit", type="flash.events.Event")]
+       </mx:Metadata>
+       
+       <mx:HBox width="100%" paddingLeft="10">
+       
+               <mx:VBox>
+                       <mx:Label text="Search:" styleName="headingLabel" />
+                       <mx:HBox>
+                               <TextBoxSearch id="textInput_search" 
width="240" textSubmit="textBox_submit(event)" />
+                               <mx:Button id="button_clear" label="Reset" 
click="button_clear_click(event)" />
+                       </mx:HBox>
+               </mx:VBox>
+
+               <mx:HBox width="100%" horizontalAlign="right">
+                       <mx:Button click="{this.visible = false}" 
styleName="closeButton" />
+               </mx:HBox>
+
+       </mx:HBox>
+
+       <mx:Spacer height="5" />
+
+       <mx:VBox styleName="searchWindowTagBox" width="100%" height="100%">
+               <mx:Label text="Popular Tags:" styleName="headingLabel" />
+               <mx:Grid id="grid_tags" width="100%" height="100%" 
styleName="searchWindowTags" verticalGap="0" horizontalGap="0" />            
+       </mx:VBox>
+               
+</WipeWindow>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/SplashWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/SplashWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/SplashWindow.mxml
new file mode 100644
index 0000000..2d011b6
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/SplashWindow.mxml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"; backgroundColor="#000000" 
horizontalScrollPolicy="off" verticalScrollPolicy="off" 
remove="video_intro.stop()" >
+       
+       <mx:Script>
+       <![CDATA[
+               import mx.managers.PopUpManager;
+
+               private var videoLength:int;
+
+               private function setVolume(event:Event):void
+               {
+                       if(event.target.selected)
+                       {
+                               video_intro.volume = 0;
+                       }
+                       else
+                       {
+                               video_intro.volume = 1;
+                               video_intro.playheadTime = 0;
+                               video_intro.play();
+                       }
+                       //so.data.mute = ev.target.selected;
+               }
+               
+               private function checkBox_skip_click(event:Event):void
+               {
+                       if(event.target.selected)
+                       {                               
+                               video_intro_complete();
+                       }
+                       else
+                       {
+                               video_intro.playheadTime = 0;
+                               video_intro.play();
+                       }
+                       //so.data.skip = event.target.selected;
+               }
+               
+               private function video_intro_complete():void
+               {               
+                       //Preferences.preferencesXml.Splash.@skip = 
checkBox_skip.selected.toString(); -- no longer save skip - GAW
+                       video_intro.playheadTime = video_intro.totalTime;
+                       video_intro.stop();
+                       //PopUpManager.removePopUp(this);
+                       //Preferences.save();
+               }
+               
+       ]]>
+       </mx:Script>
+
+       <mx:VideoDisplay id="video_intro" width="678" height="568" 
source="{Config.SPLASH_URL}" 
+               autoPlay="true" borderThickness="2" borderColor="black" 
borderStyle="inset"
+               autoBandWidthDetection="false" bufferTime="0.1" volume="0" 
complete="video_intro_complete()" rollOver="panel_options.visible=true;"
+               rollOut="panel_options.visible=false;" autoRewind="false" />
+       
+       <mx:Panel id="panel_options" width="90" height="35" color="0xFFFFFF" 
backgroundAlpha="0.6" backgroundColor="0x000000" borderColor="0x000000" 
layout="horizontal" borderAlpha="0.6"
+               borderThicknessTop="1" borderThicknessBottom="10" 
headerHeight="10" cornerRadius="5" 
x="{(video_intro.width/2)-(panel_options.width/2)}"
+               y="{(video_intro.height - 70)}" horizontalAlign="center" 
verticalAlign="middle"  horizontalGap="20" visible="false" 
+               roundedBottomCorners="true" 
rollOver="panel_options.visible=true;" >             
+                
+               <mx:CheckBox id="checkBox_mute" label="MUTE" selected="true" 
click="setVolume(event);"  textRollOverColor="0x55C0FF" 
textSelectedColor="0xACACAC" />
+               <!-- Removed - GAW
+               <mx:VRule height="20" alpha="0.5" />
+               <mx:Button id="checkBox_skip" label="SKIP" 
click="checkBox_skip_click(event);" textRollOverColor="0x55C0FF" 
textSelectedColor="0xACACAC" />
+               -->
+       </mx:Panel>
+       
+</mx:Canvas>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/TDFTabNavigator.as
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/TDFTabNavigator.as 
b/TourDeFlex/TourDeFlex/src/components/TDFTabNavigator.as
new file mode 100644
index 0000000..c045973
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/TDFTabNavigator.as
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package components
+{      
+       import mx.containers.TabNavigator; 
+       
+       /**
+        * Currently there is a known bug within flex that prevents you from 
simply setting the selectedIndex 
+        * once all the children are added. This class should be used to avoid 
the issue. 
+        **/
+       
+       public class TDFTabNavigator extends TabNavigator
+       {
+               public function TDFTabNavigator()
+               {
+                       super();
+               } 
+               override protected function 
commitSelectedIndex(newIndex:int):void
+               {
+                       super.commitSelectedIndex(newIndex);
+                       if(tabBar.numChildren > 0)
+                       {
+                               tabBar.selectedIndex = newIndex;
+                       }
+               }
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/TextBoxSearch.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/TextBoxSearch.mxml 
b/TourDeFlex/TourDeFlex/src/components/TextBoxSearch.mxml
new file mode 100644
index 0000000..978200f
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/TextBoxSearch.mxml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:TextInput xmlns:mx="http://www.adobe.com/2006/mxml"; 
creationComplete="init()" keyUp="textBox_keyUp(event)" 
change="textBox_change()">
+
+       <mx:Script>
+       <![CDATA[
+       
+               public static const TEXT_SUBMIT:String = "textSubmit";
+               private var isDirty:Boolean = false;
+               private var typingPauseTimer:Timer;
+
+               private function init():void
+               {
+                       typingPauseTimer = new Timer(700, 1);
+                       typingPauseTimer.addEventListener(TimerEvent.TIMER, 
timer_typingPause);
+               }
+
+               private function textBox_change():void
+               {
+                       isDirty = true;
+                       
+                       if(typingPauseTimer.running)
+                               typingPauseTimer.reset();
+                       typingPauseTimer.start();
+               }
+               
+               private function timer_typingPause(event:TimerEvent):void
+               {
+                       if(isDirty)
+                               submitText();
+               }
+
+               private function textBox_keyUp(event:KeyboardEvent):void
+               {
+                       if(event.keyCode == Keyboard.ENTER && isDirty)
+                               submitText();
+               }
+               
+               private function submitText():void
+               {
+                       var notificationTimer:Timer = new Timer(100, 1);
+                       notificationTimer.addEventListener(TimerEvent.TIMER, 
timer_turnNotificationOff);
+                       notificationTimer.start();
+                       
+                       isDirty = false;
+                       this.setStyle("backgroundColor", 0xFFFFB3);     
+                       dispatchEvent(new Event(TEXT_SUBMIT, true));    
+               }
+
+               private function 
timer_turnNotificationOff(event:TimerEvent):void 
+               {
+                       this.setStyle("backgroundColor", 0xFFFFFF);
+               }
+
+       ]]>
+       </mx:Script>
+       
+       <mx:Metadata>
+               [Event(name="textSubmit", type="flash.events.Event")]
+       </mx:Metadata>
+       
+</mx:TextInput>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/components/WipeWindow.mxml
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/components/WipeWindow.mxml 
b/TourDeFlex/TourDeFlex/src/components/WipeWindow.mxml
new file mode 100644
index 0000000..fe8cea9
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/components/WipeWindow.mxml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"; 
showEffect="{this.wipeDown}" hideEffect="{this.wipeUp}" styleName="wipeWindow">
+
+       <mx:Script>
+       <![CDATA[
+               import mx.events.FlexEvent;
+               import mx.events.EffectEvent;
+               
+               public static const HIDE_COMPLETE:String = "hideComplete";
+       
+               private function hideComplete(event:EffectEvent):void
+               {
+                       var hideCompleteEvent:FlexEvent = new 
FlexEvent(HIDE_COMPLETE);
+                       dispatchEvent(hideCompleteEvent);       
+               }
+               
+       ]]>
+       </mx:Script>
+
+       <mx:Metadata>
+               [Event(name="hideComplete", type="mx.events.FlexEvent")]
+       </mx:Metadata>
+
+       <mx:WipeDown id="wipeDown" duration="500" />
+       <mx:WipeUp id="wipeUp" duration="500" effectEnd="hideComplete(event)" />
+               
+</mx:VBox>

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/data/about.html
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/data/about.html 
b/TourDeFlex/TourDeFlex/src/data/about.html
new file mode 100644
index 0000000..11c6bd7
--- /dev/null
+++ b/TourDeFlex/TourDeFlex/src/data/about.html
@@ -0,0 +1,57 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<html>
+       <head>
+               <meta http-equiv="content-type" content="text/html; 
charset=utf-8">
+               <title>About</title>
+               <link rel="stylesheet" href="style.css" />
+       </head>
+       <!-- width:434 height:333 -->
+       <body>
+               <div id="hdr">
+                       <a href="http://www.adobe.com/devnet/flex/tourdeflex"; 
target="_blank"><img src="images/logo.png" alt="logo" width="159" height="43" 
border="0"></a>
+                       <div id="version"><br>
+                               <span class="team"><b><font 
color="#FFFFFF"><CENTER>A Product of the <BR>Adobe Evangelism 
Team</CENTER></font></b><br /></span>
+                       </div>
+               </div>
+               <div id="main">
+                       <div id="credits">
+                               <p><b>Concept by:</b><BR/>
+                               <A HREF="http://www.jamesward.com";>James 
Ward</A>, <A HREF="http://coenraets.org/";>Christophe Coenraets</A>, and <A 
HREF="http://gregsramblings.com";>Greg Wilson</A></p>
+                               <p><b>Application Design & Development:</b><br 
/>
+                               Sean Carey, Rich Emery, Trae Regan, Holly 
Schinsky, <A HREF="http://www.taterboy.com/blog/";>Todd Williams</A><BR>
+                               Christophe Coenraets, James Ward, Greg 
Wilson</p>
+                               
+                               <p><b>Eclipse Plugin Development:</b><br />
+                               <A HREF="http://richdesktopsolutions.com";>Holly 
Schinsky</A></p>
+                               
+                       </div>
+                       <div id="logo">
+                               <a href="http://www.hdinteractive.com"; 
target="_blank"><img src="images/HDlogo.png" alt="HDlogo" width="97" 
height="25" border="0"></a><br />
+                               <a href="http://www.hdinteractive.com"; 
target="_blank">http://www.hdinteractive.com</a>
+                       </div>
+                       <div id="ftr">
+                               <div id="ftrLogo" class="lt">
+                                       <img src="images/adobe_logo.png" 
alt="adobe_logo" width="22" height="25">
+                               </div>
+                               <div id="rights" class="rt">
+                                       ©2010 Adobe Systems Inccorporated. All 
rights reserved.  The Adobe logo and Flex are registered trademarks of Adobe 
Systems Incorporated in the United States and/or other countries.
+                               </div>
+                       </div>
+               </div>
+       </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/data/images/bkg.jpg
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/data/images/bkg.jpg 
b/TourDeFlex/TourDeFlex/src/data/images/bkg.jpg
new file mode 100644
index 0000000..4654381
Binary files /dev/null and b/TourDeFlex/TourDeFlex/src/data/images/bkg.jpg 
differ

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/data/images/logo.png
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/data/images/logo.png 
b/TourDeFlex/TourDeFlex/src/data/images/logo.png
new file mode 100644
index 0000000..4db7317
Binary files /dev/null and b/TourDeFlex/TourDeFlex/src/data/images/logo.png 
differ

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/data/images/qs_banner_plain_big2.jpg
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/data/images/qs_banner_plain_big2.jpg 
b/TourDeFlex/TourDeFlex/src/data/images/qs_banner_plain_big2.jpg
new file mode 100644
index 0000000..3012a3b
Binary files /dev/null and 
b/TourDeFlex/TourDeFlex/src/data/images/qs_banner_plain_big2.jpg differ

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e1f9d1df/TourDeFlex/TourDeFlex/src/data/images/quickstart.gif
----------------------------------------------------------------------
diff --git a/TourDeFlex/TourDeFlex/src/data/images/quickstart.gif 
b/TourDeFlex/TourDeFlex/src/data/images/quickstart.gif
new file mode 100644
index 0000000..0bf5e21
Binary files /dev/null and 
b/TourDeFlex/TourDeFlex/src/data/images/quickstart.gif differ

Reply via email to