changeset 1824:3a9f57c30378 8.0-b62

Added ConferenceScheduleApp that was demoed at JavaOne 2012 to new apps experiments directory
author "Jasper Potts"
date Mon, 22 Oct 2012 18:23:19 -0700
parents 7e671f637e68
children f536337e8dc5 1089c39177ad 4e51d2d9a6ff
files apps/experiments/ConferenceScheduleApp/build.xml apps/experiments/ConferenceScheduleApp/manifest.mf apps/experiments/ConferenceScheduleApp/nbproject/build-impl.xml apps/experiments/ConferenceScheduleApp/nbproject/configs/Run_as_WebStart.properties apps/experiments/ConferenceScheduleApp/nbproject/configs/Run_in_Browser.properties apps/experiments/ConferenceScheduleApp/nbproject/configs/Test_Mode.properties apps/experiments/ConferenceScheduleApp/nbproject/genfiles.properties apps/experiments/ConferenceScheduleApp/nbproject/jfx-impl.xml apps/experiments/ConferenceScheduleApp/nbproject/project.properties apps/experiments/ConferenceScheduleApp/nbproject/project.xml apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/AutoLogoutLightBox.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/ConferenceScheduleApp.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/Page.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/PageContainer.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/PlatformIntegration.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/SchedulerStyleSheet-Desktop.css apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/SchedulerStyleSheet.css apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/Theme.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/TouchClickedEventAvoider.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/TouchScrollEventSynthesizer.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/AsciiBoard.txt apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/CheckBoxItem.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/EmailBoard.txt apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/EventPopoverPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/LoginProgressBarSkin.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/NoopScrollBarSkin.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/Popover.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/PopoverBox.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/PopoverBoxItem.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/PopoverTreeList.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/ResizableWrappingText.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/ScrollPaneSkin3.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/SearchBox.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/SimpleVBox.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/SymbolBoard.txt apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/TestPopover.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/TestVirtualKeyboard.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/TreeBoxItem.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/VirtualKeyboard.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/VirtualKeyboardSkin.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/DataService.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/JSONParserJP.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/SessionManagement.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/TwitterJson.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/devoxx/DevoxxDataService.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/devoxx/GetConferenceDataTask.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/devoxx/LoginTask.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/devoxx/TestDataService.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/data/devoxx/UpdateScheduleTask.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/back-arrow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/backspace-icon.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/blue-linen.jpg apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/cancel.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/cancel@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/capslock-icon.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/done.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/done@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/duke48.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/enter-icon.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-btn-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-popover.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/filter-popover@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/header-arrow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/header-arrow@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/header-shadow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/header-shadow@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/ios-list-transparent.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/ios-list-transparent@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/key-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/key.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-blue-button.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-blue-button@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-gray-button.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-grey-button-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-light-blue-button-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-light-blue-button-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-light-blue-button.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-light-blue-button@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-red-button.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/large-red-button@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-badge-background-SMALL.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-badge-background.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-badge-strap-SMALL.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-badge-strap.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-btn-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-guest-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-guest-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-login-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-login-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-title-SMALL.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/login-title.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/logout-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/logout-btn-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/logout-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/logout-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/need-to-be-logged-in.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/now-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/now-btn-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/now-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/now-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/pic-shadow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/pic-shadow@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-arrow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-arrow@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-blue-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-blue-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-light-blue-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-light-blue-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-list-border.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-list-border@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-no-arrow-empty.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-no-arrow-empty@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-no-arrow.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/popover-no-arrow@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/refresh-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/refresh-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/rough_diagonal.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/rough_diagonal_blue.jpg apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/search-clear.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/search-clear@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/search.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/search@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/shift-icon.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/short-key-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/short-key.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/special-key-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/special-key.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/star.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tick.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tick@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-bottom-fade.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-bubble-tooth.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-bubble-tooth@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-bubble.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-bubble@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-dot.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-dot@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-presentation.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-presentation@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/timeline-top-fade.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tweet-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tweet-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tweet.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/tweet@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/view-sessions-btn-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/view-sessions-btn-pressed@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/view-sessions-btn.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/view-sessions-btn@2x.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-dark-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-dark.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-hide.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-light-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-light.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-medium-pressed.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/images/vk-medium.png apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Availability.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Event.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/FilterType.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Level.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Room.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Session.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/SessionTime.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/SessionType.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Speaker.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Track.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Tweet.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/model/Venue.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/CatalogPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/FilterSessionsByTrackPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/FilterSessionsByTypePage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/LoginScreen.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/SearchFilterPopoverPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/SessionFilterCriteria.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/SessionListPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/SocialPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/SpeakersPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/TimelinePage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/TracksPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/VenueRoomPage.java apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/pages/VenuesPage.java
diffstat 186 files changed, 15766 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/build.xml	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?><!-- You may freely edit this file. See commented blocks below for --><!-- some examples of how to customize the build. --><!-- (If you delete it and reopen the project it will be recreated.) --><!-- By default, only the Clean and Build commands use this build script. --><project name="ConferenceScheduleApp" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant">
+    <description>Builds, tests, and runs the project ConferenceScheduleApp.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <!--
+
+    There exist several targets which are by default empty and which can be 
+    used for execution of your tasks. These targets are usually executed 
+    before and after some main targets. Those of them relevant for JavaFX project are: 
+
+      -pre-init:                 called before initialization of project properties
+      -post-init:                called after initialization of project properties
+      -pre-compile:              called before javac compilation
+      -post-compile:             called after javac compilation
+      -pre-compile-test:         called before javac compilation of JUnit tests
+      -post-compile-test:        called after javac compilation of JUnit tests
+      -pre-jfx-jar:              called before FX SDK specific <fx:jar> task
+      -post-jfx-jar:             called after FX SDK specific <fx:jar> task
+      -pre-jfx-deploy:           called before FX SDK specific <fx:deploy> task
+      -post-jfx-deploy:          called after FX SDK specific <fx:deploy> task
+      -post-clean:               called after cleaning build products
+
+    (Targets beginning with '-' are not intended to be called on their own.)
+
+    Example of inserting a HTML postprocessor after javaFX SDK deployment:
+
+        <target name="-post-jfx-deploy">
+            <basename property="jfx.deployment.base" file="${jfx.deployment.jar}" suffix=".jar"/>
+            <property name="jfx.deployment.html" location="${jfx.deployment.dir}${file.separator}${jfx.deployment.base}.html"/>
+            <custompostprocess>
+                <fileset dir="${jfx.deployment.html}"/>
+            </custompostprocess>
+        </target>
+
+    Example of calling an Ant task from JavaFX SDK. Note that access to JavaFX SDK Ant tasks must be
+    initialized; to ensure this is done add the dependence on -check-jfx-sdk-version target:
+
+        <target name="-post-jfx-jar" depends="-check-jfx-sdk-version">
+            <echo message="Calling jar task from JavaFX SDK"/>
+            <fx:jar ...>
+                ...
+            </fx:jar>
+        </target>
+
+    For more details about JavaFX SDK Ant tasks go to
+    http://docs.oracle.com/javafx/2/deployment/jfxpub-deployment.htm
+
+    For list of available properties check the files
+    nbproject/build-impl.xml and nbproject/jfx-impl.xml.
+
+    -->
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/manifest.mf	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+X-COMMENT: Main-Class will be added automatically by build
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/build-impl.xml	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,1434 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+
+For the purpose of easier reading the script
+is divided into following sections:
+
+  - initialization
+  - compilation
+  - jar
+  - execution
+  - debugging
+  - javadoc
+  - test compilation
+  - test execution
+  - test debugging
+  - applet
+  - cleanup
+
+        -->
+<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="ConferenceScheduleApp-impl">
+    <import file="jfx-impl.xml"/>
+    <fail message="Please build using Ant 1.8.0 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.8.0"/>
+            </not>
+        </condition>
+    </fail>
+    <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
+    <!-- 
+                ======================
+                INITIALIZATION SECTION 
+                ======================
+            -->
+    <target name="-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init" name="-init-private">
+        <property file="nbproject/private/config.properties"/>
+        <property file="nbproject/private/configs/${config}.properties"/>
+        <property file="nbproject/private/private.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private" name="-init-user">
+        <property file="${user.properties.file}"/>
+        <!-- The two properties below are usually overridden -->
+        <!-- by the active platform. Just a fallback. -->
+        <property name="default.javac.source" value="1.4"/>
+        <property name="default.javac.target" value="1.4"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user" name="-init-project">
+        <property file="nbproject/configs/${config}.properties"/>
+        <property file="nbproject/project.properties"/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
+        <j2seproject1:property name="platform.home" value="platforms.${platform.active}.home"/>
+        <j2seproject1:property name="platform.bootcp" value="platforms.${platform.active}.bootclasspath"/>
+        <j2seproject1:property name="platform.compiler" value="platforms.${platform.active}.compile"/>
+        <j2seproject1:property name="platform.javac.tmp" value="platforms.${platform.active}.javac"/>
+        <condition property="platform.javac" value="${platform.home}/bin/javac">
+            <equals arg1="${platform.javac.tmp}" arg2="$${platforms.${platform.active}.javac}"/>
+        </condition>
+        <property name="platform.javac" value="${platform.javac.tmp}"/>
+        <j2seproject1:property name="platform.java.tmp" value="platforms.${platform.active}.java"/>
+        <condition property="platform.java" value="${platform.home}/bin/java">
+            <equals arg1="${platform.java.tmp}" arg2="$${platforms.${platform.active}.java}"/>
+        </condition>
+        <property name="platform.java" value="${platform.java.tmp}"/>
+        <j2seproject1:property name="platform.javadoc.tmp" value="platforms.${platform.active}.javadoc"/>
+        <condition property="platform.javadoc" value="${platform.home}/bin/javadoc">
+            <equals arg1="${platform.javadoc.tmp}" arg2="$${platforms.${platform.active}.javadoc}"/>
+        </condition>
+        <property name="platform.javadoc" value="${platform.javadoc.tmp}"/>
+        <condition property="platform.invalid" value="true">
+            <or>
+                <contains string="${platform.javac}" substring="$${platforms."/>
+                <contains string="${platform.java}" substring="$${platforms."/>
+                <contains string="${platform.javadoc}" substring="$${platforms."/>
+            </or>
+        </condition>
+        <fail unless="platform.home">Must set platform.home</fail>
+        <fail unless="platform.bootcp">Must set platform.bootcp</fail>
+        <fail unless="platform.java">Must set platform.java</fail>
+        <fail unless="platform.javac">Must set platform.javac</fail>
+        <fail if="platform.invalid">
+ The J2SE Platform is not correctly set up.
+ Your active platform is: ${platform.active}, but the corresponding property "platforms.${platform.active}.home" is not found in the project's properties files. 
+ Either open the project in the IDE and setup the Platform with the same name or add it manually.
+ For example like this:
+     ant -Duser.properties.file=&lt;path_to_property_file&gt; jar (where you put the property "platforms.${platform.active}.home" in a .properties file)
+  or ant -Dplatforms.${platform.active}.home=&lt;path_to_JDK_home&gt; jar (where no properties file is used) 
+  </fail>
+        <available file="${manifest.file}" property="manifest.available"/>
+        <condition property="splashscreen.available">
+            <and>
+                <not>
+                    <equals arg1="${application.splash}" arg2="" trim="true"/>
+                </not>
+                <available file="${application.splash}"/>
+            </and>
+        </condition>
+        <condition property="main.class.available">
+            <and>
+                <isset property="main.class"/>
+                <not>
+                    <equals arg1="${main.class}" arg2="" trim="true"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class">
+            <and>
+                <isset property="manifest.available"/>
+                <isset property="main.class.available"/>
+            </and>
+        </condition>
+        <condition property="do.archive">
+            <not>
+                <istrue value="${jar.archive.disabled}"/>
+            </not>
+        </condition>
+        <condition property="do.mkdist">
+            <and>
+                <isset property="do.archive"/>
+                <isset property="libs.CopyLibs.classpath"/>
+                <not>
+                    <istrue value="${mkdist.disabled}"/>
+                </not>
+            </and>
+        </condition>
+        <condition property="manifest.available+main.class+mkdist.available">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available">
+            <and>
+                <isset property="manifest.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+main.class.available">
+            <and>
+                <isset property="main.class.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+splashscreen.available">
+            <and>
+                <isset property="splashscreen.available"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="do.archive+manifest.available+main.class">
+            <and>
+                <istrue value="${manifest.available+main.class}"/>
+                <istrue value="${do.archive}"/>
+            </and>
+        </condition>
+        <condition property="manifest.available-mkdist.available">
+            <or>
+                <istrue value="${manifest.available}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="manifest.available+main.class-mkdist.available">
+            <or>
+                <istrue value="${manifest.available+main.class}"/>
+                <isset property="do.mkdist"/>
+            </or>
+        </condition>
+        <condition property="have.tests">
+            <or>
+                <available file="${test.src.dir}"/>
+            </or>
+        </condition>
+        <condition property="have.sources">
+            <or>
+                <available file="${src.dir}"/>
+            </or>
+        </condition>
+        <condition property="netbeans.home+have.tests">
+            <and>
+                <isset property="netbeans.home"/>
+                <isset property="have.tests"/>
+            </and>
+        </condition>
+        <condition property="no.javadoc.preview">
+            <and>
+                <isset property="javadoc.preview"/>
+                <isfalse value="${javadoc.preview}"/>
+            </and>
+        </condition>
+        <property name="run.jvmargs" value=""/>
+        <property name="run.jvmargs.ide" value=""/>
+        <property name="javac.compilerargs" value=""/>
+        <property name="work.dir" value="${basedir}"/>
+        <condition property="no.deps">
+            <and>
+                <istrue value="${no.dependencies}"/>
+            </and>
+        </condition>
+        <property name="javac.debug" value="true"/>
+        <property name="javadoc.preview" value="true"/>
+        <property name="application.args" value=""/>
+        <property name="source.encoding" value="${file.encoding}"/>
+        <property name="runtime.encoding" value="${source.encoding}"/>
+        <condition property="javadoc.encoding.used" value="${javadoc.encoding}">
+            <and>
+                <isset property="javadoc.encoding"/>
+                <not>
+                    <equals arg1="${javadoc.encoding}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <property name="javadoc.encoding.used" value="${source.encoding}"/>
+        <property name="includes" value="**"/>
+        <property name="excludes" value=""/>
+        <property name="do.depend" value="false"/>
+        <condition property="do.depend.true">
+            <istrue value="${do.depend}"/>
+        </condition>
+        <path id="endorsed.classpath.path" path="${endorsed.classpath}"/>
+        <condition else="" property="endorsed.classpath.cmd.line.arg" value="-Xbootclasspath/p:'${toString:endorsed.classpath.path}'">
+            <length length="0" string="${endorsed.classpath}" when="greater"/>
+        </condition>
+        <property name="jar.index" value="false"/>
+        <property name="jar.index.metainf" value="${jar.index}"/>
+        <property name="copylibs.rebase" value="true"/>
+        <available file="${meta.inf.dir}/persistence.xml" property="has.persistence.xml"/>
+        <condition property="junit.available">
+            <or>
+                <available classname="org.junit.Test" classpath="${run.test.classpath}"/>
+                <available classname="junit.framework.Test" classpath="${run.test.classpath}"/>
+            </or>
+        </condition>
+        <condition property="testng.available">
+            <available classname="org.testng.annotations.Test" classpath="${run.test.classpath}"/>
+        </condition>
+        <condition property="junit+testng.available">
+            <and>
+                <istrue value="${junit.available}"/>
+                <istrue value="${testng.available}"/>
+            </and>
+        </condition>
+        <condition else="testng" property="testng.mode" value="mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+        <condition else="" property="testng.debug.mode" value="-mixed">
+            <istrue value="${junit+testng.available}"/>
+        </condition>
+    </target>
+    <target name="-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-check-javafx" name="-init-check">
+        <fail unless="src.dir">Must set src.dir</fail>
+        <fail unless="test.src.dir">Must set test.src.dir</fail>
+        <fail unless="build.dir">Must set build.dir</fail>
+        <fail unless="dist.dir">Must set dist.dir</fail>
+        <fail unless="build.classes.dir">Must set build.classes.dir</fail>
+        <fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
+        <fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
+        <fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
+        <fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
+        <fail unless="dist.jar">Must set dist.jar</fail>
+    </target>
+    <target name="-init-macrodef-property">
+        <macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${@{value}}"/>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-macrodef-javac-with-processors">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <mkdir dir="@{apgeneratedsrcdir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <compilerarg value="-processorpath"/>
+                    <compilerarg path="@{processorpath}:${empty.dir}"/>
+                    <compilerarg line="${ap.processors.internal}"/>
+                    <compilerarg line="${annotation.processing.processor.options}"/>
+                    <compilerarg value="-s"/>
+                    <compilerarg path="@{apgeneratedsrcdir}"/>
+                    <compilerarg line="${ap.proc.none.internal}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-ap-cmdline-properties" name="-init-macrodef-javac-without-processors" unless="ap.supported.internal">
+        <macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <attribute default="${javac.processorpath}" name="processorpath"/>
+            <attribute default="${build.generated.sources.dir}/ap-source-output" name="apgeneratedsrcdir"/>
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="${javac.debug}" name="debug"/>
+            <attribute default="${empty.dir}" name="sourcepath"/>
+            <attribute default="${empty.dir}" name="gensrcdir"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.dir}/empty" name="empty.dir"/>
+                <mkdir dir="${empty.dir}"/>
+                <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" executable="${platform.javac}" fork="yes" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}" tempdir="${java.io.tmpdir}">
+                    <src>
+                        <dirset dir="@{gensrcdir}" erroronmissingdir="false">
+                            <include name="*"/>
+                        </dirset>
+                    </src>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <compilerarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <compilerarg line="${javac.compilerargs}"/>
+                    <customize/>
+                </javac>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-javac-with-processors,-init-macrodef-javac-without-processors" name="-init-macrodef-javac">
+        <macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${src.dir}" name="srcdir"/>
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <attribute default="${javac.classpath}" name="classpath"/>
+            <sequential>
+                <depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                </depend>
+            </sequential>
+        </macrodef>
+        <macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${build.classes.dir}" name="destdir"/>
+            <sequential>
+                <fail unless="javac.includes">Must set javac.includes</fail>
+                <pathconvert pathsep="${line.separator}" property="javac.includes.binary">
+                    <path>
+                        <filelist dir="@{destdir}" files="${javac.includes}"/>
+                    </path>
+                    <globmapper from="*.java" to="*.class"/>
+                </pathconvert>
+                <tempfile deleteonexit="true" property="javac.includesfile.binary"/>
+                <echo file="${javac.includesfile.binary}" message="${javac.includes.binary}"/>
+                <delete>
+                    <files includesfile="${javac.includesfile.binary}"/>
+                </delete>
+                <delete>
+                    <fileset file="${javac.includesfile.binary}"/>
+                </delete>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-init">
+        <condition else="false" property="nb.junit.batch" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <not>
+                    <isset property="test.method"/>
+                </not>
+            </and>
+        </condition>
+        <condition else="false" property="nb.junit.single" value="true">
+            <and>
+                <istrue value="${junit.available}"/>
+                <isset property="test.method"/>
+            </and>
+        </condition>
+    </target>
+    <target if="${nb.junit.single}" name="-init-macrodef-junit-single" unless="${nb.junit.batch}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${nb.junit.batch}" name="-init-macrodef-junit-batch" unless="${nb.junit.single}">
+        <macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-init,-init-macrodef-junit-single, -init-macrodef-junit-batch" if="${junit.available}" name="-init-macrodef-junit"/>
+    <target if="${testng.available}" name="-init-macrodef-testng">
+        <macrodef name="testng" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <condition else="" property="testng.methods.arg" value="@{testincludes}.@{testmethods}">
+                    <isset property="test.method"/>
+                </condition>
+                <union id="test.set">
+                    <fileset dir="${test.src.dir}" excludes="@{excludes},**/*.xml,${excludes}" includes="@{includes}">
+                        <filename name="@{testincludes}"/>
+                    </fileset>
+                </union>
+                <taskdef classname="org.testng.TestNGAntTask" classpath="${run.test.classpath}" name="testng"/>
+                <testng classfilesetref="test.set" failureProperty="tests.failed" jvm="${platform.java}" methods="${testng.methods.arg}" mode="${testng.mode}" outputdir="${build.test.results.dir}" suitename="ConferenceScheduleApp" testname="TestNG tests" workingDir="${work.dir}">
+                    <xmlfileset dir="${build.test.classes.dir}" includes="@{testincludes}"/>
+                    <propertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </propertyset>
+                    <customize/>
+                </testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-test-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <echo>No tests executed.</echo>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit" if="${junit.available}" name="-init-macrodef-junit-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng" if="${testng.available}" name="-init-macrodef-testng-impl">
+        <macrodef name="test-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:testng excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:testng>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-impl,-init-macrodef-junit-impl,-init-macrodef-testng-impl" name="-init-macrodef-test">
+        <macrodef name="test" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <sequential>
+                <j2seproject3:test-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customize>
+                </j2seproject3:test-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${junit.available}" name="-init-macrodef-junit-debug" unless="${nb.junit.batch}">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <test methods="@{testmethods}" name="@{testincludes}" todir="${build.test.results.dir}"/>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${nb.junit.batch}" name="-init-macrodef-junit-debug-batch">
+        <macrodef name="junit-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property name="junit.forkmode" value="perTest"/>
+                <junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" forkmode="${junit.forkmode}" jvm="${platform.java}" showoutput="true" tempdir="${build.dir}">
+                    <batchtest todir="${build.test.results.dir}">
+                        <fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
+                            <filename name="@{testincludes}"/>
+                        </fileset>
+                    </batchtest>
+                    <syspropertyset>
+                        <propertyref prefix="test-sys-prop."/>
+                        <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <formatter type="brief" usefile="false"/>
+                    <formatter type="xml"/>
+                    <jvmarg value="-ea"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <customize/>
+                </junit>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug,-init-macrodef-junit-debug-batch" if="${junit.available}" name="-init-macrodef-junit-debug-impl">
+        <macrodef name="test-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <element implicit="true" name="customize" optional="true"/>
+            <sequential>
+                <j2seproject3:junit-debug excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize/>
+                </j2seproject3:junit-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target if="${testng.available}" name="-init-macrodef-testng-debug">
+        <macrodef name="testng-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element name="customize2" optional="true"/>
+            <sequential>
+                <condition else="-testclass @{testClass}" property="test.class.or.method" value="-methods @{testClass}.@{testMethod}">
+                    <isset property="test.method"/>
+                </condition>
+                <condition else="-suitename ConferenceScheduleApp -testname @{testClass} ${test.class.or.method}" property="testng.cmd.args" value="@{testClass}">
+                    <matches pattern=".*\.xml" string="@{testClass}"/>
+                </condition>
+                <delete dir="${build.test.results.dir}" quiet="true"/>
+                <mkdir dir="${build.test.results.dir}"/>
+                <j2seproject3:debug classname="org.testng.TestNG" classpath="${debug.test.classpath}">
+                    <customize>
+                        <customize2/>
+                        <jvmarg value="-ea"/>
+                        <arg line="${testng.debug.mode}"/>
+                        <arg line="-d ${build.test.results.dir}"/>
+                        <arg line="-listener org.testng.reporters.VerboseReporter"/>
+                        <arg line="${testng.cmd.args}"/>
+                    </customize>
+                </j2seproject3:debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug" if="${testng.available}" name="-init-macrodef-testng-debug-impl">
+        <macrodef name="testng-debug-impl" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <element implicit="true" name="customize2" optional="true"/>
+            <sequential>
+                <j2seproject3:testng-debug testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2/>
+                </j2seproject3:testng-debug>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-junit-debug-impl" if="${junit.available}" name="-init-macrodef-test-debug-junit">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:test-debug-impl excludes="@{excludes}" includes="@{includes}" testincludes="@{testincludes}" testmethods="@{testmethods}">
+                    <customize>
+                        <classpath>
+                            <path path="${run.test.classpath}"/>
+                        </classpath>
+                        <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                        <jvmarg line="${run.jvmargs}"/>
+                        <jvmarg line="${run.jvmargs.ide}"/>
+                    </customize>
+                </j2seproject3:test-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-testng-debug-impl" if="${testng.available}" name="-init-macrodef-test-debug-testng">
+        <macrodef name="test-debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${includes}" name="includes"/>
+            <attribute default="${excludes}" name="excludes"/>
+            <attribute default="**" name="testincludes"/>
+            <attribute default="" name="testmethods"/>
+            <attribute default="${main.class}" name="testClass"/>
+            <attribute default="" name="testMethod"/>
+            <sequential>
+                <j2seproject3:testng-debug-impl testClass="@{testClass}" testMethod="@{testMethod}">
+                    <customize2>
+                        <syspropertyset>
+                            <propertyref prefix="test-sys-prop."/>
+                            <mapper from="test-sys-prop.*" to="*" type="glob"/>
+                        </syspropertyset>
+                    </customize2>
+                </j2seproject3:testng-debug-impl>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-init-macrodef-test-debug-junit,-init-macrodef-test-debug-testng" name="-init-macrodef-test-debug"/>
+    <!--
+                pre NB7.2 profiling section; consider it deprecated
+            -->
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile, -profile-init-check" if="profiler.info.jvmargs.agent" name="profile-init"/>
+    <target if="profiler.info.jvmargs.agent" name="-profile-pre-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-post-init">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="profiler.info.jvmargs.agent" name="-profile-init-macrodef-profile">
+        <macrodef name="resolve">
+            <attribute name="name"/>
+            <attribute name="value"/>
+            <sequential>
+                <property name="@{name}" value="${env.@{value}}"/>
+            </sequential>
+        </macrodef>
+        <macrodef name="profile">
+            <attribute default="${main.class}" name="classname"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property environment="env"/>
+                <resolve name="profiler.current.path" value="${profiler.info.pathvar}"/>
+                <java classname="@{classname}" dir="${profiler.info.dir}" fork="true" jvm="${profiler.info.jvm}">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="${profiler.info.jvmargs.agent}"/>
+                    <jvmarg line="${profiler.info.jvmargs}"/>
+                    <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+                    <arg line="${application.args}"/>
+                    <classpath>
+                        <path path="${run.classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target depends="-profile-pre-init, init, -profile-post-init, -profile-init-macrodef-profile" if="profiler.info.jvmargs.agent" name="-profile-init-check">
+        <fail unless="profiler.info.jvm">Must set JVM to use for profiling in profiler.info.jvm</fail>
+        <fail unless="profiler.info.jvmargs.agent">Must set profiler agent JVM arguments in profiler.info.jvmargs.agent</fail>
+    </target>
+    <!--
+                end of pre NB7.2 profiling section
+            -->
+    <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
+        <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="name"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <attribute default="" name="stopclassname"/>
+            <sequential>
+                <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <bootclasspath>
+                        <path path="${platform.bootcp}"/>
+                    </bootclasspath>
+                </nbjpdastart>
+            </sequential>
+        </macrodef>
+        <macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${build.classes.dir}" name="dir"/>
+            <sequential>
+                <nbjpdareload>
+                    <fileset dir="@{dir}" includes="${fix.classes}">
+                        <include name="${fix.includes}*.class"/>
+                    </fileset>
+                </nbjpdareload>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-debug-args">
+        <exec executable="${platform.java}" outputproperty="version-output">
+            <arg value="-version"/>
+        </exec>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+    <target depends="-init-debug-args" name="-init-macrodef-debug">
+        <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${debug.classpath}" name="classpath"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true" jvm="${platform.java}">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg line="${debug-args-line}"/>
+                    <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-java">
+        <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <attribute default="${main.class}" name="classname"/>
+            <attribute default="${run.classpath}" name="classpath"/>
+            <attribute default="jvm" name="jvm"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <java classname="@{classname}" dir="${work.dir}" fork="true" jvm="${platform.java}">
+                    <jvmarg line="${endorsed.classpath.cmd.line.arg}"/>
+                    <jvmarg value="-Dfile.encoding=${runtime.encoding}"/>
+                    <redirector errorencoding="${runtime.encoding}" inputencoding="${runtime.encoding}" outputencoding="${runtime.encoding}"/>
+                    <jvmarg line="${run.jvmargs}"/>
+                    <jvmarg line="${run.jvmargs.ide}"/>
+                    <classpath>
+                        <path path="@{classpath}"/>
+                    </classpath>
+                    <syspropertyset>
+                        <propertyref prefix="run-sys-prop."/>
+                        <mapper from="run-sys-prop.*" to="*" type="glob"/>
+                    </syspropertyset>
+                    <customize/>
+                </java>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-macrodef-copylibs">
+        <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
+            <attribute default="${manifest.file}" name="manifest"/>
+            <element name="customize" optional="true"/>
+            <sequential>
+                <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+                <pathconvert property="run.classpath.without.build.classes.dir">
+                    <path path="${run.classpath}"/>
+                    <map from="${build.classes.dir.resolved}" to=""/>
+                </pathconvert>
+                <pathconvert pathsep=" " property="jar.classpath">
+                    <path path="${run.classpath.without.build.classes.dir}"/>
+                    <chainedmapper>
+                        <flattenmapper/>
+                        <filtermapper>
+                            <replacestring from=" " to="%20"/>
+                        </filtermapper>
+                        <globmapper from="*" to="lib/*"/>
+                    </chainedmapper>
+                </pathconvert>
+                <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
+                <copylibs compress="${jar.compress}" index="${jar.index}" indexMetaInf="${jar.index.metainf}" jarfile="${dist.jar}" manifest="@{manifest}" rebase="${copylibs.rebase}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
+                    <fileset dir="${build.classes.dir}"/>
+                    <manifest>
+                        <attribute name="Class-Path" value="${jar.classpath}"/>
+                        <customize/>
+                    </manifest>
+                </copylibs>
+            </sequential>
+        </macrodef>
+    </target>
+    <target name="-init-presetdef-jar">
+        <presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
+            <jar compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}">
+                <j2seproject1:fileset dir="${build.classes.dir}"/>
+            </jar>
+        </presetdef>
+    </target>
+    <target name="-init-ap-cmdline-properties">
+        <property name="annotation.processing.enabled" value="true"/>
+        <property name="annotation.processing.processors.list" value=""/>
+        <property name="annotation.processing.processor.options" value=""/>
+        <property name="annotation.processing.run.all.processors" value="true"/>
+        <property name="javac.processorpath" value="${javac.classpath}"/>
+        <property name="javac.test.processorpath" value="${javac.test.classpath}"/>
+        <condition property="ap.supported.internal" value="true">
+            <not>
+                <matches pattern="1\.[0-5](\..*)?" string="${javac.source}"/>
+            </not>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties" if="ap.supported.internal" name="-init-ap-cmdline-supported">
+        <condition else="" property="ap.processors.internal" value="-processor ${annotation.processing.processors.list}">
+            <isfalse value="${annotation.processing.run.all.processors}"/>
+        </condition>
+        <condition else="" property="ap.proc.none.internal" value="-proc:none">
+            <isfalse value="${annotation.processing.enabled}"/>
+        </condition>
+    </target>
+    <target depends="-init-ap-cmdline-properties,-init-ap-cmdline-supported" name="-init-ap-cmdline">
+        <property name="ap.cmd.line.internal" value=""/>
+    </target>
+    <target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-test,-init-macrodef-test-debug,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar,-init-ap-cmdline" name="init"/>
+    <!--
+                ===================
+                COMPILATION SECTION
+                ===================
+            -->
+    <target name="-deps-jar-init" unless="built-jar.properties">
+        <property location="${build.dir}/built-jar.properties" name="built-jar.properties"/>
+        <delete file="${built-jar.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.jar.${basedir}" name="-warn-already-built-jar">
+        <echo level="warn" message="Cycle detected: ConferenceScheduleApp was already built"/>
+    </target>
+    <target depends="init,-deps-jar-init" name="deps-jar" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-jar.properties}" verbose="false"/>
+        <property file="${built-jar.properties}" prefix="already.built.jar."/>
+        <antcall target="-warn-already-built-jar"/>
+        <propertyfile file="${built-jar.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
+    <target depends="init" name="-check-automatic-build">
+        <available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
+    </target>
+    <target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
+        <antcall target="clean"/>
+    </target>
+    <target depends="init,deps-jar" name="-pre-pre-compile">
+        <mkdir dir="${build.classes.dir}"/>
+    </target>
+    <target name="-pre-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-depend">
+        <pathconvert property="build.generated.subdirs">
+            <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="*"/>
+            </dirset>
+        </pathconvert>
+        <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/>
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile,-pre-compile, -copy-persistence-xml,-compile-depend" if="have.sources" name="-do-compile">
+        <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/>
+        <copy todir="${build.classes.dir}">
+            <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target if="has.persistence.xml" name="-copy-persistence-xml">
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy todir="${build.classes.dir}/META-INF">
+            <fileset dir="${meta.inf.dir}" includes="persistence.xml"/>
+        </copy>
+    </target>
+    <target name="-post-compile">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
+    <target name="-pre-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile/>
+        <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/>
+    </target>
+    <target name="-post-compile-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
+    <!--
+                ====================
+                JAR BUILDING SECTION
+                ====================
+            -->
+    <target depends="init" name="-pre-pre-jar">
+        <dirname file="${dist.jar}" property="dist.jar.dir"/>
+        <mkdir dir="${dist.jar.dir}"/>
+    </target>
+    <target name="-pre-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive" name="-do-jar-without-manifest" unless="manifest.available-mkdist.available">
+        <j2seproject1:jar/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class-mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}"/>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar" if="do.archive+manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
+        <j2seproject1:jar manifest="${manifest.file}">
+            <j2seproject1:manifest>
+                <j2seproject1:attribute name="Main-Class" value="${main.class}"/>
+            </j2seproject1:manifest>
+        </j2seproject1:jar>
+        <echo level="info">To run this application from the command line without Ant, try:</echo>
+        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <pathconvert property="run.classpath.with.dist.jar">
+            <path path="${run.classpath}"/>
+            <map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
+        </pathconvert>
+        <echo level="info">${platform.java} -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
+    </target>
+    <target depends="init" if="do.archive" name="-do-jar-with-libraries-create-manifest" unless="manifest.available">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <touch file="${tmp.manifest.file}" verbose="false"/>
+    </target>
+    <target depends="init" if="do.archive+manifest.available" name="-do-jar-with-libraries-copy-manifest">
+        <tempfile deleteonexit="true" destdir="${build.dir}" property="tmp.manifest.file"/>
+        <copy file="${manifest.file}" tofile="${tmp.manifest.file}"/>
+    </target>
+    <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+main.class.available" name="-do-jar-with-libraries-set-main">
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="Main-Class" value="${main.class}"/>
+        </manifest>
+    </target>
+    <target depends="init,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest" if="do.archive+splashscreen.available" name="-do-jar-with-libraries-set-splashscreen">
+        <basename file="${application.splash}" property="splashscreen.basename"/>
+        <mkdir dir="${build.classes.dir}/META-INF"/>
+        <copy failonerror="false" file="${application.splash}" todir="${build.classes.dir}/META-INF"/>
+        <manifest file="${tmp.manifest.file}" mode="update">
+            <attribute name="SplashScreen-Image" value="META-INF/${splashscreen.basename}"/>
+        </manifest>
+    </target>
+    <target depends="init,-init-macrodef-copylibs,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen" if="do.mkdist" name="-do-jar-with-libraries-pack">
+        <j2seproject3:copylibs manifest="${tmp.manifest.file}"/>
+        <echo level="info">To run this application from the command line without Ant, try:</echo>
+        <property location="${dist.jar}" name="dist.jar.resolved"/>
+        <echo level="info">${platform.java} -jar "${dist.jar.resolved}"</echo>
+    </target>
+    <target depends="-do-jar-with-libraries-pack" if="do.archive" name="-do-jar-with-libraries-delete-manifest">
+        <delete>
+            <fileset file="${tmp.manifest.file}"/>
+        </delete>
+    </target>
+    <target depends="init,compile,-pre-pre-jar,-pre-jar,-do-jar-with-libraries-create-manifest,-do-jar-with-libraries-copy-manifest,-do-jar-with-libraries-set-main,-do-jar-with-libraries-set-splashscreen,-do-jar-with-libraries-pack,-do-jar-with-libraries-delete-manifest" name="-do-jar-with-libraries"/>
+    <target depends="-jfx-copylibs,-rebase-libs,jfx-deployment" name="-post-jar">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar,-jfx-copylibs,-rebase-libs" description="Build JAR." name="jar"/>
+    <!--
+                =================
+                EXECUTION SECTION
+                =================
+            -->
+    <target depends="init,compile,jar" description="Run a main class." name="run">
+        <j2seproject1:java>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <target name="-do-not-recompile">
+        <property name="javac.includes.binary" value=""/>
+    </target>
+    <target depends="init,compile-single" name="run-single">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}"/>
+    </target>
+    <target depends="init,compile-test-single" name="run-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/>
+    </target>
+    <!--
+                =================
+                DEBUGGING SECTION
+                =================
+            -->
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger">
+        <j2seproject1:nbjpdastart name="${debug.class}"/>
+    </target>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/>
+    </target>
+    <target depends="init,compile" name="-debug-start-debuggee">
+        <j2seproject3:debug>
+            <customize>
+                <arg line="${application.args}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile,-debug-start-debugger,-debug-start-debuggee,jar" description="Debug project in IDE." if="netbeans.home" name="debug"/>
+    <target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
+        <j2seproject1:nbjpdastart stopclassname="${main.class}"/>
+    </target>
+    <target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}"/>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
+    <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test">
+        <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
+        <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/>
+    <target depends="init" name="-pre-debug-fix">
+        <fail unless="fix.includes">Must set fix.includes</fail>
+        <property name="javac.includes" value="${fix.includes}.java"/>
+    </target>
+    <target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
+        <j2seproject1:nbjpdareload/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
+    <!--
+                =================
+                PROFILING SECTION
+                =================
+            -->
+    <!--
+                pre NB7.2 profiler integration
+            -->
+    <target depends="profile-init,compile" description="Profile a project in the IDE." if="profiler.info.jvmargs.agent" name="-profile-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile/>
+    </target>
+    <target depends="profile-init,compile-single" description="Profile a selected class in the IDE." if="profiler.info.jvmargs.agent" name="-profile-single-pre72">
+        <fail unless="profile.class">Must select one file in the IDE or set profile.class</fail>
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="${profile.class}"/>
+    </target>
+    <target depends="profile-init,compile-single" if="profiler.info.jvmargs.agent" name="-profile-applet-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <profile classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </profile>
+    </target>
+    <target depends="profile-init,compile-test-single" if="profiler.info.jvmargs.agent" name="-profile-test-single-pre72">
+        <fail unless="netbeans.home">This target only works when run from inside the NetBeans IDE.</fail>
+        <nbprofiledirect>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+        </nbprofiledirect>
+        <junit dir="${profiler.info.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" jvm="${profiler.info.jvm}" showoutput="true">
+            <env key="${profiler.info.pathvar}" path="${profiler.info.agentpath}:${profiler.current.path}"/>
+            <jvmarg value="${profiler.info.jvmargs.agent}"/>
+            <jvmarg line="${profiler.info.jvmargs}"/>
+            <test name="${profile.class}"/>
+            <classpath>
+                <path path="${run.test.classpath}"/>
+            </classpath>
+            <syspropertyset>
+                <propertyref prefix="test-sys-prop."/>
+                <mapper from="test-sys-prop.*" to="*" type="glob"/>
+            </syspropertyset>
+            <formatter type="brief" usefile="false"/>
+            <formatter type="xml"/>
+        </junit>
+    </target>
+    <!--
+                end of pre NB72 profiling section
+            -->
+    <target if="netbeans.home" name="-profile-check">
+        <condition property="profiler.configured">
+            <or>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
+            </or>
+        </condition>
+    </target>
+    <target depends="-profile-check,-profile-pre72,jar" description="Profile a project in the IDE." if="profiler.configured" name="profile" unless="profiler.info.jvmargs.agent">
+        <startprofiler/>
+        <antcall target="run"/>
+    </target>
+    <target depends="-profile-check,-profile-single-pre72" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-single" unless="profiler.info.jvmargs.agent">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcall target="run-single"/>
+    </target>
+    <target depends="-profile-test-single-pre72" description="Profile a selected test in the IDE." name="profile-test-single"/>
+    <target depends="-profile-check" description="Profile a selected test in the IDE." if="profiler.configured" name="profile-test" unless="profiler.info.jvmargs">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <startprofiler/>
+        <antcall target="test-single"/>
+    </target>
+    <target depends="-profile-check" description="Profile a selected class in the IDE." if="profiler.configured" name="profile-test-with-main">
+        <fail unless="run.class">Must select one file in the IDE or set run.class</fail>
+        <startprofiler/>
+        <antcal target="run-test-with-main"/>
+    </target>
+    <target depends="-profile-check,-profile-applet-pre72" if="profiler.configured" name="profile-applet" unless="profiler.info.jvmargs.agent">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <startprofiler/>
+        <antcall target="run-applet"/>
+    </target>
+    <!--
+                ===============
+                JAVADOC SECTION
+                ===============
+            -->
+    <target depends="init" if="have.sources" name="-javadoc-build">
+        <mkdir dir="${dist.javadoc.dir}"/>
+        <condition else="" property="javadoc.endorsed.classpath.cmd.line.arg" value="-J${endorsed.classpath.cmd.line.arg}">
+            <and>
+                <isset property="endorsed.classpath.cmd.line.arg"/>
+                <not>
+                    <equals arg1="${endorsed.classpath.cmd.line.arg}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" executable="${platform.javadoc}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
+            <classpath>
+                <path path="${javac.classpath}"/>
+            </classpath>
+            <fileset dir="${src.dir}" excludes="*.java,${excludes}" includes="${includes}">
+                <filename name="**/*.java"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/*.java"/>
+                <exclude name="*.java"/>
+            </fileset>
+            <arg line="${javadoc.endorsed.classpath.cmd.line.arg}"/>
+        </javadoc>
+        <copy todir="${dist.javadoc.dir}">
+            <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
+                <filename name="**/doc-files/**"/>
+            </fileset>
+            <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false">
+                <include name="**/doc-files/**"/>
+            </fileset>
+        </copy>
+    </target>
+    <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
+        <nbbrowse file="${dist.javadoc.dir}/index.html"/>
+    </target>
+    <target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
+    <!--
+                =========================
+                TEST COMPILATION SECTION
+                =========================
+            -->
+    <target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
+        <mkdir dir="${build.test.classes.dir}"/>
+    </target>
+    <target name="-pre-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target if="do.depend.true" name="-compile-test-depend">
+        <j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
+    </target>
+    <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" processorpath="${javac.test.processorpath}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
+    <target name="-pre-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-jar,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
+        <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
+        <j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
+        <j2seproject3:javac apgeneratedsrcdir="${build.test.classes.dir}" classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" processorpath="${javac.test.processorpath}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
+        <copy todir="${build.test.classes.dir}">
+            <fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
+        </copy>
+    </target>
+    <target name="-post-compile-test-single">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
+    <!--
+                =======================
+                TEST EXECUTION SECTION
+                =======================
+            -->
+    <target depends="init" if="have.tests" name="-pre-test-run">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
+        <j2seproject3:test testincludes="**/*Test.java"/>
+    </target>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init" if="have.tests" name="test-report"/>
+    <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
+    <target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
+    <target depends="init" if="have.tests" name="-pre-test-run-single">
+        <mkdir dir="${build.test.results.dir}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
+        <fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
+        <j2seproject3:test excludes="" includes="${test.includes}" testincludes="${test.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single-method">
+        <fail unless="test.class">Must select some files in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test excludes="" includes="${javac.includes}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method" if="have.tests" name="-post-test-run-single-method">
+        <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single-method,-post-test-run-single-method" description="Run single unit test." name="test-single-method"/>
+    <!--
+                =======================
+                TEST DEBUGGING SECTION
+                =======================
+            -->
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testincludes="${javac.includes}"/>
+    </target>
+    <target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-debug-start-debuggee-test-method">
+        <fail unless="test.class">Must select one file in the IDE or set test.class</fail>
+        <fail unless="test.method">Must select some method in the IDE or set test.method</fail>
+        <j2seproject3:test-debug excludes="" includes="${javac.includes}" testClass="${test.class}" testMethod="${test.method}" testincludes="${test.class}" testmethods="${test.method}"/>
+    </target>
+    <target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
+        <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
+    </target>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
+    <target depends="init,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test-method" name="debug-test-method"/>
+    <target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
+        <j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
+    </target>
+    <target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
+    <!--
+                =========================
+                APPLET EXECUTION SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" name="run-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject1:java classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject1:java>
+    </target>
+    <!--
+                =========================
+                APPLET DEBUGGING  SECTION
+                =========================
+            -->
+    <target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
+        <fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
+        <j2seproject3:debug classname="sun.applet.AppletViewer">
+            <customize>
+                <arg value="${applet.url}"/>
+            </customize>
+        </j2seproject3:debug>
+    </target>
+    <target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
+    <!--
+                ===============
+                CLEANUP SECTION
+                ===============
+            -->
+    <target name="-deps-clean-init" unless="built-clean.properties">
+        <property location="${build.dir}/built-clean.properties" name="built-clean.properties"/>
+        <delete file="${built-clean.properties}" quiet="true"/>
+    </target>
+    <target if="already.built.clean.${basedir}" name="-warn-already-built-clean">
+        <echo level="warn" message="Cycle detected: ConferenceScheduleApp was already built"/>
+    </target>
+    <target depends="init,-deps-clean-init" name="deps-clean" unless="no.deps">
+        <mkdir dir="${build.dir}"/>
+        <touch file="${built-clean.properties}" verbose="false"/>
+        <property file="${built-clean.properties}" prefix="already.built.clean."/>
+        <antcall target="-warn-already-built-clean"/>
+        <propertyfile file="${built-clean.properties}">
+            <entry key="${basedir}" value=""/>
+        </propertyfile>
+    </target>
+    <target depends="init" name="-do-clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${dist.dir}" followsymlinks="false" includeemptydirs="true"/>
+    </target>
+    <target name="-post-clean">
+        <!-- Empty placeholder for easier customization. -->
+        <!-- You can override this target in the ../build.xml file. -->
+    </target>
+    <target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
+    <target name="-check-call-dep">
+        <property file="${call.built.properties}" prefix="already.built."/>
+        <condition property="should.call.dep">
+            <and>
+                <not>
+                    <isset property="already.built.${call.subproject}"/>
+                </not>
+                <available file="${call.script}"/>
+            </and>
+        </condition>
+    </target>
+    <target depends="-check-call-dep" if="should.call.dep" name="-maybe-call-dep">
+        <ant antfile="${call.script}" inheritall="false" target="${call.target}">
+            <propertyset>
+                <propertyref prefix="transfer."/>
+                <mapper from="transfer.*" to="*" type="glob"/>
+            </propertyset>
+        </ant>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/configs/Run_as_WebStart.properties	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+$label=Run as WebStart
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/configs/Run_in_Browser.properties	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,2 @@
+# Do not modify this property in this configuration. It can be re-generated.
+$label=Run in Browser
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/configs/Test_Mode.properties	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,2 @@
+$label=Test Mode
+run.jvmargs=-Dtest.mode=true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/genfiles.properties	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,8 @@
+build.xml.data.CRC32=2f8e36c8
+build.xml.script.CRC32=f37d954b
+build.xml.stylesheet.CRC32=28e38971@1.53.1.46
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=2f8e36c8
+nbproject/build-impl.xml.script.CRC32=db927aa2
+nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/jfx-impl.xml	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,2374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+*** GENERATED FROM TEMPLATE - DO NOT EDIT ***
+***       EDIT ../build.xml INSTEAD       ***
+-->
+
+<project name="jfx-impl" default="jfx-deployment" basedir=".." xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" 
+         xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:fx="javafx:com.sun.javafx.tools.ant">
+    <description>JavaFX-specific Ant calls</description>
+
+
+    <!-- Empty placeholders for easier customization in ../build.xml -->
+    
+    <target name="-pre-jfx-jar">
+        <!-- Called right before <fx:jar> task. You can override this target in the ../build.xml file. -->
+    </target>
+
+    <target name="-post-jfx-jar">
+        <!-- Called right after <fx:jar> task. You can override this target in the ../build.xml file. -->
+    </target>
+
+    <target name="-pre-jfx-deploy">
+        <!-- Called right before <fx:deploy> task. You can override this target in the ../build.xml file. -->
+    </target>
+
+    <target name="-post-jfx-deploy">
+        <!-- Called right after <fx:deploy> task. You can override this target in the ../build.xml file. -->
+    </target>
+    
+    
+    <!-- Check system and JDK version -->
+
+    <target name="-check-operating-system">
+        <condition property="running.on.unix">
+            <os family="unix"/>
+        </condition>
+        <condition property="running.on.windows">
+            <os family="windows"/>
+        </condition>
+        <echo message="running.on.unix = ${running.on.unix}" level="verbose"/>
+        <echo message="running.on.windows = ${running.on.windows}" level="verbose"/>
+    </target>
+
+    <target name="-check-platform-home-fxsdk-java" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.platform.home.fxsdk.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${javafx.sdk}${file.separator}bin${file.separator}java"/>
+                    <available file="${javafx.sdk}${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-fxsdk-java" depends="-check-platform-home-fxsdk-java" if="do.set.platform.home.fxsdk.java">
+        <property name="active.platform.home.java.executable" value="${javafx.sdk}${file.separator}bin${file.separator}java"/>
+    </target>
+    <target name="-check-platform-home-java" if="platform.home">
+        <condition property="do.set.platform.home.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${platform.home}${file.separator}bin${file.separator}java"/>
+                    <available file="${platform.home}${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-java" depends="-set-platform-home-fxsdk-java,-check-platform-home-java" if="do.set.platform.home.java">
+        <property name="active.platform.home.java.executable" value="${platform.home}${file.separator}bin${file.separator}java"/>
+    </target>
+    <target name="-check-platform-home-probjdk-java" unless="active.platform.home.java.executable">
+        <condition property="do.set.platform.home.probjdk.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${java.home}${file.separator}..${file.separator}bin${file.separator}java"/>
+                    <available file="${java.home}${file.separator}..${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-probjdk-java" depends="-set-platform-home-java,-check-platform-home-probjdk-java" if="do.set.platform.home.probjdk.java">
+        <property name="active.platform.home.java.executable" value="${java.home}${file.separator}..${file.separator}bin${file.separator}java"/>
+    </target>
+    <target name="-check-platform-home-envjdk-java" unless="active.platform.home.java.executable">
+        <property environment="env"/>
+        <condition property="do.set.platform.home.envjdk.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${env.JAVA_HOME}${file.separator}bin${file.separator}java"/>
+                    <available file="${env.JAVA_HOME}${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-envjdk-java" depends="-set-platform-home-probjdk-java,-check-platform-home-envjdk-java" if="do.set.platform.home.envjdk.java">
+        <property environment="env"/>
+        <property name="active.platform.home.java.executable" value="${env.JAVA_HOME}${file.separator}bin${file.separator}java"/>
+    </target>
+    <target name="-check-platform-home-fxrt-java" depends="-check-property-javafx.runtime" if="javafx.runtime.defined">
+        <condition property="do.set.platform.home.fxrt.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${javafx.runtime}${file.separator}bin${file.separator}java"/>
+                    <available file="${javafx.runtime}${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-fxrt-java" depends="-set-platform-home-envjdk-java,-check-platform-home-fxrt-java" if="do.set.platform.home.fxrt.java">
+        <property name="active.platform.home.java.executable" value="${javafx.runtime}${file.separator}bin${file.separator}java"/>
+        <echo message="Warning: java executable not found in JDK, evaluating java executable in RT instead." level="info"/>
+    </target>
+    <target name="-check-platform-home-jre-java" unless="active.platform.home.java.executable">
+        <condition property="do.set.platform.home.jre.java">
+            <and>
+                <not><isset property="active.platform.home.java.executable"/></not>
+                <or>
+                    <available file="${java.home}${file.separator}bin${file.separator}java"/>
+                    <available file="${java.home}${file.separator}bin${file.separator}java.exe"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-platform-home-jre-java" depends="-set-platform-home-fxrt-java,-check-platform-home-jre-java" if="do.set.platform.home.jre.java">
+        <property name="active.platform.home.java.executable" value="${java.home}${file.separator}bin${file.separator}java"/>
+        <echo message="Warning: java executable not found in JDK, evaluating java executable in RT instead." level="info"/>
+    </target>
+    <target name="-check-platform-home" depends="-set-platform-home-jre-java">
+        <echo message="active.platform.home.java.executable = ${active.platform.home.java.executable}" level="verbose"/>
+        <fail message="Error:${line.separator}java executable not found !" unless="active.platform.home.java.executable"/>
+    </target>
+        
+    <target name="-check-jdk-version" depends="-do-init,-check-platform-home" unless="jdk-version-checked-in-jfximpl">
+        <local name="version-output"/>
+        <exec executable="${active.platform.home.java.executable}" outputproperty="version-output">
+            <arg value="-version"/>
+        </exec>
+        <echo message="version-output:${line.separator}${version-output}" level="verbose"/>
+        <condition property="have-jdk-older-than-1.6">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+                <contains string="${version-output}" substring="java version &quot;1.4"/>
+                <contains string="${version-output}" substring="java version &quot;1.5"/>
+            </or>
+        </condition>
+        <fail message="Error:${line.separator}JavaFX 2.0+ projects require JDK version 1.6+ !" if="have-jdk-older-than-1.6"/>
+        <condition property="have-jdk-7u4or5-mac">
+            <and>
+                <or>
+                    <contains string="${version-output}" substring="java version &quot;1.7.0_04"/>
+                    <contains string="${version-output}" substring="java version &quot;1.7.0_05"/>
+                </or>
+                <os family="mac"/>
+            </and>
+        </condition>
+        <condition property="have-jdk-pre7u6">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.6"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0&quot;"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0_01"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0_02"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0_03"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0_04"/>
+                <contains string="${version-output}" substring="java version &quot;1.7.0_05"/>
+            </or>
+        </condition>
+        <property name="jdk-version-checked-in-jfximpl" value="true"/>
+        <echo message="have-jdk-7u4or5-mac = ${have-jdk-7u4or5-mac}" level="verbose"/>
+        <echo message="have-jdk-pre7u6 = ${have-jdk-pre7u6}" level="verbose"/>
+    </target>
+        
+    <target name="-check-jdk-7u4or5-mac" depends="-check-jdk-version" if="have-jdk-7u4or5-mac">
+        <fail message="Error:${line.separator}JDK 7u4 Mac and 7u5 Mac do not support WebStart and JavaFX 2.0+ browser plugin technologies.${line.separator}Please upgrade to JDK 7u6 or later."/>
+    </target>
+
+    
+    <!-- Check availability of JavaFX SDK deployment support (ant-javafx.jar) -->
+
+    <target name="-check-endorsed-javafx-ant-classpath">
+        <condition property="endorsed-javafx-ant-classpath-available">
+            <and>
+                <isset property="endorsed.javafx.ant.classpath"/>
+                <not>
+                    <equals arg1="${endorsed.javafx.ant.classpath}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <echo message="endorsed-javafx-ant-classpath-available = ${endorsed-javafx-ant-classpath-available}" level="verbose"/>
+    </target>
+
+    <target name="-check-property-javafx.sdk">
+        <echo message="javafx.sdk = ${javafx.sdk}" level="verbose"/>
+        <condition property="javafx.sdk.defined">
+            <and>
+                <isset property="javafx.sdk"/>
+                <not><contains string="${javafx.sdk}" substring="$${platform" casesensitive="false"/></not>
+            </and>
+        </condition>
+        <condition property="javafx.sdk.missing+default">
+            <and>
+                <equals arg1="${platform.active}" arg2="Default_JavaFX_Platform" trim="true"/>
+                <not><isset property="javafx.sdk.defined"/></not>
+            </and>
+        </condition>
+        <condition property="javafx.sdk.missing-default">
+            <and>
+                <not><equals arg1="${platform.active}" arg2="Default_JavaFX_Platform" trim="true"/></not>
+                <not><isset property="javafx.sdk.defined"/></not>
+            </and>
+        </condition>
+        <echo message="javafx.sdk.defined = ${javafx.sdk.defined}" level="verbose"/>
+        <echo message="javafx.sdk.missing+default = ${javafx.sdk.missing+default}" level="verbose"/>
+        <echo message="javafx.sdk.missing-default = ${javafx.sdk.missing-default}" level="verbose"/>
+    </target>
+
+    <target name="-check-ant-javafx-in-fxsdk-lib" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.ant-javafx.in.fxsdk.lib">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${javafx.sdk}${file.separator}lib${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-fxsdk-lib" depends="-check-ant-javafx-in-fxsdk-lib" if="do.set.ant-javafx.in.fxsdk.lib">
+        <property name="ant-javafx.jar.location" value="${javafx.sdk}${file.separator}lib${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-fxsdk-tools" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.ant-javafx.in.fxsdk.tools">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${javafx.sdk}${file.separator}tools${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-fxsdk-tools" depends="-set-ant-javafx-in-fxsdk-lib,-check-ant-javafx-in-fxsdk-tools" if="do.set.ant-javafx.in.fxsdk.tools">
+        <property name="ant-javafx.jar.location" value="${javafx.sdk}${file.separator}tools${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-platform-home-lib" if="platform.home">
+        <condition property="do.set.ant-javafx.in.platform.home.lib">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${platform.home}${file.separator}lib${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-platform-home-lib" depends="-set-ant-javafx-in-fxsdk-tools,-check-ant-javafx-in-platform-home-lib" if="do.set.ant-javafx.in.platform.home.lib">
+        <property name="ant-javafx.jar.location" value="${platform.home}${file.separator}lib${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-platform-home-tools" if="platform.home">
+        <condition property="do.set.ant-javafx.in.platform.home.tools">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${platform.home}${file.separator}tools${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-platform-home-tools" depends="-set-ant-javafx-in-platform-home-lib,-check-ant-javafx-in-platform-home-tools" if="do.set.ant-javafx.in.platform.home.tools">
+        <property name="ant-javafx.jar.location" value="${platform.home}${file.separator}tools${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-probjdk-lib" unless="ant-javafx.jar.location">
+        <condition property="do.set.ant-javafx.in.probjdk.lib">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${java.home}${file.separator}..${file.separator}lib${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-probjdk-lib" depends="-set-ant-javafx-in-platform-home-tools,-check-ant-javafx-in-probjdk-lib" if="do.set.ant-javafx.in.probjdk.lib">
+        <property name="ant-javafx.jar.location" value="${java.home}${file.separator}..${file.separator}lib${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-probjdk-tools" unless="ant-javafx.jar.location">
+        <condition property="do.set.ant-javafx.in.probjdk.tools">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${java.home}${file.separator}..${file.separator}tools${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-probjdk-tools" depends="-set-ant-javafx-in-probjdk-lib,-check-ant-javafx-in-probjdk-tools" if="do.set.ant-javafx.in.probjdk.tools">
+        <property name="ant-javafx.jar.location" value="${java.home}${file.separator}..${file.separator}tools${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-macjdk-lib" unless="ant-javafx.jar.location">
+        <condition property="do.set.ant-javafx.in.macjdk.lib">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${java.home}${file.separator}lib${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-macjdk-lib" depends="-set-ant-javafx-in-probjdk-tools,-check-ant-javafx-in-macjdk-lib" if="do.set.ant-javafx.in.macjdk.lib">
+        <property name="ant-javafx.jar.location" value="${java.home}${file.separator}lib${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-envjdk-lib" unless="ant-javafx.jar.location">
+        <property environment="env"/>
+        <condition property="do.set.ant-javafx.in.envjdk.lib">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${env.JAVA_HOME}${file.separator}lib${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-envjdk-lib" depends="-set-ant-javafx-in-macjdk-lib,-check-ant-javafx-in-envjdk-lib" if="do.set.ant-javafx.in.envjdk.lib">
+        <property name="ant-javafx.jar.location" value="${env.JAVA_HOME}${file.separator}lib${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-check-ant-javafx-in-envjdk-tools" unless="ant-javafx.jar.location">
+        <property environment="env"/>
+        <condition property="do.set.ant-javafx.in.envjdk.tools">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${env.JAVA_HOME}${file.separator}tools${file.separator}ant-javafx.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-ant-javafx-in-envjdk-tools" depends="-set-ant-javafx-in-envjdk-lib,-check-ant-javafx-in-envjdk-tools" if="do.set.ant-javafx.in.envjdk.tools">
+        <property name="ant-javafx.jar.location" value="${env.JAVA_HOME}${file.separator}tools${file.separator}ant-javafx.jar"/>
+    </target>
+    <target name="-pre-check-ant-javafx-version" depends="-set-ant-javafx-in-envjdk-tools" unless="ant-javafx-version-already-checked-in-jfximpl">
+        <condition property="do.check.ant-javafx.version">
+            <and>
+                <isset property="ant-javafx.jar.location"/>
+                <not><isset property="ant-javafx-version-already-checked-in-jfximpl"/></not>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-endorsed-javafx-ant-classpath" depends="-check-endorsed-javafx-ant-classpath,-pre-check-ant-javafx-version" if="endorsed-javafx-ant-classpath-available">
+        <property name="javafx.ant.classpath" value="${endorsed.javafx.ant.classpath}:${ant-javafx.jar.location}"/>
+    </target>
+    <target name="-set-javafx-ant-classpath" depends="-check-endorsed-javafx-ant-classpath,-pre-check-ant-javafx-version" unless="endorsed-javafx-ant-classpath-available">
+        <property name="javafx.ant.classpath" value="${ant-javafx.jar.location}"/>
+    </target>
+    <target name="-check-ant-javafx-version" depends="-pre-check-ant-javafx-version,
+            -set-endorsed-javafx-ant-classpath,-set-javafx-ant-classpath" if="do.check.ant-javafx.version">
+        <echo message="ant-javafx.jar.location = ${ant-javafx.jar.location}" level="verbose"/>
+        <echo message="javafx.ant.classpath = ${javafx.ant.classpath}" level="verbose"/>
+        <taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
+            uri="javafx:com.sun.javafx.tools.ant"
+            classpath="${javafx.ant.classpath}"/>
+        <condition property="have-fx-ant-init">
+            <typefound name="javafx:com.sun.javafx.tools.ant:init-ant"/>
+        </condition>
+        <property name="ant-javafx-version-already-checked-in-jfximpl" value="true"/>
+        <echo message="have-fx-ant-init = ${have-fx-ant-init}" level="verbose"/>
+    </target>
+    <target name="-check-jfx-sdk-version-old" depends="-check-ant-javafx-version" unless="have-fx-ant-init">
+        <property name="javafx.ant.version" value="1.0"/>
+    </target>
+    <target name="-check-jfx-sdk-version-new" depends="-check-ant-javafx-version" if="have-fx-ant-init">
+        <fx:init-ant/>
+        <condition property="have-fx-ant-api-1.1">
+            <!-- new features from JavaFX 2.0.2 are available in API version 1.1 or later -->
+            <matches pattern="1.[1-9]" string="${javafx.ant.version}"/>
+        </condition>
+    </target>
+    <target name="-check-jfx-sdk-version" depends="-check-jfx-sdk-version-old, -check-jfx-sdk-version-new">
+        <echo message="Detected JavaFX Ant API version ${javafx.ant.version}" level="info"/>
+        <echo message="have-fx-ant-api-1.1 = ${have-fx-ant-api-1.1}" level="verbose"/>
+        <echo message="javafx.ant.classpath = ${javafx.ant.classpath}" level="verbose"/>
+    </target>
+
+    <target name="-check-jfx-deployment" depends="-check-jdk-version,-check-jfx-sdk-version">
+        <condition property="jfx-deployment-available">
+            <and>
+                <or>
+                    <isset property="do.set.ant-javafx.in.fxsdk.lib"/>
+                    <isset property="do.set.ant-javafx.in.fxsdk.tools"/>
+                    <isset property="do.set.ant-javafx.in.platform.home.lib"/>
+                    <isset property="do.set.ant-javafx.in.platform.home.tools"/>
+                    <isset property="do.set.ant-javafx.in.probjdk.lib"/>
+                    <isset property="do.set.ant-javafx.in.probjdk.tools"/>
+                    <isset property="do.set.ant-javafx.in.envjdk.lib"/>
+                    <isset property="do.set.ant-javafx.in.envjdk.tools"/>
+                </or>
+                <isset property="ant-javafx.jar.location"/>
+            </and>
+        </condition>
+        <condition property="jfx-deployment-missing+jdk7u6">
+            <and>
+                <not><isset property="jfx-deployment-available"/></not>
+                <not><isset property="have-jdk-pre7u6"/></not>
+            </and>
+        </condition>
+        <condition property="jfx-deployment-missing+javafx.sdk.missing+default">
+            <and>
+                <not><isset property="jfx-deployment-available"/></not>
+                <isset property="have-jdk-pre7u6"/>
+                <isset property="javafx.sdk.missing+default"/>
+            </and>
+        </condition>
+        <condition property="jfx-deployment-missing+javafx.sdk.missing-default">
+            <and>
+                <not><isset property="jfx-deployment-available"/></not>
+                <isset property="have-jdk-pre7u6"/>
+                <isset property="javafx.sdk.missing-default"/>
+            </and>
+        </condition>
+        <fail message="Error:${line.separator}JavaFX deployment library not found in active JDK.${line.separator}Please check that the JDK is correctly installed and its version is at least 7u4 on Mac or 7u6 on other systems." if="jfx-deployment-missing+jdk7u6"/>
+        <fail message="Error:${line.separator}JavaFX deployment library not found.${line.separator}JavaFX SDK path undefined. Check the definition of ${platform.active} in Java Platform Manager${line.separator}(or directly the properties platform.active and javafx.sdk in project.properties file).${line.separator}Note: If missing, the default JavaFX-enabled platform gets created automatically when creating a new FX Project." if="jfx-deployment-missing+javafx.sdk.missing+default"/>
+        <fail message="Error:${line.separator}JavaFX deployment library not found.${line.separator}JavaFX SDK path undefined. Check the definition of ${platform.active} in Java Platform Manager${line.separator}(or directly the properties platform.active and javafx.sdk in project.properties file)." if="jfx-deployment-missing+javafx.sdk.missing-default"/>
+        <fail message="Error:${line.separator}JavaFX deployment library not found." unless="jfx-deployment-available"/>
+        <echo message="jfx-deployment-available = ${jfx-deployment-available}" level="verbose"/>
+    </target>
+    
+    
+    <!-- Check availability of main JavaFX runtime jar (jfxrt.jar) -->
+
+    <target name="-check-property-javafx.runtime">
+        <echo message="javafx.runtime = ${javafx.runtime}" level="verbose"/>
+        <condition property="javafx.runtime.defined">
+            <and>
+                <isset property="javafx.runtime"/>
+                <not><contains string="${javafx.runtime}" substring="$${platform" casesensitive="false"/></not>
+            </and>
+        </condition>
+        <condition property="javafx.runtime.missing+default">
+            <and>
+                <equals arg1="${platform.active}" arg2="Default_JavaFX_Platform" trim="true"/>
+                <not><isset property="javafx.runtime.defined"/></not>
+            </and>
+        </condition>
+        <condition property="javafx.runtime.missing-default">
+            <and>
+                <not><equals arg1="${platform.active}" arg2="Default_JavaFX_Platform" trim="true"/></not>
+                <not><isset property="javafx.runtime.defined"/></not>
+            </and>
+        </condition>
+        <echo message="javafx.runtime.defined = ${javafx.runtime.defined}" level="verbose"/>
+        <echo message="javafx.runtime.missing+default = ${javafx.runtime.missing+default}" level="verbose"/>
+        <echo message="javafx.runtime.missing-default = ${javafx.runtime.missing-default}" level="verbose"/>
+    </target>
+
+    <target name="-check-jfxrt-in-fxrt" depends="-check-property-javafx.runtime" if="javafx.runtime.defined">
+        <condition property="do.set.jfxrt.in.fxrt">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${javafx.runtime}${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-fxrt" depends="-check-jfxrt-in-fxrt" if="do.set.jfxrt.in.fxrt">
+        <property name="jfxrt.jar.location" value="${javafx.runtime}${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-fxsdk-jre" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.jfxrt.in.fxsdk.jre">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${javafx.sdk}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-fxsdk-jre" depends="-set-jfxrt-in-fxrt,-check-jfxrt-in-fxsdk-jre" if="do.set.jfxrt.in.fxsdk.jre">
+        <property name="jfxrt.jar.location" value="${javafx.sdk}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-fxsdk-rt" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.jfxrt.in.fxsdk.rt">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${javafx.sdk}${file.separator}rt${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-fxsdk-rt" depends="-set-jfxrt-in-fxsdk-jre,-check-jfxrt-in-fxsdk-rt" if="do.set.jfxrt.in.fxsdk.rt">
+        <property name="jfxrt.jar.location" value="${javafx.sdk}${file.separator}rt${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-platform-home-jre" if="platform.home">
+        <condition property="do.set.jfxrt.in.platform.home.jre">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${platform.home}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-platform-home-jre" depends="-set-jfxrt-in-fxsdk-rt,-check-jfxrt-in-platform-home-jre" if="do.set.jfxrt.in.platform.home.jre">
+        <property name="jfxrt.jar.location" value="${platform.home}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-platform-home-rt" if="platform.home">
+        <condition property="do.set.jfxrt.in.platform.home.rt">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${platform.home}${file.separator}rt${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-platform-home-rt" depends="-set-jfxrt-in-platform-home-jre,-check-jfxrt-in-platform-home-rt" if="do.set.jfxrt.in.platform.home.rt">
+        <property name="jfxrt.jar.location" value="${platform.home}${file.separator}rt${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-jre" unless="jfxrt.jar.location">
+        <condition property="do.set.jfxrt.in.jre">
+            <and>
+                <not><isset property="jfxrt.jar.location"/></not>
+                <available file="${java.home}${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-jre" depends="-set-jfxrt-in-platform-home-rt,-check-jfxrt-in-jre" if="do.set.jfxrt.in.jre">
+        <property name="jfxrt.jar.location" value="${java.home}${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-check-jfxrt-in-envjdk-jre" unless="jfxrt.jar.location">
+        <property environment="env"/>
+        <condition property="do.set.jfxrt.in.envjdk.jre">
+            <and>
+                <not><isset property="ant-javafx.jar.location"/></not>
+                <available file="${env.JAVA_HOME}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-jfxrt-in-envjdk-jre" depends="-set-jfxrt-in-jre,-check-jfxrt-in-envjdk-jre" if="do.set.jfxrt.in.envjdk.jre">
+        <property name="jfxrt.jar.location" value="${env.JAVA_HOME}${file.separator}jre${file.separator}lib${file.separator}jfxrt.jar"/>
+    </target>
+    <target name="-pre-check-jfx-runtime" depends="-set-jfxrt-in-envjdk-jre">
+        <echo message="jfxrt.jar.location = ${jfxrt.jar.location}" level="verbose"/>
+    </target>
+
+    <target name="-check-jfx-runtime" depends="-check-jdk-version, -pre-check-jfx-runtime">
+        <condition property="jfx-runtime-available">
+            <and>
+                <or>
+                    <isset property="do.set.jfxrt.in.fxrt"/>
+                    <isset property="do.set.jfxrt.in.fxsdk.jre"/>
+                    <isset property="do.set.jfxrt.in.fxsdk.rt"/>
+                    <isset property="do.set.jfxrt.in.platform.home.jre"/>
+                    <isset property="do.set.jfxrt.in.platform.home.rt"/>
+                    <isset property="do.set.jfxrt.in.jre"/>
+                    <isset property="do.set.jfxrt.in.envjdk.jre"/>
+                </or>
+                <isset property="jfxrt.jar.location"/>
+            </and>
+        </condition>
+        <fail message="Error:${line.separator}JavaFX runtime JAR not found." unless="jfx-runtime-available"/>
+        <echo message="jfx-runtime-available = ${jfx-runtime-available}" level="verbose"/>
+    </target>
+
+
+    <!-- Check availability of WebStart executable -->
+
+    <target name="-check-webstart-in-fxrt" depends="-check-property-javafx.runtime" if="javafx.runtime.defined">
+        <condition property="do.set.webstart.in.fxrt">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <isset property="javafx.runtime.defined"/>
+                <or>
+                    <available file="${javafx.runtime}${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${javafx.runtime}${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-fxrt" depends="-check-webstart-in-fxrt" if="do.set.webstart.in.fxrt">
+        <property name="active.webstart.executable" value="${javafx.runtime}${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-fxsdk-jre" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.webstart.in.fxsdk.jre">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <isset property="javafx.sdk.defined"/>
+                <or>
+                    <available file="${javafx.sdk}${file.separator}jre${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${javafx.sdk}${file.separator}jre${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-fxsdk-jre" depends="-set-webstart-in-fxrt,-check-webstart-in-fxsdk-jre" if="do.set.webstart.in.fxsdk.jre">
+        <property name="active.webstart.executable" value="${javafx.sdk}${file.separator}jre${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-fxsdk" depends="-check-property-javafx.sdk" if="javafx.sdk.defined">
+        <condition property="do.set.webstart.in.fxsdk">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <isset property="javafx.sdk.defined"/>
+                <or>
+                    <available file="${javafx.sdk}${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${javafx.sdk}${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-fxsdk" depends="-set-webstart-in-fxsdk-jre,-check-webstart-in-fxsdk" if="do.set.webstart.in.fxsdk">
+        <property name="active.webstart.executable" value="${javafx.sdk}${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-platform-home-jre" if="platform.home">
+        <condition property="do.set.webstart.in.platform.home.jre">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <or>
+                    <available file="${platform.home}${file.separator}jre${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${platform.home}${file.separator}jre${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-platform-home-jre" depends="-set-webstart-in-fxsdk,-check-webstart-in-platform-home-jre" if="do.set.webstart.in.platform.home.jre">
+        <property name="active.webstart.executable" value="${platform.home}${file.separator}jre${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-platform-home" if="platform.home">
+        <condition property="do.set.webstart.in.platform.home">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <or>
+                    <available file="${platform.home}${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${platform.home}${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-platform-home" depends="-set-webstart-in-platform-home-jre,-check-webstart-in-platform-home" if="do.set.webstart.in.platform.home">
+        <property name="active.webstart.executable" value="${platform.home}${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-jre" unless="active.webstart.executable">
+        <condition property="do.set.webstart.in.jre">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <or>
+                    <available file="${java.home}${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${java.home}${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-jre" depends="-set-webstart-in-platform-home,-check-webstart-in-jre" if="do.set.webstart.in.jre">
+        <property name="active.webstart.executable" value="${java.home}${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-probjdk" unless="active.webstart.executable">
+        <condition property="do.set.webstart.in.probjdk">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <or>
+                    <available file="${java.home}${file.separator}..${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${java.home}${file.separator}..${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-probjdk" depends="-set-webstart-in-jre,-check-webstart-in-probjdk" if="do.set.webstart.in.probjdk">
+        <property name="active.webstart.executable" value="${java.home}${file.separator}..${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-check-webstart-in-envjdk" unless="active.webstart.executable">
+        <property environment="env"/>
+        <condition property="do.set.webstart.in.envjdk">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <or>
+                    <available file="${env.JAVA_HOME}${file.separator}bin${file.separator}javaws.exe"/>
+                    <available file="${env.JAVA_HOME}${file.separator}bin${file.separator}javaws"/>
+                </or>
+            </and>
+        </condition>
+    </target>
+    <target name="-set-webstart-in-envjdk" depends="-set-webstart-in-probjdk,-check-webstart-in-envjdk" if="do.set.webstart.in.envjdk">
+        <property name="active.webstart.executable" value="${env.JAVA_HOME}${file.separator}bin${file.separator}javaws"/>
+    </target>
+    <target name="-pre-check-webstart-in-unix" depends="-check-operating-system,-set-webstart-in-envjdk" unless="active.webstart.executable">
+        <condition property="running.on.unix-active.webstart.executable">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <isset property="running.on.unix"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-check-webstart-in-unix" depends="-pre-check-webstart-in-unix" if="running.on.unix-active.webstart.executable">
+        <local name="exec.which.javaws.result"/>
+        <exec executable="which" failifexecutionfails="false" failonerror="false" resultproperty="exec.which.javaws.result" outputproperty="exec.which.javaws.output">
+            <arg value="javaws"/>
+        </exec>
+        <condition property="do.set.webstart.in.unix">
+            <and>
+                <not><isset property="active.webstart.executable"/></not>
+                <isset property="exec.which.javaws.result"/>
+                <equals arg1="${exec.which.javaws.result}" arg2="0"/>
+                <isset property="exec.which.javaws.output"/>
+                <not><equals arg1="${exec.which.javaws.output}" arg2=""/></not>
+            </and>
+        </condition>
+        <echo message="do.set.webstart.in.unix = ${do.set.webstart.in.unix}" level="verbose"/>
+    </target>
+    <target name="-set-webstart-in-unix" depends="-set-webstart-in-envjdk,-check-webstart-in-unix" if="do.set.webstart.in.unix">
+        <property name="active.webstart.executable" value="${exec.which.javaws.output}"/>
+    </target>
+    <target name="-pre-check-jfx-webstart" depends="-set-webstart-in-unix">
+        <echo message="active.webstart.executable = ${active.webstart.executable}" level="verbose"/>
+    </target>
+
+    <target name="-check-jfx-webstart" depends="-pre-check-jfx-webstart">
+        <condition property="jfx-webstart-available">
+            <and>
+                <or>
+                    <isset property="do.set.webstart.in.fxrt"/>
+                    <isset property="do.set.webstart.in.fxsdk.jre"/>
+                    <isset property="do.set.webstart.in.fxsdk"/>
+                    <isset property="do.set.webstart.in.platform.home.jre"/>
+                    <isset property="do.set.webstart.in.platform.home"/>
+                    <isset property="do.set.webstart.in.jre"/>
+                    <isset property="do.set.webstart.in.probjdk"/>
+                    <isset property="do.set.webstart.in.envjdk"/>
+                    <isset property="do.set.webstart.in.unix"/>
+                </or>
+                <isset property="active.webstart.executable"/>
+            </and>
+        </condition>
+        <condition property="jfx-webstart-missing+jdk7u6">
+            <and>
+                <not><isset property="jfx-webstart-available"/></not>
+                <not><isset property="have-jdk-pre7u6"/></not>
+            </and>
+        </condition>
+        <condition property="jfx-webstart-missing+javafx.runtime.missing+default">
+            <and>
+                <not><isset property="jfx-webstart-available"/></not>
+                <isset property="have-jdk-pre7u6"/>
+                <isset property="javafx.runtime.missing+default"/>
+            </and>
+        </condition>
+        <condition property="jfx-webstart-missing+javafx.runtime.missing-default">
+            <and>
+                <not><isset property="jfx-webstart-available"/></not>
+                <isset property="have-jdk-pre7u6"/>
+                <isset property="javafx.runtime.missing-default"/>
+            </and>
+        </condition>
+        <fail message="Error:${line.separator}WebStart executable could not be found in active JDK.${line.separator}Please check that the JDK is correctly installed and its version is at least 7u6." if="jfx-webstart-missing+jdk7u6"/>
+        <fail message="Error:${line.separator}WebStart executable could not be found.${line.separator}JavaFX RT path undefined. Check the definition of ${platform.active} in Java Platform Manager${line.separator}(or directly the properties platform.active and javafx.runtime in project.properties file).${line.separator}Note: If missing, the default JavaFX-enabled platform gets created automatically when creating a new FX Project." if="jfx-webstart-missing+javafx.runtime.missing+default"/>
+        <fail message="Error:${line.separator}WebStart executable could not be found.${line.separator}JavaFX RT path undefined. Check the definition of ${platform.active} in Java Platform Manager${line.separator}(or directly the properties platform.active and javafx.runtime in project.properties file)." if="jfx-webstart-missing+javafx.runtime.missing-default"/>
+        <fail message="Error:${line.separator}WebStart executable could not be found." unless="jfx-webstart-available"/>
+        <echo message="jfx-webstart-available = ${jfx-webstart-available}" level="verbose"/>
+    </target>
+
+    
+    <!-- Legacy targets kept for compatibility with older build-impl.xml scripts -->
+
+    <!-- Note: target "-check-javafx" is not necessary any more but is referenced from NB 7.1 build-impl.xml -->
+    <target name="-check-javafx"/>
+    <!-- Note: target "-javafx-check-error" is not necessary any more but is referenced from NB 7.1 build-impl.xml -->
+    <target name="-javafx-check-error"/>    
+    <!-- Note: target "-init-javafx" is not necessary any more but is referenced from NB 7.1 build-impl.xml -->
+    <target name="-init-javafx"/>
+
+    
+    <!-- Check project properties -->
+    
+    <target name="-check-default-run-config" unless="config">
+        <property name="config" value="&lt;default config&gt;"/>
+    </target>
+    
+    <target name="-check-project">
+        <condition property="main-class-available">
+            <isset property="javafx.main.class"/>
+        </condition>
+        <condition property="vmargs-available">
+            <and>
+                <isset property="run.jvmargs"/>
+                <not><equals arg1="${run.jvmargs}" arg2=""/></not>
+            </and>
+        </condition>
+        <condition property="preloader-available">
+            <and>
+                <isset property="javafx.preloader.enabled"/>
+                <equals arg1="${javafx.preloader.enabled}" arg2="true"/>
+                <isset property="javafx.preloader.class"/>
+                <not><equals arg1="${javafx.preloader.class}" arg2=""/></not>
+                <isset property="javafx.preloader.jar.filename"/>
+                <not><equals arg1="${javafx.preloader.jar.filename}" arg2=""/></not>
+            </and>
+        </condition>
+        <condition property="app-with-preloader">
+            <and>
+                <istrue value="${preloader-available}"/>
+                <istrue value="${main-class-available}"/>
+            </and>
+        </condition>
+        <condition property="app-with-external-preloader-jar">
+            <and>
+                <isset property="app-with-preloader"/>
+                <isset property="javafx.preloader.type"/>
+                <equals arg1="${javafx.preloader.type}" arg2="jar" trim="true"/>
+            </and>
+        </condition>
+        <condition property="app-without-preloader">
+            <and>
+                <not>
+                    <istrue value="${preloader-available}"/>
+                </not>
+                <istrue value="${main-class-available}"/>
+            </and>
+        </condition>
+        <condition property="preloader-app">
+            <and>
+                <isset property="javafx.preloader"/>
+                <equals arg1="${javafx.preloader}" arg2="true"/>
+            </and>
+        </condition>
+        <condition property="fx-in-swing-app">
+            <and>
+                <isset property="javafx.swing"/>
+                <equals arg1="${javafx.swing}" arg2="true"/>
+            </and>
+        </condition>
+        <condition property="fx-in-swing-workaround-app">
+            <and>
+                <istrue value="${fx-in-swing-app}"/>
+                <istrue value="${preloader-app}"/>
+            </and>
+        </condition>
+        <condition property="preloader-app-no-workaround">
+            <and>
+                <istrue value="${preloader-app}"/>
+                <not><istrue value="${fx-in-swing-app}"/></not>
+            </and>
+        </condition>
+        <condition property="html-template-available">
+            <and>
+                <isset property="javafx.run.htmltemplate"/>
+                <not>
+                    <equals arg1="${javafx.run.htmltemplate}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <condition property="icon-available">
+            <and>
+                <isset property="javafx.deploy.icon"/>
+                <not>
+                    <equals arg1="${javafx.deploy.icon}" arg2=""/>
+                </not>
+            </and>
+        </condition>
+        <condition property="dimensions-available">
+            <and>
+                <isset property="javafx.run.width"/>
+                <isset property="javafx.run.height"/>
+                <not><equals arg1="${javafx.run.width}" arg2=""/></not>
+                <not><equals arg1="${javafx.run.height}" arg2=""/></not>
+            </and>
+        </condition>
+        <condition property="update-mode-background">
+            <and>
+                <isset property="javafx.deploy.backgroundupdate"/>
+                <equals arg1="${javafx.deploy.backgroundupdate}" arg2="true" trim="true"/>
+            </and>
+        </condition>
+        <condition property="offline-allowed">
+            <and>
+                <isset property="javafx.deploy.allowoffline"/>
+                <equals arg1="${javafx.deploy.allowoffline}" arg2="true" trim="true"/>
+            </and>
+        </condition>
+        <condition property="permissions-elevated">
+            <and>
+                <isset property="javafx.deploy.permissionselevated"/>
+                <equals arg1="${javafx.deploy.permissionselevated}" arg2="true" trim="true"/>
+            </and>
+        </condition>
+        <condition property="binary-encode-css">
+            <and>
+                <isset property="javafx.binarycss"/>
+                <equals arg1="${javafx.binarycss}" arg2="true" trim="true"/>
+            </and>
+        </condition>
+        <condition property="rebase-lib-jars">
+            <and>
+                <isset property="javafx.rebase.libs"/>
+                <equals arg1="${javafx.rebase.libs}" arg2="true" trim="true"/>
+            </and>
+        </condition>
+
+        <echo message="main-class-available = ${main-class-available}" level="verbose"/>
+        <echo message="vmargs-available = ${vmargs-available}" level="verbose"/>
+        <echo message="preloader-available = ${preloader-available}" level="verbose"/>
+        <echo message="app-with-preloader = ${app-with-preloader}" level="verbose"/>
+        <echo message="app-with-preloader-without-project = ${app-with-preloader-without-project}" level="verbose"/>
+        <echo message="app-without-preloader = ${app-without-preloader}" level="verbose"/>
+        <echo message="preloader-app = ${preloader-app}" level="verbose"/>
+        <echo message="fx-in-swing-app = ${fx-in-swing-app}" level="verbose"/>
+        <echo message="fx-in-swing-workaround-app = ${fx-in-swing-workaround-app}" level="verbose"/>
+        <echo message="preloader-app-no-workaround = ${preloader-app-no-workaround}" level="verbose"/>
+        <echo message="html-template-available = ${html-template-available}" level="verbose"/>
+        <echo message="icon-available = ${icon-available}" level="verbose"/>
+        <echo message="dimensions-available = ${dimensions-available}" level="verbose"/>
+        <echo message="update-mode-background = ${update-mode-background}" level="verbose"/>
+        <echo message="offline-allowed = ${offline-allowed}" level="verbose"/>
+        <echo message="permissions-elevated = ${permissions-elevated}" level="verbose"/>
+        <echo message="binary-encode-css = ${binary-encode-css}" level="verbose"/>
+        <echo message="rebase-lib-jars = ${rebase-lib-jars}" level="verbose"/>
+    </target>
+
+    <target name="-icon-deployment-check" depends="-check-project,-check-jfx-deployment" if="icon-available">
+        <condition property="icon-deployment-may-not-be-supported">
+            <and>
+                <isset property="icon-available"/>
+                <not><isset property="have-fx-ant-api-1.1"/></not>
+            </and>
+        </condition>
+    </target>
+    <target name="-icon-warning" depends="-icon-deployment-check" if="icon-deployment-may-not-be-supported">
+        <echo message="Warning: Note that due to a bug in early JavaFX 2.0 SDK distributions the icon may not be properly set in deployment files."/>
+    </target>
+
+    <target name="-set-dimensions" depends="-check-project" if="dimensions-available">
+        <property name="javafx.width" value="${javafx.run.width}"/>
+        <property name="javafx.height" value="${javafx.run.height}"/>
+    </target>
+    <target name="-reset-dimensions" depends="-check-project" unless="dimensions-available">
+        <property name="javafx.width" value="800"/>
+        <property name="javafx.height" value="600"/>
+    </target>
+
+    <target name="-set-update-mode-background" depends="-check-project" if="update-mode-background">
+        <property name="update-mode" value="background"/>
+    </target>
+    <target name="-set-update-mode-eager" depends="-check-project" unless="update-mode-background">
+        <property name="update-mode" value="eager"/>
+    </target>
+
+    <target name="-set-permissions-elevated" depends="-check-project" if="permissions-elevated">
+        <property name="permissions.elevated" value="true"/>
+    </target>
+    <target name="-reset-permissions-elevated" depends="-check-project" unless="permissions-elevated">
+        <property name="permissions.elevated" value="false"/>
+    </target>
+
+    <target name="-set-binary-css" depends="-check-project" if="binary-encode-css">
+        <property name="css-include-ext" value="bss"/>
+        <property name="css-exclude-ext" value="css"/>
+    </target>
+    <target name="-unset-binary-css" depends="-check-project" unless="binary-encode-css">
+        <property name="css-include-ext" value="css"/>
+        <property name="css-exclude-ext" value="bss"/>
+    </target>
+    <target name="-copy-binary-css" depends="-check-project" if="binary-encode-css">
+        <fileset id="cssfiles" dir="${basedir}${file.separator}${build.classes.dir}">
+            <include name="**${file.separator}*.css"/>
+        </fileset>
+        <property name="cssfileslist" refid="cssfiles"/>
+        <echo message="css files to binary convert: " level="verbose">${cssfileslist}</echo>
+        <fx:csstobin outdir="${basedir}${file.separator}${build.classes.dir}">
+            <fileset refid="cssfiles"/>
+        </fx:csstobin>
+    </target>
+
+
+    <!-- Copy dependent libraries -->
+    
+    <!-- Note: target "-jfx-copylibs" is referenced from NB 7.1 build-impl.xml -->
+    <target name="-jfx-copylibs" depends="init,compile,-pre-pre-jar,-pre-jar">
+        <local name="run.classpath.without.build.classes.and.dist.dir"/>
+        <pathconvert property="run.classpath.without.build.classes.and.dist.dir">
+            <path path="${run.classpath}"/>
+            <map from="${basedir}${file.separator}${build.classes.dir}" to=""/>
+            <map from="${basedir}${file.separator}${dist.jar}" to=""/>
+            <map from="${javafx.runtime}${file.separator}lib${file.separator}jfxrt.jar" to=""/>
+            <map from="${javafx.runtime}${file.separator}lib${file.separator}deploy.jar" to=""/>
+            <map from="${javafx.runtime}${file.separator}lib${file.separator}javaws.jar" to=""/>
+            <map from="${javafx.runtime}${file.separator}lib${file.separator}plugin.jar" to=""/>
+        </pathconvert>
+        <!-- add possibly missing dependencies at distance 2 (build system logic thus provides transitive closure) -->
+        <local name="run.and.lib.classpath"/>
+        <script language="javascript">
+            <![CDATA[
+                var pathConvert = project.createTask("pathconvert");
+                pathConvert.setProperty("run.and.lib.classpath");
+                var classPath = project.getProperty("run.classpath.without.build.classes.and.dist.dir");
+                var fileSeparator = project.getProperty("file.separator");
+                if(classPath != null) {
+                    var classPathCopy = pathConvert.createPath();
+                    classPathCopy.setPath(classPath);
+                    if(classPath.indexOf(";") != -1) {
+                        var pathArray = classPath.split(";");
+                    } else {
+                        var pathArray = classPath.split(":");
+                    }
+                    var added = "";
+                    for (var i=0; i<pathArray.length; i++) {
+                        var index = pathArray[i].lastIndexOf(fileSeparator);
+                        if (index >=0) {
+                            var onePath = pathArray[i].substr(0,index+1) + "lib";
+                            var oneDir = new java.io.File(onePath);
+                            if(oneDir.exists()) {
+                                var fs = project.createDataType("fileset");
+                                fs.setDir( oneDir );
+                                fs.setIncludes("*.jar");
+                                var ds = fs.getDirectoryScanner(project);
+                                var srcFiles = ds.getIncludedFiles();
+                                for (j=0; j<srcFiles.length; j++) {
+                                    if(classPath.indexOf(srcFiles[j]) == -1 && added.indexOf(srcFiles[j]) == -1) {
+                                        var path = pathConvert.createPath();
+                                        path.setPath(onePath + fileSeparator + srcFiles[j]);
+                                        added += srcFiles[j];
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                pathConvert.perform();
+            ]]>
+        </script>
+        <echo message="run.and.lib.classpath = ${run.and.lib.classpath}" level="verbose"/>
+        <delete dir="${dist.dir}${file.separator}lib" includeEmptyDirs="true" quiet="true"/>
+        <copy todir="${dist.dir}${file.separator}lib" flatten="true" preservelastmodified="true" overwrite="true">
+            <path>
+                <pathelement path="${run.and.lib.classpath}"/>
+            </path>
+        </copy>
+    </target>
+    
+    <target name="-copy-external-preloader-jar" depends="-check-project" if="app-with-external-preloader-jar">
+        <copy file="${javafx.preloader.jar.path}" todir="${dist.dir}${file.separator}lib"/>
+    </target>
+
+
+    <!-- Optional classpath re-base of dependent JAR manifests after copy to lib/, required by GlassFish -->
+
+    <macrodef name="rebase-lib">
+        <attribute name="jarfile"/>
+        <sequential>
+            <local name="tmpdir"/>
+            <property name="tmpdir" value="${java.io.tmpdir}${file.separator}${user.name}_${ant.project.name}_rebase" />
+            <echo message="tmpdir = ${tmpdir}" level="verbose"/>
+            <delete dir="${tmpdir}" quiet="true"/>
+            <mkdir dir="${tmpdir}"/>
+            <unzip src="@{jarfile}" dest="${tmpdir}">
+                <patternset>
+                    <include name="META-INF${file.separator}MANIFEST.MF"/>
+                </patternset>
+            </unzip>
+            <local name="manifest.file.temp"/>
+            <property name="manifest.file.temp" value="${tmpdir}${file.separator}META-INF${file.separator}MANIFEST.MF" />
+            <echo message="manifest.file.temp = ${manifest.file.temp}" level="verbose"/>
+            <!-- edited manifest file -->
+            <local name="manifest.file.temp.new"/>
+            <property name="manifest.file.temp.new" value="${manifest.file.temp}_new" />
+            <echo message="manifest.file.temp.new = ${manifest.file.temp.new}" level="verbose"/>
+            <script language="javascript">
+                <![CDATA[
+                    var UTF_8 = "UTF-8";
+                    var ATTR_CLASS_PATH = "Class-Path";
+                    var ATTR_CLASS_PATH_FX = "JavaFX-Class-Path";
+                    function isSigned(manifest) {        
+                        var sections = manifest.getSectionNames();
+                        while(sections.hasMoreElements()) {
+                            var sectionname = sections.nextElement();
+                            var section = manifest.getSection(sectionname);
+                            if(section != null) {
+                                var sectionKeys = section.getAttributeKeys();
+                                while (sectionKeys.hasMoreElements()) {
+                                    var element = sectionKeys.nextElement();
+                                    if (element.endsWith("-Digest") || element.endsWith("-digest")) {
+                                        return true;
+                                    }
+                                }
+                            }
+                        }
+                        return false;
+                    }
+                    var src = project.getProperty("manifest.file.temp");
+                    var srf = new java.io.File(src);
+                    try {
+                        var fis = new java.io.FileInputStream(srf);
+                        try {
+                            var isr = new java.io.InputStreamReader(fis, UTF_8);
+                            try {
+                                var manifest = new org.apache.tools.ant.taskdefs.Manifest(isr);
+                            } finally {
+                                isr.close();
+                            }
+                        } finally {
+                            fis.close();
+                        }
+                    } catch(e) {
+                        var manifest = null;
+                    }
+                    if(manifest != null) {
+                        if(isSigned(manifest)) {
+                            println("Warning: Signed JAR can not be rebased.");
+                        } else {
+                            var mainSection = manifest.getMainSection();
+                            var classPath = mainSection.getAttributeValue(ATTR_CLASS_PATH);
+                            if (classPath != null) {
+                                var classPathAttr = ATTR_CLASS_PATH;
+                            } else {
+                                classPath = mainSection.getAttributeValue(ATTR_CLASS_PATH_FX);
+                                if(classPath != null) {
+                                    var classPathAttr = ATTR_CLASS_PATH_FX;
+                                }
+                            }
+                            if(classPath != null) {
+                                var result = new java.lang.StringBuilder();
+                                var changed = false;
+                                var pathArray = classPath.split(" ");
+                                for (var i=0; i<pathArray.length; i++) {
+                                    if (result.length() > 0) {
+                                        result.append(' ');
+                                    }
+                                    var index = pathArray[i].lastIndexOf('/');
+                                    if (index >=0 && index < pathArray[i].length()-1) {
+                                        pathArray[i] = pathArray[i].substring(index+1);
+                                        changed = true;
+                                    }
+                                    result.append(pathArray[i]);
+                                }
+                                mainSection.removeAttribute(classPathAttr);
+                                mainSection.addAttributeAndCheck(new org.apache.tools.ant.taskdefs.Manifest.Attribute(classPathAttr, result.toString()));
+                                var tgt = project.getProperty("manifest.file.temp.new");
+                                var tgf = new java.io.File(tgt);
+                                try {
+                                    var fos = new java.io.FileOutputStream(tgf);
+                                    try {
+                                        var osw = new java.io.OutputStreamWriter(fos, UTF_8);
+                                        try {
+                                            var manifestOut = new java.io.PrintWriter(osw);
+                                            manifest.write(manifestOut);
+                                            manifestOut.close();
+                                        } finally {
+                                            osw.close();
+                                        }
+                                    } finally {
+                                        fos.close();
+                                    }
+                                } catch(e) {
+                                    println("Warning: problem storing rebased manifest file.");
+                                }
+                            }
+                        }
+                    }
+                ]]>
+            </script>
+            <antcall target="-move-new-manifest-if-exists">
+                <param name="move.file.from" value="${manifest.file.temp.new}"/>
+                <param name="move.file.to" value="${manifest.file.temp}"/>
+            </antcall>
+            <zip destfile="@{jarfile}" basedir="${tmpdir}" update="true"/>
+            <delete dir="${tmpdir}" quiet="true"/>
+        </sequential>
+    </macrodef>
+    
+    <target name="-new-temp-mainfest-existence">
+        <condition property="new-temp-manifest-exists">
+            <available file="${move.file.from}"/>
+        </condition>
+        <echo message="new-temp-manifest-exists = ${new-temp-manifest-exists}" level="verbose"/>
+    </target>
+    
+    <target name="-move-new-manifest-if-exists" depends="-new-temp-mainfest-existence" if="new-temp-manifest-exists">
+        <move file="${move.file.from}" tofile="${move.file.to}" failonerror="false"/>
+    </target>
+    
+    <target name="-rebase-libs-macro-call">
+        <echo message="Rebase jarfile = ${jar.file.to.rebase}" level="verbose"/>
+        <rebase-lib jarfile="${jar.file.to.rebase}"/>
+    </target>
+    
+    <!-- Note: target "-rebase-libs" is referenced from NB 7.1 build-impl.xml -->
+    <target name="-rebase-libs" depends="-check-project, -jfx-copylibs" if="rebase-lib-jars">
+        <property name="pp_rebase_dir" value="${basedir}${file.separator}${dist.dir}${file.separator}lib"/>
+        <property name="pp_rebase_fs" value="*.jar"/>
+        <script language="javascript">
+            <![CDATA[
+                var dir = project.getProperty("pp_rebase_dir");
+                var fDir = new java.io.File(dir);
+                if( fDir.exists() ) {
+                    var callTask = project.createTask("antcall");
+                    callTask.setTarget("-rebase-libs-macro-call");
+                    var param = callTask.createParam();
+                    param.setName("jar.file.to.rebase");
+                    var includes = project.getProperty("pp_rebase_fs");
+                    var fs = project.createDataType("fileset");
+                    fs.setDir( fDir );
+                    fs.setIncludes(includes);
+                    var ds = fs.getDirectoryScanner(project);
+                    var srcFiles = ds.getIncludedFiles();
+                    for (i=0; i<srcFiles.length; i++) {
+                        param.setValue(dir + "${file.separator}" + srcFiles[i]);
+                        callTask.perform();
+                    }
+                }
+            ]]>
+        </script>
+    </target>
+
+
+    <!-- Main Deployment Target -->
+
+    <!-- Note: target "jfx-deployment" is referenced from NB 7.1 build-impl.xml -->
+    <target name="jfx-deployment" depends="-check-jfx-deployment,-check-project,-icon-warning,
+        -set-dimensions,-reset-dimensions,-set-update-mode-background,-set-update-mode-eager,
+        -set-permissions-elevated,-reset-permissions-elevated,
+        -copy-external-preloader-jar,-set-binary-css,-unset-binary-css,-copy-binary-css,
+        -deploy-app-sign-nopreloader-notemplate,
+        -deploy-app-sign-preloader-notemplate,
+        -deploy-app-sign-nopreloader-template,
+        -deploy-app-sign-preloader-template,
+        -deploy-app-sign-nopreloader-notemplate-swing,
+        -deploy-app-sign-nopreloader-template-swing,
+        -deploy-app-nosign-nopreloader-notemplate,
+        -deploy-app-nosign-preloader-notemplate,
+        -deploy-app-nosign-nopreloader-template,
+        -deploy-app-nosign-preloader-template,
+        -deploy-app-nosign-nopreloader-notemplate-swing,
+        -deploy-app-nosign-nopreloader-template-swing"
+        if="jfx-deployment-available">
+    </target>
+
+
+    <!-- Security / Signing -->
+    
+    <target name="-unavailable-signjars-task" depends="-check-jfx-deployment" unless="jfx-deployment-available">
+        <echo message="Warning: Task required to sign JAR file is missing, check the availability of JavaFX 2.0 deployment tasks. JAR files will not be signed."/>
+    </target>
+
+    <target name="-security-props-check">
+        <condition property="javafx.signed.true">
+            <istrue value="${javafx.signing.enabled}"/>
+        </condition>
+    </target>
+
+    <target name="-check-signing-possible" depends="-security-props-check,-check-jfx-deployment,-unavailable-signjars-task">
+        <condition property="javafx.signed.true+signjars.task.available">
+            <and>
+                <isset property="javafx.signed.true"/>
+                <isset property="jfx-deployment-available"/>
+            </and>
+        </condition>
+    </target>
+    
+    <target name="-javafx-init-keystore" depends="-check-signing-possible,-javafx-init-signing,-javafx-init-keystore1,-javafx-init-keystore2,-check-keystore-exists" 
+            if="javafx.signed.true+signjars.task.available" unless="javafx.signjar.keystore.exists">
+        <property name="javafx.signjar.vendor" value="CN=${application.vendor}"/>
+        <echo message="Going to create default keystore in ${javafx.signjar.keystore}"/>
+        <genkey dname="${javafx.signjar.vendor}" alias="${javafx.signjar.alias}" keystore="${javafx.signjar.keystore}"
+            storepass="${javafx.signjar.storepass}" keypass="${javafx.signjar.keypass}"/>
+    </target>
+    
+    <target name="-check-keystore-exists">
+        <available property="javafx.signjar.keystore.exists" file="${javafx.signjar.keystore}"/>
+    </target>
+
+    <target name="-javafx-init-signing">
+        <condition property="generated.key.signing">
+            <equals arg1="${javafx.signing.type}" arg2="self" trim="true"/>
+        </condition>
+    </target>
+
+    <target name="-javafx-init-keystore1" depends="-javafx-init-signing" if="generated.key.signing">
+        <property name="javafx.signjar.keystore" value="${basedir}${file.separator}build${file.separator}nb-jfx.jks" />
+        <property name="javafx.signjar.storepass" value="storepass"/>
+        <property name="javafx.signjar.keypass" value="keypass"/>
+        <property name="javafx.signjar.alias" value="nb-jfx"/>
+    </target>
+
+    <target name="-javafx-init-keystore2" depends="-javafx-init-signing" unless="generated.key.signing">
+        <property name="javafx.signjar.keystore" value="${javafx.signing.keystore}" />
+        <property name="javafx.signjar.storepass" value="${javafx.signing.keystore.password}"/>
+        <property name="javafx.signjar.keypass" value="${javafx.signing.keyalias.password}"/>
+        <property name="javafx.signjar.alias" value="${javafx.signing.keyalias}"/>
+    </target>
+
+    
+    <!-- Project Deployment Macros -->
+
+    <macrodef name="deploy-defines">
+        <sequential>
+            <basename property="jfx.deployment.jar" file="${dist.jar}"/>
+            <property name="jfx.deployment.dir" location="${dist.dir}"/>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="deploy-preprocess">
+        <sequential>
+            <delete includeEmptyDirs="true" quiet="true">
+                <fileset dir="${jfx.deployment.dir}${file.separator}lib">
+                    <exclude name="**${file.separator}*.jar"/>
+                </fileset>
+            </delete>
+        </sequential>
+    </macrodef>
+
+    <!-- fx:jar scripted call enables passing of arbitrarily long list of params and fx-version dependent behavior -->
+    <macrodef name="deploy-jar">
+        <sequential>
+            <antcall target="-pre-jfx-jar"/>
+            <echo message="javafx.ant.classpath = ${javafx.ant.classpath}" level="verbose"/>
+            <typedef name="fx_jar" classname="com.sun.javafx.tools.ant.FXJar" classpath="${javafx.ant.classpath}"/>
+            <echo message="Launching &lt;fx:jar&gt; task from ${ant-javafx.jar.location}" level="info"/>
+            <property name="pp_jar_destfile" value="${jfx.deployment.dir}${file.separator}${jfx.deployment.jar}"/>
+            <property name="pp_jar_buildclasses" value="${basedir}${file.separator}${build.classes.dir}"/>
+            <property name="pp_jar_cssbss" value="**${file.separator}*.${css-exclude-ext}"/>
+            <property name="pp_jar_dir" value="${jfx.deployment.dir}"/>
+            <property name="pp_jar_fs1" value="lib${file.separator}${javafx.preloader.jar.filename}"/>
+            <property name="pp_jar_fs2" value="lib${file.separator}*.jar"/>
+            <echo message="deploy_jar: pp_jar_destfile = ${pp_jar_destfile}" level="verbose"/>
+            <echo message="deploy_jar: pp_jar_buildclasses = ${pp_jar_buildclasses}" level="verbose"/>
+            <echo message="deploy_jar: pp_jar_cssbss = ${pp_jar_cssbss}" level="verbose"/>
+            <echo message="deploy_jar: pp_jar_dir = ${pp_jar_dir}" level="verbose"/>
+            <echo message="deploy_jar: pp_jar_fs1 = ${pp_jar_fs1}" level="verbose"/>
+            <echo message="deploy_jar: pp_jar_fs2 = ${pp_jar_fs2}" level="verbose"/>
+            <script language="javascript">
+                <![CDATA[
+                    var S = java.io.File.separator;
+                    var JFXPAR = "javafx.param";
+                    var JFXPARN = "name";
+                    var JFXPARV = "value";
+                    var JFXLAZY = "download.mode.lazy.jar";
+                    var withpreloader = project.getProperty("app-with-preloader");
+                    var fx_ant_api_1_1 = project.getProperty("have-fx-ant-api-1.1");
+
+                    // get jars with lazy download mode property set
+                    function getLazyJars() {
+                        var jars = new Array();
+                        var keys = project.getProperties().keys();
+                        while(keys.hasMoreElements()) {
+                            var pn = keys.nextElement();
+                            if(pn.substr(0,JFXLAZY.length) == JFXLAZY) {
+                                var fname = pn.substring(JFXLAZY.length+1);
+                                jars.push(fname);
+                            }
+                        }
+                        return jars.length > 0 ? jars : null;
+                    }
+                    // set download mode of dependent libraries
+                    function setDownloadMode(fsEager, fsLazy, jars) {
+                        for(i = 0; i < jars.length; i++) {
+                            fsEager.setExcludes("lib" + S + jars[i]);
+                            fsLazy.setIncludes("lib" + S + jars[i]);
+                        }
+                    }
+                    
+                    // fx:jar
+                    var jar = project.createTask("fx_jar");
+                    jar.setProject(project);
+                    var destfile = project.getProperty("pp_jar_destfile");
+                    jar.setDestfile(destfile);
+
+                    // fx:application
+                    var app = jar.createApplication();
+                    app.setProject(project);
+                    var title = project.getProperty("application.title");
+                    var mainclass = project.getProperty("javafx.main.class");
+                    var fallback = project.getProperty("javafx.fallback.class");
+                    app.setName(title);
+                    app.setMainClass(mainclass);
+                    app.setFallbackClass(fallback);
+                    if(withpreloader == "true") {
+                        preloaderclass = project.getProperty("javafx.preloader.class");
+                        app.setPreloaderClass(preloaderclass);
+                    }
+                    // fx:param, fx:argument
+                    var keys = project.getProperties().keys();
+                    while(keys.hasMoreElements()) {
+                        var pn = keys.nextElement();
+                        if(pn.substr(0,JFXPAR.length) == JFXPAR && pn.indexOf(JFXPARN) == (pn.length()-JFXPARN.length)) {
+                            var propn = project.getProperty(pn);
+                            if(propn != null && propn.length() > 0) {
+                                var pv = pn.substr(0,pn.indexOf(JFXPARN)) + JFXPARV;
+                                var propv = project.getProperty(pv);
+                                if(propv != null && propv.length() > 0) {
+                                    var par = app.createParam();
+                                    par.setName(propn);
+                                    par.setValue(propv);
+                                } else {
+                                    if(fx_ant_api_1_1 == "true") {
+                                        var arg = app.createArgument();
+                                        arg.addText(propn);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    // fx:resources
+                    var res = jar.createResources();
+                    res.setProject(project);
+                    var pdir = project.getProperty("pp_jar_dir");
+                    if(withpreloader == "true") {
+                        var f1 = res.createFileSet();
+                        f1.setProject(project);
+                        f1.setDir(new java.io.File(pdir));
+                        var i1 = project.getProperty("pp_jar_fs1");
+                        f1.setIncludes(i1);
+                        f1.setRequiredFor("preloader");
+                        var f2 = res.createFileSet();
+                        f2.setProject(project);
+                        f2.setDir(new java.io.File(pdir));
+                        var i2a = project.getProperty("jfx.deployment.jar");
+                        var i2b = project.getProperty("pp_jar_fs2");
+                        var e2c = project.getProperty("pp_jar_fs1");
+                        f2.setIncludes(i2a);
+                        f2.setIncludes(i2b);
+                        f2.setExcludes(e2c);
+                        f2.setRequiredFor("startup");
+                        var lazyjars = getLazyJars();
+                        if(lazyjars != null) {
+                            var f3 = res.createFileSet();
+                            f3.setProject(project);
+                            f3.setDir(new java.io.File(pdir));
+                            f3.setRequiredFor("runtime");
+                            setDownloadMode(f2,f3,lazyjars);
+                        }
+                    } else {
+                        var fn = res.createFileSet();
+                        fn.setProject(project);
+                        fn.setDir(new java.io.File(pdir));
+                        var ia = project.getProperty("jfx.deployment.jar");
+                        var ib = project.getProperty("pp_jar_fs2");
+                        fn.setIncludes(ia);
+                        fn.setIncludes(ib);
+                        fn.setRequiredFor("startup");
+                        var lazyjars = getLazyJars();
+                        if(lazyjars != null) {
+                            var fn2 = res.createFileSet();
+                            fn2.setProject(project);
+                            fn2.setDir(new java.io.File(pdir));
+                            fn2.setRequiredFor("runtime");
+                            setDownloadMode(fn,fn2,lazyjars);
+                        }
+                    }
+                    
+                    // fileset to exclude *.css or *.bss
+                    var fs = jar.createFileSet();
+                    fs.setProject(project);
+                    var buildcls = project.getProperty("pp_jar_buildclasses");
+                    var exc = project.getProperty("pp_jar_cssbss");
+                    fs.setDir(new java.io.File(buildcls));
+                    fs.setExcludes(exc);
+                    
+                    // manifest
+                    var man = jar.createManifest();
+                    var a1val = project.getProperty("application.vendor");
+                    var a1 = new org.apache.tools.ant.taskdefs.Manifest.Attribute();
+                    a1.setName("Implementation-Vendor");
+                    a1.setValue(a1val);
+                    man.addConfiguredAttribute(a1);
+                    var a2val = project.getProperty("application.title");
+                    var a2 = new org.apache.tools.ant.taskdefs.Manifest.Attribute();
+                    a2.setName("Implementation-Title");
+                    a2.setValue(a2val);
+                    man.addConfiguredAttribute(a2);
+                    var a3 = new org.apache.tools.ant.taskdefs.Manifest.Attribute();
+                    a3.setName("Implementation-Version");
+                    a3.setValue("1.0");
+                    man.addConfiguredAttribute(a3);
+                    
+                    jar.perform();
+                ]]>
+            </script>
+            <antcall target="-post-jfx-jar"/>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="deploy-sign">
+        <sequential>
+            <echo message="keystore=${javafx.signjar.keystore}" level="verbose"/>
+            <echo message="storepass=${javafx.signjar.storepass}" level="verbose"/>
+            <echo message="alias=${javafx.signjar.alias}" level="verbose"/>
+            <echo message="keypass=${javafx.signjar.keypass}" level="verbose"/>
+            <signjar keystore="${javafx.signjar.keystore}"
+                storepass="${javafx.signjar.storepass}"
+                alias="${javafx.signjar.alias}"
+                keypass="${javafx.signjar.keypass}">
+                <fileset dir="${jfx.deployment.dir}">
+                    <include name="${jfx.deployment.jar}"/>
+                    <include name="lib${file.separator}*.jar"/>
+                </fileset>
+            </signjar>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="deploy-sign-preloader">
+        <sequential>
+            <echo message="keystore=${javafx.signjar.keystore}" level="verbose"/>
+            <echo message="storepass=${javafx.signjar.storepass}" level="verbose"/>
+            <echo message="alias=${javafx.signjar.alias}" level="verbose"/>
+            <echo message="keypass=${javafx.signjar.keypass}" level="verbose"/>
+            <signjar keystore="${javafx.signjar.keystore}"
+                storepass="${javafx.signjar.storepass}"
+                alias="${javafx.signjar.alias}"
+                keypass="${javafx.signjar.keypass}">
+                <fileset dir="${jfx.deployment.dir}">
+                    <include name="lib${file.separator}${javafx.preloader.jar.filename}"/>
+                </fileset>
+            </signjar>
+            <signjar keystore="${javafx.signjar.keystore}"
+                storepass="${javafx.signjar.storepass}"
+                alias="${javafx.signjar.alias}"
+                keypass="${javafx.signjar.keypass}">
+                <fileset dir="${jfx.deployment.dir}">
+                    <include name="${jfx.deployment.jar}"/>
+                    <include name="lib${file.separator}*.jar"/>
+                    <exclude name="lib${file.separator}${javafx.preloader.jar.filename}"/>
+                </fileset>
+            </signjar>
+        </sequential>
+    </macrodef>
+
+    <macrodef name="deploy-process-template">
+        <sequential>
+            <echo message="javafx.run.htmltemplate = ${javafx.run.htmltemplate}" level="verbose"/>
+            <pathconvert property="javafx.run.htmltemplate.processed">
+                <path path="${javafx.run.htmltemplate}"/>
+                <mapper>
+                     <chainedmapper>
+                          <flattenmapper/>
+                          <globmapper from="*" to="${jfx.deployment.dir}${file.separator}*" casesensitive="no"/>
+                     </chainedmapper>
+                </mapper>
+            </pathconvert>
+            <echo message="javafx.run.htmltemplate.processed = ${javafx.run.htmltemplate.processed}" level="verbose"/>
+        </sequential>
+    </macrodef>
+
+    <!-- fx:deploy scripted call enables passing of arbitrarily long lists of params, vmoptions and callbacks and fx-version dependent behavior -->
+    <macrodef name="deploy-deploy">
+        <sequential>
+            <antcall target="-pre-jfx-deploy"/>
+            <echo message="javafx.ant.classpath = ${javafx.ant.classpath}" level="verbose"/>
+            <typedef name="fx_deploy" classname="com.sun.javafx.tools.ant.DeployFXTask" classpath="${javafx.ant.classpath}"/>
+            <echo message="Launching &lt;fx:deploy&gt; task from ${ant-javafx.jar.location}" level="info"/>
+            <property name="pp_deploy_dir" value="${jfx.deployment.dir}"/>
+            <property name="pp_deploy_fs1" value="lib${file.separator}${javafx.preloader.jar.filename}"/>
+            <property name="pp_deploy_fs2" value="lib${file.separator}*.jar"/>
+            <echo message="deploy_deploy: pp_deploy_dir = ${pp_deploy_dir}" level="verbose"/>
+            <echo message="deploy_deploy: pp_deploy_fs1 = ${pp_deploy_fs1}" level="verbose"/>
+            <echo message="deploy_deploy: pp_deploy_fs2 = ${pp_deploy_fs2}" level="verbose"/>
+            <script language="javascript">
+                <![CDATA[
+                    function isTrue(prop) {
+                        return prop != null && 
+                           (prop.toLowerCase()=="true" || prop.toLowerCase()=="yes" || prop.toLowerCase()=="on");
+                    }                    
+                    var S = java.io.File.separator;
+                    var JFXPAR = "javafx.param";
+                    var JFXPARN = "name";
+                    var JFXPARV = "value";
+                    var JFXCALLB = "javafx.jscallback";
+                    var JFXLAZY = "download.mode.lazy.jar";
+                    var withpreloader = project.getProperty("app-with-preloader");
+                    var fx_ant_api_1_1 = project.getProperty("have-fx-ant-api-1.1");
+
+                    // get jars with lazy download mode property set
+                    function getLazyJars() {
+                        var jars = new Array();
+                        var keys = project.getProperties().keys();
+                        while(keys.hasMoreElements()) {
+                            var pn = keys.nextElement();
+                            if(pn.substr(0,JFXLAZY.length) == JFXLAZY) {
+                                var fname = pn.substring(JFXLAZY.length+1);
+                                jars.push(fname);
+                            }
+                        }
+                        return jars.length > 0 ? jars : null;
+                    }
+                    // set download mode of dependent libraries
+                    function setDownloadMode(fsEager, fsLazy, jars) {
+                        for(i = 0; i < jars.length; i++) {
+                            fsEager.setExcludes("lib" + S + jars[i]);
+                            fsLazy.setIncludes("lib" + S + jars[i]);
+                        }
+                    }
+                    
+                    // fx:deploy
+                    var deploy = project.createTask("fx_deploy");
+                    deploy.setProject(project);
+                    var width = project.getProperty("javafx.width");
+                    var height = project.getProperty("javafx.height");
+                    var outdir = project.getProperty("jfx.deployment.dir");
+                    var embedJNLP = project.getProperty("javafx.deploy.embedJNLP");
+                    var updatemode = project.getProperty("update-mode");
+                    var outfile = project.getProperty("application.title");
+                    var includeDT = project.getProperty("javafx.deploy.includeDT");
+                    var offline = project.getProperty("javafx.deploy.allowoffline");
+                    deploy.setWidth(width);
+                    deploy.setHeight(height);
+                    deploy.setOutdir(outdir);
+                    deploy.setEmbedJNLP(isTrue(embedJNLP));
+                    deploy.setUpdateMode(updatemode);
+                    deploy.setOutfile(outfile);
+                    deploy.setIncludeDT(isTrue(includeDT));
+                    if(offline != null) {
+                        if(fx_ant_api_1_1 == "true") {
+                            deploy.setOfflineAllowed(isTrue(offline));
+                        } else {
+                            println("Warning: offlineAllowed not supported by this version of JavaFX SDK deployment Ant task. Please upgrade JavaFX to 2.0.2 or higher.");
+                        }
+                    }
+
+                    // fx:application
+                    var app = deploy.createApplication();
+                    app.setProject(project);
+                    var title = project.getProperty("application.title");
+                    var mainclass = project.getProperty("javafx.main.class");
+                    var fallback = project.getProperty("javafx.fallback.class");
+                    app.setName(title);
+                    app.setMainClass(mainclass);
+                    app.setFallbackClass(fallback);
+                    if(withpreloader == "true") {
+                        preloaderclass = project.getProperty("javafx.preloader.class");
+                        app.setPreloaderClass(preloaderclass);
+                    }
+                    // fx:param, fx:argument
+                    var keys = project.getProperties().keys();
+                    while(keys.hasMoreElements()) {
+                        var pn = keys.nextElement();
+                        if(pn.substr(0,JFXPAR.length) == JFXPAR && pn.indexOf(JFXPARN) == (pn.length()-JFXPARN.length)) {
+                            var propn = project.getProperty(pn);
+                            if(propn != null && propn.length() > 0) {
+                                var pv = pn.substr(0,pn.indexOf(JFXPARN)) + JFXPARV;
+                                var propv = project.getProperty(pv);
+                                if(propv != null && propv.length() > 0) {
+                                    var par = app.createParam();
+                                    par.setName(propn);
+                                    par.setValue(propv);
+                                } else {
+                                    if(fx_ant_api_1_1 == "true") {
+                                        var arg = app.createArgument();
+                                        arg.addText(propn);
+                                    } else {
+                                        println("Warning: Unnamed parameters not supported by this version of JavaFX SDK deployment Ant tasks. Upgrade JavaFX to 2.0.2 or higher.");
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    
+                    // fx:resources
+                    var res = deploy.createResources();
+                    res.setProject(project);
+                    var deploydir = project.getProperty("pp_deploy_dir");
+                    if(withpreloader == "true") {
+                        var f1 = res.createFileSet();
+                        f1.setProject(project);
+                        f1.setDir(new java.io.File(deploydir));
+                        var i1 = project.getProperty("pp_deploy_fs1");
+                        f1.setIncludes(i1);
+                        f1.setRequiredFor("preloader");
+                        var f2 = res.createFileSet();
+                        f2.setProject(project);
+                        f2.setDir(new java.io.File(deploydir));
+                        var i2a = project.getProperty("jfx.deployment.jar");
+                        var i2b = project.getProperty("pp_deploy_fs2");
+                        var e2c = project.getProperty("pp_deploy_fs1");
+                        f2.setIncludes(i2a);
+                        f2.setIncludes(i2b);
+                        f2.setExcludes(e2c);
+                        f2.setRequiredFor("startup");
+                        var lazyjars = getLazyJars();
+                        if(lazyjars != null) {
+                            var f3 = res.createFileSet();
+                            f3.setProject(project);
+                            f3.setDir(new java.io.File(deploydir));
+                            f3.setRequiredFor("runtime");
+                            setDownloadMode(f2,f3,lazyjars);
+                        }
+                    } else {
+                        var fn = res.createFileSet();
+                        fn.setProject(project);
+                        fn.setDir(new java.io.File(deploydir));
+                        var ia = project.getProperty("jfx.deployment.jar");
+                        var ib = project.getProperty("pp_deploy_fs2");
+                        fn.setIncludes(ia);
+                        fn.setIncludes(ib);
+                        fn.setRequiredFor("startup");
+                        var lazyjars = getLazyJars();
+                        if(lazyjars != null) {
+                            var fn2 = res.createFileSet();
+                            fn2.setProject(project);
+                            fn2.setDir(new java.io.File(deploydir));
+                            fn2.setRequiredFor("runtime");
+                            setDownloadMode(fn,fn2,lazyjars);
+                        }
+                    }
+                    
+                    // fx:info
+                    var info = deploy.createInfo();
+                    info.setProject(project);
+                    var vendor = project.getProperty("application.vendor");
+                    info.setTitle(title); // title known from before
+                    info.setVendor(vendor);
+                    var icon = project.getProperty("javafx.deploy.icon");
+                    if(icon != null) {
+                        if(fx_ant_api_1_1 == "true") {
+                            var iicon = info.createIcon();
+                            iicon.setHref(icon);
+                        } else {
+                            println("Warning: Icon not supported by this version of JavaFX SDK deployment Ant task. Please upgrade JavaFX to 2.0.2 or higher.");
+                        }
+                    }
+                    
+                    // fx:permissions
+                    var perm = deploy.createPermissions();
+                    perm.setProject(project);
+                    var elev = project.getProperty("permissions.elevated");
+                    perm.setElevated(isTrue(elev));
+                    
+                    // fx:preferences
+                    var pref = deploy.createPreferences();
+                    pref.setProject(project);
+                    var scut = project.getProperty("javafx.deploy.adddesktopshortcut");
+                    var instp = project.getProperty("javafx.deploy.installpermanently");
+                    var smenu = project.getProperty("javafx.deploy.addstartmenushortcut");
+                    pref.setShortcut(isTrue(scut));
+                    pref.setInstall(isTrue(instp));
+                    pref.setMenu(isTrue(smenu));
+
+                    // fx:template
+                    var templ = project.getProperty("javafx.run.htmltemplate");
+                    var templp = project.getProperty("javafx.run.htmltemplate.processed");
+                    if(templ != null && templp != null && templ.length() > 0 && templp.length() > 0) {
+                        var temp = deploy.createTemplate();
+                        temp.setProject(project);
+                        temp.setFile(new java.io.File(templ));
+                        temp.setTofile(new java.io.File(templp));
+                    }
+
+                    // fx:platform
+                    var plat = deploy.createPlatform();
+                    plat.setProject(project);
+                    var jvmargs = project.getProperty("run.jvmargs");
+                    if(jvmargs != null && jvmargs.length() > 0) {
+                        var jvmargss = jvmargs.split(" ");
+                        for(i = 0; i < jvmargss.length; i++) {
+                            if(jvmargss[i] != null && jvmargss[i].length() > 0) {
+                                var vmarg = plat.createJvmarg();
+                                vmarg.setValue(jvmargss[i]);
+                            }
+                        }
+                    }
+                    
+                    // fx:callbacks
+                    var callbs = deploy.createCallbacks();
+                    callbs.setProject(project);
+                    var keys = project.getProperties().keys();
+                    while(keys.hasMoreElements()) {
+                        var pn = keys.nextElement();
+                        if(pn.substr(0,JFXCALLB.length) == JFXCALLB) {
+                            var prop = project.getProperty(pn);
+                            if(prop != null && prop.length() > 0) {
+                                var cname = pn.substring(JFXCALLB.length+1);
+                                var cb = callbs.createCallback();
+                                cb.setProject(project);
+                                cb.setName(cname);
+                                cb.addText(prop);
+                            }
+                        }
+                    }
+                    
+                    deploy.perform();
+                ]]>
+            </script>
+            <antcall target="-post-jfx-deploy"/>
+        </sequential>
+    </macrodef>
+
+    <!-- JavaFX 2.0+ deploy task as yet can not generate pre-FX jnlp which is needed for FX-in-Swing projects-->
+    <macrodef name="deploy-deploy-swing">
+        <sequential>
+            <antcall target="-pre-jfx-deploy"/>
+            <local name="permissions-elevated-token"/>
+            <condition property="permissions-elevated-token" value="${line.separator}    &lt;security&gt;${line.separator}        &lt;all-permissions/&gt;${line.separator}    &lt;/security&gt;" else="">
+                <isset property="permissions-elevated"/>
+            </condition>
+            <local name="offline-allowed-token"/>
+            <condition property="offline-allowed-token" value="${line.separator}        &lt;offline-allowed/&gt;" else="">
+                <isset property="offline-allowed"/>
+            </condition>
+            <local name="update-mode-background-token"/>
+            <condition property="update-mode-background-token" value="background" else="always">
+                <isset property="update-mode-background"/>
+            </condition>
+            <local name="html-template-processed-available"/>
+            <condition property="html-template-processed-available">
+                <and>
+                    <isset property="javafx.run.htmltemplate.processed"/>
+                    <not>
+                        <equals arg1="${javafx.run.htmltemplate.processed}" arg2=""/>
+                    </not>
+                </and>
+            </condition>
+            <local name="javafx.deploy.icon.basename"/>
+            <basename property="javafx.deploy.icon.basename" file="${javafx.deploy.icon}"/>
+            <local name="local-icon-filename-available"/>
+            <condition property="local-icon-filename-available">
+                <and>
+                    <isset property="icon-available"/>
+                    <isset property="javafx.deploy.icon.basename"/>
+                    <not><equals arg1="${javafx.deploy.icon.basename}" arg2=""/></not>
+                    <not><contains string="${javafx.deploy.icon.basename}" substring="$${javafx" casesensitive="false"/></not>
+                    <not><contains string="${javafx.deploy.icon}" substring="http:" casesensitive="false"/></not>
+                </and>
+            </condition>
+            <local name="icon-token"/>
+            <condition property="icon-token" value="${line.separator}        &lt;icon href=&quot;${javafx.deploy.icon.basename}&quot; kind=&quot;default&quot;/&gt;">
+                <isset property="local-icon-filename-available"/>
+            </condition>
+            <condition property="icon-token" value="${line.separator}        &lt;icon href=&quot;${javafx.deploy.icon}&quot; kind=&quot;default&quot;/&gt;" else="">
+                <isset property="icon-available"/>
+            </condition>
+            <basename property="dist.filename" file="${dist.jar}" suffix=".jar"/>
+            <length file="${dist.jar}" property="dist.jar.size" />
+            <local name="vmargs-token"/>
+            <condition property="vmargs-token" value="java-vm-args=&quot;${run.jvmargs}&quot; " else="">
+                <isset property="vmargs-available"/>
+            </condition>
+            <local name="applet-params-token"/>
+            <local name="application-args-token"/>
+            <script language="javascript">
+                <![CDATA[
+                    var JFXPAR = "javafx.param";
+                    var JFXPARN = "name";
+                    var JFXPARV = "value";
+
+                    var params = "";
+                    var args = "";
+                    var keys = project.getProperties().keys();
+                    while(keys.hasMoreElements()) {
+                        var pn = keys.nextElement();
+                        if(pn.substr(0,JFXPAR.length) == JFXPAR && pn.indexOf(JFXPARN) == (pn.length()-JFXPARN.length)) {
+                            var propn = project.getProperty(pn);
+                            if(propn != null && propn.length() > 0) {
+                                var pv = pn.substr(0,pn.indexOf(JFXPARN)) + JFXPARV;
+                                var propv = project.getProperty(pv);
+                                if(propv != null && propv.length() > 0) {
+                                    params += "\n        <param name=\"" + propn + "\" value=\"" + propv + "\"/>";
+                                    args += "\n        <argument>" + propn + "=" + propv + "</argument>";
+                                } else {
+                                    params += "\n        <param name=\"" + propn + "\" value=\"\"/>";
+                                    args += "\n        <argument>" + propn + "</argument>";
+                                }
+                            }
+                        }
+                    }
+                    project.setProperty("applet-params-token", params);
+                    project.setProperty("application-args-token", args);
+                ]]>
+            </script>
+            <filterchain id="jnlp.template.filter">
+                <replacetokens>
+                    <token key="NAME" value="${dist.filename}"/>
+                    <token key="MAINCLASS" value="${main.class}"/>
+                    <token key="FILESIZE" value="${dist.jar.size}"/>
+                    <token key="VENDOR" value="${application.vendor}"/>
+                    <token key="TITLE" value="${application.title}"/>
+                    <token key="WIDTH" value="${javafx.run.width}"/>
+                    <token key="HEIGHT" value="${javafx.run.height}"/>
+                    <token key="PERMISSIONS" value="${permissions-elevated-token}"/>
+                    <token key="OFFLINE" value="${offline-allowed-token}"/>
+                    <token key="UPDATEMODE" value="${update-mode-background-token}"/>
+                    <token key="ICON" value="${icon-token}"/>
+                    <token key="VMARGS" value="${vmargs-token}"/>
+                    <token key="PARAMETERS" value="${applet-params-token}"/>
+                    <token key="ARGUMENTS" value="${application-args-token}"/>
+                </replacetokens>
+            </filterchain>
+            <copy file="${basedir}${file.separator}nbproject${file.separator}templates${file.separator}FXSwingTemplateApplication.jnlp" 
+                    tofile="${dist.dir}${file.separator}${dist.filename}_application.jnlp" >
+                    <filterchain refid="jnlp.template.filter"/>
+            </copy>        
+            <copy file="${basedir}${file.separator}nbproject${file.separator}templates${file.separator}FXSwingTemplateApplet.jnlp" 
+                    tofile="${dist.dir}${file.separator}${dist.filename}_applet.jnlp" >
+                    <filterchain refid="jnlp.template.filter"/>
+            </copy>        
+            <copy file="${basedir}${file.separator}nbproject${file.separator}templates${file.separator}FXSwingTemplate.html" 
+                    tofile="${dist.dir}${file.separator}${dist.filename}.html" >
+                    <filterchain refid="jnlp.template.filter"/>
+            </copy>
+            <script language="javascript">
+                <![CDATA[
+                    var PREF = "file:";
+                    var doCopyIcon = project.getProperty("local-icon-filename-available");
+                    if(doCopyIcon != null) {
+                        var iconProp = project.getProperty("javafx.deploy.icon");
+                        if(iconProp.indexOf(PREF) == 0) {
+                            iconProp = iconProp.slice(PREF.length);
+                        }
+                        while(iconProp.charAt(0) == "/") {
+                            iconProp = iconProp.slice(1);
+                        }
+                        var S = java.io.File.separator;
+                        var baseDir = project.getProperty("basedir");
+                        var distDir = project.getProperty("dist.dir");
+                        var copyTask = project.createTask("copy");
+                        var source = new java.io.File(iconProp);
+                        var target = new java.io.File(baseDir + S + distDir);
+                        copyTask.setFile(source);
+                        copyTask.setTodir(target);
+                        copyTask.setFlatten(true);
+                        copyTask.setFailOnError(false);
+                        copyTask.perform();
+                    }
+                    var doCopyHTMLFrom = project.getProperty("html-template-available");
+                    var doCopyHTMLTo = project.getProperty("html-template-processed-available");
+                    if(doCopyHTMLFrom != null && doCopyHTMLTo != null) {
+                        var htmlFrom = project.getProperty("javafx.run.htmltemplate");
+                        if(htmlFrom.indexOf(PREF) == 0) {
+                            htmlFrom = htmlFrom.slice(PREF.length);
+                        }
+                        while(htmlFrom.charAt(0) == "/") {
+                            htmlFrom = htmlFrom.slice(1);
+                        }
+                        var htmlTo = project.getProperty("javafx.run.htmltemplate.processed");
+                        if(htmlTo.indexOf(PREF) == 0) {
+                            htmlTo = htmlTo.slice(PREF.length);
+                        }
+                        while(htmlTo.charAt(0) == "/") {
+                            htmlTo = htmlTo.slice(1);
+                        }
+                        var copyTask = project.createTask("copy");
+                        var source = new java.io.File(htmlFrom);
+                        var target = new java.io.File(htmlTo);
+                        copyTask.setFile(source);
+                        copyTask.setTofile(target);
+                        copyTask.setFailOnError(false);
+                        copyTask.perform();
+                    }
+                ]]>
+            </script>
+            <antcall target="-post-jfx-deploy"/>
+        </sequential>
+    </macrodef>
+
+
+    <!-- Project Deployment Targets -->
+
+    <target name="-check-sign" depends="-check-project,-javafx-init-keystore" if="javafx.signed.true+signjars.task.available">
+        <condition property="sign-nopreloader-notemplate">
+            <and>
+                <isset property="app-without-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="sign-preloader-notemplate">
+            <and>
+                <isset property="app-with-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="sign-nopreloader-template">
+            <and>
+                <isset property="app-without-preloader"/>
+                <isset property="html-template-available"/>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="sign-preloader-template">
+            <and>
+                <isset property="app-with-preloader"/>
+                <isset property="html-template-available"/>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="sign-nopreloader-notemplate-swing">
+            <and>
+                <isset property="app-without-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <isset property="fx-in-swing-app"/>
+            </and>
+        </condition>
+        <condition property="sign-nopreloader-template-swing">
+            <and>
+                <isset property="app-without-preloader"/>
+                <isset property="html-template-available"/>
+                <isset property="fx-in-swing-app"/>
+            </and>
+        </condition>
+    </target>
+    <target name="-check-nosign" depends="-check-project">
+        <condition property="nosign-nopreloader-notemplate">
+            <and>
+                <isset property="app-without-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <not><isset property="javafx.signed.true"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="nosign-preloader-notemplate">
+            <and>
+                <isset property="app-with-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <not><isset property="javafx.signed.true"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="nosign-nopreloader-template">
+            <and>
+                <isset property="app-without-preloader"/>
+                <isset property="html-template-available"/>
+                <not><isset property="javafx.signed.true"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="nosign-preloader-template">
+            <and>
+                <isset property="app-with-preloader"/>
+                <isset property="html-template-available"/>
+                <not><isset property="javafx.signed.true"/></not>
+                <not><isset property="fx-in-swing-app"/></not>
+            </and>
+        </condition>
+        <condition property="nosign-nopreloader-notemplate-swing">
+            <and>
+                <isset property="app-without-preloader"/>
+                <not><isset property="html-template-available"/></not>
+                <not><isset property="javafx.signed.true"/></not>
+                <isset property="fx-in-swing-app"/>
+            </and>
+        </condition>
+        <condition property="nosign-nopreloader-template-swing">
+            <and>
+                <isset property="app-without-preloader"/>
+                <isset property="html-template-available"/>
+                <not><isset property="javafx.signed.true"/></not>
+                <isset property="fx-in-swing-app"/>
+            </and>
+        </condition>
+    </target>
+
+
+    <!-- WITH SIGNING -->
+
+    <!-- project without preloader -->
+    <!-- no html template -->
+    <target name="-deploy-app-sign-nopreloader-notemplate" depends="-check-sign" if="sign-nopreloader-notemplate" unless="preloader-app">
+        <echo message="-deploy-app-sign-nopreloader-notemplate" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project with preloader -->
+    <!-- no html template -->
+    <target name="-deploy-app-sign-preloader-notemplate" depends="-check-sign" if="sign-preloader-notemplate" unless="preloader-app">
+        <echo message="-deploy-app-sign-preloader-notemplate" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign-preloader/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- html template -->
+    <target name="-deploy-app-sign-nopreloader-template" depends="-check-sign" if="sign-nopreloader-template" unless="preloader-app">
+        <echo message="-deploy-app-sign-nopreloader-template" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign/>
+        <deploy-process-template/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project with preloader -->
+    <!-- html template -->
+    <target name="-deploy-app-sign-preloader-template" depends="-check-sign" if="sign-preloader-template" unless="preloader-app">
+        <echo message="-deploy-app-sign-preloader-template" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign-preloader/>
+        <deploy-process-template/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- no html template -->
+    <!-- FX in Swing app -->
+    <target name="-deploy-app-sign-nopreloader-notemplate-swing" depends="-check-sign" if="sign-nopreloader-notemplate-swing" unless="preloader-app-no-workaround">
+        <echo message="-deploy-app-sign-nopreloader-notemplate-swing" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign/>
+        <deploy-deploy-swing/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- html template -->
+    <!-- FX in Swing app -->
+    <target name="-deploy-app-sign-nopreloader-template-swing" depends="-check-sign" if="sign-nopreloader-template-swing" unless="preloader-app-no-workaround">
+        <echo message="-deploy-app-sign-nopreloader-template-swing" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-sign/>
+        <deploy-process-template/>
+        <deploy-deploy-swing/>
+    </target>
+
+
+    <!-- NO SIGNING -->
+
+    <!-- project without preloader -->
+    <!-- no html template -->
+    <target name="-deploy-app-nosign-nopreloader-notemplate" depends="-check-nosign" if="nosign-nopreloader-notemplate" unless="preloader-app">
+        <echo message="-deploy-app-nosign-nopreloader-notemplate" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project with preloader -->
+    <!-- no html template -->
+    <target name="-deploy-app-nosign-preloader-notemplate" depends="-check-nosign" if="nosign-preloader-notemplate" unless="preloader-app">
+        <echo message="-deploy-app-nosign-preloader-notemplate" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- html template -->
+    <target name="-deploy-app-nosign-nopreloader-template" depends="-check-nosign" if="nosign-nopreloader-template" unless="preloader-app">
+        <echo message="-deploy-app-nosign-nopreloader-template" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-process-template/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project with preloader -->
+    <!-- html template -->
+    <target name="-deploy-app-nosign-preloader-template" depends="-check-nosign" if="nosign-preloader-template" unless="preloader-app">
+        <echo message="-deploy-app-nosign-preloader-template" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-process-template/>
+        <deploy-deploy/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- no html template -->
+    <!-- FX in Swing app -->
+    <target name="-deploy-app-nosign-nopreloader-notemplate-swing" depends="-check-nosign" if="nosign-nopreloader-notemplate-swing" unless="preloader-app-no-workaround">
+        <echo message="-deploy-app-nosign-nopreloader-notemplate-swing" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-deploy-swing/>
+    </target>
+
+    <!-- project without preloader -->
+    <!-- html template -->
+    <!-- FX in Swing app -->
+    <target name="-deploy-app-nosign-nopreloader-template-swing" depends="-check-nosign" if="nosign-nopreloader-template-swing" unless="preloader-app-no-workaround">
+        <echo message="-deploy-app-nosign-nopreloader-template-swing" level="verbose"/>
+        <deploy-defines/>
+        <deploy-preprocess/>
+        <deploy-jar/>
+        <deploy-process-template/>
+        <deploy-deploy-swing/>
+    </target>
+
+
+    <!-- Project Run Targets -->
+
+    <target name="-warn-of-preloader" depends="-check-project" if="preloader-app-no-workaround">
+        <fail message="Error:${line.separator}JavaFX 2 Preloader Project can not be executed directly.${line.separator}Please execute instead a JavaFX Application that uses the Preloader."/>
+    </target>
+    
+
+    <!-- Running/Debugging/Profiling Standalone -->
+
+    <target name="jfxsa-run" depends="-check-jfx-runtime,-warn-of-preloader,run"/>
+
+    <target name="jfxsa-debug" depends="jar,-check-jfx-runtime,-warn-of-preloader,debug"/>
+    
+    <target name="jfxsa-profile" depends="-check-jfx-runtime,-warn-of-preloader,profile"/>
+
+
+    <!-- Shared Debugging init -->
+
+    <target name="-init-debug-args">
+        <property name="version-output" value="java version &quot;${ant.java.version}"/>
+        <condition property="have-jdk-older-than-1.4">
+            <or>
+                <contains string="${version-output}" substring="java version &quot;1.0"/>
+                <contains string="${version-output}" substring="java version &quot;1.1"/>
+                <contains string="${version-output}" substring="java version &quot;1.2"/>
+                <contains string="${version-output}" substring="java version &quot;1.3"/>
+            </or>
+        </condition>
+        <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
+            <istrue value="${have-jdk-older-than-1.4}"/>
+        </condition>
+        <condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
+            <os family="windows"/>
+        </condition>
+        <condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
+            <isset property="debug.transport"/>
+        </condition>
+    </target>
+
+
+    <!-- Running/Debugging/Profiling as WebStart -->
+    
+    <target name="-check-jnlp-file-fx" depends="-check-project" unless="fx-in-swing-app">
+        <basename property="jfx.deployment.base" file="${jfx.deployment.jar}" suffix=".jar"/>
+        <property name="jfx.deployment.jnlp" location="${jfx.deployment.dir}${file.separator}${jfx.deployment.base}.jnlp"/>
+    </target>
+    <target name="-check-jnlp-file-swing" depends="-check-project" if="fx-in-swing-app">
+        <basename property="jfx.deployment.base" file="${jfx.deployment.jar}" suffix=".jar"/>
+        <property name="jfx.deployment.jnlp" location="${jfx.deployment.dir}${file.separator}${jfx.deployment.base}_application.jnlp"/>
+    </target>
+    <target name="-check-jnlp-file" depends="-check-jnlp-file-fx,-check-jnlp-file-swing">
+        <condition property="jnlp-file-exists">
+            <available file="${jfx.deployment.jnlp}"/>
+        </condition>
+        <condition property="jnlp-file-exists+netbeans.home">
+            <and>
+                <isset property="jnlp-file-exists"/>
+                <isset property="netbeans.home"/>
+            </and>
+        </condition>
+    </target>
+
+    <target name="-resolve-jnlp-file" depends="-check-jnlp-file" unless="jnlp-file-exists">
+        <antcall target="jfx-deployment"/>
+        <antcall target="-check-jnlp-file"/>
+    </target>
+
+    <target name="jfxws-run" if="jnlp-file-exists" depends="-check-jdk-7u4or5-mac,jar,-check-jfx-webstart,-resolve-jnlp-file,-check-jfx-runtime" description="Start fx javaws execution">
+        <echo message="Executing ${jfx.deployment.jnlp} using ${active.webstart.executable}"/>
+        <exec executable="${active.webstart.executable}">
+            <arg file="${jfx.deployment.jnlp}"/>
+        </exec>
+    </target>
+    
+    <target name="jfxws-debug" if="jnlp-file-exists+netbeans.home" depends="-check-jdk-7u4or5-mac,jar,-check-jfx-webstart,-resolve-jnlp-file,-check-jfx-runtime,-debug-start-debugger,-debug-javaws-debuggee" 
+        description="Debug fx javaws project in IDE"/>
+        
+    <target name="-debug-javaws-debuggee" depends="-init-debug-args">
+        <echo message="Executing ${jfx.deployment.jnlp} in debug mode using ${active.webstart.executable}"/>
+        <exec executable="${active.webstart.executable}">
+            <env key="JAVAWS_VM_ARGS" value="${debug-args-line} -Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+            <arg value="-wait"/>
+            <arg file="${jfx.deployment.jnlp}"/>
+        </exec>
+    </target>
+    
+    <target name="-profile-check-1">
+        <condition property="profiler.configured">
+            <or>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-agentpath:"/>
+                <contains casesensitive="true" string="${run.jvmargs.ide}" substring="-javaagent:"/>
+            </or>
+        </condition>
+    </target>
+    
+    <target if="jnlp-file-exists+netbeans.home" name="-profile-check-jnlp">
+        <antcall target="-profile-check-1"/>
+    </target>
+    
+    <target name="-do-jfxws-profile" depends="-check-jdk-7u4or5-mac,jar,-check-jfx-webstart,-resolve-jnlp-file,-check-jfx-runtime">
+        <echo message="Executing ${jfx.deployment.jnlp} in profile mode using ${active.webstart.executable}"/>
+        <exec executable="${active.webstart.executable}">
+            <env key="JAVAWS_VM_ARGS" value="${run.jvmargs.ide}"/>
+            <arg value="-wait"/>
+            <arg file="${jfx.deployment.jnlp}"/>
+        </exec>
+    </target>
+    
+    <target name="jfxws-profile" if="profiler.configured" 
+        depends="-profile-check-1"
+        description="Profile fx javaws project in IDE">
+        <startprofiler/>
+        
+        <antcall target="-do-jfxws-profile"/>
+    </target>
+    
+
+    <!-- Running/Debugging/Profiling in Browser -->
+
+    <target name="-check-selected-browser-path" depends="-check-default-run-config">
+        <condition property="javafx.run.inbrowser.undefined">
+            <or>
+                <and>
+                    <isset property="javafx.run.inbrowser"/>
+                    <equals arg1="${javafx.run.inbrowser}" arg2="undefined"/>
+                </and>
+                <and>
+                    <isset property="javafx.run.inbrowser.path"/>
+                    <equals arg1="${javafx.run.inbrowser.path}" arg2="undefined"/>
+                </and>
+            </or>
+        </condition>
+        <condition property="javafx.run.inbrowser.path-exists">
+            <and>
+                <isset property="javafx.run.inbrowser.path"/>
+                <available file="${javafx.run.inbrowser.path}"/>
+            </and>
+        </condition>
+        <fail message="Error:${line.separator}Browser selection not recognizable from ${config} run configuration.${line.separator}Please go to Project Properties dialog, category Run, to select a valid browser." unless="javafx.run.inbrowser.path"/>
+        <fail message="Error:${line.separator}No browser defined in ${config} run configuration.${line.separator}Please verify in Tools->Options dialog that NetBeans recognizes a valid browser, then go to Project Properties dialog, category Run, to select a valid browser." if="javafx.run.inbrowser.undefined"/>
+        <fail message="Error:${line.separator}Browser ${javafx.run.inbrowser.path} referred from ${config} run configuration can not be found.${line.separator}(This can happen, e.g, when the FX Project is transferred to another system.)${line.separator}Please go to Project Properties dialog, category Run, to select a valid browser." unless="javafx.run.inbrowser.path-exists"/>
+    </target>
+
+    <target name="-check-template-processed-html-file">
+        <condition property="html-file-exists">
+            <and>
+                <isset property="html-template-available"/>
+                <available file="${javafx.run.htmltemplate.processed}"/>
+            </and>
+        </condition>
+    </target>
+    
+    <target name="-set-template-processed-html-file" depends="-check-template-processed-html-file" if="html-file-exists">
+        <property name="jfx.deployment.html" location="${javafx.run.htmltemplate.processed}"/>
+    </target>
+    
+    <target name="-set-html-file" depends="-set-template-processed-html-file" unless="html-file-exists">
+        <basename property="jfx.deployment.base" file="${jfx.deployment.jar}" suffix=".jar"/>
+        <property name="jfx.deployment.html" location="${jfx.deployment.dir}${file.separator}${jfx.deployment.base}.html"/>
+        <condition property="html-file-exists">
+            <available file="${jfx.deployment.html}"/>
+        </condition>
+        <condition property="html-file-exists+netbeans.home">
+            <and>
+                <isset property="html-file-exists"/>
+                <isset property="netbeans.home"/>
+            </and>
+        </condition>
+    </target>
+
+    <target name="jfxbe-run" if="html-file-exists" depends="-check-jdk-7u4or5-mac,jar,-check-selected-browser-path,-set-html-file,-check-jfx-runtime" description="Start JavaFX execution in browser">
+        <echo message="Executing ${jfx.deployment.html} using ${javafx.run.inbrowser}"/>
+        <echo message="(${javafx.run.inbrowser.path})"/>
+        <exec executable="${javafx.run.inbrowser.path}">
+            <arg file="${jfx.deployment.html}"/>
+        </exec>
+    </target>
+    
+    <target name="jfxbe-debug" if="html-file-exists+netbeans.home" depends="-check-jdk-7u4or5-mac,jar,-check-selected-browser-path,-set-html-file,-check-jfx-runtime,-debug-start-debugger,-debug-jfxbe-debuggee" 
+        description="Debug JavaFX project in browser"/>
+        
+    <target name="-debug-jfxbe-debuggee" depends="-init-debug-args">
+        <echo message="Executing ${jfx.deployment.html} in debug mode using ${javafx.run.inbrowser}"/>
+        <echo message="(${javafx.run.inbrowser.path})"/>
+        <exec executable="${javafx.run.inbrowser.path}">
+            <env key="_JPI_VM_OPTIONS" value="${debug-args-line} -Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
+            <arg file="${jfx.deployment.html}"/>
+        </exec>
+    </target>
+
+    <target if="html-file-exists+netbeans.home" name="-profile-check-html">
+        <antcall target="-profile-check-1"/>
+    </target>
+
+    <target name="-do-jfxbe-profile" depends="-check-jdk-7u4or5-mac,jar,-check-selected-browser-path,-set-html-file,-check-jfx-runtime">
+        <echo message="Executing ${jfx.deployment.html} in profile mode using ${javafx.run.inbrowser}"/>
+        <echo message="(${javafx.run.inbrowser.path})"/>
+        <exec executable="${javafx.run.inbrowser.path}">
+            <env key="_JPI_VM_OPTIONS" value="${run.jvmargs.ide}"/>
+            <arg file="${jfx.deployment.html}"/>
+        </exec>
+    </target>
+
+    <target name="jfxbe-profile" if="profiler.configured"
+        depends="-profile-check-html"
+        description="Profile JavaFX project in browser">
+        <startprofiler/>
+        
+        <antcall target="-do-jfxbe-profile"/>
+    </target>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/project.properties	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,116 @@
+annotation.processing.enabled=true
+annotation.processing.enabled.in.editor=false
+annotation.processing.processors.list=
+annotation.processing.run.all.processors=true
+annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
+application.title=ConferenceScheduleApp
+application.vendor=jp202575
+build.classes.dir=${build.dir}/classes
+build.classes.excludes=**/*.java,**/*.form
+# This directory is removed when the project is cleaned:
+build.dir=build
+build.generated.dir=${build.dir}/generated
+build.generated.sources.dir=${build.dir}/generated-sources
+# Only compile against the classpath explicitly listed here:
+build.sysclasspath=ignore
+build.test.classes.dir=${build.dir}/test/classes
+build.test.results.dir=${build.dir}/test/results
+compile.on.save=true
+compile.on.save.unsupported.javafx=true
+# Uncomment to specify the preferred debugger connection transport:
+#debug.transport=dt_socket
+debug.classpath=\
+    ${run.classpath}
+debug.test.classpath=\
+    ${run.test.classpath}
+# This directory is removed when the project is cleaned:
+dist.dir=dist
+dist.jar=${dist.dir}/ConferenceScheduleApp.jar
+dist.javadoc.dir=${dist.dir}/javadoc
+endorsed.classpath=
+excludes=
+includes=**
+# Non-JavaFX jar file creation is deactivated in JavaFX 2.0+ projects
+jar.archive.disabled=true
+jar.compress=false
+jar.index=${jnlp.enabled}
+javac.classpath=\
+    ${javafx.runtime}/lib/jfxrt.jar
+# Space-separated list of extra javac options
+javac.compilerargs=
+javac.deprecation=false
+javac.processorpath=\
+    ${javac.classpath}
+javac.source=1.7
+javac.target=1.7
+javac.test.classpath=\
+    ${javac.classpath}:\
+    ${build.classes.dir}
+javac.test.processorpath=\
+    ${javac.test.classpath}
+javadoc.additionalparam=
+javadoc.author=false
+javadoc.encoding=${source.encoding}
+javadoc.noindex=false
+javadoc.nonavbar=false
+javadoc.notree=false
+javadoc.private=false
+javadoc.splitindex=true
+javadoc.use=true
+javadoc.version=false
+javadoc.windowtitle=
+javafx.binarycss=false
+javafx.deploy.adddesktopshortcut=false
+javafx.deploy.addstartmenushortcut=false
+javafx.deploy.allowoffline=true
+# If true, application update mode is set to 'background', if false, update mode is set to 'eager'
+javafx.deploy.backgroundupdate=false
+javafx.deploy.embedJNLP=true
+javafx.deploy.includeDT=true
+javafx.deploy.installpermanently=false
+javafx.deploy.permissionselevated=false
+# This is a JavaFX project
+javafx.enabled=true
+javafx.fallback.class=com.javafx.main.NoJavaFXFallback
+# Main class for JavaFX
+javafx.main.class=com.javafx.experiments.scheduleapp.ConferenceScheduleApp
+javafx.preloader.class=
+# This project does not use Preloader
+javafx.preloader.enabled=false
+javafx.preloader.jar.filename=
+javafx.preloader.jar.path=
+javafx.preloader.project.path=
+javafx.preloader.type=none
+# Set true for GlassFish only. Rebases manifest classpaths of JARs in lib dir. Not usable with signed JARs.
+javafx.rebase.libs=false
+javafx.run.height=600
+javafx.run.width=800
+javafx.runtime=${platforms.Default_JavaFX_Platform.javafx.runtime.home}
+javafx.sdk=${platforms.Default_JavaFX_Platform.javafx.sdk.home}
+javafx.signing.enabled=false
+javafx.signing.type=notsigned
+jnlp.codebase.type=no.codebase
+jnlp.descriptor=application
+# Pre-JavaFX 2.0 WebStart is deactivated in JavaFX 2.0+ projects
+jnlp.enabled=false
+jnlp.mixed.code=default
+jnlp.offline-allowed=false
+jnlp.signed=false
+jnlp.signing=
+jnlp.signing.alias=
+jnlp.signing.keystore=
+# Main class for Java launcher
+main.class=com.javafx.main.Main
+manifest.file=manifest.mf
+meta.inf.dir=${src.dir}/META-INF
+mkdist.disabled=false
+platform.active=Default_JavaFX_Platform
+run.classpath=\
+    ${dist.jar}:\
+    ${javac.classpath}
+run.test.classpath=\
+    ${javac.test.classpath}:\
+    ${build.test.classes.dir}
+source.encoding=UTF-8
+src.dir=src
+test.src.dir=test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/nbproject/project.xml	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.java.j2seproject</type>
+    <configuration>
+        <buildExtensions xmlns="http://www.netbeans.org/ns/ant-build-extender/1">
+            <extension file="jfx-impl.xml" id="jfx">
+                <dependency dependsOn="-check-javafx" target="-init-check"/>
+                <dependency dependsOn="-jfx-copylibs" target="-post-jar"/>
+                <dependency dependsOn="-rebase-libs" target="-post-jar"/>
+                <dependency dependsOn="jfx-deployment" target="-post-jar"/>
+                <dependency dependsOn="jar" target="debug"/>
+                <dependency dependsOn="-jfx-copylibs" target="jar"/>
+                <dependency dependsOn="-rebase-libs" target="jar"/>
+                <dependency dependsOn="jar" target="profile"/>
+                <dependency dependsOn="jar" target="run"/>
+            </extension>
+        </buildExtensions>
+        <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
+            <name>ConferenceScheduleApp</name>
+            <explicit-platform explicit-source-supported="true"/>
+            <source-roots>
+                <root id="src.dir"/>
+            </source-roots>
+            <test-roots>
+                <root id="test.src.dir"/>
+            </test-roots>
+        </data>
+    </configuration>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/AutoLogoutLightBox.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.javafx.experiments.scheduleapp;
+
+import com.javafx.experiments.scheduleapp.control.ResizableWrappingText;
+import com.javafx.experiments.scheduleapp.data.DataService;
+import javafx.animation.Animation;
+import javafx.animation.FadeTransition;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.scene.layout.Region;
+import javafx.scene.text.Text;
+import javafx.scene.text.TextAlignment;
+import javafx.util.Duration;
+
+public class AutoLogoutLightBox extends Region {
+    private Box box;
+    private Animation fadeAnimation = null;
+    private final DataService dataService;
+
+    public AutoLogoutLightBox(DataService dataService) {
+        this.dataService = dataService;
+        getStyleClass().setAll("light-box-veil");
+        box = new Box();
+        getChildren().add(box);
+    }
+
+    public void setSecondsLeft(int secondsLeft) {
+        box.setSecondsLeft(secondsLeft);
+    }
+
+    public void show() {
+        if (fadeAnimation != null || !isVisible()) {
+            if (fadeAnimation != null) {
+                fadeAnimation.stop();
+                setVisible(true); // just to make sure
+            } else {
+                setOpacity(0);
+                setVisible(true);
+            }
+
+            FadeTransition tx = new FadeTransition(Duration.seconds(.7), this);
+            tx.setToValue(1.0);
+            tx.setOnFinished(new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent event) {
+                    fadeAnimation = null;
+                }
+            });
+            fadeAnimation = tx;
+            tx.play();
+        }
+    }
+
+    public void hide() {
+        if (fadeAnimation != null || isVisible()) {
+            if (fadeAnimation != null) {
+                fadeAnimation.stop();
+                setVisible(true); // just to make sure
+            } else {
+                setOpacity(1);
+                setVisible(true);
+            }
+
+            FadeTransition tx = new FadeTransition(Duration.seconds(.7), this);
+            tx.setToValue(0.0);
+            tx.setOnFinished(new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent event) {
+                    fadeAnimation = null;
+                    setVisible(false);
+                }
+            });
+            fadeAnimation = tx;
+            tx.play();
+        }
+    }
+
+    @Override protected double computePrefWidth(double height) {
+        final Insets insets = getInsets();
+        return insets.getLeft() + box.prefWidth(-1) + insets.getRight();
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        final Insets insets = getInsets();
+        return insets.getTop() + box.prefHeight(box.prefWidth(-1)) + insets.getBottom();
+    }
+
+    @Override protected void layoutChildren() {
+        final Insets insets = getInsets();
+        double width = getWidth() - insets.getLeft() - insets.getRight();
+        double height = getHeight() - insets.getTop() - insets.getBottom();
+
+        double boxWidth = box.prefWidth(-1);
+        double boxHeight = box.prefHeight(boxWidth);
+        box.resizeRelocate((int)((width - boxWidth) / 2), (int)((height - boxHeight) / 2), boxWidth, boxHeight);
+    }
+
+    private class Box extends Region {
+        private Text message;
+
+        public Box() {
+            getStyleClass().setAll("light-box");
+            message = new ResizableWrappingText();
+            message.getStyleClass().setAll("auto-logout-text");
+            message.setTextAlignment(TextAlignment.CENTER);
+            setSecondsLeft(15);
+            getChildren().add(message);
+        }
+
+        @Override protected double computePrefWidth(double height) {
+            final Insets insets = getInsets();
+            return insets.getLeft() + 400 + insets.getRight();
+        }
+
+        @Override protected double computePrefHeight(double width) {
+            final Insets insets = getInsets();
+            return insets.getTop() + message.prefHeight(400) + insets.getBottom();
+        }
+
+        @Override protected void layoutChildren() {
+            final Insets insets = getInsets();
+            final double top = insets.getTop();
+            final double left = insets.getLeft();
+            final double width = getWidth() - left - insets.getRight();
+            final double height = getHeight() - top - insets.getBottom();
+
+            message.setWrappingWidth(width);
+            message.resizeRelocate((int) (left + .5), (int) (top + .5), (int) (width + .5), (int) (height + .5));
+        }
+
+        private void setSecondsLeft(int secondsLeft) {
+            message.setText(
+                    "Are you still there? The "+dataService.getName()+" Schedule Builder will auto-log you out in "
+                            + secondsLeft + " seconds. Touch anywhere to continue.");
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/ConferenceScheduleApp.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,412 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import com.javafx.experiments.scheduleapp.control.Popover;
+import com.javafx.experiments.scheduleapp.control.VirtualKeyboard;
+import com.javafx.experiments.scheduleapp.data.DataService;
+import com.javafx.experiments.scheduleapp.data.SessionManagement;
+import com.javafx.experiments.scheduleapp.data.devoxx.DevoxxDataService;
+import com.javafx.experiments.scheduleapp.data.devoxx.TestDataService;
+import com.javafx.experiments.scheduleapp.model.SessionTime;
+import com.javafx.experiments.scheduleapp.pages.CatalogPage;
+import com.javafx.experiments.scheduleapp.pages.LoginScreen;
+import com.javafx.experiments.scheduleapp.pages.SocialPage;
+import com.javafx.experiments.scheduleapp.pages.SpeakersPage;
+import com.javafx.experiments.scheduleapp.pages.TimelinePage;
+import com.javafx.experiments.scheduleapp.pages.TracksPage;
+import com.javafx.experiments.scheduleapp.pages.VenuesPage;
+import com.sun.glass.ui.Screen;
+import com.sun.javafx.tk.TKSceneListener;
+import com.sun.javafx.tk.quantum.GlassScene;
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.Timer;
+import java.util.TimerTask;
+import javafx.animation.Animation;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.Timeline;
+import javafx.animation.TranslateTransition;
+import javafx.application.Application;
+import javafx.application.Platform;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.event.ActionEvent;
+import javafx.event.Event;
+import javafx.event.EventHandler;
+import javafx.event.EventType;
+import javafx.geometry.VPos;
+import javafx.scene.Node;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.control.TextInputControl;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.image.Image;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.input.ScrollEvent;
+import javafx.scene.input.TouchEvent;
+import javafx.scene.layout.StackPane;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.ImagePattern;
+import javafx.scene.paint.Paint;
+import javafx.scene.text.Text;
+import javafx.stage.Stage;
+import javafx.util.Duration;
+
+public class ConferenceScheduleApp extends Application {
+    private static final String os = System.getProperty("os.name");
+    public static final boolean IS_BEAGLE = "Linux".equals(os) && Boolean.getBoolean("com.sun.javafx.isEmbedded");
+    public static final boolean IS_MAC = "Mac OS X".equals(os);
+    public static final boolean IS_WINDOWS = os.startsWith("Windows");
+    public static final boolean DISABLE_AUTO_LOGOUT = "true".equalsIgnoreCase(System.getProperty("disable.auto.logout"));
+    public static final boolean IS_TESTING_MODE = "true".equalsIgnoreCase(System.getProperty("test.mode"));
+    public static final boolean IS_VK_DISABLED = Boolean.getBoolean("no.vk");
+
+    private static ConferenceScheduleApp INSTANCE;
+    private Popover centralPopover;
+    private PageContainer pageContainer;
+    private StackPane root;
+    private LoginScreen loginScreen;
+    private TimelinePage TIMELINE_PAGE;
+    private CatalogPage CATALOG_PAGE;
+    private final SessionManagement SESSION_MANAGEMENT = new SessionManagement();
+    private long startTime;
+    private long lastFrame;
+    private int frames =0;
+    private DataService dataService;
+    private Scene scene;
+    private ToggleButton loginLogoutButton;
+    private Animation loginLogoutAnimation;
+    private Timeline automatedTimer;
+    private Timer autoLogoutTimer;
+    private volatile long countdownTimerStart;
+    private AutoLogoutLightBox lightBox;
+    private VirtualKeyboard keyboard;
+    private Animation keyboardSlideAnimation;
+    private TKSceneListener sceneListener;
+    private Text clock = new Text();
+    private DateFormat dateFormat = new SimpleDateFormat("E hh:mm a");
+
+    @Override public void start(Stage stage) throws Exception {
+        INSTANCE = this;
+        if(IS_TESTING_MODE) System.out.println("==============================================\n    WARNING: IN TEST MODE\n==============================================");
+        
+        // create data service
+        dataService = IS_TESTING_MODE ? new TestDataService() : new DevoxxDataService(7);
+        
+        centralPopover = new Popover();
+        centralPopover.setPrefWidth(400);
+        lightBox = new AutoLogoutLightBox(dataService);
+        lightBox.setVisible(false);
+        keyboard = new VirtualKeyboard();
+        loginLogoutButton = new ToggleButton();
+        
+        // calculate window size
+        final double width = IS_BEAGLE ? Screen.getMainScreen().getWidth() : 1024;
+        final double height = IS_BEAGLE ? Screen.getMainScreen().getHeight(): 600;
+
+        // create pages
+        CATALOG_PAGE = new CatalogPage(centralPopover, dataService);
+        TIMELINE_PAGE = new TimelinePage(centralPopover, dataService);
+        pageContainer = new PageContainer(centralPopover, lightBox,
+            TIMELINE_PAGE,
+            CATALOG_PAGE,
+            new SocialPage(dataService),
+            new SpeakersPage(centralPopover, dataService),
+            new VenuesPage(centralPopover, dataService),
+            new TracksPage(centralPopover, dataService)
+        );
+        pageContainer.setVisible(false);
+
+        clock.setId("Clock");
+        clock.setText(dateFormat.format(new Date()));
+        clock.setTextOrigin(VPos.TOP);
+        Timer clockTimer = new Timer(true);
+        clockTimer.scheduleAtFixedRate(new TimerTask() {
+            @Override public void run() {
+                Platform.runLater(new Runnable() {
+                    @Override public void run() {
+                         clock.setText(dateFormat.format(new Date()));
+                    }
+                });
+            }
+        }, 20000, 20000);
+
+        // create login/logout button
+        loginLogoutButton.setId("LoginLogout");
+        loginLogoutButton.getStyleClass().clear();
+        loginLogoutButton.resize(75, 31);
+        loginLogoutButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
+            @Override public void handle(MouseEvent event) {
+                showLoginScreen();
+            }
+        });
+        pageContainer.getChildren().addAll(clock, loginLogoutButton);
+
+        pageContainer.getChildren().addAll(centralPopover, lightBox);
+
+        // create login screen
+        loginScreen = new LoginScreen(dataService, height < 1000);
+        
+        // create root
+        root = new StackPane() {
+            @Override protected void layoutChildren() {
+                final double w = getWidth();
+                final double h = getHeight();
+                super.layoutChildren();
+                keyboard.resizeRelocate(0, h, w, w * (3.0/11.0));
+                clock.setX(w - 240);
+                clock.setY(9);
+                loginLogoutButton.setLayoutX(w-67-12);
+                loginLogoutButton.setLayoutY(5);
+            }
+        };
+        root.getChildren().addAll(pageContainer, loginScreen, keyboard);
+
+        // create scene
+        scene = new Scene(root, width, height);
+
+        if (!IS_VK_DISABLED) {
+            keyboard.setOnAction(new EventHandler<KeyEvent>() {
+                @Override public void handle(KeyEvent event) {
+                    if (sceneListener == null) {
+                        try {
+                            GlassScene peer = (GlassScene) scene.impl_getPeer();
+                            Field f = GlassScene.class.getDeclaredField("sceneListener");
+                            f.setAccessible(true);
+                            sceneListener = (TKSceneListener) f.get(peer);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+
+                    // TODO not sure how to implement
+                    sceneListener.keyEvent(
+                            (EventType<KeyEvent>)event.getEventType(),
+                            event.getCode().impl_getCode(),
+                            event.getCharacter().toCharArray(),
+                            event.isShiftDown(), false, false, false);
+                }
+            });
+            scene.focusOwnerProperty().addListener(new ChangeListener<Node>() {
+                @Override public void changed(ObservableValue<? extends Node> observable, Node oldValue, Node newValue) {
+                    boolean isTextOwner = false;
+                    Parent parent = newValue instanceof Parent ? (Parent) newValue : null;
+                    while (parent != null) {
+                        if (parent instanceof TextInputControl) {
+                            isTextOwner = true;
+                            break;
+                        }
+                        parent = parent.getParent();
+                    }
+
+                    if (isTextOwner && keyboard.getTranslateY() == 0) {
+                        // The focus on a text input control and therefore we must show the keyboard
+                        if (keyboardSlideAnimation != null) {
+                            keyboardSlideAnimation.stop();
+                        }
+                        TranslateTransition tx = new TranslateTransition(Duration.seconds(.4), keyboard);
+                        tx.setToY(-(scene.getWidth() * (3.0 / 11.0)));
+                        keyboardSlideAnimation = tx;
+                        keyboardSlideAnimation.play();
+                    } else if (!isTextOwner && keyboard.getTranslateY() != 0) {
+                        if (keyboardSlideAnimation != null) {
+                            keyboardSlideAnimation.stop();
+                        }
+                        TranslateTransition tx = new TranslateTransition(Duration.seconds(.4), keyboard);
+                        tx.setToY(0);
+                        keyboardSlideAnimation = tx;
+                        keyboardSlideAnimation.play();
+                    }
+
+                    if (newValue != null) {
+                        VirtualKeyboard.Type type = (VirtualKeyboard.Type) newValue.getProperties().get("vkType");
+                        keyboard.setType(type == null ? VirtualKeyboard.Type.TEXT : type);
+                    }
+                }
+            });
+        }
+
+        if (IS_BEAGLE) {
+            TouchScrollEventSynthesizer ises = new TouchScrollEventSynthesizer(scene);
+        }
+        // beagle is really slow with background textures so use color for beagle
+        Paint background = IS_BEAGLE ? Color.web("#e8eae8") :
+                new ImagePattern(
+                    new Image(getClass().getResource("images/rough_diagonal.png").toExternalForm()),
+                    0,0,255,255,false);
+        scene.setFill(background);
+        scene.getStylesheets().add(
+                getClass().getResource("SchedulerStyleSheet.css").toExternalForm());
+        if(!IS_BEAGLE) {
+            scene.getStylesheets().add(
+                    getClass().getResource("SchedulerStyleSheet-Desktop.css").toExternalForm());
+        }
+
+        EventHandler<Event> resetAutoLogoutTimerHandler = new EventHandler<Event>() {
+            @Override public void handle(Event event) {
+                countdownTimerStart = System.currentTimeMillis();
+                lightBox.hide();
+            }
+        };
+        scene.addEventFilter(MouseEvent.MOUSE_PRESSED, resetAutoLogoutTimerHandler);
+        scene.addEventFilter(MouseEvent.MOUSE_CLICKED, resetAutoLogoutTimerHandler);
+        scene.addEventFilter(KeyEvent.KEY_PRESSED, resetAutoLogoutTimerHandler);
+        scene.addEventFilter(KeyEvent.KEY_RELEASED, resetAutoLogoutTimerHandler);
+        scene.addEventFilter(ScrollEvent.ANY, resetAutoLogoutTimerHandler);
+        scene.addEventFilter(TouchEvent.ANY, resetAutoLogoutTimerHandler);
+
+        stage.setScene(scene);
+        // show stage
+        stage.show();
+    }
+
+    public static ConferenceScheduleApp getInstance() { return INSTANCE; }
+
+    public SessionManagement getSessionManagement() {
+        return SESSION_MANAGEMENT;
+    }
+
+    public void showLoginScreen() {
+        for (com.javafx.experiments.scheduleapp.model.Event event : dataService.getEvents()) {
+            SessionTime time = event.getSessionTime();
+            if (time != null) time.setEvent(null);
+        }
+        dataService.getEvents().clear();
+
+        if (autoLogoutTimer != null) {
+            autoLogoutTimer.cancel();
+            autoLogoutTimer = null;
+            if (lightBox.isVisible()) {
+                lightBox.setVisible(false);
+            }
+        }
+
+        centralPopover.hide();
+
+        loginScreen.setOpacity(0);
+        loginScreen.setVisible(true);
+        loginScreen.reset();
+        // logout
+        SESSION_MANAGEMENT.logout();
+        pageContainer.reset();
+        if (loginLogoutAnimation != null) {
+            loginLogoutAnimation.stop();
+            pageContainer.setVisible(true);
+        }
+
+        loginLogoutAnimation = new Timeline(
+                new KeyFrame(
+                    Duration.millis(800), 
+                    new EventHandler<ActionEvent>() {
+                        @Override public void handle(ActionEvent event) {
+                            pageContainer.setVisible(false);
+                            pageContainer.setCache(false);
+                            loginScreen.setCache(false);
+                            loginLogoutAnimation = null;
+                        }
+                    },
+                    new KeyValue(loginScreen.opacityProperty(), 1d)
+                )
+        );
+        loginLogoutAnimation.play();
+    }
+    
+    public void hideLoginScreen() {
+        final boolean isGuest = SESSION_MANAGEMENT.isGuestProperty().get();
+        pageContainer.gotoPage(isGuest ? CATALOG_PAGE : TIMELINE_PAGE, false);
+        pageContainer.setVisible(true);
+        // update login button state
+        loginLogoutButton.setSelected(!isGuest);
+        if (loginLogoutAnimation != null) {
+            loginLogoutAnimation.stop();
+            loginScreen.setVisible(true);
+        }
+
+        loginLogoutAnimation = new Timeline(
+                new KeyFrame(
+                    Duration.millis(800), 
+                    new EventHandler<ActionEvent>() {
+                        @Override public void handle(ActionEvent event) {
+                            loginScreen.setVisible(false);
+                            loginScreen.setCache(false);
+                            pageContainer.setCache(false);
+                            loginLogoutAnimation = null;
+                        }
+                    },
+                    new KeyValue(loginScreen.opacityProperty(), 0d)
+                )
+        );
+        loginLogoutAnimation.play();
+
+        if (!DISABLE_AUTO_LOGOUT) {
+            countdownTimerStart = System.currentTimeMillis();
+            autoLogoutTimer = new Timer("Auto Logout Timer", true);
+            autoLogoutTimer.scheduleAtFixedRate(new TimerTask() {
+                @Override public void run() {
+                    long currentTime = System.currentTimeMillis();
+                    long diff = currentTime - countdownTimerStart;
+                    if (diff > 60000) {
+                        Platform.runLater(new Runnable() {
+                            @Override public void run() {
+                                showLoginScreen();
+                            }
+                        });
+                    } else if (diff > 45000) {
+                        long remaining = 60000 - diff;
+                        final int seconds = (int) (remaining / 1000.0);
+                        Platform.runLater(
+                                new Runnable() {
+                                    @Override public void run() {
+                                        lightBox.setSecondsLeft(seconds);
+                                        lightBox.show();
+                                    }
+                                });
+                    }
+                }
+            }, 1000, 1000);
+        }
+    }
+
+
+    public static void main(String[] args) throws  Exception {
+        Locale.setDefault(Locale.US);
+        TimeZone.setDefault(TimeZone.getTimeZone("PST"));
+        launch(args);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/Page.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import javafx.scene.control.Label;
+import javafx.scene.layout.Region;
+import com.javafx.experiments.scheduleapp.data.DataService;
+
+public abstract class Page extends Region {
+    
+    private final String name;
+    protected final DataService dataService;
+
+    public Page(String name, DataService dataService) {
+        this.name = name;
+        this.dataService = dataService;
+        Label temp = new Label(name);
+        temp.setStyle("-fx-font-size: 30px;");
+        getChildren().add(temp);
+    }
+
+    public String getName() {
+        return name;
+    }
+    
+    public void pageTabClicked() {
+    }
+
+    public abstract void reset();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/PageContainer.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import static com.javafx.experiments.scheduleapp.Theme.*;
+import com.javafx.experiments.scheduleapp.control.Popover;
+import java.util.HashMap;
+import java.util.Map;
+import javafx.animation.Interpolator;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.TimelineBuilder;
+import javafx.application.Platform;
+import javafx.collections.FXCollections;
+import javafx.collections.ListChangeListener;
+import javafx.collections.ObservableList;
+import javafx.event.EventHandler;
+import javafx.geometry.Bounds;
+import javafx.scene.Scene;
+import javafx.scene.control.Label;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.ImagePattern;
+import javafx.scene.shape.Rectangle;
+import javafx.util.Duration;
+
+/**
+ * A custom page container like a TabView but with special visuals and animation.
+ */
+public class PageContainer extends Pane {
+    private static final Color TEXT_SELECTED_COLOR = Color.WHITE;
+    // model
+    private final ObservableList<Page> pages = FXCollections.observableArrayList();
+    private Page currentPage = null;
+    // ui
+    private HBox header = new HBox();
+    private Rectangle selectionBox = new Rectangle();
+    private Map<Page,Label> titlesMap = new HashMap<Page, Label>();
+    private ImageView headerShadow = new ImageView(
+                new Image(getClass().getResource("images/header-shadow.png").toExternalForm()));
+    private ImageView headerArrow = new ImageView(
+                new Image(getClass().getResource("images/header-arrow.png").toExternalForm()));
+    private final Popover popover;
+    private final AutoLogoutLightBox lightBox;
+
+    public PageContainer(Popover popover, AutoLogoutLightBox lightBox, final Page ... pages) {
+        this.pages.addAll(pages);
+        this.popover = popover;
+        this.lightBox = lightBox;
+        // build ui
+        header.setId("page-container-header");
+        header.setFillHeight(true);
+        headerShadow.setMouseTransparent(true);
+        headerArrow.setMouseTransparent(true);
+//        selectionBox.setFill(new ImagePattern(
+//                new Image(getClass().getResource("images/rough_diagonal_blue.jpg").toExternalForm()),
+//                0,0,255,255,false));
+        selectionBox.setFill( new ImagePattern(
+                new Image(getClass().getResource("images/rough_diagonal_blue.jpg").toExternalForm()),
+                0,0,255,255,false));
+        selectionBox.setManaged(false);
+        header.getChildren().add(selectionBox);
+        getChildren().addAll(header,headerShadow, headerArrow);
+        // add all pages
+        getChildren().addAll(pages);
+        for (Page page: pages) {
+            page.setVisible(false);
+        }
+        // do first rebuild and listen to changes in available pages
+        rebuild();
+        this.pages.addListener(new ListChangeListener<Page>() {
+            @Override public void onChanged(Change<? extends Page> change) {
+                rebuild();
+            }
+        });
+        // goto first page, runLater because we want this to happen after first layout
+        Platform.runLater(new Runnable() {
+            @Override public void run() {
+                gotoPage(pages[0], false);
+            }
+        });
+    }
+    
+    private void rebuild() {
+        if (header.getChildren().size() > 1) {
+            header.getChildren().remove(1, header.getChildren().size());
+            titlesMap.clear();
+        }
+        for(final Page page: pages) {
+            Label title = new Label(page.getName());
+            titlesMap.put(page,title);
+            title.setMaxHeight(Double.MAX_VALUE);
+            title.getStyleClass().add("page-container-header-title");
+            title.setPickOnBounds(true);
+            title.setOnMouseClicked(new EventHandler<MouseEvent>() {
+                @Override public void handle(MouseEvent t) {
+                    System.out.println("CLICKED ON PAGE BUTTON FOR "+page.getName());
+                    if (currentPage != page) {
+                        gotoPage(page, true);
+                    }
+                    page.pageTabClicked();
+                }
+            });
+            header.getChildren().add(title);
+        }
+    }
+    
+    public void gotoPage(Page page, boolean animate) {
+        System.out.println("CHANGING TO PAGE --> "+page.getName());
+        final Label newTitleLabel = titlesMap.get(page);
+        final Bounds newPageTitleBounds = newTitleLabel.getBoundsInParent();
+        if (currentPage != null && animate) {
+            final Label currentTitlelabel = titlesMap.get(currentPage);
+            final Bounds currentPageTitleBounds = currentTitlelabel.getBoundsInParent();
+            TimelineBuilder.create()
+                .keyFrames(
+                    new KeyFrame(Duration.ZERO, 
+                        new KeyValue(selectionBox.xProperty(), currentPageTitleBounds.getMinX()),
+                        new KeyValue(selectionBox.yProperty(), currentPageTitleBounds.getMinY()),
+                        new KeyValue(selectionBox.widthProperty(), currentPageTitleBounds.getWidth()),
+                        new KeyValue(selectionBox.heightProperty(), currentPageTitleBounds.getHeight()),
+                        new KeyValue(newTitleLabel.textFillProperty(), DARK_GREY),
+                        new KeyValue(currentTitlelabel.textFillProperty(), TEXT_SELECTED_COLOR),
+                        new KeyValue(headerArrow.layoutXProperty(), headerArrow.getLayoutX())
+                    ),
+                    new KeyFrame(Duration.seconds(.3), 
+                        new KeyValue(selectionBox.xProperty(), newPageTitleBounds.getMinX(), Interpolator.EASE_BOTH),
+                        new KeyValue(selectionBox.yProperty(), newPageTitleBounds.getMinY(), Interpolator.EASE_BOTH),
+                        new KeyValue(selectionBox.widthProperty(), newPageTitleBounds.getWidth(), Interpolator.EASE_BOTH),
+                        new KeyValue(selectionBox.heightProperty(), newPageTitleBounds.getHeight(), Interpolator.EASE_BOTH),
+                        new KeyValue(newTitleLabel.textFillProperty(), TEXT_SELECTED_COLOR, Interpolator.EASE_BOTH),
+                        new KeyValue(currentTitlelabel.textFillProperty(), DARK_GREY, Interpolator.EASE_BOTH),
+                        new KeyValue(headerArrow.layoutXProperty(), newPageTitleBounds.getMinX() + (newPageTitleBounds.getWidth()/2) - 6, Interpolator.EASE_BOTH)
+                    )
+                )
+                .build().play();
+            // hide current page
+            currentPage.setVisible(false);
+        } else {
+            selectionBox.setX(newPageTitleBounds.getMinX());
+            selectionBox.setY(newPageTitleBounds.getMinY());
+            selectionBox.setWidth(newPageTitleBounds.getWidth());
+            selectionBox.setHeight(newPageTitleBounds.getHeight());
+            headerArrow.setLayoutX(newPageTitleBounds.getMinX() + (newPageTitleBounds.getWidth()/2) - 6);
+            if (currentPage != null) {
+                // hide current page
+                currentPage.setVisible(false);
+                // change current pages title back to dark grey
+                titlesMap.get(currentPage).setTextFill(DARK_GREY);
+            }
+            newTitleLabel.setTextFill(TEXT_SELECTED_COLOR);
+        }
+//        if(getChildren().size() == 3) {
+//            getChildren().add(page);
+//        } else {
+//            getChildren().set(3,page);
+//        }
+        page.setVisible(true);
+        currentPage = page;
+    }
+
+    @Override protected void layoutChildren() {
+        final double w = getWidth();
+        final double h = getHeight();
+        header.resize(w, 40);
+        headerShadow.setFitWidth(w);
+        for(Page page: pages) {
+            page.resizeRelocate(0, 40, w, h-40);
+        }
+
+        Scene scene = getScene();
+        double width = popover.prefWidth(-1);
+        popover.setLayoutX((int) ((scene.getWidth() - width) / 2));
+        popover.setLayoutY(50);
+        if (popover.isVisible()) {
+            popover.autosize();
+        }
+        lightBox.resizeRelocate(0, 0, w, h);
+    }
+    
+    public ObservableList<Page> getPages() {
+        return pages;
+    }
+
+    public void reset() {
+        for (Page page : pages) {
+            page.reset();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/PlatformIntegration.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import static com.javafx.experiments.scheduleapp.ConferenceScheduleApp.*;
+import com.javafx.experiments.scheduleapp.data.TwitterJson;
+import com.javafx.experiments.scheduleapp.model.Event;
+import com.javafx.experiments.scheduleapp.model.Session;
+import com.javafx.experiments.scheduleapp.model.Tweet;
+import com.javafx.experiments.scheduleapp.pages.SocialPage;
+import java.awt.Desktop;
+import java.net.URI;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.util.Callback;
+
+/**
+ * class giving access to platform integration
+ */
+public class PlatformIntegration {
+    
+    /**
+     * Check if platform supports opening URLs in the system browser
+     * 
+     * @return true if system can open URLs
+     */
+    public static boolean supportsSystemCalendar() {
+        return false; 
+    }
+    
+    /**
+     * Read all events from the system calendar between the given start and 
+     * end dates.
+     * 
+     * @param start The start of range to find events from
+     * @param end   The end of range to find events to
+     * @return List of all events found
+     */
+    public static List<Event> readEvents(List<Session> sessions, Date start, Date end) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * Write the given list of events into the system calendar.
+     * 
+     * @param events List of events to save into calendar
+     */
+    public static void writeEvents(List<Event> events) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * Delete the given list of events from the system calendar.
+     * 
+     * @param events List of events to delete
+     */
+    public static void deleteEvents(List<Event> events) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * Check if platform supports opening URLs in the system browser
+     * 
+     * @return true if system can open URLs
+     */
+    public static boolean supportsOpeningUrls() {
+        return IS_MAC || IS_WINDOWS; 
+    }
+    
+    /**
+     * Open the given URL in the system web browser.
+     * 
+     * @param url 
+     */
+    public static void openUrl(String url) {
+        if (IS_MAC) {
+            try {
+                Process p = Runtime.getRuntime().exec(new String[]{"open",url});
+            } catch (Exception ex) {
+                Logger.getLogger(SocialPage.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        } else if(IS_WINDOWS) {
+            try {
+                Desktop.getDesktop().browse(new URI(url));
+            } catch (Exception ex) {
+                Logger.getLogger(SocialPage.class.getName()).log(Level.SEVERE, null, ex);
+            }
+        } else {
+            throw new UnsupportedOperationException();
+        }
+    }
+    
+    /**
+     * Get all tweets returned by the twitter API call with the given URL.
+     * 
+     * @param url
+     * @param gotTweetCallBack 
+     */
+    public static void getTweetsForQuery(String url, final Callback<Tweet[],Void> gotTweetCallBack) {
+        TwitterJson.getTweetsForQuery(url, gotTweetCallBack);
+    }
+    
+    /**
+     * Check if platform supports opening URLs in the system browser
+     * 
+     * @return true if system can open URLs
+     */
+    public static boolean supportsSendingTweets() {
+        return false; 
+    }
+    
+    /**
+     * Open a platform native send tweet dialog with the given initial text.
+     * 
+     * @param text The initial text for tweet
+     */
+    public static void tweet(String text) {
+        throw new UnsupportedOperationException();
+    }
+    
+    /**
+     * Check if platform supports showing map routes
+     * 
+     * @return true if system can show maps
+     */
+    public static boolean supportsMapRouting() {
+        return false; 
+    }
+    
+    /**
+     * Open system maps application and show route from current location to the
+     * given address.
+     * 
+     * @param address The address to show route to
+     */
+    public static void openMapRoute(final String address) {
+        throw new UnsupportedOperationException();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/SchedulerStyleSheet-Desktop.css	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,38 @@
+.scroll-bar {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ScrollBarSkin";
+    -fx-background-color: null !important;
+    -fx-background-insets: 0;
+    -fx-padding: 5;
+}
+.scroll-bar .thumb {
+    -fx-background-color: rgba(0,0,0,0.4);
+    -fx-background-insets: 0;
+    -fx-background-radius: 10;
+}
+.scroll-bar .track  {
+    -fx-background-color: null !important;
+    -fx-background-insets:  0;
+}
+.scroll-bar .track-background  {
+    -fx-background-color: null !important;
+    -fx-background-insets:  0;
+    -fx-border-color: rgba(0,0,0,0.2);
+    -fx-border-radius: 0.5em;
+}
+.scroll-bar .increment-button {
+    -fx-background-color: null;
+}
+.scroll-bar:horizontal .increment-button {
+    -fx-padding: 0.5em 0 0.5em 0;
+}
+.scroll-bar:vertical .increment-button {
+    -fx-padding: 0 0.5em 0 0.5em;
+}
+.scroll-bar .decrement-button, .scroll-bar .increment-arrow, .scroll-bar .decrement-arrow {
+    -fx-background-color: null;
+    -fx-padding: 0;
+}
+
+.popover .scroll-bar {
+    -fx-background-color: white !important;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/SchedulerStyleSheet.css	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,638 @@
+.root {    
+    -fx-font: 14px "Helvetica";
+}
+
+#Clock {
+    -fx-font: 24px "Helvetica";
+    -fx-fill: #666666;
+}
+
+.hyperlink {
+    -fx-text-fill: #00a8cc;
+}
+#page-container-header {
+    -fx-font-size: 16px;
+    -fx-font-weight: bold;
+    -fx-background-color: rgba(0,0,0,0.05);
+    -fx-padding: 0 10 0 10;
+}
+.page-container-header-title {
+    -fx-padding: 0 10 0 10;
+    -fx-font-weight: bold;
+}
+
+.light-box-veil {
+    -fx-background-color: rgba(0, 0, 0, 0.8);
+}
+
+.light-box {
+    -fx-background-color: white, repeating-image-pattern("images/rough_diagonal_blue.jpg");
+    -fx-background-radius: 24, 18;
+    -fx-background-insets: 0, 6;
+    -fx-padding: 24;
+}
+
+.auto-logout-text {
+    -fx-font-size: 18pt;
+    -fx-fill: white;
+}
+
+.list-of-links {
+    -fx-border-image-source: url("images/popover-list-border.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;
+    -fx-padding: -11; 
+}
+
+.list-of-links-transparent {
+    -fx-border-image-source: url("images/ios-list-transparent.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;
+    -fx-padding: -11; 
+}
+.popover-dialog {
+    -fx-border-image-source: url("images/popover-no-arrow.png");
+    -fx-border-image-slice: 78 50 60 50 fill;
+    -fx-border-image-width: 78 50 60 50;
+    -fx-padding: -42 -36 0 0; 
+}
+.popover-dialog-linen {
+    -fx-background-image: url("images/blue-linen.jpg");
+    -fx-border-image-source: url("images/popover-no-arrow-empty.png");
+    -fx-border-image-slice: 78 50 60 50;
+    -fx-border-image-width: 78 50 60 50;
+    -fx-padding: -42 -36 0 0; 
+    -fx-border-image-insets: -71 -44 -54 -44;
+}
+
+.large-red-button .text{   
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+.large-red-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-font-weight: bold;
+    -fx-font-size: 20px;
+    -fx-text-fill: white;
+    -fx-alignment: center;
+    -fx-border-image-source: url("images/large-red-button.png");
+    -fx-border-image-slice: 14 fill;
+    -fx-border-image-width: 14;
+    -fx-padding: -3 10 -3 10; 
+}
+.large-red-button:disabled, .large-blue-button:disabled  {
+    -fx-opacity: 0.2;
+}
+
+.large-blue-button .text{   
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+.large-blue-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-font-weight: bold;
+    -fx-font-size: 20px;
+    -fx-text-fill: white;
+    -fx-alignment: center;
+    -fx-border-image-source: url("images/large-blue-button.png");
+    -fx-border-image-slice: 14 fill;
+    -fx-border-image-width: 14;
+    -fx-padding: -3 10 -3 10; 
+}
+
+.large-light-blue-button .text{   
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+.large-light-blue-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-font-weight: bold;
+    -fx-font-size: 20px;
+    -fx-text-fill: white;
+    -fx-alignment: center;
+    -fx-border-image-source: url("images/large-light-blue-button.png");
+    -fx-border-image-slice: 14 fill;
+    -fx-border-image-width: 14;
+    -fx-padding: -3 10 -3 10; 
+}
+.large-light-blue-button:pressed {
+    -fx-border-image-source: url("images/large-light-blue-button-pressed.png");
+}
+.large-gray-blue-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-font-weight: bold;
+    -fx-font-size: 20px;
+    -fx-text-fill: white;
+    -fx-alignment: center;
+    -fx-border-image-source: url("images/large-gray-button.png");
+    -fx-border-image-slice: 14 fill;
+    -fx-border-image-width: 14;
+    -fx-padding: -3 10 -3 10; 
+}
+.large-gray-button:pressed {
+    -fx-border-image-source: url("images/large-gray-button-pressed.png");
+}
+
+.search-box {
+    -fx-skin: "com.sun.javafx.scene.control.skin.TextFieldSkin";
+    -fx-border-image-source: url("images/search.png");
+    -fx-border-image-slice: 0 15 0 30 fill;
+    -fx-border-image-width: 0 15 0 30;
+    -fx-padding: 0 50 0 0; 
+    -fx-prompt-text-fill: #b4b3b4;
+    -fx-text-fill: black;
+    -fx-cursor: text;
+    -fx-font-size: 16px;
+    -fx-border-color: null;
+}
+
+.search-box:focused {
+    -fx-text-fill: black;
+    -fx-border-color: #00a8cc;
+    -fx-border-width: 1.5;
+    -fx-border-radius: 30;
+    -fx-border-insets: -1 -1 0 -1;
+}
+
+/* ****** POPOVER ******************************************************************************* */
+
+.popover {
+    -fx-padding: 44 7 7 7; 
+}
+
+.popover-frame {
+    -fx-border-image-source: url("images/popover-no-arrow-empty.png");
+    -fx-border-image-slice: 78 50 60 50;
+    -fx-border-image-width: 78 50 60 50;
+    -fx-border-image-insets: -27 -37 -47 -37;
+}
+
+.session-popover .popover-frame {
+    -fx-border-image-source: url("images/filter-popover.png");
+    -fx-border-image-slice: 92 65 58 44;
+    -fx-border-image-width: 92 65 58 44;
+    -fx-border-image-insets: -42 -7 -46 -30;
+}
+
+.popover-left-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-padding: 5 10 5 10;
+    -fx-border-image-source: url("images/popover-blue-btn.png");
+    -fx-border-image-slice: 0 5 0 5 fill;
+    -fx-border-image-width: 0 5 0 5;
+    -fx-font-weight: bold;
+    -fx-text-fill: white;
+}
+
+.popover-left-button .text {
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+
+.popover-right-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-padding: 5 10 5 10;
+    -fx-border-image-source: url("images/popover-light-blue-btn.png");
+    -fx-border-image-slice: 0 5 0 5 fill;
+    -fx-border-image-width: 0 5 0 5;
+    -fx-font-weight: bold;
+    -fx-text-fill: white;
+}
+
+.popover-right-button .text {
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+
+.event-popover-page {
+    -fx-background-image: url("images/blue-linen.jpg");
+}
+
+.popover-tree-list-cell {
+    -fx-background-color: white;
+    -fx-border-color: transparent transparent #dfdfdf transparent;
+    -fx-padding: 0 30 0 12;
+}
+
+.popover-box-cell {
+    -fx-background-color: transparent;
+    -fx-border-color: transparent transparent #dfdfdf transparent;
+    -fx-border-insets: 0 1 0 1;
+    -fx-padding: 10;
+}
+
+.popover-box {
+    -fx-border-image-source: url("images/popover-list-border.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;
+    -fx-padding: -11;
+}
+
+#PopoverBackground {
+    -fx-background-image: url("images/blue-linen.jpg");
+}
+
+/* ****** TIMELINE ******************************************************************************* */
+
+.timelinev2-bubble {
+    -fx-border-image-source: url("images/timeline-bubble.png");
+    -fx-border-image-slice: 4 4 4 4 fill;
+    -fx-border-image-width: 4 4 4 4;
+}
+
+#now-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/now-btn.png");
+}
+
+#now-button:pressed {
+    -fx-background-image: url("images/now-btn-pressed.png");
+}
+/* ====== For Timeline v1 ========== */
+.timeline-bubble {
+    -fx-border-image-source: url("images/timeline-bubble.png");
+    -fx-border-image-slice: 4 4 4 4 fill;
+    -fx-border-image-width: 4 4 4 4;
+    /*-fx-padding: 3 3 3 16;*/
+}
+.timeline-day {
+    -fx-font-weight: bold;
+    -fx-background-color: #00a8cc;
+    -fx-background-radius: 5;
+    -fx-padding: 0 4 0 4;
+    -fx-text-fill: white;
+}
+.timeline-time {
+    -fx-font-size: 20px;
+    -fx-font-weight: bold;
+    -fx-fill: #00a8cc;
+}
+.timeline-bubble-title {
+    -fx-font-weight: bold;
+}
+.timeline-bubble-speakers {
+    -fx-font-size: 12px;
+    -fx-font-weight: bold;
+    -fx-text-fill: #666;
+}
+.timeline-bubble-summary {
+    -fx-font-size: 11px;
+}
+/* ====== END For Timeline v1 ========== */
+
+/* ****** CATALOG ******************************************************************************* */
+
+.catalog-session-tile {
+    -fx-font-size: 12px;
+    -fx-font-weight: bold;
+    -fx-padding: 2;
+    -fx-alignment: top-left
+}
+.catalog-session-speaker {
+    -fx-font-size: 12px;
+    -fx-alignment: top-left;
+}
+.catalog-time {
+    -fx-font-size: 20px;
+    -fx-font-weight: bold;
+    -fx-fill: #00a8cc;
+}
+.catalog-day {
+    -fx-font-weight: bold;
+    -fx-fill: #00a8cc;
+}
+
+/* ****** SCROLL BARS ******************************************************************************* */
+
+.scroll-bar {
+    -fx-skin: "com.javafx.experiments.scheduleapp.control.NoopScrollBarSkin";
+}
+
+.scroll-pane {
+    -fx-background-color: null;
+    -fx-background-insets: 0;
+    -fx-skin: "com.javafx.experiments.scheduleapp.control.ScrollPaneSkin3"
+}
+
+/* ****** SESSION FILTER *************************************************************************** */
+#session-filter-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/filter-btn.png");
+}
+#session-filter-button:armed {
+    -fx-background-image: url("images/filter-btn-pressed.png");
+}
+#filter-popover {
+    -fx-border-image-source: url("images/filter-popover.png");
+    -fx-border-image-slice: 92 56 59 45 fill;
+    -fx-border-image-width: 92 56 59 45;
+    -fx-padding: -42 -36 0 0; 
+}
+.session-filter-pane-titlebar-text {
+    -fx-font-size: 20px;
+    -fx-font-weight: bold;
+    -fx-fill: white;    
+    -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.9) , 0, 0.0 , 0 , -1 );
+}
+#session-filter-pane-cancel-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/cancel.png");
+}
+#session-filter-pane-done-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/done.png");
+}
+.session-filter-popover-content {
+    -fx-font-size: 12px;
+    -fx-font-weight: bold;
+    -fx-padding: -11; 
+}
+.popover-list-item {
+    -fx-border-color: transparent transparent #cacaca transparent;
+    -fx-padding: 0 12 0 12;
+    -fx-font-size: 14px;
+}
+.popover-list-item.last {
+    -fx-border-color: null;
+}
+.popover-list-item-text {
+    -fx-font-weight: bold;
+}
+.popover-config-setting-value {
+    -fx-text-fill: #324f85;
+}
+.popover-option-node-toggle {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ToggleButtonSkin";
+    -fx-padding: 0 37 0 12;
+    -fx-font-weight: bold;
+    -fx-alignment: center-left;
+}
+.popover-option-node-toggle:selected {
+    -fx-text-fill: #324f85;
+}
+
+/* ****** SOCIAL PAGE *************************************************************************** */
+.twitter-list-view {
+    -fx-border-image-source: url("images/ios-list-transparent.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;
+    /*-fx-padding: -11;*/ 
+}
+#tweet-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/tweet.png");
+}
+#tweet-button:pressed {
+    -fx-background-image: url("images/tweet-pressed.png");
+}
+#refresh-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/refresh-btn.png");
+}
+#refresh-button:pressed {
+    -fx-background-image: url("images/refresh-btn-pressed.png");
+}
+
+/* ****** SPEAKERS PAGE *************************************************************************** */
+.speaker-session-list {
+/*    -fx-border-image-source: url("images/ios-list-transparent.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;*/
+    -fx-background-color: white;
+    -fx-background-radius: 10px;
+    -fx-border-color: #dddddd;
+    -fx-border-radius: 10px;
+}
+.speaker-session-list .label{
+    -fx-padding: 0 12px 0 12px;
+}
+.session-list-item {
+    -fx-border-color: #dddddd transparent transparent transparent;
+}
+
+/* ****** VENUES PAGE *************************************************************************** */
+#venue-room-session-list {
+    -fx-border-image-source: url("images/ios-list-transparent.png");
+    -fx-border-image-slice: 11 fill;
+    -fx-border-image-width: 11;
+    -fx-padding: -11; 
+}
+#venue-room-session-list .popover-tree-list-cell {
+    -fx-background-color: null;
+}
+
+/* ****** TRACKS PAGE *************************************************************************** */
+.view-sessions-button {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/view-sessions-btn.png");
+}
+.view-sessions-button:pressed {
+    -fx-background-image: url("images/view-sessions-btn-pressed.png");
+}
+
+/* ****** LOGIN SCREEN *************************************************************************** */
+#LoginBadge {
+    -fx-border-image-source: url("images/login-badge-background.png");
+    -fx-border-image-slice: 34 20 21 16 fill;
+    -fx-border-image-width: 34 20 21 16;
+    -fx-font-size: 30px;
+}
+#LoginGuestBtn {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/login-guest-btn.png");
+}
+#LoginGuestBtn:pressed {
+    -fx-background-image: url("images/login-guest-btn-pressed.png");
+}
+#LoginLoginBtn {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ButtonSkin";
+    -fx-background-image: url("images/login-login-btn.png");
+}
+#LoginLoginBtn:pressed {
+    -fx-background-image: url("images/login-login-btn-pressed.png");
+}
+#LoginBadge .text-field {
+    -fx-background-color: null;
+    -fx-border-color: transparent transparent #c8c8c8 transparent;
+    -fx-border-width: 2;
+    -fx-font: 30px "Helvetica Neue Light";
+    -fx-prompt-text-fill: #a8a8a8;
+}
+#LoginBadge .password-field {
+    -fx-background-color: null;
+    -fx-border-color: transparent transparent #c8c8c8 transparent;
+    -fx-border-width: 2;
+    -fx-font: 30px "Helvetica Neue Light";
+    -fx-prompt-text-fill: #a8a8a8;
+}
+#LoginProgressBar {
+    -fx-skin: "com.javafx.experiments.scheduleapp.control.LoginProgressBarSkin";
+    -fx-background-color: rgba(255, 255, 255, .3), #555;
+    -fx-background-radius: 25px, 25px;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-padding: 7px;
+}
+
+#LoginProgressBar > .bar {
+    -fx-background-radius: 20px;
+    -fx-background-color:
+        linear-gradient(
+            to bottom,
+            rgb(93,175,212) 37%,
+            rgb(60,135,172) 69%);
+    /* Prevents from having a bar where the right < left. Designed so left + right == radius */
+    -fx-padding: 0 10 0 10;
+}
+
+.LoginMessageBox {
+    -fx-font: 15px "Helvetica Neue Light";
+    -fx-background-color: red, pink;
+    -fx-background-radius: 8px, 5px;
+    -fx-background-insets: 0px, 1px;
+    -fx-padding: 0 10 0 40;
+}
+
+#LoginLogout {
+    -fx-skin: "com.sun.javafx.scene.control.skin.ToggleButtonSkin";
+    -fx-background-image: url("images/login-btn.png");
+}
+#LoginLogout:pressed {
+    -fx-background-image: url("images/login-btn-pressed.png");
+}
+#LoginLogout:selected {
+    -fx-background-image: url("images/logout-btn.png");
+}
+#LoginLogout:selected:pressed {
+    -fx-background-image: url("images/logout-btn-pressed.png");
+}
+
+/*******************************************************************************
+ *                                                                             *
+ * Virtual Keyboard                                                            *
+ *                                                                             *
+ ******************************************************************************/
+.virtual-keyboard {
+    -fx-skin: "com.javafx.experiments.scheduleapp.control.VirtualKeyboardSkin";
+    -fx-cursor: default;
+    /*-fx-background-color: linear-gradient(to bottom, rgb(126, 126, 126) 0%, rgb(76, 76, 76) 10%, rgb(84, 84, 84) 100%);*/
+    -fx-background-color: linear-gradient(to bottom, rgb(100, 100, 100, 0.8) 0%, rgb(50, 50, 50, 0.7) 10%, rgb(50, 50, 50, 0.7) 100%);
+    -fx-background-insets: 0;
+    -fx-padding: 8 4 10 4;
+}
+
+.backspace-icon {
+    -fx-background-image: url("images/backspace-icon.png");
+    -fx-background-repeat: no-repeat;
+    -fx-background-position: center;
+}
+
+.enter-icon {
+    -fx-background-image: url("images/enter-icon.png");
+    -fx-background-repeat: no-repeat;
+    -fx-background-position: center;
+}
+
+.shift-icon {
+    -fx-background-image: url("images/shift-icon.png");
+    -fx-background-repeat: no-repeat;
+    -fx-background-position: center;
+}
+
+.hide-icon {
+    -fx-background-image: url("images/vk-hide.png");
+    -fx-background-repeat: no-repeat;
+    -fx-background-position: center;
+}
+
+.key {
+    -fx-border-image-source: url("images/vk-light.png");
+    -fx-border-image-slice: 14 fill;
+    -fx-border-image-width: 14;
+    -fx-border-image-repeat: stretch;
+    -fx-border-image-insets: -3 -3 -3 -3;
+    -fx-padding: 3 3 5 0;
+}
+
+.key:pressed {
+    -fx-border-image-source: url("images/vk-light-pressed.png");
+    -fx-padding: 5 3 3 0;
+}
+
+.key-text {
+    -fx-font-size: 22px;
+    /*-fx-font-weight: bold;*/
+    -fx-fill: #333333;
+}
+
+.key.special {
+    -fx-border-image-source: url("images/vk-dark.png");
+}
+
+.key.special:pressed {
+    -fx-border-image-source: url("images/vk-dark-pressed.png");
+    -fx-padding: 5 3 3 0;
+}
+
+.special-text {
+    -fx-font-size: 18px;
+    /*-fx-font-weight: normal;*/
+    -fx-fill: rgb(230, 230, 230);
+}
+
+.key.short {
+    -fx-border-image-source: url("images/vk-medium.png");
+}
+
+.key.short:pressed {
+    -fx-border-image-source: url("images/vk-medium-pressed.png");
+    -fx-padding: 5 3 3 0;
+}
+/*
+.short .key-text {
+    -fx-font-size: 20px;
+    -fx-font-weight: normal;
+    -fx-fill: #333333;
+}*/
+/*
+.key {
+    -fx-background-color: rgb(45, 45, 45),
+                          rgb(148, 148, 148),
+                          linear-gradient(to bottom, rgb(251, 251, 251) 0%, rgb(216, 216, 216) 100%),
+                          linear-gradient(to bottom, rgb(240, 240, 240) 0%, rgb(208, 208, 208) 75%, rgb(196, 196, 196) 100%);
+    -fx-background-insets: 3 -.5 -1 -.5, 0, 0 1 2 1, 1 1 3 1;
+    -fx-font-size: 18px;
+    -fx-fill: #333333;
+    -fx-padding: 3 3 5 0;
+    -fx-background-radius: 8, 8, 5, 4;
+}
+
+.key:pressed {
+    -fx-background-color: rgb(45, 45, 45),
+                          linear-gradient(to bottom, rgb(251, 251, 251) 0%, rgb(216, 216, 216) 100%),
+                          linear-gradient(to bottom, rgb(240, 240, 240) 0%, rgb(208, 208, 208) 75%, rgb(196, 196, 196) 100%);
+    -fx-background-insets: 3 -.5 -1 -.5, 0, 0 1 2 1;
+}
+
+.key.special {
+    -fx-background-color: rgb(45, 45, 45),
+                          rgb(81, 81, 81),
+                          linear-gradient(to bottom, rgb(154, 154, 154) 0%, rgb(121, 121, 121) 100%),
+                          linear-gradient(to bottom, rgb(112, 112, 112) 0%, rgb(94, 94, 94) 75%, rgb(84, 84, 84) 100%);
+    -fx-fill: rgb(210, 210, 210);
+}
+
+.key.special:pressed {
+    -fx-background-color: rgb(45, 45, 45),
+                          linear-gradient(to bottom, rgb(154, 154, 154) 0%, rgb(121, 121, 121) 100%),
+                          linear-gradient(to bottom, rgb(112, 112, 112) 0%, rgb(94, 94, 94) 75%, rgb(84, 84, 84) 100%);
+}
+
+.key.short {
+    -fx-background-color: rgb(45, 45, 45),
+                          rgb(124, 124, 124),
+                          linear-gradient(to bottom, rgb(214, 214, 214) 0%, rgb(182, 182, 182) 100%),
+                          linear-gradient(to bottom, rgb(181, 181, 181) 0%, rgb(158, 158, 158) 75%, rgb(153, 153, 153) 100%);
+    -fx-fill: rgb(210, 210, 210);
+}
+
+.key.short:pressed {
+    -fx-background-color: rgb(45, 45, 45),
+                          linear-gradient(to bottom, rgb(214, 214, 214) 0%, rgb(182, 182, 182) 100%),
+                          linear-gradient(to bottom, rgb(181, 181, 181) 0%, rgb(158, 158, 158) 75%, rgb(153, 153, 153) 100%);
+}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/Theme.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import javafx.scene.image.Image;
+import javafx.scene.paint.Color;
+import javafx.scene.text.Font;
+import javafx.scene.text.FontWeight;
+
+/**
+ * This is a very simple theme of constants for styles used though out the 
+ * application. This allows us to avoid the cost of CSS.
+ */
+public class Theme {
+    public static final String DEFAULT_FONT_NAME = "Helvetica";
+    public static final Image RIGHT_ARROW = new Image(
+            Theme.class.getResource("images/popover-arrow.png").toExternalForm());
+    public static final Image STAR = new Image(
+            Theme.class.getResource("images/star.png").toExternalForm());
+    public static Image SHADOW_PIC = new Image(
+            Theme.class.getResource("images/pic-shadow.png").toExternalForm());
+    public static Image DUKE_48 = new Image(
+            Theme.class.getResource("images/duke48.png").toExternalForm());
+    public static final Image TICK_IMAGE = new Image(
+            Theme.class.getResource("images/tick.png").toExternalForm());
+    public static final Font HUGE_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.BOLD, 40);
+    public static final Font LARGE_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.BOLD, 20);
+    public static final Font LARGE_LIGHT_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.NORMAL, 18);
+    public static final Font BASE_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.BOLD, 14);
+    public static final Font LIGHT_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.NORMAL, 14);
+    public static final Font SMALL_FONT = Font.font(DEFAULT_FONT_NAME, FontWeight.BOLD, 10);
+    public static final Color BLUE = Color.web("#00a8cc");
+    public static final Color PINK = Color.web("#ea0068");
+    public static final Color GRAY = Color.web("#5f5f5f");
+    public static final Color VLIGHT_GRAY = Color.web("#9b9b9b");
+    public static final Color DARK_GREY = Color.web("#363636");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/TouchClickedEventAvoider.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.Node;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.input.ScrollEvent;
+
+public class TouchClickedEventAvoider {
+    boolean scrolling;
+    double pressX, pressY;
+    
+    public TouchClickedEventAvoider(Node node) {
+        node.addEventFilter(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
+            public void handle(ActionEvent event) {
+                if (scrolling) event.consume();
+            }
+        });
+        
+        node.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
+            public void handle(MouseEvent event) {
+                pressX = event.getScreenX();
+                pressY = event.getScreenY();
+            }
+        });
+        node.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
+            public void handle(MouseEvent event) {
+                if (scrolling) event.consume();
+            }
+        });
+        node.addEventFilter(ScrollEvent.SCROLL_STARTED, new EventHandler<ScrollEvent>() {
+            public void handle(ScrollEvent event) {
+                scrolling = true;
+            }
+        });
+        node.addEventFilter(ScrollEvent.SCROLL_FINISHED, new EventHandler<ScrollEvent>() {
+            public void handle(ScrollEvent event) {
+                scrolling = false;
+            }
+        });
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/TouchScrollEventSynthesizer.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp;
+
+import javafx.animation.*;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.event.Event;
+import javafx.event.EventHandler;
+import javafx.scene.Scene;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.input.ScrollEvent;
+import javafx.util.Duration;
+
+public class TouchScrollEventSynthesizer implements EventHandler {
+    private static final int INERTIA_DURATION = 2400;
+    private static final double CLICK_THRESHOLD = 20;
+    private static final double CLICK_TIME_THRESHOLD = Integer.parseInt(System.getProperty("click", "400"));
+    static {
+        System.out.println("CLICK_TIME_THRESHOLD = " + CLICK_TIME_THRESHOLD);
+    }
+    private long startDrag;
+    private long lastDrag;
+    private long lastDragDelta;
+    private int startDragX;
+    private int startDragY;
+    private int lastDragX;
+    private int lastDragY;
+    private int lastDragStepX;
+    private int lastDragStepY;
+    private double dragVelocityX;
+    private double dragVelocityY;
+    private boolean clickThresholdBroken;
+    private Timeline inertiaTimeline = null;
+    private long lastClickTime = -1;
+    private boolean isFiredByMe = false;
+
+    public TouchScrollEventSynthesizer(Scene scene) {
+        scene.addEventFilter(MouseEvent.ANY, this);
+        scene.addEventFilter(ScrollEvent.ANY, this);
+    }
+
+    @Override public void handle(final Event e) {
+        if (isFiredByMe) return;
+        if (e instanceof ScrollEvent) {
+            final ScrollEvent se = (ScrollEvent)e;
+//            System.out.println("SCROLL touch = "+se.getTouchCount()+" e = "+se.getEventType()+"  dx="+se.getDeltaX()+"  dy="+se.getDeltaY()+"  tdx="+se.getTotalDeltaX()+"  tdy="+se.getTotalDeltaY());
+            if (se.getTouchCount() != 0) se.consume();
+        } else if (e instanceof MouseEvent) {
+            final MouseEvent me = (MouseEvent)e;
+//            System.out.println("MOUSE "+e.getEventType());
+            if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
+                lastDragX = startDragX = (int)me.getX();
+                lastDragY = startDragY = (int)me.getY();
+                lastDrag = startDrag = System.currentTimeMillis();
+                lastDragDelta = 0;
+                if(inertiaTimeline != null) inertiaTimeline.stop();
+                clickThresholdBroken = false;
+            } else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
+                // Delta of this drag vs. last drag location (or start)
+                lastDragStepX = (int)me.getX() - lastDragX;
+                lastDragStepY = (int)me.getY() - lastDragY;
+
+                // Duration of this drag step.
+                lastDragDelta = System.currentTimeMillis() - lastDrag;
+
+                // Velocity of last drag increment.
+                dragVelocityX = (double)lastDragStepX/(double)lastDragDelta;
+                dragVelocityY = (double)lastDragStepY/(double)lastDragDelta;
+
+                // Snapshot of this drag event.
+                lastDragX = (int)me.getX();
+                lastDragY = (int)me.getY();
+                lastDrag = System.currentTimeMillis();
+
+                // Calculate distance so far -- have we dragged enough to scroll?
+                final int dragX = (int)me.getX() - startDragX;
+                final int dragY = (int)me.getY() - startDragY;
+                double distance = Math.abs(Math.sqrt((dragX*dragX) + (dragY*dragY)));
+
+                int scrollDistX = lastDragStepX;
+                int scrollDistY = lastDragStepY;
+                if (!clickThresholdBroken && distance > CLICK_THRESHOLD) {
+                    clickThresholdBroken = true;
+                    scrollDistX = dragX;
+                    scrollDistY = dragY;
+                }
+                if (clickThresholdBroken) {
+                    // TODO
+                    Event.fireEvent(e.getTarget(), ScrollEvent.impl_scrollEvent(
+                            ScrollEvent.SCROLL,
+                            scrollDistX, scrollDistY,
+                            scrollDistX, scrollDistY,
+                            ScrollEvent.HorizontalTextScrollUnits.NONE, 0,
+                            ScrollEvent.VerticalTextScrollUnits.NONE, 0,
+                            0,
+                            me.getX(), me.getY(),
+                            me.getSceneX(), me.getSceneY(),
+                            me.isShiftDown(), me.isControlDown(), me.isAltDown(), me.isMetaDown(),
+                            true, false));
+                }
+            } else if (e.getEventType() == MouseEvent.MOUSE_RELEASED) {
+                handleRelease(me);
+            } else if (e.getEventType() == MouseEvent.MOUSE_CLICKED) {
+                final long time = System.currentTimeMillis();
+//                System.out.println("CLICKED   clickThresholdBroken="+clickThresholdBroken+"   timeSinceLast = "+ (time-lastClickTime)+" CONSUMED="+((time-lastClickTime) < CLICK_TIME_THRESHOLD));
+                if (clickThresholdBroken || (lastClickTime != -1 && (time-lastClickTime) < CLICK_TIME_THRESHOLD)) e.consume();
+                lastClickTime = time;
+            }
+        }
+    }
+
+    private void handleRelease(final MouseEvent me) {
+        if (clickThresholdBroken) {
+            // Calculate last instantaneous velocity. User may have stopped moving
+            // before they let go of the mouse.
+            final long time = System.currentTimeMillis() - lastDrag;
+            dragVelocityX = (double)lastDragStepX/(time + lastDragDelta);
+            dragVelocityY = (double)lastDragStepY/(time + lastDragDelta);
+
+            // determin if click or drag/flick
+            final int dragX = (int)me.getX() - startDragX;
+            final int dragY = (int)me.getY() - startDragY;
+
+            // calculate complete time from start to end of drag
+            final long totalTime = System.currentTimeMillis() - startDrag;
+
+            // if time is less than 300ms then considered a quick flick and whole time is used
+            final boolean quick = totalTime < 300;
+
+            // calculate velocity
+            double velocityX = quick ? (double)dragX / (double)totalTime : dragVelocityX; // pixels/ms
+            double velocityY = quick ? (double)dragY / (double)totalTime : dragVelocityY; // pixels/ms
+
+//            System.out.printf("dragVelocityX = %f, dragVelocityY = %f\n", dragVelocityX, dragVelocityY);
+//            System.out.printf("velocityX = %f, dragX = %d; velocityY = %f, dragY = %d; totalTime = %d\n",
+//                    velocityX, dragX, velocityY, dragY, totalTime);
+
+            // calculate distance we would travel at this speed for INERTIA_DURATION ms of travel
+            final int distanceX = (int)(velocityX * INERTIA_DURATION); // distance
+            final int distanceY = (int)(velocityY * INERTIA_DURATION); // distance
+            //
+            DoubleProperty animatePosition = new SimpleDoubleProperty() {
+                double lastMouseX = me.getX();
+                double lastMouseY = me.getY();
+                @Override protected void invalidated() {
+                    final double mouseX = me.getX() + (distanceX * get());
+                    final double mouseY = me.getY() + (distanceY * get());
+                    final double dragStepX = mouseX - lastMouseX;
+                    final double dragStepY = mouseY - lastMouseY;
+
+                    if (Math.abs(dragStepX) >= 1.0 || Math.abs(dragStepY) >= 1.0) {
+                        Event.fireEvent(me.getTarget(), ScrollEvent.impl_scrollEvent(
+                                ScrollEvent.SCROLL,
+                                dragStepX, dragStepY,
+                                (distanceX * get()), (distanceY * get()),
+                                ScrollEvent.HorizontalTextScrollUnits.NONE, 0,
+                                ScrollEvent.VerticalTextScrollUnits.NONE, 0,
+                                0,
+                                me.getX(), me.getY(),
+                                me.getSceneX(), me.getSceneY(),
+                                me.isShiftDown(), me.isControlDown(), me.isAltDown(), me.isMetaDown(),
+                                true, true));
+                    }
+                    lastMouseX = mouseX;
+                    lastMouseY = mouseY;
+                }
+            };
+
+            // animate a slow down from current velocity to zero
+            inertiaTimeline = TimelineBuilder.create()
+                .keyFrames(
+                    new KeyFrame(Duration.ZERO, new KeyValue(animatePosition, 0)),
+                    new KeyFrame(Duration.millis(INERTIA_DURATION), new KeyValue(animatePosition, 1d, Interpolator.SPLINE(0.0513, 0.1131, 0.1368, 1.0000)))
+                ).build();
+            inertiaTimeline.play();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/AsciiBoard.txt	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,5 @@
+[`|~ ][1|! ][2|@ ][3|# ][4|\$ ][5|% ][6|^ ][7|& ][8|* ][9|( ][0|) ][-|_ ][=|+ ][$backspace  ]
+[$tab  ][q ][w ][e ][r ][t ][y ][u ][i ][o ][p ][\[|{ ][\]|} ][\\|\| ]
+[$caps   ][a ][s ][d ][f ][g ][h ][j ][k ][l ][;|: ]['|" ][$enter  ]
+[$shift    ][z ][x ][c ][v ][b ][n ][m ][,|< ][.|> ][/|? ][$shift   ]
+[$hide   ][$SymbolBoard  ][$space               ][$SymbolBoard  ][$hide  ]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/CheckBoxItem.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import static com.javafx.experiments.scheduleapp.Theme.*;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.SimpleBooleanProperty;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.VPos;
+import javafx.scene.Node;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.text.Text;
+
+public class CheckBoxItem<T> extends PopoverBoxItem<T> {
+    private static final double GAP = 10;
+    private final Text name = new Text();
+    private final ImageView arrow = new ImageView(TICK_IMAGE);
+    private final BooleanProperty checked = new SimpleBooleanProperty(this, "checked", true);
+    public final boolean isChecked() { return checked.get(); }
+    public final void setChecked(boolean value) { checked.set(value); }
+    public final BooleanProperty checkedProperty() { return checked; }
+
+    public CheckBoxItem(String name, T item, boolean checked) {
+        super(name, item);
+        this.checked.set(checked);
+        this.name.textProperty().bind(nameProperty());
+        this.name.setTextOrigin(VPos.TOP);
+        this.name.getStyleClass().setAll(".text");
+        getChildren().addAll(this.name, arrow);
+        arrow.visibleProperty().bind(checkedProperty());
+
+        addEventHandler(
+                MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
+            @Override public void handle(MouseEvent event) {
+                setChecked(!isChecked());
+            }
+        });
+    }
+
+    @Override protected double computePrefWidth(double height) {
+        final Insets insets = getInsets();
+        final Node graphic = getGraphic();
+        return insets.getLeft() +
+                (graphic == null ? 0 : (graphic.prefWidth(-1) + GAP)) +
+                name.prefWidth(-1) + GAP + arrow.prefWidth(-1) + insets.getRight();
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        final Insets insets = getInsets();
+        double h = Math.max(name.prefHeight(name.prefWidth(-1)), arrow.prefHeight(-1));
+        final Node graphic = getGraphic();
+        if (graphic != null) {
+            h = Math.max(h, graphic.prefHeight(graphic.prefWidth(-1)));
+        }
+        return insets.getTop() + h + insets.getBottom();
+    }
+
+    @Override protected void layoutChildren() {
+        final Insets insets = getInsets();
+        final double top = insets.getTop();
+        double left = insets.getLeft();
+        double rightSide = getWidth() - insets.getRight();
+        final double height = getHeight() - top - insets.getBottom();
+
+        final Node graphic = getGraphic();
+        if (graphic != null) {
+            double graphicWidth = graphic.prefWidth(-1);
+            double graphicHeight = graphic.prefHeight(graphicWidth);
+            graphic.resizeRelocate((int) left, (int) top, (int) graphicWidth, (int) ((graphicHeight - height) / 2));
+            left += graphicWidth + GAP;
+        }
+
+        double nameWidth = name.prefWidth(-1);
+        double nameHeight = name.prefHeight(nameWidth);
+        name.resizeRelocate((int)(left + .5), (int)((top + (height - nameHeight) / 2) + .5), (int)(nameWidth + .5), (int)(nameHeight + .5));
+
+        double arrowWidth = arrow.prefWidth(-1);
+        double arrowHeight = arrow.prefHeight(-1);
+        arrow.relocate((int) ((rightSide - arrowWidth) + .5), (int) ((top + (height - arrowHeight) / 2) + .5));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/EmailBoard.txt	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,5 @@
+[`|~ ][1|! ][2|, ][3|# ][4|\$ ][5|% ][6|^ ][7|& ][8|* ][9|( ][0|) ][-|_ ][=|+ ][$backspace  ]
+[$tab  ][q ][w ][e ][r ][t ][y ][u ][i ][o ][p ][\[|{ ][\]|} ][\\|\| ]
+[$caps   ][a ][s ][d ][f ][g ][h ][j ][k ][l ][;|: ]['|" ][$enter  ]
+[$shift    ][z ][x ][c ][v ][b ][n ][m ][@|< ][.|> ][/|? ][$shift   ]
+[$hide ][$.org  ][$.net  ][$space           ][$.com  ][$oracle.com   ][$hide ]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/EventPopoverPage.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,484 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import com.javafx.experiments.scheduleapp.ConferenceScheduleApp;
+import com.javafx.experiments.scheduleapp.PlatformIntegration;
+import static com.javafx.experiments.scheduleapp.Theme.*;
+import com.javafx.experiments.scheduleapp.model.Availability;
+import com.javafx.experiments.scheduleapp.data.DataService;
+import com.javafx.experiments.scheduleapp.model.Event;
+import com.javafx.experiments.scheduleapp.model.Session;
+import java.text.DateFormat;
+import java.util.Collections;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.SimpleBooleanProperty;
+import javafx.collections.ObservableList;
+import javafx.concurrent.Task;
+import javafx.concurrent.WorkerStateEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.Orientation;
+import javafx.scene.Node;
+import javafx.scene.control.Button;
+import javafx.scene.control.ProgressIndicator;
+import javafx.scene.control.ScrollPane;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.Region;
+import javafx.scene.paint.Color;
+import javafx.scene.text.Text;
+
+/**
+ * The content for displaying a event in a popover.
+ */
+public class EventPopoverPage extends Region implements Popover.Page {
+    private static final DateFormat DAY_TIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
+    private static final DateFormat TIME_FORMAT = DateFormat.getTimeInstance(DateFormat.SHORT);
+    /**
+     * The ExecutorService used for running our get availability tasks. We could have just created
+     * a new thread each time, but there really isn't a need for it.
+     */
+    private static ExecutorService FILTER_EXECUTOR = Executors.newSingleThreadExecutor(
+            new ThreadFactory() {
+                @Override public Thread newThread(Runnable r) {
+                    Thread th = new Thread(r);
+                    th.setDaemon(true);
+                    th.setName("Check Availability Thread");
+                    return th;
+                }
+            });
+    private static Task<Availability> CHECK_AVAIL_TASK;
+    
+    private Popover popover;
+    private final ScrollPane scrollPane;
+    private final Node content;
+    private boolean showBack;
+    private BooleanProperty full = new SimpleBooleanProperty(this, "full", true);
+
+    public EventPopoverPage(final DataService dataService, final Event event, boolean showBack) {
+        this.showBack = showBack;
+        getStyleClass().add("event-popover-page");
+
+        final Session session = event.getSession();
+
+        scrollPane = new ScrollPane();
+        scrollPane.setFitToWidth(true);
+        scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
+        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
+        content = session == null ? new EventContent(event, dataService) : new SessionContent(session, event, dataService);
+        scrollPane.setContent(content);
+        getChildren().add(scrollPane);
+
+        if (CHECK_AVAIL_TASK != null) {
+            CHECK_AVAIL_TASK.cancel();
+        }
+
+        if (!ConferenceScheduleApp.getInstance().getSessionManagement().isGuestProperty().get() &&
+                content instanceof SessionContent) {
+            CHECK_AVAIL_TASK = dataService.checkAvailability(event);
+            CHECK_AVAIL_TASK.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
+                @Override public void handle(WorkerStateEvent event) {
+                    final SessionContent sc = (SessionContent) content;
+                    final Availability avail = CHECK_AVAIL_TASK.getValue();
+                    if (!sc.fav) {
+                        sc.button.setText(avail.full ? "Session Full" : "Register");
+                        full.set(avail.full);
+                    }
+                }
+            });
+            FILTER_EXECUTOR.submit(CHECK_AVAIL_TASK);
+        }
+    }
+
+    @Override public void setPopover(Popover popover) {
+        this.popover = popover;
+    }
+
+    @Override public Popover getPopover() {
+        return popover;
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        final Insets insets = getInsets();
+        return insets.getTop() + content.prefHeight(width) + insets.getBottom();
+    }
+
+    @Override protected double computePrefWidth(double height) {
+        final Insets insets = getInsets();
+        return insets.getLeft() + content.prefWidth(height) + insets.getRight();
+    }
+
+    @Override protected void layoutChildren() {
+        final Insets insets = getInsets();
+        scrollPane.relocate(insets.getLeft(), insets.getTop());
+        scrollPane.resize(
+                getWidth() - insets.getLeft() - insets.getRight(),
+                getHeight() - insets.getTop() - insets.getBottom());
+    }
+
+    @Override public Node getPageNode() {
+        return this;
+    }
+
+    @Override public String getPageTitle() {
+        return "Event";
+    }
+
+    @Override public String leftButtonText() {
+        return showBack ? "Back" : null;
+    }
+
+    @Override public void handleLeftButton() {
+        popover.popPage();
+    }
+
+    @Override public String rightButtonText() {
+        return "Done";
+    }
+
+    @Override public void handleRightButton() {
+        popover.hide();
+    }
+
+    @Override public void handleShown() { }
+    @Override public void handleHidden() { }
+
+    private class Content extends Region {
+        static final double GAP = 12;
+        Text eventTitle;
+        Text item1Label;
+        Text item1Value;
+        Text item2Label;
+        Text item2Value;
+        Text item3Label;
+        Text item3Value;
+        Text desc;
+        Button button;
+
+        public Content() {
+            setPadding(new Insets(24));
+        }
+
+        // The content is biased such that the height depends on the width
+        @Override public Orientation getContentBias() {
+            return Orientation.HORIZONTAL;
+        }
+
+        @Override protected double computePrefWidth(double height) {
+            // We're just going to ignore the height parameter, because the
+            // content is width-biased.
+            return 400;
+        }
+
+        @Override protected double computePrefHeight(double width) {
+            if (width == -1) width = 400;
+            final Insets insets = getInsets();
+            width = width - insets.getLeft() - insets.getRight();
+
+            double h = eventTitle.prefHeight(width) + GAP;
+
+            final double labelWidth = computeLabelWidth();
+            final double valueWidth = width - labelWidth - GAP;
+
+            // Add the heights of the 3 values, plus the 12 pixel gap between them
+            h += item1Value.prefHeight(valueWidth);
+
+            if (item2Value != null) {
+                h += GAP;
+                h += item2Value.prefHeight(valueWidth);
+            }
+
+            if (item3Value != null) {
+                h += GAP;
+                h += item3Value.prefHeight(valueWidth);
+            }
+
+            // Add the height of the desc plus padding
+            if (desc != null) {
+                h += GAP;
+                h += desc.prefHeight(width);
+            }
+
+            // Add the height of the button plus padding
+            if (button != null) {
+                h += GAP;
+                h += button.prefHeight(width);
+            }
+
+            return insets.getTop() + h + insets.getBottom();
+        }
+
+        @Override protected void layoutChildren() {
+            final Insets insets = getInsets();
+            final double left = insets.getLeft();
+            final double width = getWidth() - left - insets.getRight();
+            final double labelWidth = computeLabelWidth();
+            final double valueWidth = width - labelWidth - GAP;
+            final double valueStartX = left + labelWidth + GAP;
+
+            double y = insets.getTop();
+            double labelHeight = eventTitle.prefHeight(width);
+            eventTitle.resizeRelocate(left, y, width, labelHeight);
+            y += labelHeight + GAP;
+
+            labelHeight = item1Label.prefHeight(-1);
+            double valueHeight = item1Value.prefHeight(valueWidth);
+            item1Value.resizeRelocate(valueStartX, y, valueWidth, valueHeight);
+            item1Label.resizeRelocate(left, y + ((valueHeight - labelHeight) / 2), labelWidth, labelHeight);
+
+            if (item2Label != null) {
+                y += valueHeight + GAP;
+                labelHeight = item2Label.prefHeight(-1);
+                valueHeight = item2Value.prefHeight(valueWidth);
+                item2Value.resizeRelocate(valueStartX, y, valueWidth, valueHeight);
+                item2Label.resizeRelocate(left, y + ((valueHeight - labelHeight) / 2), labelWidth, labelHeight);
+            }
+
+            if (item3Label != null) {
+                y += valueHeight + GAP;
+                labelHeight = item3Label.prefHeight(-1);
+                valueHeight = item3Value.prefHeight(valueWidth);
+                item3Value.resizeRelocate(valueStartX, y, valueWidth, valueHeight);
+                item3Label.resizeRelocate(left, y + ((valueHeight - labelHeight) / 2), labelWidth, labelHeight);
+            }
+
+            if (desc != null) {
+                y += valueHeight + GAP;
+                valueHeight = desc.prefHeight(width);
+                desc.resizeRelocate(left, y, width, valueHeight);
+            }
+
+            if (button != null) {
+                y += valueHeight + GAP;
+                valueHeight = button.prefHeight(width);
+                button.resizeRelocate(left, y, width, valueHeight);
+            }
+        }
+
+        private double computeLabelWidth() {
+            double labelWidth = item1Label.prefWidth(-1); // single row of text only
+            if (item2Label != null) {
+                labelWidth = Math.max(labelWidth, item2Label.prefWidth(-1));
+            }
+            if (item3Label != null) {
+                labelWidth = Math.max(labelWidth, item3Label.prefWidth(-1));
+            }
+            return labelWidth;
+        }
+    }
+
+    private final class SessionContent extends Content {
+        private boolean fav;
+        public SessionContent(Session session, Event event, DataService dataService) {
+            // event title
+            eventTitle = new ResizableWrappingText(session.getTitle());
+            eventTitle.setFont(BASE_FONT);
+            eventTitle.setFill(Color.WHITE);
+
+            item1Label = new Text(session == null ? "Time" : "Speakers");
+            item1Label.setFill(VLIGHT_GRAY);
+            item1Label.setFont(BASE_FONT);
+
+            item1Value = new ResizableWrappingText(session.getSpeakersDisplay());
+            item1Value.setFill(Color.WHITE);
+            item1Value.setFont(LIGHT_FONT);
+
+            item2Label = new Text("Time");
+            item2Label.setFill(VLIGHT_GRAY);
+            item2Label.setFont(BASE_FONT);
+
+            item2Value = new ResizableWrappingText(
+                    DAY_TIME_FORMAT.format(event.getStart())+ " to "+ TIME_FORMAT.format(event.getEnd()));
+            item2Value.setFill(Color.WHITE);
+            item2Value.setFont(LIGHT_FONT);
+
+            item3Label = new Text("Location");
+            item3Label.setFill(VLIGHT_GRAY);
+            item3Label.setFont(BASE_FONT);
+
+            item3Value = new ResizableWrappingText(session.getSessionTimes()[0].getRoom().toString());
+            item3Value.setFill(Color.WHITE);
+            item3Value.setFont(LIGHT_FONT);
+
+            // description
+            desc = new ResizableWrappingText(session.getSummary());
+            desc.setFill(Color.WHITE);
+            desc.setFont(LIGHT_FONT);
+
+            // Button is either a delete button or a favorite button
+            fav = event.getSessionTime().getEvent() != null;
+            button = fav ? new DeleteButton(event, dataService) : new AddButton(event, dataService);
+
+            getChildren().addAll(eventTitle, item1Label, item1Value, item2Label, item2Value,
+                                 item3Label, item3Value, desc, button);
+        }
+    }
+
+    private final class EventContent extends Content {
+        public EventContent(Event event, DataService dataService) {
+            // event title
+            eventTitle = new ResizableWrappingText(event.getTitle());
+            eventTitle.setFont(BASE_FONT);
+            eventTitle.setFill(Color.WHITE);
+
+            item1Label = new Text("Time");
+            item1Label.setFill(VLIGHT_GRAY);
+            item1Label.setFont(BASE_FONT);
+
+            item1Value = new ResizableWrappingText(
+                    DAY_TIME_FORMAT.format(event.getStart())+ " to "+ TIME_FORMAT.format(event.getEnd()));
+            item1Value.setFill(Color.WHITE);
+            item1Value.setFont(LIGHT_FONT);
+
+            getChildren().addAll(eventTitle, item1Label, item1Value);
+
+            final String organizer = event.getOrganizer();
+            if (organizer != null && !"null".equals(organizer)) {
+                item2Label = new Text("Organizer");
+                item2Label.setFill(VLIGHT_GRAY);
+                item2Label.setFont(BASE_FONT);
+
+                item2Value = new ResizableWrappingText(organizer);
+                item2Value.setFill(Color.WHITE);
+                item2Value.setFont(LIGHT_FONT);
+
+                getChildren().addAll(item2Label, item2Value);
+            }
+
+            final String location = event.getLocation();
+            if (location != null && !"null".equals(location)) {
+                item3Label = new Text("Location");
+                item3Label.setFill(VLIGHT_GRAY);
+                item3Label.setFont(BASE_FONT);
+
+                item3Value = new ResizableWrappingText(location);
+                item3Value.setFill(Color.WHITE);
+                item3Value.setFont(LIGHT_FONT);
+
+                getChildren().addAll(item3Label, item3Value);
+            }
+        }
+    }
+
+    private class AddButton extends Button {
+        public AddButton(final Event event, final DataService dataService) {
+            super(ConferenceScheduleApp.getInstance().getSessionManagement().isGuestProperty().get() ? "Login to Register" : "Checking Availability");
+            setPrefWidth(Double.MAX_VALUE);
+            // TODO we shouldn't allow anybody to register for a session which is already
+            // in the past.
+            disableProperty().bind(ConferenceScheduleApp.getInstance().getSessionManagement().isGuestProperty().or(full));
+            getStyleClass().setAll("large-blue-button");
+            setOnMouseClicked(new EventHandler<MouseEvent>() {
+                @Override public void handle(MouseEvent t) {
+                    final Task<Void> task = dataService.register(event);
+                    final ProgressIndicator pi = new ProgressIndicator();
+                    pi.setPrefSize(16, 16);
+                    setGraphic(pi);
+                    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
+                        @Override public void handle(WorkerStateEvent workerStateEvent) {
+                            if (PlatformIntegration.supportsSystemCalendar()) {
+                                PlatformIntegration.writeEvents(Collections.singletonList(event));
+                            }
+                            // mark sessionTime as saved
+                            event.getSessionTime().setEvent(event);
+                            // insert new
+                            boolean added = false;
+                            final long start = event.getStart().getTime();
+                            final ObservableList<Event> events = dataService.getEvents();
+                            for (int i = 0; i < events.size(); i++) {
+                                final Event e = events.get(i);
+                                if (e.getStart().getTime() > start) {
+                                    System.out.println("        Adding event before [" + i + "]  " + e.getTitle());
+                                    events.add(i, event);
+                                    added = true;
+                                    break;
+                                }
+                            }
+                            System.out.println("added = " + added);
+                            if (!added) { // no events are after so just append to end
+                                events.add(event);
+                            }
+                            popover.hide();
+                            setGraphic(null);
+                        }
+                    });
+                    task.setOnFailed(new EventHandler<WorkerStateEvent>() {
+                        @Override public void handle(WorkerStateEvent workerStateEvent) {
+                            Throwable th = task.getException();
+                            if (th != null) th.printStackTrace();
+                            setGraphic(null);
+                        }
+                    });
+                    new Thread(task).start();
+                }
+            });
+        }
+    }
+
+    private class DeleteButton extends Button {
+        public DeleteButton(final Event event, final DataService dataService) {
+            super("Unregister");
+            setPrefWidth(Double.MAX_VALUE);
+            disableProperty().bind(ConferenceScheduleApp.getInstance().getSessionManagement().isGuestProperty());
+            getStyleClass().setAll("large-red-button");
+            setOnMouseClicked(new EventHandler<MouseEvent>() {
+                @Override public void handle(MouseEvent t) {
+                    final Task<Void> task = dataService.unregister(event);
+                    final ProgressIndicator pi = new ProgressIndicator();
+                    pi.setPrefSize(16, 16);
+                    setGraphic(pi);
+                    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
+                        @Override public void handle(WorkerStateEvent workerStateEvent) {
+                            if (PlatformIntegration.supportsSystemCalendar())
+                                PlatformIntegration.deleteEvents(Collections.singletonList(event));
+                            event.getSessionTime().setEvent(null);
+                            dataService.getEvents().remove(event);
+                            popover.hide();
+                            setGraphic(null);
+                        }
+                    });
+                    task.setOnFailed(new EventHandler<WorkerStateEvent>() {
+                        @Override public void handle(WorkerStateEvent workerStateEvent) {
+                            Throwable th = task.getException();
+                            if (th != null) th.printStackTrace();
+                            setGraphic(null);
+                        }
+                    });
+                    new Thread(task).start();
+                }
+            });
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/LoginProgressBarSkin.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import com.sun.javafx.scene.control.behavior.ProgressBarBehavior;
+import javafx.animation.Interpolator;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.Timeline;
+import javafx.beans.InvalidationListener;
+import javafx.beans.Observable;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.geometry.Insets;
+import javafx.scene.control.ProgressBar;
+import javafx.scene.control.SkinBase;
+import javafx.scene.layout.Region;
+import javafx.util.Duration;
+
+public class LoginProgressBarSkin extends SkinBase<ProgressBar, ProgressBarBehavior<ProgressBar>> {
+    /**
+     * The track is rendered by the control itself, the bar though is provided by this skin.
+     */
+    private Region bar;
+
+    private Timeline widthTimeline = null;
+    private DoubleProperty barWidth = new SimpleDoubleProperty(this, "barWidth", 0) {
+        @Override protected void invalidated() {
+            requestLayout();
+        }
+    }; // between 0 and 1
+
+    /***************************************************************************
+     *                                                                         *
+     * Constructors                                                            *
+     *                                                                         *
+     **************************************************************************/
+
+    public LoginProgressBarSkin(final ProgressBar control) {
+        super(control, new ProgressBarBehavior<ProgressBar>(control));
+        InvalidationListener listener = new InvalidationListener() {
+            @Override public void invalidated(Observable valueModel) {
+                if (widthTimeline != null) widthTimeline.stop();
+                widthTimeline = new Timeline(
+                        new KeyFrame(Duration.millis(500),
+                                new KeyValue(barWidth, control.getProgress(), Interpolator.EASE_IN)));
+                widthTimeline.play();
+            }
+        };
+        control.widthProperty().addListener(listener);
+        control.progressProperty().addListener(listener);
+
+        bar = new Region();
+        bar.getStyleClass().setAll("bar");
+        getChildren().setAll( bar);
+        requestLayout();
+    }
+
+    @Override
+    public double getBaselineOffset() {
+        double height = getSkinnable().getHeight();
+        return getInsets().getTop() + height;
+    }
+
+    /***************************************************************************
+     *                                                                         *
+     * Layout                                                                  *
+     *                                                                         *
+     **************************************************************************/
+
+    @Override protected double computePrefWidth(double height) {
+        return Math.max(100, getInsets().getLeft() + bar.prefWidth(getWidth()) + getInsets().getRight());
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        return getInsets().getTop() + bar.prefHeight(width) + getInsets().getBottom();
+    }
+
+    @Override protected void layoutChildren(final double x, final double y, final double w, final double h) {
+        final boolean indeterminate = getSkinnable().isIndeterminate();
+        double bw = indeterminate ? 0 : w * barWidth.get();
+        if (bw > 0) {
+            final Insets barInsets = bar.getInsets();
+            bw = Math.max(barInsets.getLeft() + barInsets.getRight(), bw);
+        }
+        final Insets insets = getInsets();
+        bar.resizeRelocate(x, y, bw, getHeight() - (insets.getTop() + insets.getBottom()));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/NoopScrollBarSkin.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.control.ScrollBar;
+import javafx.scene.control.Skin;
+
+/**
+ * A minimal skin for scrollbars that is much lighter weight as we don't need 
+ * scrollbars on touch devices.
+ */
+public class NoopScrollBarSkin implements Skin<ScrollBar>{
+    private ScrollBar scrollBar;
+    private Node node = new Group();
+
+    public NoopScrollBarSkin(ScrollBar scrollBar) {
+        this.scrollBar = scrollBar;
+    }
+    
+    @Override public ScrollBar getSkinnable() {
+        return scrollBar;
+    }
+
+    @Override public Node getNode() {
+        return node;
+    }
+
+    @Override public void dispose() {}
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/Popover.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import java.util.LinkedList;
+import javafx.animation.Animation;
+import javafx.animation.FadeTransition;
+import javafx.animation.Interpolator;
+import javafx.animation.KeyFrame;
+import javafx.animation.KeyValue;
+import javafx.animation.ParallelTransition;
+import javafx.animation.ScaleTransition;
+import javafx.animation.Timeline;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.event.ActionEvent;
+import javafx.event.Event;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.geometry.Point2D;
+import javafx.geometry.VPos;
+import javafx.scene.Group;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.input.MouseEvent;
+import javafx.scene.layout.Region;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Rectangle;
+import javafx.scene.text.Text;
+import javafx.util.Duration;
+import com.javafx.experiments.scheduleapp.Theme;
+
+/**
+ * A Popover is a mini-window that pops up and contains some application specific content.
+ * It's width is defined by the application, but defaults to a hard-coded pref width.
+ * The height will always be between a minimum height (determined by the application, but
+ * pre-set with a minimum value) and a maximum height (specified by the application, or
+ * based on the height of the scene). The value for the pref height is determined by
+ * inspecting the pref height of the current displayed page. At time this value is animated
+ * (when switching from page to page).
+ */
+public class Popover extends Region implements EventHandler<Event>{
+    private static final int PAGE_GAP = 15;
+
+    /**
+     * The visual frame of the popover is defined as an addition region, rather than simply styling
+     * the popover itself as one might expect. The reason for this is that our frame is styled via
+     * a border image, and it has an inner shadow associated with it, and we want to be able to ensure
+     * that the shadow is on top of whatever content is drawn within the popover. In addition, the inner
+     * edge of the frame is rounded, and we want the content to slide under it, only to be clipped beneath
+     * the frame. So it works best for the frame to be overlaid on top, even though it is not intuitive.
+     */
+    private final Region frameBorder = new Region();
+    private final Button leftButton = new Button("Left");
+    private final Button rightButton = new Button("Right");
+    private final LinkedList<Page> pages = new LinkedList<Page>();
+    private final Region backgroundRectangle = new Region();
+    private final Group pagesGroup = new Group();
+    private final Rectangle pagesClipRect = new Rectangle();
+    private final Group titlesGroup = new Group();
+    private Text title; // the current title
+    private final Rectangle titlesClipRect = new Rectangle();
+//    private final EventHandler<ScrollEvent> popoverScrollHandler;
+    private final EventHandler<MouseEvent> popoverHideHandler;
+    private Runnable onHideCallback = null;
+    private int maxPopupHeight = -1;
+
+    private DoubleProperty popoverHeight = new SimpleDoubleProperty(400) {
+        @Override protected void invalidated() {
+            requestLayout();
+        }
+    };
+
+    public Popover() {
+        // TODO Could pagesGroup be a region instead? I need to draw some opaque background. Right now when
+        // TODO animating from one page to another you can see the background "shine through" because the
+        // TODO group background is transparent. That can't be good for performance either.
+        getStyleClass().setAll("popover");
+        frameBorder.getStyleClass().setAll("popover-frame");
+        frameBorder.setMouseTransparent(true);
+        backgroundRectangle.setId("PopoverBackground");
+        // setup buttons
+        leftButton.setOnMouseClicked(this);
+        leftButton.getStyleClass().setAll("popover-left-button");
+        rightButton.setOnMouseClicked(this);
+        rightButton.getStyleClass().setAll("popover-right-button");
+        pagesClipRect.setSmooth(false);
+        pagesGroup.setAutoSizeChildren(false);
+        pagesGroup.setClip(pagesClipRect);
+        titlesClipRect.setSmooth(false);
+        titlesGroup.setClip(titlesClipRect);
+        getChildren().addAll(backgroundRectangle, pagesGroup, frameBorder, titlesGroup, leftButton, rightButton);
+        // always hide to start with
+        setVisible(false);
+        setOpacity(0);
+        setScaleX(.8);
+        setScaleY(.8);
+        // create handlers for auto hiding
+        popoverHideHandler = new EventHandler<MouseEvent>() {
+            @Override public void handle(MouseEvent t) {
+                // check if event is outside popup
+                Point2D mouseInFilterPane = sceneToLocal(t.getX(), t.getY());
+                if (mouseInFilterPane.getX() < 0 || mouseInFilterPane.getX() > (getWidth()) ||
+                    mouseInFilterPane.getY() < 0 || mouseInFilterPane.getY() > (getHeight())) {
+                    hide();
+                    t.consume();
+                }
+            }
+        };
+//        popoverScrollHandler = new EventHandler<ScrollEvent>() {
+//            @Override public void handle(ScrollEvent t) {
+//                t.consume(); // consume all scroll events
+//            }
+//        };
+    }
+
+    /**
+     * Handle mouse clicks on the left and right buttons.
+     */
+    @Override public void handle(Event event) {
+        if (event.getSource() == leftButton) {
+            pages.getFirst().handleLeftButton();
+        } else if (event.getSource() == rightButton) {
+            pages.getFirst().handleRightButton();
+        }
+    }
+
+    @Override protected double computeMinWidth(double height) {
+        Page page = pages.isEmpty() ? null : pages.getFirst();
+        if (page != null) {
+            Node n = page.getPageNode();
+            if (n != null) {
+                Insets insets = getInsets();
+                return insets.getLeft() + n.minWidth(-1) + insets.getRight();
+            }
+        }
+        return 200;
+    }
+
+    @Override protected double computeMinHeight(double width) {
+        Insets insets = getInsets();
+        return insets.getLeft() + 100 + insets.getRight();
+    }
+
+    @Override protected double computePrefWidth(double height) {
+        Page page = pages.isEmpty() ? null : pages.getFirst();
+        if (page != null) {
+            Node n = page.getPageNode();
+            if (n != null) {
+                Insets insets = getInsets();
+                return insets.getLeft() + n.prefWidth(-1) + insets.getRight();
+            }
+        }
+        return 400;
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        double minHeight = minHeight(-1);
+        double maxHeight = maxHeight(-1);
+        double prefHeight = popoverHeight.get();
+        if (prefHeight == -1) {
+            Page page = pages.getFirst();
+            if (page != null) {
+                Insets inset = getInsets();
+                if (width == -1) {
+                    width = prefWidth(-1);
+                }
+                double contentWidth = width - inset.getLeft() - inset.getRight();
+                double contentHeight = page.getPageNode().prefHeight(contentWidth);
+                prefHeight = inset.getTop() + contentHeight + inset.getBottom();
+                popoverHeight.set(prefHeight);
+            } else {
+                prefHeight = minHeight;
+            }
+        }
+        return boundedSize(minHeight, prefHeight, maxHeight);
+    }
+
+    static double boundedSize(double min, double pref, double max) {
+        double a = pref >= min ? pref : min;
+        double b = min >= max ? min : max;
+        return a <= b ? a : b;
+    }
+
+    @Override protected double computeMaxWidth(double height) {
+        return Double.MAX_VALUE;
+    }
+
+    @Override protected double computeMaxHeight(double width) {
+        Scene scene = getScene();
+        if (scene != null) {
+            return scene.getHeight() - 100;
+        } else {
+            return Double.MAX_VALUE;
+        }
+    }
+
+    @Override protected void layoutChildren() {
+        if (maxPopupHeight == -1) {
+            maxPopupHeight = (int)getScene().getHeight()-100;
+        }
+        final Insets insets = getInsets();
+        final int width = (int)getWidth();
+        final int height = (int)getHeight();
+        final int top = (int)insets.getTop();
+        final int right = (int)insets.getRight();
+        final int bottom = (int)insets.getBottom();
+        final int left = (int)insets.getLeft();
+
+        int pageWidth = width - left - right;
+        int pageHeight = height - top - bottom;
+
+        backgroundRectangle.resizeRelocate(left, top, pageWidth, pageHeight);
+        frameBorder.resize(width, height);
+
+        pagesGroup.resizeRelocate(left, top, pageWidth, pageHeight);
+        pagesClipRect.setWidth(pageWidth);
+        pagesClipRect.setHeight(pageHeight);
+
+        int pageX = 0;
+        for (Node page : pagesGroup.getChildren()) {
+            page.resizeRelocate(pageX, 0, pageWidth, pageHeight);
+            pageX += pageWidth + PAGE_GAP;
+        }
+
+        int buttonHeight = (int)(leftButton.prefHeight(-1));
+        if (buttonHeight < 30) buttonHeight = 30;
+        final int buttonTop = (int)((top-buttonHeight)/2d);
+        final int leftButtonWidth = (int)(leftButton.prefWidth(-1)+0.5d);
+        leftButton.resizeRelocate(left, buttonTop,leftButtonWidth,buttonHeight);
+        final int rightButtonWidth = (int)(rightButton.prefWidth(-1)+0.5d);
+        rightButton.resizeRelocate(width-right-rightButtonWidth, buttonTop,rightButtonWidth,buttonHeight);
+
+        final double leftButtonRight = leftButton.isVisible() ? (left + leftButtonWidth) : left;
+        final double rightButtonLeft = rightButton.isVisible() ? (right + rightButtonWidth) : right;
+        titlesClipRect.setX(leftButtonRight);
+        titlesClipRect.setWidth(pageWidth - leftButtonRight - rightButtonLeft);
+        titlesClipRect.setHeight(top);
+
+        if (title != null) {
+            title.setTranslateY((int) (top / 2d));
+        }
+    }
+    
+    public final void clearPages() {
+        while (!pages.isEmpty()) {
+            pages.pop().handleHidden();
+        }
+        pagesGroup.getChildren().clear();
+        titlesGroup.getChildren().clear();
+        pagesClipRect.setX(0);
+        pagesClipRect.setWidth(400);
+        pagesClipRect.setHeight(400);
+        popoverHeight.set(400);
+        pagesGroup.setTranslateX(0);
+        titlesGroup.setTranslateX(0);
+        titlesClipRect.setTranslateX(0);
+    }
+    
+    public final void popPage() {
+        Page oldPage = pages.pop();
+        oldPage.handleHidden();
+        oldPage.setPopover(null);
+        Page page = pages.getFirst();
+        leftButton.setVisible(page.leftButtonText() != null);
+        leftButton.setText(page.leftButtonText());
+        rightButton.setVisible(page.rightButtonText() != null);
+        rightButton.setText(page.rightButtonText());
+        if (pages.size() > 0) {
+            final Insets insets = getInsets();
+            final int width = (int)prefWidth(-1);
+            final int right = (int)insets.getRight();
+            final int left = (int)insets.getLeft();
+            int pageWidth = width - left - right;
+            final int newPageX = (pageWidth+PAGE_GAP) * (pages.size()-1);
+            new Timeline(
+                    new KeyFrame(Duration.millis(350),
+                        new EventHandler<ActionEvent>() {
+                            @Override public void handle(ActionEvent t) {
+                                pagesGroup.setCache(false);
+                                pagesGroup.getChildren().remove(pagesGroup.getChildren().size()-1);
+                                titlesGroup.getChildren().remove(titlesGroup.getChildren().size()-1);
+                                resizePopoverToNewPage(pages.getFirst().getPageNode());
+                            }
+                        },
+                        new KeyValue(pagesGroup.translateXProperty(), -newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(titlesGroup.translateXProperty(), -newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(pagesClipRect.xProperty(), newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(titlesClipRect.translateXProperty(), newPageX, Interpolator.EASE_BOTH)
+                    )
+                ).play();
+        } else {
+            hide();
+        }
+    }
+    
+    public final void pushPage(final Page page) {
+        final Node pageNode = page.getPageNode();
+        pagesGroup.getChildren().add(pageNode);
+        final Insets insets = getInsets();
+        final int pageWidth = (int)(prefWidth(-1) - insets.getLeft() - insets.getRight());
+        final int newPageX = (pageWidth + PAGE_GAP) * pages.size();
+        leftButton.setVisible(page.leftButtonText() != null);
+        leftButton.setText(page.leftButtonText());
+        rightButton.setVisible(page.rightButtonText() != null);
+        rightButton.setText(page.rightButtonText());
+        
+        title = new Text(page.getPageTitle());
+        title.setFont(Theme.LARGE_FONT);
+        title.setFill(Color.WHITE);
+        title.setTextOrigin(VPos.CENTER);
+        title.setTranslateX(newPageX + (int) ((pageWidth - title.getLayoutBounds().getWidth()) / 2d));
+        titlesGroup.getChildren().add(title);
+        
+        if (!pages.isEmpty() && isVisible()) {
+            final Timeline timeline = new Timeline(
+                    new KeyFrame(Duration.millis(350),
+                        new EventHandler<ActionEvent>() {
+                            @Override public void handle(ActionEvent t) {
+                                pagesGroup.setCache(false);
+                                resizePopoverToNewPage(pageNode);
+                            }
+                        },
+                        new KeyValue(pagesGroup.translateXProperty(), -newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(titlesGroup.translateXProperty(), -newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(pagesClipRect.xProperty(), newPageX, Interpolator.EASE_BOTH),
+                        new KeyValue(titlesClipRect.translateXProperty(), newPageX, Interpolator.EASE_BOTH)
+                    )
+                );
+            timeline.play();
+        }
+        page.setPopover(this);
+        page.handleShown();
+        pages.push(page);
+    }
+    
+    private void resizePopoverToNewPage(final Node newPageNode) {
+        final Insets insets = getInsets();
+        final double width = prefWidth(-1);
+        final double contentWidth = width - insets.getLeft() - insets.getRight();
+        double h = newPageNode.prefHeight(contentWidth);
+        h += insets.getTop() + insets.getBottom();
+        new Timeline(
+            new KeyFrame(Duration.millis(200),
+                new KeyValue(popoverHeight, h, Interpolator.EASE_BOTH)
+            )
+        ).play();
+    }
+    
+    public void show(){
+        show(null);
+    }
+
+    private Animation fadeAnimation = null;
+
+    public void show(Runnable onHideCallback){
+        if (!isVisible() || fadeAnimation != null) {
+            this.onHideCallback = onHideCallback;
+            getScene().addEventFilter(MouseEvent.MOUSE_CLICKED, popoverHideHandler);
+//            getScene().addEventFilter(ScrollEvent.ANY,popoverScrollHandler);
+
+            if (fadeAnimation != null) {
+                fadeAnimation.stop();
+                setVisible(true); // for good measure
+            } else {
+                popoverHeight.set(-1);
+                setVisible(true);
+            }
+
+            FadeTransition fade = new FadeTransition(Duration.seconds(.1), this);
+            fade.setToValue(1.0);
+            fade.setOnFinished(new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent event) {
+                    fadeAnimation = null;
+                }
+            });
+
+            ScaleTransition scale = new ScaleTransition(Duration.seconds(.1), this);
+            scale.setToX(1);
+            scale.setToY(1);
+
+            ParallelTransition tx = new ParallelTransition(fade, scale);
+            fadeAnimation = tx;
+            tx.play();
+        }
+    }
+    
+    public void hide(){
+        if (isVisible() || fadeAnimation != null) {
+            getScene().removeEventFilter(MouseEvent.MOUSE_CLICKED, popoverHideHandler);
+//            getScene().removeEventFilter(ScrollEvent.ANY,popoverScrollHandler);
+
+            if (fadeAnimation != null) {
+                fadeAnimation.stop();
+            }
+
+            FadeTransition fade = new FadeTransition(Duration.seconds(.1), this);
+            fade.setToValue(0);
+            fade.setOnFinished(new EventHandler<ActionEvent>() {
+                @Override public void handle(ActionEvent event) {
+                    fadeAnimation = null;
+                    setVisible(false);
+                    clearPages();
+                    if (onHideCallback != null) onHideCallback.run();
+                }
+            });
+
+            ScaleTransition scale = new ScaleTransition(Duration.seconds(.1), this);
+            scale.setToX(.8);
+            scale.setToY(.8);
+
+            ParallelTransition tx = new ParallelTransition(fade, scale);
+            fadeAnimation = tx;
+            tx.play();
+        }
+    }
+    
+    /**
+     * Represents a page in a popover.
+     */
+    public static interface Page {
+        public void setPopover(Popover popover);
+        public Popover getPopover();
+
+        /**
+         * Get the node that represents the page.
+         * 
+         * @return the page node.
+         */
+        public Node getPageNode();
+        
+        /**
+         * Get the title to display for this page.
+         * 
+         * @return The page title
+         */
+        public String getPageTitle();
+
+        /**
+         * The text for left button, if null then button will be hidden.
+         */
+        public String leftButtonText();
+
+        /**
+         * Called on a click of the left button of the popover.
+         */
+        public void handleLeftButton();
+
+        /**
+         * The text for right button, if null then button will be hidden.
+         */
+        public String rightButtonText();
+
+        /**
+         * Called on a click of the right button of the popover.
+         */
+        public void handleRightButton();
+
+        public void handleShown();
+        public void handleHidden();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/PopoverBox.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import java.util.List;
+import javafx.collections.ObservableList;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
+import javafx.scene.layout.Region;
+
+/**
+ * Similar to the PopoverTreeList, but represents the content as an HBox of items rather
+ * than a ListView of items. This is a reasonable choice when there are a smaller number
+ * of items to display and virtualization is not required. Each item in the tree box looks like:
+ * <pre>
+ *   ---------------------------------------------------
+ *  | Item Name         [Optional Name of Next Page]  > |
+ *   ---------------------------------------------------
+ * </pre>
+ */
+public class PopoverBox<T> extends Region {
+    public final ObservableList<PopoverBoxItem<T>> getItems() {
+        return (ObservableList<PopoverBoxItem<T>>) (ObservableList) getChildren();
+    }
+
+    public PopoverBox() {
+        getStyleClass().setAll("popover-box");
+    }
+
+    @Override protected double computePrefHeight(double width) {
+        List<Node> children = getChildren();
+        double prefHeight = 0;
+        for (int i=0; i<children.size(); i++) {
+            Node child = children.get(i);
+            prefHeight += child.prefHeight(child.prefWidth(-1));
+        }
+
+        final Insets insets = getInsets();
+        return insets.getTop() + prefHeight + insets.getBottom();
+    }
+
+    @Override protected double computePrefWidth(double height) {
+        List<Node> children = getChildren();
+        double prefWidth = 0;
+        for (int i=0; i<children.size(); i++) {
+            Node child = children.get(i);
+            prefWidth = Math.max(prefWidth, child.prefWidth(-1));
+        }
+
+        final Insets insets = getInsets();
+        return insets.getLeft() + prefWidth + insets.getRight();
+    }
+
+    @Override protected void layoutChildren() {
+        final Insets insets = getInsets();
+        final double top = insets.getTop();
+        final double left = insets.getLeft();
+        final double width = getWidth() - left - insets.getRight();
+
+        List<Node> children = getChildren();
+        double y = top;
+        for (int i=0; i<children.size(); i++) {
+            Node child = children.get(i);
+            double h = child.prefHeight(width);
+            child.resizeRelocate((int)(left + .5), (int)(y + .5), (int)(width + .5), (int)(h + .5));
+            y += h;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/ConferenceScheduleApp/src/com/javafx/experiments/scheduleapp/control/PopoverBoxItem.java	Mon Oct 22 18:23:19 2012 -0700
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2008, 2012 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.javafx.experiments.scheduleapp.control;
+
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.scene.Node;
+import javafx.scene.layout.Region;
+
+// TODO really should just be a Cell, then it has Graphic etc for free
+public class PopoverBoxItem<T> extends Region {
+    private final ObjectProperty<T> item = new SimpleObjectProperty<T>(this, "item");
+    public final T getItem() { return item.get(); }
+    public final void setItem(T value) { item.set(value); }
+    public final ObjectProperty<T> itemProperty() { return item; }