See 09 widget, version 1.0rc3
authorivanl
Thu, 22 Oct 2009 15:52:58 +0100
changeset 19 f3521a11d878
parent 18 b73e6caf0031
child 20 918767a9c8d3
See 09 widget, version 1.0rc3
See09/.project
See09/Icon.png
See09/Info.plist
See09/WRTKit/Resources/CheckBox.png
See09/WRTKit/Resources/ContentPanelFoldIcons.png
See09/WRTKit/Resources/ControlAssemblyBackground.png
See09/WRTKit/Resources/DocumentBackground-old.png
See09/WRTKit/Resources/DocumentBackground.png
See09/WRTKit/Resources/FormButtonCenter.png
See09/WRTKit/Resources/FormButtonCenterLarge.png
See09/WRTKit/Resources/FormButtonLeft.png
See09/WRTKit/Resources/FormButtonLeftLarge.png
See09/WRTKit/Resources/FormButtonRight.png
See09/WRTKit/Resources/FormButtonRightLarge.png
See09/WRTKit/Resources/ListViewCaptionBackground.png
See09/WRTKit/Resources/NotificationPopupBackground.png
See09/WRTKit/Resources/NotificationPopupTypeIndicator.png
See09/WRTKit/Resources/ProgressBar0.png
See09/WRTKit/Resources/ProgressBar10.png
See09/WRTKit/Resources/ProgressBar100.png
See09/WRTKit/Resources/ProgressBar20.png
See09/WRTKit/Resources/ProgressBar30.png
See09/WRTKit/Resources/ProgressBar40.png
See09/WRTKit/Resources/ProgressBar50.png
See09/WRTKit/Resources/ProgressBar60.png
See09/WRTKit/Resources/ProgressBar70.png
See09/WRTKit/Resources/ProgressBar80.png
See09/WRTKit/Resources/ProgressBar90.png
See09/WRTKit/Resources/ProgressBarUnknown.gif
See09/WRTKit/Resources/RadioButton.png
See09/WRTKit/Resources/ScrollbarThumbBottom.png
See09/WRTKit/Resources/ScrollbarThumbMiddle.png
See09/WRTKit/Resources/ScrollbarThumbTop.png
See09/WRTKit/Resources/ScrollbarTrackBottom.png
See09/WRTKit/Resources/ScrollbarTrackMiddle.png
See09/WRTKit/Resources/ScrollbarTrackTop.png
See09/WRTKit/Resources/SeparatorCenter.png
See09/WRTKit/Resources/SeparatorLeft.png
See09/WRTKit/Resources/SeparatorRight.png
See09/WRTKit/Resources/Thumbs.db
See09/WRTKit/Resources/UI-large.css
See09/WRTKit/Resources/UI.css
See09/WRTKit/UI/ActionControl.js
See09/WRTKit/UI/Ajax.js
See09/WRTKit/UI/ContentPanel.js
See09/WRTKit/UI/Control.js
See09/WRTKit/UI/FormButton.js
See09/WRTKit/UI/ImageLabel.js
See09/WRTKit/UI/Label.js
See09/WRTKit/UI/ListView.js
See09/WRTKit/UI/NavigationButton.js
See09/WRTKit/UI/NotificationPopup.js
See09/WRTKit/UI/Scrollbar.js
See09/WRTKit/UI/SelectionControl.js
See09/WRTKit/UI/SelectionList.js
See09/WRTKit/UI/SelectionMenu.js
See09/WRTKit/UI/Separator.js
See09/WRTKit/UI/TextArea.js
See09/WRTKit/UI/TextEntryControl.js
See09/WRTKit/UI/TextField.js
See09/WRTKit/UI/TextPane.js
See09/WRTKit/UI/UIElement.js
See09/WRTKit/UI/UIInit.js
See09/WRTKit/UI/UIManager.js
See09/WRTKit/UI/View.js
See09/WRTKit/Utils/Logger.js
See09/WRTKit/WRTKit.js
See09/autoupdate.js
See09/blank.png
See09/day-icon.png
See09/day1.png
See09/day2.png
See09/home.png
See09/index.html
See09/logo.png
See09/main.js
See09/minilogo.png
See09/schedule-icon.png
See09/schedule-icon0.png
See09/schedule-icon1.png
See09/schedule-icon2.png
See09/schedule-icon3.png
See09/schedule.js
See09/schedule.png
See09/see09.csv
See09/session.js
See09/style.css
See09/trailz.png
See09/tweet.png
See09/tweetz-icon.png
See09/tweetz.png
See09/twitter.js
See09/utils.js
See09/venue.png
See09/venuelabel.png
See09/wrt_preview_frame.html
See09/wrt_preview_main.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/.project	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>See09</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.wrt.widgetPreviewBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.wrt.WidgetProjectNature</nature>
+		<nature>com.aptana.ide.project.nature.web</nature>
+	</natures>
+</projectDescription>
Binary file See09/Icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/Info.plist	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Nokia//DTD PLIST 1.0//EN" "http://www.nokia.com/DTDs/plist-1.0.dtd">
+<plist version="1.0">
+    <dict>
+        <key>DisplayName</key>
+        <string>SEE 2009</string>
+        <key>Identifier</key>
+        <string>com.symbian.see09.widget</string>
+        <key>Version</key>
+        <string>1.0</string>
+        <key>MainHTML</key>
+        <string>index.html</string>
+        <key>AllowNetworkAccess</key>
+        <true/>
+        <key>MiniViewEnabled</key>
+		<true/>
+    </dict>
+</plist>
\ No newline at end of file
Binary file See09/WRTKit/Resources/CheckBox.png has changed
Binary file See09/WRTKit/Resources/ContentPanelFoldIcons.png has changed
Binary file See09/WRTKit/Resources/ControlAssemblyBackground.png has changed
Binary file See09/WRTKit/Resources/DocumentBackground-old.png has changed
Binary file See09/WRTKit/Resources/DocumentBackground.png has changed
Binary file See09/WRTKit/Resources/FormButtonCenter.png has changed
Binary file See09/WRTKit/Resources/FormButtonCenterLarge.png has changed
Binary file See09/WRTKit/Resources/FormButtonLeft.png has changed
Binary file See09/WRTKit/Resources/FormButtonLeftLarge.png has changed
Binary file See09/WRTKit/Resources/FormButtonRight.png has changed
Binary file See09/WRTKit/Resources/FormButtonRightLarge.png has changed
Binary file See09/WRTKit/Resources/ListViewCaptionBackground.png has changed
Binary file See09/WRTKit/Resources/NotificationPopupBackground.png has changed
Binary file See09/WRTKit/Resources/NotificationPopupTypeIndicator.png has changed
Binary file See09/WRTKit/Resources/ProgressBar0.png has changed
Binary file See09/WRTKit/Resources/ProgressBar10.png has changed
Binary file See09/WRTKit/Resources/ProgressBar100.png has changed
Binary file See09/WRTKit/Resources/ProgressBar20.png has changed
Binary file See09/WRTKit/Resources/ProgressBar30.png has changed
Binary file See09/WRTKit/Resources/ProgressBar40.png has changed
Binary file See09/WRTKit/Resources/ProgressBar50.png has changed
Binary file See09/WRTKit/Resources/ProgressBar60.png has changed
Binary file See09/WRTKit/Resources/ProgressBar70.png has changed
Binary file See09/WRTKit/Resources/ProgressBar80.png has changed
Binary file See09/WRTKit/Resources/ProgressBar90.png has changed
Binary file See09/WRTKit/Resources/ProgressBarUnknown.gif has changed
Binary file See09/WRTKit/Resources/RadioButton.png has changed
Binary file See09/WRTKit/Resources/ScrollbarThumbBottom.png has changed
Binary file See09/WRTKit/Resources/ScrollbarThumbMiddle.png has changed
Binary file See09/WRTKit/Resources/ScrollbarThumbTop.png has changed
Binary file See09/WRTKit/Resources/ScrollbarTrackBottom.png has changed
Binary file See09/WRTKit/Resources/ScrollbarTrackMiddle.png has changed
Binary file See09/WRTKit/Resources/ScrollbarTrackTop.png has changed
Binary file See09/WRTKit/Resources/SeparatorCenter.png has changed
Binary file See09/WRTKit/Resources/SeparatorLeft.png has changed
Binary file See09/WRTKit/Resources/SeparatorRight.png has changed
Binary file See09/WRTKit/Resources/Thumbs.db has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/Resources/UI-large.css	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,940 @@
+	/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/******************************************************************************/
+/*        Definition of visuals for the WRTKit user interface toolkit         */
+/******************************************************************************/
+
+/* Fix for font size inheritance */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl,
+dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody,
+tfoot, thead, tr, th, td {
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+	outline: none;
+}
+
+
+/******************************************************************************/
+/* Document body rules */
+
+body {
+    margin: 0px;
+    background: url("DocumentBackground.png") repeat;  /* repeat-x fixed; */
+    font: normal 24px Arial, sans-serif;
+    color: rgb(0,0,0);
+}
+
+
+/******************************************************************************/
+/* Override default WRT styling for HTML form controls */
+
+/* Textarea when focused */
+textarea:focus {
+    outline: none;
+}
+
+/* Textarea when hovering */
+textarea:hover {
+    outline: none;
+}
+
+/* Select elements when focused */
+select:focus {
+    outline: none;
+}
+
+/* Select elements when hovering */
+select:hover {
+    outline: none;
+}
+
+/* Input elements when focused */
+input:focus {
+    outline: none;
+}
+
+/* Input elements when hovering */
+input:hover {
+    outline: none;
+}
+
+/* Link elements */
+a {
+    text-decoration: none;
+    color: rgb(0,0,0);
+}
+
+/* Links when focused */
+a:focus {
+    background: none;
+    outline: none;
+}
+
+/* Links when hovering */
+a:hover {
+    background: none;
+    outline: none;
+}
+
+
+/******************************************************************************/
+/* Rules for default view and document scrollbar containers */
+
+/* Default view container rules */
+.ViewContainer {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Default document scrollbar container rules */
+.DocumentScrollbarContainer {
+    position: fixed;
+    right: 0px;
+    top: 0px;
+    height: 100%;
+    width: 7px;
+}
+
+
+/******************************************************************************/
+/* View style rules */
+
+/* Rules for the list view */
+.ListView {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Rules for the list view caption */
+.ListViewCaption {
+    background: url("ListViewCaptionBackground.png") repeat;
+    height: 35px;
+}
+
+/* Rules for the list view caption text */
+.ListViewCaptionText {
+    background: url("ListViewCaptionBackground.png") repeat;
+	background-color: black;
+    font-size: 1.1em;  
+    font-weight: bold;
+    padding: 7px 0px 0px 3px;
+	color: #FFFFFF;
+}
+
+/* Rules for the list view control list element */
+.ListViewControlList {
+    margin: 1px 10px 1px 3px;
+}
+
+
+/******************************************************************************/
+/* Control style rules */
+
+/* Rules for control root element (rootElement) */
+.Control {
+	min-height: 60px;
+	height:auto !important;
+    height:60px; 
+}
+
+/* Control assembly rules (assemblyElement) */
+.ControlAssembly {
+    background: url("ControlAssemblyBackground.png") repeat-x; 
+    padding: 1px 5px;
+}
+
+/* Control assembly in normal state */
+.ControlAssemblyNormal {
+    background-position: 0px 0px;
+}
+
+/* Control assembly in focused state */
+.ControlAssemblyFocus {
+    background-position: 0px -250px;
+}
+
+/* Control assembly in hovering state */
+.ControlAssemblyHover {
+    background-position: 0px -500px;
+}
+
+/* Control assembly in disabled state */
+.ControlAssemblyDisabled {
+    background-position: 0px 0px;
+}
+
+/* Caption for controls (captionElement) */
+.ControlCaption {
+    font-weight: bold;
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption for controls in normal state */
+.ControlCaptionNormal {
+    
+}
+
+/* Caption for controls when focused */
+.ControlCaptionFocus {
+    color: rgb(0,0,0);
+}
+
+/* Caption for controls when hovering */
+.ControlCaptionHover {
+    
+}
+
+/* Caption for controls when disabled */
+.ControlCaptionDisabled {
+    color: rgb(125,125,125);
+}
+
+/* Control element rules (controlElement) */
+.ControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/******************************************************************************/
+/* Label */
+
+/* Rules for the text value of a Label control */
+.LabelText {
+    
+}
+
+/******************************************************************************/
+/* TextPane */
+
+/* Rules for the text value of a TextPane control */
+.TextPane {
+    background: rgb(255,255,255);
+    font: normal 14px Arial, sans-serif;
+}
+
+/******************************************************************************/
+/* ContentPanel */
+
+/* Caption area rules for non-foldable content panels */
+.ContentPanelCaptionNonFoldable {
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption area rules for foldable content panels */
+.ContentPanelCaptionFoldable {
+    padding: 4px 0px 3px 3px;
+}
+
+/* Rules for fold toggling element in content panel */
+.ContentPanelFoldToggle {
+    background: url("ContentPanelFoldIcons.png") no-repeat;
+    padding-left: 16px;
+}
+
+/* Collapsed fold */
+.ContentPanelFoldToggleCollapsed {
+    background-position: 0px 0px;
+}
+
+/* Expanded fold */
+.ContentPanelFoldToggleExpanded {
+    background-position: 0px -200px;
+}
+
+/* Rules for the content panel caption text */
+.ContentPanelCaptionText {
+    font-weight: bold;
+}
+
+/* Caption text for content panel in normal state */
+.ContentPanelCaptionTextNormal {
+    
+}
+
+/* Caption text for content panel when focused */
+.ContentPanelCaptionTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* Caption text for content panel when hovering */
+.ContentPanelCaptionTextHover {
+    
+}
+
+/* Caption text for content panel when disabled */
+.ContentPanelCaptionTextDisabled {
+    color: rgb(125,125,125);
+}
+
+/* Rules for content in the content panel */
+.ContentPanelContent {
+    padding: 2px 2px 2px 8px;
+}
+
+
+/******************************************************************************/
+/* FormButton */
+
+/* Rules for form button */
+.FormButton {
+    
+}
+
+/* Rules for form button control element */
+.FormButtonControlElement {
+    
+}
+
+/* Rules for form button table (table) */
+.FormButtonTable {
+    width: 100%;
+    border-spacing: 0px;
+    padding: 0px;
+    table-layout: fixed;
+}
+
+/* Form button row (tr) */
+.FormButtonRow {
+    padding: 0px;
+}
+
+/* Rules for form button left cell (td) */
+.FormButtonLeftCell {
+    width: 8px;
+    height: 60px;
+    background: url("FormButtonLeftLarge.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button center cell (td) */
+.FormButtonCenterCell {
+    height: 60px;
+    background: url("FormButtonCenterLarge.png") repeat-x;
+    padding: 0px;
+    vertical-align: middle;
+    text-align: center;
+}
+
+/* Rules for form button right cell (td) */
+.FormButtonRightCell {
+    width: 8px;
+    height: 60px;
+    background: url("FormButtonRightLarge.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonLeftCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonLeftCellFocus {
+    background-position: 0px -120px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonLeftCellHover {
+    background-position: 0px -240px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonLeftCellDisabled {
+    background-position: 0px -360px;
+}
+
+/* Rules for form button center cell in normal state (td) */
+.FormButtonCenterCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button center cell in focused state (td) */
+.FormButtonCenterCellFocus {
+    background-position: 0px -120px;
+}
+
+/* Rules for form button center cell in hover state (td) */
+.FormButtonCenterCellHover {
+    background-position: 0px -240px;
+}
+
+/* Rules for form button center cell in disabled state (td) */
+.FormButtonCenterCellDisabled {
+    background-position: 0px -360px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonRightCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonRightCellFocus {
+    background-position: 0px -120px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonRightCellHover {
+    background-position: 0px -240px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonRightCellDisabled {
+    background-position: 0px -360px;
+}
+
+/* Rules for form button text */
+.FormButtonText {
+    font-weight: bold;
+}
+
+/* Form button text in normal state */
+.FormButtonTextNormal {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when focused */
+.FormButtonTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when hovering */
+.FormButtonTextHover {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when disabled */
+.FormButtonTextDisabled {
+    color: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* NavigationButton */
+
+/* Rules for navigation button */
+.NavigationButton {
+    
+}
+
+/* Rules for navigation button control element */
+.NavigationButtonControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/* Rules for navigation button table (table) */
+.NavigationButtonTable {
+    border-spacing: 0px;
+    padding: 0px;
+}
+
+/* Navigation button row (tr) */
+.NavigationButtonRow {
+    padding: 0px;
+}
+
+/* Rules for navigation button image cell (td) */
+.NavigationButtonImageCell {
+    line-height: 1px;
+    font-size: 1px;
+    vertical-align: middle;
+}
+
+/* Rules for navigation button text cell (td) */
+.NavigationButtonTextCell {
+    vertical-align: middle;
+    padding: 0px;
+}
+
+/* Rules for navigation button image */
+.NavigationButtonImage {
+    padding: 0px 5px 0px 0px;
+}
+
+/* Rules for navigation button text */
+.NavigationButtonText {
+    font-weight: bold;
+}
+
+/* Navigation button text in normal state */
+.NavigationButtonTextNormal {
+    
+}
+
+/* Navigation button text when focused */
+.NavigationButtonTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* Navigation button text when hovering */
+.NavigationButtonTextHover {
+    
+}
+
+/* Navigation button text when disabled */
+.NavigationButtonTextDisabled {
+    color: rgb(125,125,125);
+}
+
+
+/******************************************************************************/
+/* TextField */
+
+/* Rules for textField */
+.TextField {
+    width: 100%;
+	min-height: 50px;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextField in normal state */
+.TextFieldNormal {
+    
+}
+
+/* TextField in focus state */
+.TextFieldFocus {
+    
+}
+
+/* TextField in hover state */
+.TextFieldHover {
+    
+}
+
+/* TextField in disabled state */
+.TextFieldDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* TextArea */
+
+/* Rules for TextArea */
+.TextArea {
+    width: 100%;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextArea in normal state */
+.TextAreaNormal {
+    
+}
+
+/* TextArea in focus state */
+.TextAreaFocus {
+    
+}
+
+/* TextArea in hover state */
+.TextAreaHover {
+    
+}
+
+/* TextArea in disabled state */
+.TextAreaDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* Separator */
+
+/* Rules for Separator (table) */
+.Separator {
+    width: 100%;
+    padding: 0px;
+    border-spacing: 0px;
+    table-layout: fixed;
+    margin: 3px 0px;
+}
+
+/* Separator row (tr) */
+.SeparatorRow {
+    padding: 0px;
+}
+
+/* Separator left cell (td) */
+.SeparatorLeftCell {
+    width: 5px;
+    height: 2px;
+    background: url("SeparatorLeft.png") no-repeat;
+    padding: 0px;
+}
+
+/* Separator center cell (td) */
+.SeparatorCenterCell {
+    height: 2px;
+    background: url("SeparatorCenter.png") repeat-x;
+    padding: 0px;
+}
+
+/* Separator right cell (td) */
+.SeparatorRightCell {
+    width: 6px;
+    height: 2px;
+    background: url("SeparatorRight.png") no-repeat;
+    padding: 0px;
+}
+
+
+/******************************************************************************/
+/* SelectionMenu */
+
+/* Rules for SelectionMenu select element */
+.SelectionMenu {
+    width: 100%;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* SelectionMenu in normal state */
+.SelectionMenuNormal {
+    
+}
+
+/* SelectionMenu in focus state */
+.SelectionMenuFocus {
+    
+}
+
+/* SelectionMenu in hover state */
+.SelectionMenuHover {
+    
+}
+
+/* SelectionMenu in disabled state */
+.SelectionMenuDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+/* Rules for SelectionMenu option elements */
+.SelectionMenuOption {
+	min-height: 60;
+    background: rgb(255,255,255);
+}
+
+/* SelectionMenu option in normal state */
+.SelectionMenuOptionNormal {
+    
+}
+
+/* SelectionMenu option in focus state */
+.SelectionMenuOptionFocus {
+    
+}
+
+/* SelectionMenu option in hover state */
+.SelectionMenuOptionHover {
+    
+}
+
+/* SelectionMenu option in disabled state */
+.SelectionMenuOptionDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* SelectionList */
+
+/* SelectionList option list element */
+.SelectionList {
+    
+}
+
+/* SelectionList option list element in normal state */
+.SelectionListNormal {
+    
+}
+
+/* SelectionList option list element in focus state */
+.SelectionListFocus {
+    
+}
+
+/* SelectionList option list element in hover state */
+.SelectionListHover {
+    
+}
+
+/* SelectionList option list element in disabled state */
+.SelectionListDisabled {
+    
+}
+
+/* SelectionList option element in single selection mode */
+.SelectionListOptionSingle {
+    padding-left: 19px;
+    background: url("RadioButton.png") no-repeat;
+    min-height: 50px;
+}
+
+/* SelectionList option element in single selection mode, unchecked normal state */
+.SelectionListOptionSingleUncheckedNormal {
+    background-position: 0px 10px;
+}
+
+/* SelectionList option element in single selection mode, unchecked focus state */
+.SelectionListOptionSingleUncheckedFocus {
+    background-position: 0px -40px;
+}
+
+/* SelectionList option element in single selection mode, unchecked diabled state */
+.SelectionListOptionSingleUncheckedDisabled {
+    background-position: 0px -90px;
+}
+
+/* SelectionList option element in single selection mode, checked normal state */
+.SelectionListOptionSingleCheckedNormal {
+    background-position: 0px -140px;
+}
+
+/* SelectionList option element in single selection mode, checked focus state */
+.SelectionListOptionSingleCheckedFocus {
+    background-position: 0px -190px;
+}
+
+/* SelectionList option element in single selection mode, checked diabled state */
+.SelectionListOptionSingleCheckedDisabled {
+    background-position: 0px -240px;
+}
+
+/* SelectionList option element in multi selection mode */
+.SelectionListOptionMulti {
+    padding-left: 19px;
+    background: url("CheckBox.png") no-repeat;
+    min-height: 50px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked normal state */
+.SelectionListOptionMultiUncheckedNormal {
+    background-position: 0px 0px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked focus state */
+.SelectionListOptionMultiUncheckedFocus {
+    background-position: 0px -50px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked diabled state */
+.SelectionListOptionMultiUncheckedDisabled {
+    background-position: 0px -100px;
+}
+
+/* SelectionList option element in multi selection mode, checked normal state */
+.SelectionListOptionMultiCheckedNormal {
+    background-position: 0px -150px;
+}
+
+/* SelectionList option element in multi selection mode, checked focus state */
+.SelectionListOptionMultiCheckedFocus {
+    background-position: 0px -200px;
+}
+
+/* SelectionList option element in multi selection mode, checked diabled state */
+.SelectionListOptionMultiCheckedDisabled {
+    background-position: 0px -250px;
+}
+
+/* SelectionList option text */
+.SelectionListOptionText {
+    
+}
+
+/* SelectionList option text in normal state */
+.SelectionListOptionTextNormal {
+    
+}
+
+/* SelectionList option text in focus state */
+.SelectionListOptionTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* SelectionList option text in hover state */
+.SelectionListOptionTextHover {
+    
+}
+
+/* SelectionList option text in disabled state */
+.SelectionListOptionTextDisabled {
+    color: rgb(125,125,125);
+}
+
+
+/******************************************************************************/
+/* Scrollbar */
+
+/* Scrollbar root element */
+.Scrollbar {
+    position: absolute;
+    height: 100%;
+    width: 7px;
+}
+
+/* Top portion of scrollbar track */
+.ScrollbarTrackTop {
+    position: absolute;
+    background: url("ScrollbarTrackTop.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Middle portion of scrollbar track */
+.ScrollbarTrackMiddle {
+    position: absolute;
+    background: url("ScrollbarTrackMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar track */
+.ScrollbarTrackBottom {
+    position: absolute;
+    background: url("ScrollbarTrackBottom.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Top portion of scrollbar thumb */
+.ScrollbarThumbTop {
+    position: absolute;
+    background: url("ScrollbarThumbTop.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+/* Middle portion of scrollbar thumb */
+.ScrollbarThumbMiddle {
+    position: absolute;
+    background: url("ScrollbarThumbMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar thumb */
+.ScrollbarThumbBottom {
+    position: absolute;
+    background: url("ScrollbarThumbBottom.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+
+/******************************************************************************/
+/* NotificationPopup */
+
+/* Container that defines the area for the popup dialog */
+.NotificationPopupContainer {
+    position: fixed;
+    bottom: 0px;
+    left: 50%;
+    margin-left: -115px;
+    width: 230px;
+    height: 85px;
+}
+
+/* Notification popup dialog */
+.NotificationPopup {
+    position: absolute;
+    width: 230px;
+    height: 85px;
+    background: url("NotificationPopupBackground.png") repeat-x;
+    border: 1px solid rgb(0,0,0);
+}
+
+/* Notification type indicator */
+.NotificationPopupTypeIndicator {
+    position: absolute;
+    left: 195px;
+    top: 10px;
+    width: 24px;
+    height: 34px;
+    background: url("NotificationPopupTypeIndicator.png") no-repeat;
+}
+
+/* Notification type indicator for notifications of undefined type */
+.NotificationPopupTypeIndicatorNone {
+    background-position: 0px 0px;
+}
+
+/* Notification type indicator for info notifications */
+.NotificationPopupTypeIndicatorInfo {
+    background-position: 0px -50px;
+}
+
+/* Notification type indicator for warning notifications */
+.NotificationPopupTypeIndicatorWarning {
+    background-position: 0px -100px;
+}
+
+/* Notification type indicator for wait notifications */
+.NotificationPopupTypeIndicatorWait {
+    background-position: 0px -150px;
+}
+
+/* Notification text area */
+.NotificationPopupText {
+    position: absolute;
+    left: 10px;
+    top: 8px;
+    width: 180px;
+    height: 50px;
+}
+
+/* Progress bar */
+.NotificationPopupProgressBar {
+    position: absolute;
+    left: 6px;
+    top: 60px;
+    width: 218px;
+    height: 16px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/Resources/UI.css	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,936 @@
+	/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+/******************************************************************************/
+/*        Definition of visuals for the WRTKit user interface toolkit         */
+/******************************************************************************/
+
+/* Fix for font size inheritance */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
+blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl,
+dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody,
+tfoot, thead, tr, th, td {
+    font-weight: inherit;
+    font-style: inherit;
+    font-size: 100%;
+    font-family: inherit;
+	outline: none;
+}
+
+
+/******************************************************************************/
+/* Document body rules */
+
+body {
+    margin: 0px;
+    background: url("DocumentBackground.png") repeat;  /* repeat-x fixed; */
+    font: normal 14px Arial, sans-serif;
+    color: rgb(0,0,0);
+}
+
+
+/******************************************************************************/
+/* Override default WRT styling for HTML form controls */
+
+/* Textarea when focused */
+textarea:focus {
+    outline: none;
+}
+
+/* Textarea when hovering */
+textarea:hover {
+    outline: none;
+}
+
+/* Select elements when focused */
+select:focus {
+    outline: none;
+}
+
+/* Select elements when hovering */
+select:hover {
+    outline: none;
+}
+
+/* Input elements when focused */
+input:focus {
+    outline: none;
+}
+
+/* Input elements when hovering */
+input:hover {
+    outline: none;
+}
+
+/* Link elements */
+a {
+    text-decoration: none;
+    color: rgb(0,0,0);
+}
+
+/* Links when focused */
+a:focus {
+    background: none;
+    outline: none;
+}
+
+/* Links when hovering */
+a:hover {
+    background: none;
+    outline: none;
+}
+
+
+/******************************************************************************/
+/* Rules for default view and document scrollbar containers */
+
+/* Default view container rules */
+.ViewContainer {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Default document scrollbar container rules */
+.DocumentScrollbarContainer {
+    position: fixed;
+    right: 0px;
+    top: 0px;
+    height: 100%;
+    width: 7px;
+}
+
+
+/******************************************************************************/
+/* View style rules */
+
+/* Rules for the list view */
+.ListView {
+    margin: 0px 0px 0px 0px;
+}
+
+/* Rules for the list view caption */
+.ListViewCaption {
+    background: url("ListViewCaptionBackground.png") repeat;
+    height: 35px;
+}
+
+/* Rules for the list view caption text */
+.ListViewCaptionText {
+    background: url("ListViewCaptionBackground.png") repeat;
+	background-color: black;
+    font-size: 1.2em;
+    font-weight: bold;
+    padding: 7px 0px 0px 2px;
+	color: #FFFFFF;
+}
+
+/* Rules for the list view control list element */
+.ListViewControlList {
+    margin: 1px 10px 1px 3px;
+}
+
+
+/******************************************************************************/
+/* Control style rules */
+
+/* Rules for control root element (rootElement) */
+.Control {
+
+}
+
+/* Control assembly rules (assemblyElement) */
+.ControlAssembly {
+    background: url("ControlAssemblyBackground.png") repeat-x; 
+    padding: 1px 5px;
+}
+
+/* Control assembly in normal state */
+.ControlAssemblyNormal {
+    background-position: 0px 0px;
+}
+
+/* Control assembly in focused state */
+.ControlAssemblyFocus {
+    background-position: 0px -250px;
+}
+
+/* Control assembly in hovering state */
+.ControlAssemblyHover {
+    background-position: 0px -500px;
+}
+
+/* Control assembly in disabled state */
+.ControlAssemblyDisabled {
+    background-position: 0px 0px;
+}
+
+/* Caption for controls (captionElement) */
+.ControlCaption {
+    font-weight: bold;
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption for controls in normal state */
+.ControlCaptionNormal {
+    
+}
+
+/* Caption for controls when focused */
+.ControlCaptionFocus {
+    color: rgb(0,0,0);
+}
+
+/* Caption for controls when hovering */
+.ControlCaptionHover {
+    
+}
+
+/* Caption for controls when disabled */
+.ControlCaptionDisabled {
+    color: rgb(125,125,125);
+}
+
+/* Control element rules (controlElement) */
+.ControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/******************************************************************************/
+/* Label */
+
+/* Rules for the text value of a Label control */
+.LabelText {
+    
+}
+
+/******************************************************************************/
+/* TextPane */
+
+/* Rules for the text value of a TextPane control */
+.TextPane {
+    background: rgb(255,255,255);
+    font: normal 14px Arial, sans-serif;
+}
+
+/******************************************************************************/
+/* ContentPanel */
+
+/* Caption area rules for non-foldable content panels */
+.ContentPanelCaptionNonFoldable {
+    padding: 3px 0px 0px 3px;
+}
+
+/* Caption area rules for foldable content panels */
+.ContentPanelCaptionFoldable {
+    padding: 4px 0px 3px 3px;
+}
+
+/* Rules for fold toggling element in content panel */
+.ContentPanelFoldToggle {
+    background: url("ContentPanelFoldIcons.png") no-repeat;
+    padding-left: 16px;
+}
+
+/* Collapsed fold */
+.ContentPanelFoldToggleCollapsed {
+    background-position: 0px 0px;
+}
+
+/* Expanded fold */
+.ContentPanelFoldToggleExpanded {
+    background-position: 0px -200px;
+}
+
+/* Rules for the content panel caption text */
+.ContentPanelCaptionText {
+    font-weight: bold;
+}
+
+/* Caption text for content panel in normal state */
+.ContentPanelCaptionTextNormal {
+    
+}
+
+/* Caption text for content panel when focused */
+.ContentPanelCaptionTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* Caption text for content panel when hovering */
+.ContentPanelCaptionTextHover {
+    
+}
+
+/* Caption text for content panel when disabled */
+.ContentPanelCaptionTextDisabled {
+    color: rgb(125,125,125);
+}
+
+/* Rules for content in the content panel */
+.ContentPanelContent {
+    padding: 2px 2px 2px 8px;
+}
+
+
+/******************************************************************************/
+/* FormButton */
+
+/* Rules for form button */
+.FormButton {
+    
+}
+
+/* Rules for form button control element */
+.FormButtonControlElement {
+    
+}
+
+/* Rules for form button table (table) */
+.FormButtonTable {
+    width: 100%;
+    border-spacing: 0px;
+    padding: 0px;
+    table-layout: fixed;
+}
+
+/* Form button row (tr) */
+.FormButtonRow {
+    padding: 0px;
+}
+
+/* Rules for form button left cell (td) */
+.FormButtonLeftCell {
+    width: 8px;
+    height: 26px;
+    background: url("FormButtonLeft.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button center cell (td) */
+.FormButtonCenterCell {
+    height: 26px;
+    background: url("FormButtonCenter.png") repeat-x;
+    padding: 0px;
+    vertical-align: middle;
+    text-align: center;
+}
+
+/* Rules for form button right cell (td) */
+.FormButtonRightCell {
+    width: 8px;
+    height: 26px;
+    background: url("FormButtonRight.png") no-repeat;
+    padding: 0px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonLeftCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonLeftCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonLeftCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonLeftCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button center cell in normal state (td) */
+.FormButtonCenterCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button center cell in focused state (td) */
+.FormButtonCenterCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button center cell in hover state (td) */
+.FormButtonCenterCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button center cell in disabled state (td) */
+.FormButtonCenterCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button left cell in normal state (td) */
+.FormButtonRightCellNormal {
+    background-position: 0px 0px;
+}
+
+/* Rules for form button left cell in focused state (td) */
+.FormButtonRightCellFocus {
+    background-position: 0px -50px;
+}
+
+/* Rules for form button left cell in hover state (td) */
+.FormButtonRightCellHover {
+    background-position: 0px -100px;
+}
+
+/* Rules for form button left cell in disabled state (td) */
+.FormButtonRightCellDisabled {
+    background-position: 0px -150px;
+}
+
+/* Rules for form button text */
+.FormButtonText {
+    font-weight: bold;
+}
+
+/* Form button text in normal state */
+.FormButtonTextNormal {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when focused */
+.FormButtonTextFocus {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when hovering */
+.FormButtonTextHover {
+    color: rgb(255,255,255);
+}
+
+/* Form button text when disabled */
+.FormButtonTextDisabled {
+    color: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* NavigationButton */
+
+/* Rules for navigation button */
+.NavigationButton {
+    
+}
+
+/* Rules for navigation button control element */
+.NavigationButtonControlElement {
+    padding: 3px 3px 3px 3px;
+}
+
+/* Rules for navigation button table (table) */
+.NavigationButtonTable {
+    border-spacing: 0px;
+    padding: 0px;
+}
+
+/* Navigation button row (tr) */
+.NavigationButtonRow {
+    padding: 0px;
+}
+
+/* Rules for navigation button image cell (td) */
+.NavigationButtonImageCell {
+    line-height: 1px;
+    font-size: 1px;
+    vertical-align: middle;
+}
+
+/* Rules for navigation button text cell (td) */
+.NavigationButtonTextCell {
+    vertical-align: middle;
+    padding: 0px;
+}
+
+/* Rules for navigation button image */
+.NavigationButtonImage {
+    padding: 0px 5px 0px 0px;
+}
+
+/* Rules for navigation button text */
+.NavigationButtonText {
+    font-weight: bold;
+}
+
+/* Navigation button text in normal state */
+.NavigationButtonTextNormal {
+    
+}
+
+/* Navigation button text when focused */
+.NavigationButtonTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* Navigation button text when hovering */
+.NavigationButtonTextHover {
+    
+}
+
+/* Navigation button text when disabled */
+.NavigationButtonTextDisabled {
+    color: rgb(125,125,125);
+}
+
+
+/******************************************************************************/
+/* TextField */
+
+/* Rules for textField */
+.TextField {
+    width: 100%;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextField in normal state */
+.TextFieldNormal {
+    
+}
+
+/* TextField in focus state */
+.TextFieldFocus {
+    
+}
+
+/* TextField in hover state */
+.TextFieldHover {
+    
+}
+
+/* TextField in disabled state */
+.TextFieldDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* TextArea */
+
+/* Rules for TextArea */
+.TextArea {
+    width: 100%;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* TextArea in normal state */
+.TextAreaNormal {
+    
+}
+
+/* TextArea in focus state */
+.TextAreaFocus {
+    
+}
+
+/* TextArea in hover state */
+.TextAreaHover {
+    
+}
+
+/* TextArea in disabled state */
+.TextAreaDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* Separator */
+
+/* Rules for Separator (table) */
+.Separator {
+    width: 100%;
+    padding: 0px;
+    border-spacing: 0px;
+    table-layout: fixed;
+    margin: 3px 0px;
+}
+
+/* Separator row (tr) */
+.SeparatorRow {
+    padding: 0px;
+}
+
+/* Separator left cell (td) */
+.SeparatorLeftCell {
+    width: 5px;
+    height: 2px;
+    background: url("SeparatorLeft.png") no-repeat;
+    padding: 0px;
+}
+
+/* Separator center cell (td) */
+.SeparatorCenterCell {
+    height: 2px;
+    background: url("SeparatorCenter.png") repeat-x;
+    padding: 0px;
+}
+
+/* Separator right cell (td) */
+.SeparatorRightCell {
+    width: 6px;
+    height: 2px;
+    background: url("SeparatorRight.png") no-repeat;
+    padding: 0px;
+}
+
+
+/******************************************************************************/
+/* SelectionMenu */
+
+/* Rules for SelectionMenu select element */
+.SelectionMenu {
+    width: 100%;
+    border: 1px solid rgb(0,0,0);
+    background: rgb(255,255,255);
+    margin: 0px 0px 3px 0px;
+}
+
+/* SelectionMenu in normal state */
+.SelectionMenuNormal {
+    
+}
+
+/* SelectionMenu in focus state */
+.SelectionMenuFocus {
+    
+}
+
+/* SelectionMenu in hover state */
+.SelectionMenuHover {
+    
+}
+
+/* SelectionMenu in disabled state */
+.SelectionMenuDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+/* Rules for SelectionMenu option elements */
+.SelectionMenuOption {
+    background: rgb(255,255,255);
+}
+
+/* SelectionMenu option in normal state */
+.SelectionMenuOptionNormal {
+    
+}
+
+/* SelectionMenu option in focus state */
+.SelectionMenuOptionFocus {
+    
+}
+
+/* SelectionMenu option in hover state */
+.SelectionMenuOptionHover {
+    
+}
+
+/* SelectionMenu option in disabled state */
+.SelectionMenuOptionDisabled {
+    color: rgb(50,50,50);
+    background: rgb(200,200,200);
+}
+
+
+/******************************************************************************/
+/* SelectionList */
+
+/* SelectionList option list element */
+.SelectionList {
+    
+}
+
+/* SelectionList option list element in normal state */
+.SelectionListNormal {
+    
+}
+
+/* SelectionList option list element in focus state */
+.SelectionListFocus {
+    
+}
+
+/* SelectionList option list element in hover state */
+.SelectionListHover {
+    
+}
+
+/* SelectionList option list element in disabled state */
+.SelectionListDisabled {
+    
+}
+
+/* SelectionList option element in single selection mode */
+.SelectionListOptionSingle {
+    padding-left: 19px;
+    background: url("RadioButton.png") no-repeat;
+    height: 25px;
+}
+
+/* SelectionList option element in single selection mode, unchecked normal state */
+.SelectionListOptionSingleUncheckedNormal {
+    background-position: 0px 0px;
+}
+
+/* SelectionList option element in single selection mode, unchecked focus state */
+.SelectionListOptionSingleUncheckedFocus {
+    background-position: 0px -50px;
+}
+
+/* SelectionList option element in single selection mode, unchecked diabled state */
+.SelectionListOptionSingleUncheckedDisabled {
+    background-position: 0px -100px;
+}
+
+/* SelectionList option element in single selection mode, checked normal state */
+.SelectionListOptionSingleCheckedNormal {
+    background-position: 0px -150px;
+}
+
+/* SelectionList option element in single selection mode, checked focus state */
+.SelectionListOptionSingleCheckedFocus {
+    background-position: 0px -200px;
+}
+
+/* SelectionList option element in single selection mode, checked diabled state */
+.SelectionListOptionSingleCheckedDisabled {
+    background-position: 0px -250px;
+}
+
+/* SelectionList option element in multi selection mode */
+.SelectionListOptionMulti {
+    padding-left: 19px;
+    background: url("CheckBox.png") no-repeat;
+    height: 25px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked normal state */
+.SelectionListOptionMultiUncheckedNormal {
+    background-position: 0px 0px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked focus state */
+.SelectionListOptionMultiUncheckedFocus {
+    background-position: 0px -50px;
+}
+
+/* SelectionList option element in multi selection mode, unchecked diabled state */
+.SelectionListOptionMultiUncheckedDisabled {
+    background-position: 0px -100px;
+}
+
+/* SelectionList option element in multi selection mode, checked normal state */
+.SelectionListOptionMultiCheckedNormal {
+    background-position: 0px -150px;
+}
+
+/* SelectionList option element in multi selection mode, checked focus state */
+.SelectionListOptionMultiCheckedFocus {
+    background-position: 0px -200px;
+}
+
+/* SelectionList option element in multi selection mode, checked diabled state */
+.SelectionListOptionMultiCheckedDisabled {
+    background-position: 0px -250px;
+}
+
+/* SelectionList option text */
+.SelectionListOptionText {
+    
+}
+
+/* SelectionList option text in normal state */
+.SelectionListOptionTextNormal {
+    
+}
+
+/* SelectionList option text in focus state */
+.SelectionListOptionTextFocus {
+    color: rgb(0,0,0);
+}
+
+/* SelectionList option text in hover state */
+.SelectionListOptionTextHover {
+    
+}
+
+/* SelectionList option text in disabled state */
+.SelectionListOptionTextDisabled {
+    color: rgb(125,125,125);
+}
+
+
+/******************************************************************************/
+/* Scrollbar */
+
+/* Scrollbar root element */
+.Scrollbar {
+    position: absolute;
+    height: 100%;
+    width: 7px;
+}
+
+/* Top portion of scrollbar track */
+.ScrollbarTrackTop {
+    position: absolute;
+    background: url("ScrollbarTrackTop.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Middle portion of scrollbar track */
+.ScrollbarTrackMiddle {
+    position: absolute;
+    background: url("ScrollbarTrackMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar track */
+.ScrollbarTrackBottom {
+    position: absolute;
+    background: url("ScrollbarTrackBottom.png") no-repeat;
+    width: 7px;
+    height: 4px;
+}
+
+/* Top portion of scrollbar thumb */
+.ScrollbarThumbTop {
+    position: absolute;
+    background: url("ScrollbarThumbTop.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+/* Middle portion of scrollbar thumb */
+.ScrollbarThumbMiddle {
+    position: absolute;
+    background: url("ScrollbarThumbMiddle.png") repeat-y;
+    width: 7px;
+}
+
+/* Bottom portion of scrollbar thumb */
+.ScrollbarThumbBottom {
+    position: absolute;
+    background: url("ScrollbarThumbBottom.png") no-repeat;
+    width: 7px;
+    height: 5px;
+}
+
+
+/******************************************************************************/
+/* NotificationPopup */
+
+/* Container that defines the area for the popup dialog */
+.NotificationPopupContainer {
+    position: fixed;
+    bottom: 0px;
+    left: 50%;
+    margin-left: -115px;
+    width: 230px;
+    height: 85px;
+}
+
+/* Notification popup dialog */
+.NotificationPopup {
+    position: absolute;
+    width: 230px;
+    height: 85px;
+    background: url("NotificationPopupBackground.png") repeat-x;
+    border: 1px solid rgb(0,0,0);
+}
+
+/* Notification type indicator */
+.NotificationPopupTypeIndicator {
+    position: absolute;
+    left: 195px;
+    top: 10px;
+    width: 24px;
+    height: 34px;
+    background: url("NotificationPopupTypeIndicator.png") no-repeat;
+}
+
+/* Notification type indicator for notifications of undefined type */
+.NotificationPopupTypeIndicatorNone {
+    background-position: 0px 0px;
+}
+
+/* Notification type indicator for info notifications */
+.NotificationPopupTypeIndicatorInfo {
+    background-position: 0px -50px;
+}
+
+/* Notification type indicator for warning notifications */
+.NotificationPopupTypeIndicatorWarning {
+    background-position: 0px -100px;
+}
+
+/* Notification type indicator for wait notifications */
+.NotificationPopupTypeIndicatorWait {
+    background-position: 0px -150px;
+}
+
+/* Notification text area */
+.NotificationPopupText {
+    position: absolute;
+    left: 10px;
+    top: 8px;
+    width: 180px;
+    height: 50px;
+}
+
+/* Progress bar */
+.NotificationPopupProgressBar {
+    position: absolute;
+    left: 6px;
+    top: 60px;
+    width: 218px;
+    height: 16px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/ActionControl.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,144 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (ÒNokiaÓ) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under NokiaÕs copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ActionControl class is an abstract base class for action controls like
+// buttons. Don't use ActionControl directly.
+
+// Constructor.
+function ActionControl(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// ActionControl inherits from Control.
+ActionControl.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the button element.
+ActionControl.prototype.buttonElement = null;
+
+// Reference to the link element.
+ActionControl.prototype.linkElement = null;
+
+// Enabled status.
+ActionControl.prototype.enabled = false;
+
+// Initializer - called from constructor.
+ActionControl.prototype.init = function(id, caption) {
+    uiLogger.debug("ActionControl.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+}
+
+// Common event listeners hookup function called from subclasses.
+ActionControl.prototype.bindActionControlListeners = function() {
+    var self = this;
+    this.linkElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.linkElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.buttonElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.buttonElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.buttonElement.addEventListener("mousedown", function(event) {
+                                                       self.controlClicked(event);
+                                                       event.stopPropagation();
+                                                       event.preventDefault();
+                                                   }, true);
+    this.buttonElement.addEventListener("keydown", function(event) {
+                                                    // center and enter trigger the action
+                                                    if (event.keyCode == 0 || event.keyCode == 13) {
+                                                        self.controlClicked();
+                                                        event.stopPropagation();
+                                                        event.preventDefault();
+                                                    }
+                                                 }, true);
+}
+
+// Returns the enabled state.
+ActionControl.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+ActionControl.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("ActionControl.setEnabled(" + enabled + ")");
+    // switch the state
+    this.enabled = enabled;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+ActionControl.prototype.setFocused = function(focused) {
+    uiLogger.debug("ActionControl.setFocused(" + focused + ")");
+    if (this.enabled) {
+        if (focused) {
+            this.linkElement.focus();
+        } else {
+            this.linkElement.blur();
+        }
+    }
+}
+
+// Callback for clicks.
+ActionControl.prototype.controlClicked = function(event) {
+    uiLogger.debug("ActionControl.controlClicked()");
+    
+    // if we're enabled then a click results in an action performed event
+    if (this.enabled) {
+        // focus when clicked
+        if (!this.focused) {
+            this.linkElement.focus();
+        }
+        
+        // notify event listeners
+        this.actionPerformed(event);
+    }
+}
+
+// Callback for action performed events.
+ActionControl.prototype.actionPerformed = function(event) {
+    uiLogger.debug("ActionControl.actionPerformed()");
+    // notify event listeners
+    this.fireEvent(this.createEvent("ActionPerformed", event));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/Ajax.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,103 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// Ajax utility calss to create XmlHttpRequest object
+function Ajax() 
+{
+	//	xmlHttpRequest object	
+	var request = null;
+
+    // branch for native XMLHttpRequest object
+    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
+    	try 
+		{
+			request = new XMLHttpRequest();
+			try
+			{
+				//	attach the Bypass code, if the browser is firefox
+				if(netscape.security.PrivilegeManager.enablePrivilege)
+				{
+					//	duplicate the function
+					request._open = request.open;
+					
+					//	redefine the function definition
+					request.open = function(method, url, flag)
+					{
+						try
+						{
+							// Enable Universal Browser Read
+							netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+
+							//	call the native XmlHttpRequest.open method
+							this._open(method, url, flag);
+						}catch(e)
+						{
+							//	call the native XmlHttpRequest.open method
+							this._open(method, url, flag);
+						}
+					}
+				}
+			}
+			catch(e)
+			{
+				//	eatup all exceptions
+			}
+		} 
+		catch(e) {
+			request = null;
+        }
+    // branch for IE/Windows ActiveX version
+    } else if(window.ActiveXObject) {
+       	try {
+        	request = new ActiveXObject("Msxml2.XMLHTTP");
+      	} catch(e) {
+        	try {
+          		request = new ActiveXObject("Microsoft.XMLHTTP");
+        	} catch(e) {
+          		alert('Failed to create XmlHttprequest');
+				return null;
+        	}
+		}
+    }
+	
+	return (request);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/ContentPanel.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,368 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ContentPanel class is a control for displaying content. The panel
+// can be expanded and collapsed.
+
+// Constructor.
+function ContentPanel(id, caption, content, foldable, expanded) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, content, foldable, expanded);
+    }
+}
+
+// ContentPanel inherits from Control.
+ContentPanel.prototype = new Control(UI_NO_INIT_ID);
+
+// The element hierarchy in a content panel is as follows:
+//
+// rootElement
+//     assemblyElement
+//         captionElement
+//             foldToggleElement
+//                 captionLinkElement
+//                     captionTextElement
+//     contentElement
+//
+// captionTextElement is moved under foldToggleElement if disabled
+// or captionElement if not foldable
+
+// The fold toggle element used for folding content panels.
+ContentPanel.prototype.foldToggleElement = null;
+
+// The caption link element of this control.
+ContentPanel.prototype.captionLinkElement = null;
+
+// The caption text element of this control.
+ContentPanel.prototype.captionTextElement = null;
+
+// The content element of this control.
+ContentPanel.prototype.contentElement = null;
+
+// The foldable state of this control.
+ContentPanel.prototype.foldable = false;
+
+// The expanded state of this control.
+ContentPanel.prototype.expanded = false;
+
+// Enabled status.
+ContentPanel.prototype.enabled = false;
+
+// Initializer - called from constructor.
+ContentPanel.prototype.init = function(id, caption, content, foldable, expanded) {
+    uiLogger.debug("ContentPanel.init(" + id + ", " + caption + ", " + content + ", " + foldable + ", " + expanded + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+    
+    // create caption text element
+    this.captionTextElement = document.createElement("span");
+    
+    // disconnect the control element
+    this.assemblyElement.removeChild(this.controlElement);
+    
+    // set the foldable state
+    this.foldable = foldable;
+    
+    // is this a foldable content panel?
+    if (foldable) {
+        // create fold toggle element
+        this.foldToggleElement = document.createElement("div");
+        this.captionElement.appendChild(this.foldToggleElement);
+        
+        // create caption link and add to caption element
+        this.captionLinkElement = document.createElement("a");
+        this.captionLinkElement.href = "JavaScript:void(0)";
+        this.foldToggleElement.appendChild(this.captionLinkElement);
+        
+        // add the text element to the link element
+        this.captionLinkElement.appendChild(this.captionTextElement);
+        
+        // bind event listeners
+        var self = this;
+        this.captionLinkElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+        this.captionLinkElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+        this.foldToggleElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+        this.foldToggleElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+        this.foldToggleElement.addEventListener("mousedown", function(event) {
+                                                                 self.captionClicked();
+                                                                 event.stopPropagation();
+                                                                 event.preventDefault();
+                                                             }, true);
+        this.foldToggleElement.addEventListener("keydown", function(event) {
+                                                               // center and enter trigger the action
+                                                               if (event.keyCode == 0 || event.keyCode == 13) {
+                                                                   self.captionClicked();
+                                                                   event.stopPropagation();
+                                                                   event.preventDefault();
+                                                               }
+                                                           }, true);
+        
+        this.expanded = expanded;
+    } else {
+        // since this is not a foldable panel the content should be expanded
+        this.expanded = true;
+        
+        // add the text element directly to the caption element
+        this.captionElement.appendChild(this.captionTextElement);
+    }
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.contentElement.style.display = this.expanded ? "block" : "none";
+    this.rootElement.appendChild(this.contentElement);
+    
+    // set caption, content and expanded state
+    this.setCaption(caption);
+    this.setContent(content);
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the enabled state.
+ContentPanel.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+ContentPanel.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("ContentPanel.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    // is this a foldable content?
+    if (this.foldable) {
+         // the caption link must be disabled
+        if (this.enabled) {
+            // diabled -> enabled
+            this.foldToggleElement.removeChild(this.captionTextElement);
+            this.foldToggleElement.appendChild(this.captionLinkElement);
+            this.captionLinkElement.appendChild(this.captionTextElement);
+        } else {
+            // enabled -> diabled
+            this.captionLinkElement.removeChild(this.captionTextElement);
+            this.foldToggleElement.removeChild(this.captionLinkElement);
+            this.foldToggleElement.appendChild(this.captionTextElement);
+        }
+    }
+    
+    // update style
+    this.updateStyleFromState();    
+}
+
+// Returns the caption; null if none.
+ContentPanel.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+ContentPanel.prototype.setCaption = function(caption) {
+    // bail out if the caption text element has not been created
+    // this is to prevent the superclass init calling this before
+    // we've initialized our custom caption
+    if (this.captionTextElement == null)
+        return;
+    
+    uiLogger.debug("ContentPanel.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionTextElement.innerHTML = (caption == null) ? "" : caption;
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the content.
+ContentPanel.prototype.getContent = function() {
+    return this.contentElement.innerHTML;
+}
+
+// Sets the content.
+ContentPanel.prototype.setContent = function(content) {
+    uiLogger.debug("ContentPanel.setContent(" + content + ")");
+    this.contentElement.innerHTML = (content == null) ? "" : content;
+}
+
+// Returns the focusable state for the control.
+ContentPanel.prototype.isFocusable = function() {
+    // a content panel is focusable if it's foldable and enabled
+    return (this.foldable && this.enabled);
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+ContentPanel.prototype.setFocused = function(focused) {
+    uiLogger.debug("ContentPanel.setFocused(" + focused + ")");
+    if (this.enabled && this.foldable) {
+        if (focused) {
+            this.captionLinkElement.focus();
+        } else {
+            this.captionLinkElement.blur();
+        }
+    }
+    // note that this.focused gets set as a result of focusStateChanged() being called
+    // rather than setting it explicitly here
+}
+
+// Returns the expanded state.
+ContentPanel.prototype.isExpanded = function() {
+    return this.expanded;
+}
+
+// Sets the expanded state.
+ContentPanel.prototype.setExpanded = function(expanded) {
+    uiLogger.debug("ContentPanel.setExpanded(" + expanded + ")");
+    
+    // make sure only foldable content panels are folded
+    if (!this.foldable) {
+        uiLogger.warn("Cannot fold a non-foldable content panel!");
+        return;
+    }
+    
+    this.expanded = expanded;
+    if (this.expanded) {
+        // expand
+        this.contentElement.style.display = "block";
+        
+        // find out control top and bottom
+        var controlTop = this.getAbsoluteTop(this.rootElement);
+        var controlHeight = this.rootElement.clientHeight;
+        var controlBottom = controlTop + controlHeight;
+        
+        // find out the viewport top and bottom
+        var viewportTop = window.scrollY;
+        var viewportHeight = window.innerHeight;
+        var viewportBottom = viewportTop + viewportHeight;
+        
+        // make sure the control is positioned so that it can be seen
+        var overflow = controlBottom - viewportBottom;
+        if (overflow > 0) {
+            // there's overflow so we need to scroll to get the control
+            // into the viewport - however not so far that the control
+            // goes past the viewport top.
+            var distanceToTop = controlTop - viewportTop;
+            var scrollAmount = Math.min(overflow, distanceToTop);
+            window.scrollBy(0, scrollAmount);
+        }
+    } else {
+        // collapse
+        this.contentElement.style.display = "none";
+    }
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("ExpandedStateChanged", this.expanded));
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the absolute position (y) of the given element.
+ContentPanel.prototype.getAbsoluteTop = function(element) {
+    // traverse from element to root and add top-offset
+    // for each element we find on the way
+    var absTop = 0;
+    while (element != null) {
+        absTop += element.offsetTop;
+        element = element.offsetParent;
+    }
+    return absTop;
+}
+
+// Callback for when the caption is clicked.
+ContentPanel.prototype.captionClicked = function() {
+    uiLogger.debug("ContentPanel.captionClicked()");
+    
+    // if we're enabled then a click results toggling the expanded state
+    if (this.enabled) {
+        // focus when clicked
+        if (!this.focused) {
+            this.captionLinkElement.focus();
+        }
+        
+        // toggle the expanded state
+        this.setExpanded(!this.expanded);
+    }
+}
+
+// Updates the style of the control to reflects the state of the control.
+ContentPanel.prototype.updateStyleFromState = function() {
+    uiLogger.debug("ContentPanel.updateStyleFromState()");
+
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    
+    if (this.foldable) {
+        // foldable content panel
+        this.setClassName(this.captionElement, "ContentPanelCaptionFoldable");
+        this.setClassName(this.foldToggleElement, "ContentPanelFoldToggle ContentPanelFoldToggle" + (this.expanded ? "Expanded" : "Collapsed"));
+    } else {
+        // non-folding
+        this.setClassName(this.captionElement, "ContentPanelCaptionNonFoldable");
+    }
+    
+    // set the content caption text class names
+    this.setClassName(this.captionTextElement, "ContentPanelCaptionText ContentPanelCaptionText" + stateName);
+    
+    // set the content element class names
+    this.setClassName(this.contentElement, "ContentPanelContent");
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/Control.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,231 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Control class is an abstract base class for all user interface controls.
+
+// Constructor.
+function Control(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// Control inherits from UIElement.
+Control.prototype = new UIElement(UI_NO_INIT_ID);
+
+// The view that control belongs to.
+Control.prototype.view = null;
+
+// Is the control focused?
+Control.prototype.focused = false;
+
+// Is the pointer over this control?
+Control.prototype.hovering = false;
+
+// The element hierarchy in a control is as follows:
+//
+// rootElement
+//     assemblyElement
+//         captionElement
+//         controlElement
+//
+// The assembly element groups the portion of a control that typically handle
+// the visual effects for focus and hover states. Having a separate root and
+// assembly elements allows other elements to be added to a control without
+// them being affected by the CSS rules of the assembly element.
+
+// The assembly element of this control.
+Control.prototype.assemblyElement = null;
+
+// The caption of this control; null if none.
+Control.prototype.caption = null;
+
+// The caption element of this control.
+Control.prototype.captionElement = null;
+
+// The control element of this control.
+Control.prototype.controlElement = null;
+
+// Initializer - called from constructor.
+Control.prototype.init = function(id, caption) {
+    uiLogger.debug("Control.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    UIElement.prototype.init.call(this, id);
+    
+    // create assembly, caption and control elements
+    this.assemblyElement = document.createElement("div");
+    this.captionElement = document.createElement("div");
+    this.assemblyElement.appendChild(this.captionElement);
+    this.controlElement = document.createElement("div");
+    this.assemblyElement.appendChild(this.controlElement);
+    this.rootElement.appendChild(this.assemblyElement);
+    
+    // set the caption
+    // style is not updated because the subclass will update the style later
+    // when it has completely initialized the component
+    this.setCaption(caption, true);
+}
+
+// Returns the caption; null if none.
+Control.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+Control.prototype.setCaption = function(caption, noStyleUpdate) {
+    uiLogger.debug("Control.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionElement.innerHTML = (caption == null) ? "" : caption;
+    
+    // update style
+    if (!noStyleUpdate) {
+        this.updateStyleFromState();
+    }
+}
+
+// Returns the enabled state.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.isEnabled = function() {
+    return false;
+}
+
+// Sets the enabled state.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("Control.setEnabled(" + enabled + ")");
+}
+
+// Returns the focusable state for the control.
+// Defaults focusable if enabled - override this in subclasses as required.
+Control.prototype.isFocusable = function() {
+    return this.isEnabled();
+}
+
+// Returns the focused state for the control.
+Control.prototype.isFocused = function() {
+    return this.focused;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.setFocused = function(focused) {
+    uiLogger.debug("Control.setFocused(" + focused + ")");
+    // note that this.focused gets set as a result of focusStateChanged() being called
+    // rather than setting it explicitly here
+}
+
+// Called when the focus state has changed for this control.
+Control.prototype.focusStateChanged = function(focused) {
+    uiLogger.debug("Control.focusStateChanged(" + focused + ")");
+    if (this.focused != focused) {
+        this.focused = focused;
+        
+        // let the view know about the focus change
+        if (this.view != null) {
+            this.view.focusedControlChanged(focused ? this : null);
+        }
+        
+        // update the style from the current state
+        this.updateStyleFromState();
+        
+        // notify event listeners
+        this.fireEvent(this.createEvent("FocusStateChanged", focused));
+    }
+}
+
+// Called when the hover state has changed for this control.
+Control.prototype.hoverStateChanged = function(hovering) {
+    uiLogger.debug("Control.hoverStateChanged(" + hovering + ")");
+    if (this.hovering != hovering) {
+        this.hovering = hovering;
+        
+        // update the style from the current state
+        this.updateStyleFromState();
+        
+        // notify event listeners
+        this.fireEvent(this.createEvent("HoverStateChanged", hovering));
+    }
+}
+
+// Helper method that returns the state name for the current state.
+Control.prototype.getStyleStateName = function() {
+    var focusable = this.isFocusable();
+    if (focusable && this.focused) {
+        return "Focus";
+    } else if (focusable && this.hovering) {
+        return "Hover";
+    } else if (!this.isEnabled()) {
+        return "Disabled";
+    } else {
+        return "Normal";
+    }
+}
+
+// Resets the state tracking for focus and hover.
+// Override this in subclasses as required to implement the state reset.
+Control.prototype.resetFocusState = function() {
+    uiLogger.debug("Control.resetFocusState()");
+    this.hovering = false;
+    this.focused = false;
+    this.updateStyleFromState();
+}
+
+// Helper function that sets a classname for an element.
+// Only sets the class name if it actually is different from the current value.
+Control.prototype.setClassName = function(element, className) {
+    if (element.className != className) {
+        element.className = className;
+    }
+}
+
+// Updates the style of the control to reflects the state of the control.
+// Override this in subclasses as required to implement the state change.
+Control.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Control.updateStyleFromState()");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/FormButton.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,177 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The FormButton class implements a button control for use in form-style UIs.
+
+// Constructor.
+function FormButton(id, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, text);
+    }
+}
+
+// FormButton inherits from ActionControl.
+FormButton.prototype = new ActionControl(UI_NO_INIT_ID);
+
+// Button table element.
+FormButton.prototype.tableElement = null;
+
+// Button table row element.
+FormButton.prototype.tableRowElement = null;
+
+// Button table left cell element.
+FormButton.prototype.tableLeftCellElement = null;
+
+// Button table center cell element.
+FormButton.prototype.tableCenterCellElement = null;
+
+// Button text element.
+FormButton.prototype.textElement = null;
+
+// Button table right cell element.
+FormButton.prototype.tableRightCellElement = null;
+
+// Initializer - called from constructor.
+FormButton.prototype.init = function(id, text) {
+    uiLogger.debug("FormButton.init(" + id + ", " + text + ")");
+    
+    // call superclass initializer
+    ActionControl.prototype.init.call(this, id, null);
+    
+    // remove caption element
+    this.assemblyElement.removeChild(this.captionElement);
+    
+    // construct the button
+    this.buttonElement = document.createElement("div");
+    this.tableElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableCenterCellElement = document.createElement("td");
+    this.linkElement = document.createElement("a");
+    this.linkElement.href = "JavaScript:void(0)";
+    this.textElement = document.createElement("span");
+    this.tableRightCellElement = document.createElement("td");
+    this.tableElement.appendChild(this.tableRowElement);
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableCenterCellElement);
+    this.tableCenterCellElement.appendChild(this.linkElement);
+    this.linkElement.appendChild(this.textElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.buttonElement.appendChild(this.tableElement);
+    this.controlElement.appendChild(this.buttonElement);
+    
+    // set the text
+    this.setText(text);
+    
+    // bind event listeners
+    this.bindActionControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Sets the enabled state.
+FormButton.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("FormButton.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    if (this.enabled) {
+        // diabled -> enabled
+        this.tableCenterCellElement.removeChild(this.textElement);
+        this.tableCenterCellElement.appendChild(this.linkElement);
+        this.linkElement.appendChild(this.textElement);
+    } else {
+        // enabled -> diabled
+        this.linkElement.removeChild(this.textElement);
+        this.tableCenterCellElement.removeChild(this.linkElement);
+        this.tableCenterCellElement.appendChild(this.textElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the button text.
+FormButton.prototype.getText = function() {
+    return this.textElement.innerHTML;
+}
+
+// Sets the button text.
+FormButton.prototype.setText = function(text) {
+    uiLogger.debug("FormButton.setText(" + text + ")");
+    this.textElement.innerHTML = (text == null) ? "" : text;;
+}
+
+// Updates the style of the control to reflects the state of the control.
+FormButton.prototype.updateStyleFromState = function() {
+    uiLogger.debug("FormButton.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+    
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    
+    // control element
+    this.setClassName(this.controlElement, "ControlElement FormButtonControlElement");
+    
+    // set the button table class names
+    this.setClassName(this.buttonElement, "FormButton");
+    this.setClassName(this.tableElement, "FormButtonTable");
+    this.setClassName(this.tableRowElement, "FormButtonRow");
+    this.setClassName(this.tableLeftCellElement, "FormButtonLeftCell FormButtonLeftCell" + stateName);
+    this.setClassName(this.tableCenterCellElement, "FormButtonCenterCell FormButtonLeftCell" + stateName);
+    this.setClassName(this.tableRightCellElement, "FormButtonRightCell FormButtonLeftCell" + stateName);
+    
+    // set the button text class name
+    this.setClassName(this.textElement, "FormButtonText FormButtonText" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/ImageLabel.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,100 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// The ImageLabel class implements a control that displays an image
+
+// Constructor.
+function ImageLabel(id, caption, image) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, image);
+    }
+}
+
+// Label inherits from Control.
+ImageLabel.prototype = new Control(UI_NO_INIT_ID);
+
+// Content element for the ImageLabel
+ImageLabel.prototype.contentElement = null;
+
+// DOM element for image 
+ImageLabel.prototype.imageElement = null;
+
+// Initializer - called from constructor.
+ImageLabel.prototype.init = function(id, caption, image) {
+    uiLogger.debug("ImageLabel.init(" + id + ", " + caption + ", " + image + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.controlElement.appendChild(this.contentElement);
+    
+    // set the image
+    this.setImage(image);
+}
+
+// Returns the enabled state for the control.
+ImageLabel.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+ImageLabel.prototype.isFocusable = function() {
+    return false;
+}
+
+// Returns the button image (URL); null if none.
+ImageLabel.prototype.getImage = function() {
+    return (this.imageElement != null) ? this.imageElement.src : null;
+}
+
+// Sets the button image (URL); null if none.
+ImageLabel.prototype.setImage = function(image) {
+    uiLogger.debug("NavigationButton.setImage(" + image + ")");
+    
+    if (image == null) {
+        // remove image - if any
+        if (this.imageElement != null) {
+            this.contentElement.removeChild(this.imageElement);
+        }
+    } else {
+        // default to not append image element
+        var append = false;
+        
+        // create image element if one doesn't exist
+        if (this.imageElement == null) {
+            this.imageElement = document.createElement("img");
+            this.imageElement.setAttribute("alt", "");
+            append = true;
+        }
+        
+        // set image source URL
+        this.imageElement.src = image;
+        
+        // append the image element to the left cell?
+        if (append) {
+            this.contentElement.appendChild(this.imageElement);
+        }
+    }
+}
+
+
+// Updates the style of the control to reflects the state of the control.
+ImageLabel.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Label.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.captionElement, "ControlCaption ControlCaptionNormal");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.contentElement, "LabelText");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/Label.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,105 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Label class implements a control that displays textual content.
+
+// Constructor.
+function Label(id, caption, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, text);
+    }
+}
+
+// Label inherits from Control.
+Label.prototype = new Control(UI_NO_INIT_ID);
+
+// Content element for label text.
+Label.prototype.contentElement = null;
+
+// Initializer - called from constructor.
+Label.prototype.init = function(id, caption, text) {
+    uiLogger.debug("Label.init(" + id + ", " + caption + ", " + text + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.controlElement.appendChild(this.contentElement);
+    
+    // set the text
+    this.setText(text);
+}
+
+// Returns the enabled state for the control.
+Label.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+Label.prototype.isFocusable = function() {
+    return false;
+}
+
+// Returns the control text.
+Label.prototype.getText = function() {
+    return this.contentElement.innerHTML;
+}
+
+// Sets the text for the control.
+Label.prototype.setText = function(text) {
+    uiLogger.debug("Label.setText(" + text + ")");
+    this.contentElement.innerHTML = (text == null) ? "" : text;
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+Label.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Label.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.captionElement, "ControlCaption ControlCaptionNormal");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.contentElement, "LabelText");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/ListView.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,199 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The ListView class implements a vertical list view that hosts controls
+// as child components.
+
+// Constructor.
+function ListView(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// ListView inherits from View.
+ListView.prototype = new View(UI_NO_INIT_ID);
+
+// The caption of this view; null if none.
+ListView.prototype.caption = null;
+
+// The caption element of this view.
+ListView.prototype.captionElement = null;
+
+// The caption text element of this view.
+ListView.prototype.captionTextElement = null;
+
+// Root HTML element for controls.
+ListView.prototype.listElement = null;
+
+// List of controls in the view.
+ListView.prototype.controls = null;
+
+// Initializer for ListView.
+ListView.prototype.init = function(id, caption) {
+    uiLogger.debug("ListView.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    View.prototype.init.call(this, id);
+    
+    // init control array
+    this.controls = [];
+    
+    // set style class name for root element
+    this.rootElement.className = "ListView";
+    
+    // create caption and caption text elements
+    this.captionElement = document.createElement("div");
+    this.captionElement.className = "ListViewCaptionText";
+    this.rootElement.appendChild(this.captionElement);
+    
+    // create root element for controls and add to the view root element
+    this.listElement = document.createElement("div");
+    this.listElement.className = "ListViewControlList";
+    this.rootElement.appendChild(this.listElement);
+    
+    // set the caption
+    this.setCaption(caption);
+}
+
+// Returns the caption; null if none.
+ListView.prototype.getCaption = function() {
+    return this.caption;
+}
+
+// Sets the caption; null if none.
+ListView.prototype.setCaption = function(caption) {
+    uiLogger.debug("ListView.setCaption(" + caption + ")");
+    
+    // set the display style
+    this.captionElement.style.display = (caption == null) ? "none" : "block";
+    
+    // set the caption
+    this.caption = caption;
+    this.captionElement.innerHTML = (caption == null) ? "" : caption;
+}
+
+// Returns an array of controls in the view.
+ListView.prototype.getControls = function() {
+    return this.controls;
+}
+
+// Adds a control to the view.
+ListView.prototype.addControl = function(control) {
+    uiLogger.debug("ListView.addControl(" + control + ")");
+    
+    // add the control to the controls array and attach it to the list element
+    this.controls.push(control);
+    this.listElement.appendChild(control.rootElement);
+    control.view = this;
+}
+
+// Inserts a control to the view before the specified control.
+ListView.prototype.insertControl = function(control, beforeControl) {
+    uiLogger.debug("ListView.insertControl(" + control + ", " + beforeControl + ")");
+    
+    // iterate through current controls
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this the control we should insert before?
+        if (this.controls[i] == beforeControl) {
+            // we found the control to insert before - insert here and connect to list element
+            this.controls.splice(i, 0, control);
+            this.listElement.insertBefore(control.rootElement, beforeControl.rootElement);
+            control.view = this;
+            return;
+        }
+    }
+    
+    // the control wasn't found so we'll add it last
+    this.addControl(control);
+}
+
+// Removes a control from the view.
+ListView.prototype.removeControl = function(control) {
+    uiLogger.debug("ListView.removeControl(" + control + ")");
+    
+    // iterate through current controls
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this the control we should remove?
+        if (this.controls[i] == control) {
+            // we found the control to remove - remove it from the list element
+            this.controls.splice(i, 1);
+            this.listElement.removeChild(control.rootElement);
+            control.view = null;
+        }
+    }
+}
+
+// Attempts to focus the first focusable control.
+ListView.prototype.focusFirstControl = function() {
+    uiLogger.debug("ListView.focusFirstControl()");
+    for (var i = 0; i < this.controls.length; i++) {
+        // is this control focusable?
+        var control = this.controls[i];
+        if (control.isFocusable()) {
+            control.setFocused(true);
+            break;
+        }
+    }
+}
+
+// Attempts to reset all control focus states.
+// Override in subclasses as required.
+ListView.prototype.resetControlFocusStates = function() {
+    uiLogger.debug("ListView.resetControlFocusStates()");
+    for (var i = 0; i < this.controls.length; i++) {
+        this.controls[i].resetFocusState();
+    }
+}
+
+// Attempts to reset all control focus states.
+// Override in subclasses as required.
+View.prototype.restoreControlFocusStates = function() {
+    uiLogger.debug("View.restoreControlFocusStates()");
+	if ( ! this.focusedControl || this.focusedControl == null ) {
+		this.resetControlFocusStates();
+		return;
+	}
+	this.focusedControl.controlElement.focus();
+	this.focusedControlChanged(this.focusedControl);
+	this.focusedControl.setFocused(true);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/NavigationButton.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,220 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The NavigationButton class implements a button control for use in
+// navigational contexts in menu-style UIs.
+
+// Constructor.
+function NavigationButton(id, image, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, image, text);
+    }
+}
+
+// NavigationButton inherits from ActionControl.
+NavigationButton.prototype = new ActionControl(UI_NO_INIT_ID);
+
+// Button table element.
+NavigationButton.prototype.tableElement = null;
+
+// Button table row element.
+NavigationButton.prototype.tableRowElement = null;
+
+// Button table left cell element.
+NavigationButton.prototype.tableLeftCellElement = null;
+
+// Button table right cell element.
+NavigationButton.prototype.tableRightCellElement = null;
+
+// Button image element.
+NavigationButton.prototype.imageElement = null;
+
+// Button link element.
+NavigationButton.prototype.linkElement = null;
+
+// Button text element.
+NavigationButton.prototype.textElement = null;
+
+// Initializer - called from constructor.
+NavigationButton.prototype.init = function(id, image, text) {
+    uiLogger.debug("NavigationButton.init(" + id + ", " + image + ", " + text + ")");
+    
+    // call superclass initializer
+    ActionControl.prototype.init.call(this, id, null);
+    
+    // remove caption element
+    this.assemblyElement.removeChild(this.captionElement);
+    
+    // construct the button
+    this.buttonElement = document.createElement("div");
+    this.tableElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableRightCellElement = document.createElement("td");
+    this.imageElement = null;
+    this.linkElement = document.createElement("a");
+    this.linkElement.href = "JavaScript:void(0)";
+    this.textElement = document.createElement("span");
+    this.tableElement.appendChild(this.tableRowElement);
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.tableRightCellElement.appendChild(this.linkElement);
+    this.linkElement.appendChild(this.textElement);
+    this.buttonElement.appendChild(this.tableElement);
+    this.controlElement.appendChild(this.buttonElement);
+    
+    // set the image and text
+    this.setImage(image);
+    this.setText(text);
+    
+    // bind event listeners
+    this.bindActionControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Sets the enabled state.
+NavigationButton.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("NavigationButton.setEnabled(" + enabled + ")");
+    
+    // bail out early if there is no change in state
+    if (this.enabled == enabled) {
+        return;
+    }
+    
+    // set the enabled state
+    this.enabled = enabled;
+    
+    if (this.enabled) {
+        // diabled -> enabled
+        this.tableRightCellElement.removeChild(this.textElement);
+        this.tableRightCellElement.appendChild(this.linkElement);
+        this.linkElement.appendChild(this.textElement);
+    } else {
+        // enabled -> diabled
+        this.linkElement.removeChild(this.textElement);
+        this.tableRightCellElement.removeChild(this.linkElement);
+        this.tableRightCellElement.appendChild(this.textElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the button image (URL); null if none.
+NavigationButton.prototype.getImage = function() {
+    return (this.imageElement != null) ? this.imageElement.src : null;
+}
+
+// Sets the button image (URL); null if none.
+NavigationButton.prototype.setImage = function(image) {
+    uiLogger.debug("NavigationButton.setImage(" + image + ")");
+    
+    if (image == null) {
+        // remove image - if any
+        if (this.imageElement != null) {
+            this.tableLeftCellElement.removeChild(this.imageElement);
+        }
+    } else {
+        // default to not append image element
+        var append = false;
+        
+        // create image element if one doesn't exist
+        if (this.imageElement == null) {
+            this.imageElement = document.createElement("img");
+            this.imageElement.setAttribute("alt", "");
+            append = true;
+        }
+        
+        // set image source URL
+        this.imageElement.src = image;
+        
+        // append the image element to the left cell?
+        if (append) {
+            this.tableLeftCellElement.appendChild(this.imageElement);
+        }
+    }
+}
+
+// Returns the button text.
+NavigationButton.prototype.getText = function() {
+    return this.textElement.innerHTML;
+}
+
+// Sets the button text.
+NavigationButton.prototype.setText = function(text) {
+    uiLogger.debug("NavigationButton.setText(" + text + ")");
+    this.textElement.innerHTML = (text == null) ? "" : text;;
+}
+
+// Updates the style of the control to reflects the state of the control.
+NavigationButton.prototype.updateStyleFromState = function() {
+    uiLogger.debug("NavigationButton.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set root element class name
+    this.setClassName(this.rootElement, "Control");
+    
+    // set the control assembly class names
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    
+    // control element
+    this.setClassName(this.controlElement, "ControlElement NavigationButtonControlElement");
+    
+    // set the button table class names
+    this.setClassName(this.buttonElement, "NavigationButton");
+    this.setClassName(this.tableElement, "NavigationButtonTable");
+    this.setClassName(this.tableRowElement, "NavigationButtonRow");
+    this.setClassName(this.tableLeftCellElement, "NavigationButtonImageCell");
+    this.setClassName(this.tableRightCellElement, "NavigationButtonTextCell");
+    
+    // set image class names
+    if (this.imageElement) {
+        this.setClassName(this.imageElement, "NavigationButtonImage");
+    }
+    
+    // set the button text class name
+    this.setClassName(this.textElement, "NavigationButtonText NavigationButtonText" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/NotificationPopup.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,321 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The NotificationPopup class handles the display of notifications such as
+// warnings, information messages and progress indication.
+
+// Constructor.
+function NotificationPopup() {
+    // create notification popup
+    this.containerElement = document.createElement("div");
+    this.containerElement.className = "NotificationPopupContainer";
+    this.popupElement = document.createElement("div");
+    this.popupElement.className = "NotificationPopup";
+    this.typeIndicatorElement = document.createElement("div");
+    this.typeIndicatorElement.className = "NotificationPopupTypeIndicator";
+    this.textElement = document.createElement("div");
+    this.textElement.className = "NotificationPopupText";
+    this.progressBarElement = document.createElement("div");
+    this.progressBarElement.className = "NotificationPopupProgressBar";
+    
+    // assemble popup
+    this.popupElement.appendChild(this.typeIndicatorElement);
+    this.popupElement.appendChild(this.textElement);
+    this.popupElement.appendChild(this.progressBarElement);
+    this.containerElement.appendChild(this.popupElement);
+    
+    // create progress bar image element and initialize it
+    this.progressBarImageElement = document.createElement("img");
+    var self = this;
+    this.progressBarImageElement.addEventListener("load", function() { self.progressBarImageLoadingCompleted(); }, false);
+    this.progressBarImageElement.setAttribute("alt", "");
+    this.progressBarImageURL = this.getProgressBarImage(this.PROGRESS_BAR_IMAGE_NONE);
+    this.progressBarImageElement.src = this.progressBarImageURL;
+    this.progressBarElement.appendChild(this.progressBarImageElement);
+    
+    // init the popup to be fully down
+    this.popupElement.style.top = "100%";
+    
+    // set default popup contents
+    this.setPopupContents(null, null, null);
+}
+
+// Notification container element.
+NotificationPopup.prototype.containerElement = null;
+
+// Notification popup element.
+NotificationPopup.prototype.popupElement = null;
+
+// Type indicator element.
+NotificationPopup.prototype.typeIndicatorElement = null;
+
+// Notification text element.
+NotificationPopup.prototype.textElement = null;
+
+// Progress bar element.
+NotificationPopup.prototype.progressBarElement = null;
+
+// Progress bar image element.
+NotificationPopup.prototype.progressBarImageElement = null;
+
+// Progress bar image URL.
+NotificationPopup.prototype.progressBarImageURL = null;
+
+// Has the progress bar image been loaded?
+NotificationPopup.prototype.progressBarImageLoaded = false;
+
+// Flag that tracks whether we're in the middle of starting to
+// show a notification popup.
+NotificationPopup.prototype.processingShowNotification = false;
+
+// Notification popup position (0 = hidden, 1 = showing).
+NotificationPopup.prototype.popupPosition = 0;
+
+// Interval for timer ticks (in milliseconds)
+NotificationPopup.prototype.ANIM_TIMER_INTERVAL = 25;
+
+// Animation timer identifier or null if no active timer.
+NotificationPopup.prototype.animTimerId = null;
+
+// Time in milliseconds for the popup animation to complete
+NotificationPopup.prototype.ANIM_TIME = 300;
+
+// Flag that determines the behavior of showNotification(). If set to true
+// the popup will snap open when showNotification() is called instead of
+// animation.
+NotificationPopup.prototype.SHOW_SNAPS_OPEN = true;
+
+// Animation direction (0 = no movement, -1 hiding, +1 = showing).
+NotificationPopup.prototype.animDir = 0;
+
+// Auto-hide timer identifier or null if no active timer.
+NotificationPopup.prototype.autoHideTimerId = null;
+
+// The commanded display time.
+NotificationPopup.prototype.displayTime = -1;
+
+NotificationPopup.prototype.PROGRESS_BAR_IMAGE_NONE = 0;
+
+// Displays a notification.
+NotificationPopup.prototype.showNotification = function(displayTime, type, text, progress) {
+    uiLogger.debug("NotificationPopup.showNotification(" + displayTime + ", " + type + ", " + text + ", " + progress + ")");
+    
+    // mark that showNotification() has been called and that we are in
+    // the middle of starting to show the notification popup
+    this.processingShowNotification = true;
+    
+    // remember the display time
+    this.displayTime = displayTime;
+    
+    // attach the popup to the document if not attached
+    if (this.containerElement.parentNode == null) {
+        document.body.appendChild(this.containerElement);
+        uiLogger.debug("Notification popup attached to document");
+    }
+    
+    // set popup contents and update style
+    this.setPopupContents(type, text, progress);
+    
+    // if the progress image is loaded then we can complete the showing
+    // of the notification popup immediately - otherwise the image loaded
+    // allback will complete the process.
+    if (this.progressBarImageLoaded) {
+        this.completeShowNotification();
+    }
+}
+
+// Completes displaying of a notification.
+// Note: Used internally - don't call this directly.
+NotificationPopup.prototype.completeShowNotification = function() {
+    uiLogger.debug("NotificationPopup.completeShowNotification()");
+    
+    // animation direction is +1 for showing the popup
+    if (this.popupPosition != 1) {
+        if (this.SHOW_SNAPS_OPEN) {
+            if (this.popupPosition == 0) {
+                this.popupPosition = 1;
+            }
+        }
+        this.animatePopup(1);
+    }
+    
+    // setup auto hiding if a display time is specified
+    if (this.displayTime > 0) {
+        // stop any existing timer
+        if (this.autoHideTimerId != null) {
+            clearTimeout(this.autoHideTimerId);
+            uiLogger.debug("Auto hide timer stopped");
+        }
+        // set timer to hide notification
+        var self = this;
+        this.autoHideTimerId = setTimeout(function() {
+                                              if (self.displayTime > 0) {
+                                                  self.hideNotification();
+                                              }
+                                          }, this.ANIM_TIME + this.displayTime);
+        uiLogger.debug("Auto hide timer started");
+    }
+    
+    // mark us as no longer processing a show notification call
+    this.processingShowNotification = false;
+}
+
+// Hides the currently displayed notification.
+NotificationPopup.prototype.hideNotification = function() {
+    uiLogger.debug("NotificationPopup.hideNotification()");
+    // mark us as no longer processing a show notification call
+    this.processingShowNotification = false;
+    
+    // animation direction is -1 for hiding the popup
+    if (this.popupPosition != 0) {
+        this.animatePopup(-1);
+    }
+    
+    // stop auto hide timer if one is set
+    if (this.autoHideTimerId != null) {
+        clearTimeout(this.autoHideTimerId);
+        this.autoHideTimerId = null;
+        uiLogger.debug("Auto hide timer stopped");
+    }
+}
+
+// Starts animation of the popup (1 to show, -1 to hide).
+NotificationPopup.prototype.animatePopup = function(direction) {
+    uiLogger.debug("NotificationPopup.animatePopup(" + direction + ")");
+    // set the direction and star the animation timer
+    this.animDir = direction;
+    if (this.animTimerId == null) {
+        var self = this;
+        this.animTimerId = setInterval(function() { self.animate(); }, this.ANIM_TIMER_INTERVAL);
+        uiLogger.debug("Notification popup animation started");
+    }
+}
+
+// Callback for animation timer.
+NotificationPopup.prototype.animate = function() {
+    // calculate new popup position and clamp
+    var animStep = (this.ANIM_TIMER_INTERVAL / this.ANIM_TIME) * this.animDir;
+    var newPos = this.popupPosition + animStep;
+    if (newPos < 0) {
+        newPos = 0;
+    } else if (newPos > 1) {
+        newPos = 1;
+    }
+    
+    // set the new position to the popup element
+    this.popupPosition = newPos;
+    this.popupElement.style.top = (100 - Math.round(this.popupPosition * 100)) + "%";
+    
+    // have we reached the end of the animation?
+    if (newPos == 0 || newPos == 1) {
+        // reset animation direction
+        this.animDir = 0;
+        
+        // remove the popup from the body if its hidden
+        if (newPos == 0) {
+            document.body.removeChild(this.containerElement);
+            uiLogger.debug("Notification popup detached from document");
+        }
+        
+        // stop timer
+        clearTimeout(this.animTimerId);
+        this.animTimerId = null;
+        uiLogger.debug("Notification popup animation stopped");
+    }
+}
+
+// Returns a URL for the progress bar image to use for the specified progress.
+NotificationPopup.prototype.getProgressBarImage = function(progress) {
+    // path for progress bar images
+    var progressBarImagePath = "WRTKit/Resources/";
+    
+    // unknown progress
+    return progressBarImagePath + "ProgressBarUnknown.gif";
+}
+
+// Sets the contents of the popup.
+NotificationPopup.prototype.setPopupContents = function(type, text, progress) {
+    uiLogger.debug("NotificationPopup.setPopupContents(" + type + ", " + text + ", " + progress + ")");
+    
+    // figure out notification type style name
+    var typeName = (type == null) ? "none" : type.toLowerCase();
+    typeName = typeName.charAt(0).toUpperCase() + typeName.substring(1);
+    
+    // set type element class names
+    this.typeIndicatorElement.className = "NotificationPopupTypeIndicator NotificationPopupTypeIndicator" + typeName;
+    
+    // set notification text
+    this.textElement.innerHTML = (text == null) ? "" : text;
+    
+    // set progress
+    this.progressBarElement.style.display = (progress == null) ? "none" : "block";
+    if (progress != null) {
+        var imgURL = this.getProgressBarImage(progress);
+        if (imgURL != this.progressBarImageURL) {
+            // load new image
+            this.progressBarImageLoaded = false;
+            this.progressBarImageURL = imgURL;
+            this.progressBarImageElement.src = imgURL;
+        } else {
+            // the correct image is already loaded
+            this.progressBarImageLoaded = true;
+        }
+    } else {
+        // there is no progress bar so there is no need
+        // to load any progress bar image
+        this.progressBarImageLoaded = true;
+    }
+}
+
+// Callback for notifying the object that its progress bar image completed loading.
+NotificationPopup.prototype.progressBarImageLoadingCompleted = function() {
+    uiLogger.debug("NotificationPopup.progressBarImageLoadingCompleted()");
+    
+    // mark the progress bar image as loaded
+    this.progressBarImageLoaded = true;
+    
+    // complete the process of displaying the notification popup
+    // if it has been commanded but not yet completed
+    if (this.processingShowNotification) {
+        this.completeShowNotification();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/Scrollbar.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,173 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Scrollbar class is an implementation of a user interface element that
+// indicates the current viewport position in a document.
+
+// Constructor.
+function Scrollbar(parentElement) {
+    uiLogger.debug("Scrollbar(" + parentElement + ")");
+    
+    // get the parent element
+    this.parentElement = parentElement;
+    
+    // create the root element
+    this.rootElement = document.createElement("div");
+    this.rootElement.className = "Scrollbar";
+    this.rootElement.style.visibility = "hidden";
+    
+    // create the scrollbar
+    // the scrollbar consists of a root element with six children
+    // (three track elements and three thumb elements)
+    
+    // track
+    this.trackTopElement = document.createElement("div");
+    this.trackTopElement.className = "ScrollbarTrackTop";
+    this.trackMiddleElement = document.createElement("div");
+    this.trackMiddleElement.className = "ScrollbarTrackMiddle";
+    this.trackBottomElement = document.createElement("div");
+    this.trackBottomElement.className = "ScrollbarTrackBottom";
+    
+    // thumb
+    this.thumbTopElement = document.createElement("div");
+    this.thumbTopElement.className = "ScrollbarThumbTop";
+    this.thumbMiddleElement = document.createElement("div");
+    this.thumbMiddleElement.className = "ScrollbarThumbMiddle";
+    this.thumbBottomElement = document.createElement("div");
+    this.thumbBottomElement.className = "ScrollbarThumbBottom";
+    
+    // assemble and attach the scrollbar
+    this.rootElement.appendChild(this.trackTopElement);
+    this.rootElement.appendChild(this.trackMiddleElement);
+    this.rootElement.appendChild(this.trackBottomElement);
+    this.rootElement.appendChild(this.thumbTopElement);
+    this.rootElement.appendChild(this.thumbMiddleElement);
+    this.rootElement.appendChild(this.thumbBottomElement);
+    this.parentElement.appendChild(this.rootElement);
+    
+    // bring the scrollbar up to date
+    this.update(0, 100, 100);
+}
+
+// Parent element for the scrollbar.
+Scrollbar.prototype.parentElement = null;
+
+// Root HTML element in the scrollbar.
+Scrollbar.prototype.rootElement = null;
+
+// Scrollbar track top element.
+Scrollbar.prototype.trackTopElement = null;
+
+// Scrollbar track middle element.
+Scrollbar.prototype.trackMiddleElement = null;
+
+// Scrollbar track bottom element.
+Scrollbar.prototype.trackBottomElement = null;
+
+// Scrollbar thumb top element.
+Scrollbar.prototype.thumbTopElement = null;
+
+// Scrollbar thumb middle element.
+Scrollbar.prototype.thumbMiddleElement = null;
+
+// Scrollbar thumb bottom element.
+Scrollbar.prototype.thumbBottomElement = null;
+
+// Is the scrollbar needed?
+Scrollbar.prototype.scrollbarNeeded = false;
+
+// Updates the scrollbar.
+Scrollbar.prototype.update = function(scrollY, viewportHeight, documentHeight) {
+    // figure out current heights
+    var scrollbarHeight = this.rootElement.clientHeight;
+    var trackTopHeight = this.trackTopElement.clientHeight;
+    var trackBottomHeight = this.trackBottomElement.clientHeight;
+    var thumbTopHeight = this.thumbTopElement.clientHeight;
+    var thumbBottomHeight = this.thumbBottomElement.clientHeight;
+    
+    // scrollable height is the larger of document and viewport heights
+    var scrollableHeight = documentHeight;
+    var scrollbarNeeded = true;
+    if (viewportHeight >= documentHeight) {
+        scrollableHeight = viewportHeight;
+        scrollbarNeeded = false;
+    }
+    
+    // show or hide scrollbar?
+    if (scrollbarNeeded != this.scrollbarNeeded) {
+        this.scrollbarNeeded = scrollbarNeeded;
+        this.rootElement.style.visibility = scrollbarNeeded ? "visible" : "hidden";
+    }
+    
+    // calculate thumb top position...
+    var thumbTopPct = scrollY / scrollableHeight;
+    var thumbTop = scrollbarHeight * thumbTopPct;
+    // ...and bottom position...
+    var thumbBottomPct = (scrollY + viewportHeight) / scrollableHeight;
+    var thumbBottom = scrollbarHeight * thumbBottomPct;
+    
+    // ...and thumb height
+    var thumbHeight = thumbBottom - thumbTop;
+    
+    // ensure that the thumb is not too small
+    var thumbMinHeight = thumbTopHeight + thumbBottomHeight;
+    if (thumbHeight < thumbMinHeight) {
+        var underflow = thumbMinHeight - thumbHeight;
+        // adjust thumb top pos assuming a shorter scrollbar track
+        var thumbMid = (scrollbarHeight - underflow) * ((thumbTopPct + thumbBottomPct) / 2) + (underflow / 2);
+        thumbTop = thumbMid - (thumbMinHeight / 2);
+        thumbBottom = thumbTop + thumbMinHeight;
+        thumbHeight = thumbBottom - thumbTop;
+    }
+    
+    // position and size track element (add 1 to the middle section height for rounding errors)
+    this.trackTopElement.style.top = "0px";
+    this.trackMiddleElement.style.top = Math.round(trackTopHeight) + "px";
+    this.trackMiddleElement.style.height = Math.round(scrollbarHeight - trackTopHeight - trackBottomHeight + 1) + "px";
+    this.trackBottomElement.style.top = Math.round(scrollbarHeight - trackTopHeight) + "px";
+    
+    // position and size thumb element (add 1 to the middle section height for rounding errors)
+    this.thumbTopElement.style.top = Math.round(thumbTop) + "px";
+    this.thumbMiddleElement.style.top = Math.round(thumbTop + thumbTopHeight) + "px";
+    this.thumbMiddleElement.style.height = Math.round(thumbHeight - thumbTopHeight - thumbBottomHeight + 1) + "px";
+    this.thumbBottomElement.style.top = Math.round(thumbBottom - thumbBottomHeight) + "px";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/SelectionControl.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,189 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionControl class is an abstract base class for controls that lets
+// the user select one or more options from a list of options. Don't use
+// SelectionControl directly.
+
+// Constructor.
+function SelectionControl(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionControl inherits from Control.
+SelectionControl.prototype = new Control(UI_NO_INIT_ID);
+
+// List of options.
+SelectionControl.prototype.options = null;
+
+// The single selected option in single selection controls
+// or list of options in multi selection controls.
+SelectionControl.prototype.selected = null;
+
+// Single or multiple selection.
+SelectionControl.prototype.multipleSelection = false;
+
+// Initializer - called from constructor.
+SelectionControl.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionControl.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // set the multiple selection property
+    this.multipleSelection = multipleSelection;
+    
+    // init options and selected (makes copies of the original arrays)
+    this.options = (options != null) ? options.slice(0) : [];
+    if (multipleSelection) {
+        this.selected = (selected == null) ? [] : selected.slice(0);
+    } else {
+        this.selected = selected;
+    }
+    this.validateSelected();
+}
+
+// Returns true if the control is a multiple selection control; false if single.
+SelectionControl.prototype.isMultipleSelection = function() {
+    return this.multipleSelection;
+}
+
+// Returns true if the specified option is selected; false if not.
+SelectionControl.prototype.isSelected = function(option) {
+    if (this.multipleSelection) {
+        // multiple selection
+        // iterate through all selected options and look for the specified option
+        for (var i = 0; i < this.selected.length; i++) {
+            if (this.selected[i] == option) {
+                return true;
+            }
+        }
+        return false;
+    } else {
+        // single selection
+        return (this.selected == option);
+    }
+}
+
+// Returns the currently selected option in a single selection control or
+// an array of selected options in a multiple selection control. If there are
+// no selected options a single selection control returns null and a multiple
+// selection control returns an empty array.
+SelectionControl.prototype.getSelected = function() {
+    return this.multipleSelection ? this.selected.slice(0) : this.selected;
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+// Override in sublcasses to provide full implementation.
+SelectionControl.prototype.setSelected = function(selected) {
+    this.selected = this.multipleSelection ? selected.slice(0) : selected;
+    // make sure the selected option or options are legal
+    this.validateSelected();
+}
+
+// Ensures that the selected option or options exist among the options in this control.
+SelectionControl.prototype.validateSelected = function() {
+    if (this.multipleSelection) {
+        // multiple selection
+        // iterate through all selected options and ensure they exist among the options
+        for (var i = 0; i < this.selected.length; i++) {
+            // check that the selected option exists among the options
+            var found = false;
+            for (var j = 0; j < this.options.length; j++) {
+                if (this.options[j] == this.selected[i]) {
+                    // found - stop looking for this option
+                    found = true;
+                    break;
+                }
+            }
+            // not found - remove this selected element
+            if (!found) {
+                this.selected.splice(i, 1);
+                // since we removed an entry we must re-check this position
+                i--;
+            }
+        }
+    } else {
+        // single selection
+        if (this.selected != null) {
+            // check that the selected option exists among the options
+            for (var i = 0; i < this.options.length; i++) {
+                if (this.options[i] == this.selected) {
+                    // found - we're done
+                    return;
+                }
+            }
+            // not found - remove the selection
+            this.selected = null;
+        }
+    }
+}
+
+// Returns the options in the control as an array of option objects with
+// a value and text property.
+SelectionControl.prototype.getOptions = function() {
+    return this.options;
+}
+
+// Sets the options in the control.
+// Override in sublcasses to provide full implementation.
+SelectionControl.prototype.setOptions = function(options) {
+    this.options = options.slice(0);
+    // make sure the selected option or options are legal
+    this.validateSelected();
+}
+
+// Returns the option that has the specified value; null if none.
+SelectionControl.prototype.getOptionForValue = function(value) {
+    // iterate through all options and look for a match
+    for (var i = 0; i < this.options.length; i++) {
+        if (this.options[i].value == value) {
+            return this.options[i];
+        }
+    }
+    return null;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/SelectionList.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,355 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionList class implements a single or multi selection control
+// that lets users select one or more options from a list of options.
+
+// Constructor.
+function SelectionList(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionList inherits from SelectionControl.
+SelectionList.prototype = new SelectionControl(UI_NO_INIT_ID);
+
+// Root element for options.
+SelectionList.prototype.optionListElement = null;
+
+// Array for tracking option elements.
+SelectionList.prototype.optionElements = null;
+
+// Tracking for currently focused option; null if none.
+SelectionList.prototype.focusedOption = null;
+
+// Enabled status.
+SelectionList.prototype.enabled = false;
+
+// Initializer - called from constructor.
+SelectionList.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionList.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    SelectionControl.prototype.init.call(this, id, caption, options, multipleSelection, selected);
+    
+    // create option list element
+    this.optionListElement = document.createElement("div");
+    this.controlElement.appendChild(this.optionListElement);
+    
+    // the control defaults to enabled
+    this.enabled = true;
+    
+    // init option element arrays
+    this.optionElements = [];
+    
+    // update the option elements to match the options in this control
+    this.updateOptionElements();
+}
+
+// Returns the enabled state.
+SelectionList.prototype.isEnabled = function() {
+    return this.enabled;
+}
+
+// Sets the enabled state.
+SelectionList.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("SelectionList.setEnabled(" + enabled + ")");
+    // switch the state and update the the control
+    this.enabled = enabled;
+    this.updateOptionElements();
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+SelectionList.prototype.setFocused = function(focused) {
+    uiLogger.debug("SelectionList.setFocused(" + focused + ")");
+    if (this.enabled && this.optionElements.length > 0) {
+        if (focused) {
+            this.optionElements[0].link.focus();
+        } else {
+            this.optionElements[0].link.blur();
+        }
+    }
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+SelectionList.prototype.setSelected = function(selected) {
+    // call superclass setSelected()
+    SelectionControl.prototype.setSelected.call(this, selected);
+    this.updateStyleFromState();
+}
+
+// Sets the options in the control.
+SelectionList.prototype.setOptions = function(options) {
+    // call superclass setOptions()
+    SelectionControl.prototype.setOptions.call(this, options);
+    this.updateOptionElements();
+}
+
+// Updates the option elements for the control element.
+SelectionList.prototype.updateOptionElements = function() {
+    uiLogger.debug("SelectionControl.updateOptionElements()");
+    
+    // start by removing all current options from the option list element
+    while (this.optionListElement.firstChild != null) {
+        this.optionListElement.removeChild(this.optionListElement.firstChild);
+    }
+    
+    // iterate through the options and add (and possibly create) a
+    // properly configured option element for each option
+    for (var i = 0; i < this.options.length; i++) {
+        // get the option and option element we're working on
+        var option = this.options[i];
+        
+        // option, link and text elements for this option
+        var optionElement;
+        var optionLinkElement;
+        var optionTextElement;
+        
+        // get the elements
+        if (i == this.optionElements.length) {
+            // we need to create a new option element...
+            optionElement = document.createElement("div");
+            
+            // ...and a new option link element...
+            optionLinkElement = document.createElement("a");
+            optionLinkElement.href = "JavaScript:void(0)";
+            
+            // ...and a new option text element
+            optionTextElement = document.createElement("span");
+            
+            // hook up event listeners to the element
+            var self = this;
+            optionLinkElement.addEventListener("focus", function(event) { self.optionFocusStateChanged(event, true); }, false);
+            optionLinkElement.addEventListener("blur", function(event) { self.optionFocusStateChanged(event, false); }, false);
+            optionElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+            optionElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+            optionElement.addEventListener("mousedown", function(event) {
+                                                               self.optionClicked(event)
+                                                               event.stopPropagation();
+                                                               event.preventDefault();
+                                                        }, true);
+            optionElement.addEventListener("keydown", function(event) {
+                                                            // center and enter trigger the action
+                                                            if (event.keyCode == 0 || event.keyCode == 13) {
+                                                                self.optionClicked(event)
+                                                                event.stopPropagation();
+                                                                event.preventDefault();
+                                                            }
+                                                      }, true);
+            
+            // add the elements to the option element array
+            this.optionElements.push({ option: optionElement, link: optionLinkElement, text: optionTextElement });
+        } else {
+            // we already have ready elements so we'll reuse them
+            optionElement = this.optionElements[i].option;
+            optionLinkElement = this.optionElements[i].link;
+            optionTextElement = this.optionElements[i].text;
+            
+            // remove the option link element from its current parent - if any
+            if (optionLinkElement.parentNode != null) {
+                optionLinkElement.parentNode.removeChild(optionLinkElement);
+            }
+            
+            // remove the option text element from its current parent - if any
+            if (optionTextElement.parentNode != null) {
+                optionTextElement.parentNode.removeChild(optionTextElement);
+            }
+        }
+        
+        // set the option text
+        optionTextElement.innerHTML = option.text;
+        
+        // hook up the option to the control
+        if (this.enabled) {
+            // add the option link element to the option element
+            optionElement.appendChild(optionLinkElement);
+            // add the text element to the option element
+            optionLinkElement.appendChild(optionTextElement);
+        } else {
+            // add the text element directly to the control element
+            optionElement.appendChild(optionTextElement);
+        }
+        // add the option element to the option list element
+        this.optionListElement.appendChild(optionElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Callback for focus state change events.
+SelectionList.prototype.optionFocusStateChanged = function(event, focused) {
+    uiLogger.debug("SelectionControl.optionFocusStateChanged()");
+    
+    // get the event source option
+    var option = null;
+    var optionElement = null;
+    for (var i = 0; i < this.optionElements.length; i++) {
+        optionElement = this.optionElements[i];
+        if (optionElement.link == event.currentTarget) {
+            option = this.options[i];
+            break;
+        }
+    }
+    
+    // remember the focused option; or null if none is focused
+    if (focused) {
+        this.focusedOption = option;
+    } else {
+        this.focusedOption = null;
+    }
+    
+    // call the superclass focus state change handler
+    this.focusStateChanged(focused);
+}
+
+// Callback for clicks.
+SelectionList.prototype.optionClicked = function(event) {
+    uiLogger.debug("SelectionControl.optionClicked()");
+    
+    // bail out if we're not enabled
+    if (!this.enabled) {
+        return false;
+    }
+    
+    // get the changed option
+    var option = null;
+    var optionElement = null;
+    for (var i = 0; i < this.optionElements.length; i++) {
+        optionElement = this.optionElements[i];
+        if (optionElement.option == event.currentTarget) {
+            option = this.options[i];
+            break;
+        }
+    }
+    
+    // make sure the option is focused
+    optionElement.link.focus();
+    
+    // toggle the selection
+    if (this.multipleSelection) {
+        // iterate through the selected options and see if this
+        // option is selected. if not then add it to the selection.
+        // if it already is selected then them remove it.
+        var found = false;
+        for (var i = 0; i < this.selected.length; i++) {
+            if (this.selected[i] == option) {
+                // remove from selected set
+                found = true;
+                this.selected.splice(i, 1);
+                break;
+            }
+        }
+        if (!found) {
+            // add to the selected set
+            this.selected.push(option);
+        }
+    } else {
+        // update the selected option
+        this.selected = option;
+    }
+    
+    // update the style
+    this.updateStyleFromState();
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("SelectionChanged", this.getSelected()));
+}
+
+// Resets the state tracking for focus and hover.
+// Override this in subclasses as required to implement the state reset.
+SelectionList.prototype.resetFocusState = function() {
+    uiLogger.debug("SelectionList.resetFocusState()");
+    this.hovering = false;
+    this.focused = false;
+    this.focusedOption = null;
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+SelectionList.prototype.updateStyleFromState = function() {
+    uiLogger.debug("SelectionList.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set option list and option class names
+    this.setClassName(this.optionListElement, "SelectionList SelectionList" + stateName);
+    for (var i = 0; i < this.options.length; i++) {
+        var option = this.options[i];
+        
+        // get the option and option text elements for this option
+        var optionElement = this.optionElements[i].option;
+        var optionTextElement = this.optionElements[i].text;
+        
+        // figure out the option state
+        var optionStateName = this.isSelected(option) ? "Checked" : "Unchecked";
+        if (!this.enabled) {
+            optionStateName += "Disabled";
+        } else if (this.focusedOption == option) {
+            optionStateName += "Focus";
+        } else {
+            optionStateName += "Normal";
+        }
+        
+        // set option element class names
+        if (this.multipleSelection) {
+            this.setClassName(optionElement, "SelectionListOptionMulti SelectionListOptionMulti" + optionStateName);
+        } else {
+            this.setClassName(optionElement, "SelectionListOptionSingle SelectionListOptionSingle" + optionStateName);
+        }
+        
+        // set option text class names
+        this.setClassName(optionTextElement, "SelectionListOptionText SelectionListOptionText" + stateName);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/SelectionMenu.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,204 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The SelectionMenu class implements a single or multi selection control
+// that lets users select one or more options from a menu.
+
+// Constructor.
+function SelectionMenu(id, caption, options, multipleSelection, selected) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, options, multipleSelection, selected);
+    }
+}
+
+// SelectionMenu inherits from SelectionControl.
+SelectionMenu.prototype = new SelectionControl(UI_NO_INIT_ID);
+
+// Reference to the peer HTML element.
+SelectionControl.prototype.peerElement = null;
+
+// Array for tracking option elements.
+SelectionMenu.prototype.optionElements = null;
+
+// Initializer - called from constructor.
+SelectionMenu.prototype.init = function(id, caption, options, multipleSelection, selected) {
+    uiLogger.debug("SelectionMenu.init(" + id + ", " + caption + ", " + options + ", " + multipleSelection + ", " + selected + ")");
+    
+    // call superclass initializer
+    SelectionControl.prototype.init.call(this, id, caption, options, multipleSelection, selected);
+    
+    // create the control
+    this.peerElement = document.createElement("select");
+    this.peerElement.multiple = multipleSelection;
+    this.controlElement.appendChild(this.peerElement);
+    
+    // init option elements array
+    this.optionElements = [];
+    
+    // update the option elements to match the options in this control
+    this.updateOptionElements();
+    
+    // bind event listeners
+    var self = this;
+    this.peerElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.peerElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.peerElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.peerElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.peerElement.addEventListener("change", function() { self.selectionChanged(); }, false);
+}
+
+// Returns the enabled state.
+SelectionMenu.prototype.isEnabled = function() {
+    return !this.peerElement.disabled;
+}
+
+// Sets the enabled state.
+SelectionMenu.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("SelectionMenu.setEnabled(" + enabled + ")");
+    this.peerElement.disabled = !enabled;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+SelectionMenu.prototype.setFocused = function(focused) {
+    uiLogger.debug("SelectionMenu.setFocused(" + focused + ")");
+    if (focused) {
+        this.peerElement.focus();
+    } else {
+        this.peerElement.blur();
+    }
+}
+
+// Sets the currently selected options. Pass a single option in a single selection
+// control or an array of selected controls in a multiple selection control. To
+// deselect all options pass null in a single selection control and an empty array
+// in a multiple selection control.
+SelectionMenu.prototype.setSelected = function(selected) {
+    // call superclass setSelected()
+    SelectionControl.prototype.setSelected.call(this, selected);
+    
+    // iterate through the options and set the selected state
+    // on the corresponding option element
+    for (var i = 0; i < this.options.length; i++) {
+        this.optionElements[i].selected = this.isSelected(this.options[i]);
+    }
+}
+
+// Sets the options in the control.
+SelectionMenu.prototype.setOptions = function(options) {
+    // call superclass setOptions()
+    SelectionControl.prototype.setOptions.call(this, options);
+    this.updateOptionElements();
+}
+
+// Updates the option elements for the peer select element.
+SelectionMenu.prototype.updateOptionElements = function() {
+    // start by removing all current options from the select element
+    while (this.peerElement.firstChild != null) {
+        this.peerElement.removeChild(this.peerElement.firstChild);
+    }
+    
+    // iterate through the options and add (and possibly create) a
+    // properly configured option element for each option
+    for (var i = 0; i < this.options.length; i++) {
+        // do we need to create a new option element?
+        if (i == this.optionElements.length) {
+            this.optionElements.push(document.createElement("option"));
+        }
+        
+        // get the option and option element we're working on
+        var option = this.options[i];
+        var optionElement = this.optionElements[i];
+        
+        // set the state for this option element and add it to the
+        // peer select element
+        optionElement.text = option.text;
+        optionElement.selected = this.isSelected(option);
+        this.peerElement.appendChild(optionElement);
+    }
+    
+    // update the style
+    this.updateStyleFromState();    
+}
+
+// Callback for selection change events.
+SelectionMenu.prototype.selectionChanged = function() {
+    uiLogger.debug("SelectionControl.selectionChanged()");
+    
+    // update the selected options array or reference
+    this.selected = (this.multipleSelection) ? [] : null;
+    for (var i = 0; i < this.options.length; i++) {
+        if (this.optionElements[i].selected) {
+            if (this.multipleSelection) {
+                this.selected.push(this.options[i]);
+            } else {
+                this.selected = this.options[i];
+                break;
+            }
+        }
+    }
+    
+    // notify event listeners
+    this.fireEvent(this.createEvent("SelectionChanged", this.getSelected()));
+}
+
+// Updates the style of the control to reflects the state of the control.
+SelectionMenu.prototype.updateStyleFromState = function() {
+    uiLogger.debug("SelectionMenu.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set select and option element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "SelectionMenu SelectionMenu" + peerStateName);
+    for (var i = 0; i < this.options.length; i++) {
+        var option = this.optionElements[i];
+        this.setClassName(option, "SelectionMenuOption SelectionMenuOption" + peerStateName);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/Separator.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,119 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The Separator class is used to provide a visual separator in a list.
+
+// Constructor.
+function Separator(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// Separator inherits from Control.
+Separator.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the separator element.
+Separator.prototype.separatorElement = null;
+
+// Separator row element.
+Separator.prototype.tableRowElement = null;
+
+// Left cell element.
+Separator.prototype.tableLeftCellElement = null;
+
+// Center cell element.
+Separator.prototype.tableCenterCellElement = null;
+
+// Right cell element.
+Separator.prototype.tableRightCellElement = null;
+
+// Initializer - called from constructor.
+Separator.prototype.init = function(id) {
+    uiLogger.debug("Separator.init(" + id + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, null);
+    
+    // remove caption and control elements
+    this.assemblyElement.removeChild(this.captionElement);
+    this.assemblyElement.removeChild(this.controlElement);
+    
+    // create separator
+    this.separatorElement = document.createElement("table");
+    this.tableRowElement = document.createElement("tr");
+    this.tableLeftCellElement = document.createElement("td");
+    this.tableCenterCellElement = document.createElement("td");
+    this.tableRightCellElement = document.createElement("td");
+    this.tableRowElement.appendChild(this.tableLeftCellElement);
+    this.tableRowElement.appendChild(this.tableCenterCellElement);
+    this.tableRowElement.appendChild(this.tableRightCellElement);
+    this.separatorElement.appendChild(this.tableRowElement);
+    this.assemblyElement.appendChild(this.separatorElement);
+    
+    // update style
+    this.updateStyleFromState();
+}
+
+// Returns the enabled state for the control.
+Separator.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+Separator.prototype.isFocusable = function() {
+    return false;
+}
+
+// Updates the style of the control to reflects the state of the control.
+Separator.prototype.updateStyleFromState = function() {
+    uiLogger.debug("Separator.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+    this.setClassName(this.separatorElement, "Separator");
+    this.setClassName(this.tableRowElement, "SeparatorRow");
+    this.setClassName(this.tableLeftCellElement, "SeparatorLeftCell");
+    this.setClassName(this.tableCenterCellElement, "SeparatorCenterCell");
+    this.setClassName(this.tableRightCellElement, "SeparatorRightCell");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/TextArea.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,96 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextArea class implements a multi line text entry control.
+
+// Constructor.
+function TextArea(id, caption, value, rows) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, value, rows);
+    }
+}
+
+// TextArea inherits from TextEntryControl.
+TextArea.prototype = new TextEntryControl(UI_NO_INIT_ID);
+
+// Initializer - called from constructor.
+TextArea.prototype.init = function(id, caption, value, rows) {
+    uiLogger.debug("TextArea.init(" + id + ", " + caption + ", " + value + ", " + rows + ")");
+    
+    // call superclass initializer
+    TextEntryControl.prototype.init.call(this, id, caption);
+    
+    // create the peer element
+    this.peerElement = document.createElement("textarea");
+    // default rowcount is 3 if not defined
+    // width always comes from style but is a required attribute
+    this.peerElement.rows = (rows != null) ? rows : 3;
+    this.peerElement.cols = 20;
+    this.controlElement.appendChild(this.peerElement);
+    
+    // set the value
+    this.peerElement.value = (value == null) ? "" : value;
+    
+    // bind event listeners
+    this.bindTextEntryControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+TextArea.prototype.updateStyleFromState = function() {
+    uiLogger.debug("TextArea.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set peer element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "TextArea TextArea" + stateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/TextEntryControl.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,125 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextEntryControl class is an abstract base class for the single and multi-
+// line text entry controls TextField and TextArea. Don't use TextEntryControl
+// directly.
+
+// Constructor.
+function TextEntryControl(id, caption) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption);
+    }
+}
+
+// TextEntryControl inherits from Control.
+TextEntryControl.prototype = new Control(UI_NO_INIT_ID);
+
+// Reference to the peer HTML element.
+TextEntryControl.prototype.peerElement = null;
+
+// Initializer - called from constructor.
+TextEntryControl.prototype.init = function(id, caption) {
+    uiLogger.debug("TextEntryControl.init(" + id + ", " + caption + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+}
+
+// Common event listeners hookup function called from subclasses.
+TextEntryControl.prototype.bindTextEntryControlListeners = function() {
+    var self = this;
+    this.peerElement.addEventListener("focus", function() { self.focusStateChanged(true); }, false);
+    this.peerElement.addEventListener("blur", function() { self.focusStateChanged(false); }, false);
+    this.peerElement.addEventListener("mouseover", function() { self.hoverStateChanged(true); }, false);
+    this.peerElement.addEventListener("mouseout", function() { self.hoverStateChanged(false); }, false);
+    this.peerElement.addEventListener("change", function() { self.valueChanged(); }, false);
+}
+
+// Returns the enabled state.
+// Override this in subclasses as required to implement the state change.
+TextEntryControl.prototype.isEnabled = function() {
+    return !this.peerElement.readOnly;
+}
+
+// Sets the enabled state.
+// Override this in subclasses as required to implement the state change.
+TextEntryControl.prototype.setEnabled = function(enabled) {
+    uiLogger.debug("TextEntryControl.setEnabled(" + enabled + ")");
+    this.peerElement.readOnly = !enabled;
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Returns the control text.
+TextEntryControl.prototype.getText = function() {
+    return this.peerElement.value;
+}
+
+// Sets the text for the control.
+TextEntryControl.prototype.setText = function(text) {
+    this.peerElement.value = text;
+}
+
+// Returns the focusable state for the control.
+TextEntryControl.prototype.isFocusable = function() {
+    // text entry controls are always focusable
+    return true;
+}
+
+// Sets the focused state for the control.
+// Note: This may not always succeed.
+TextEntryControl.prototype.setFocused = function(focused) {
+    uiLogger.debug("TextEntryControl.setFocused(" + focused + ")");
+    if (focused) {
+        this.peerElement.focus();
+    } else {
+        this.peerElement.blur();
+    }
+}
+
+// Callback for value change events.
+TextEntryControl.prototype.valueChanged = function() {
+    uiLogger.debug("TextEntryControl.valueChanged()");
+    // notify event listeners
+    this.fireEvent(this.createEvent("ValueChanged", this.peerElement.value));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/TextField.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,93 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextField class implements a single line text entry control.
+
+// Constructor.
+function TextField(id, caption, value, masked) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, value, masked);
+    }
+}
+
+// TextField inherits from TextEntryControl.
+TextField.prototype = new TextEntryControl(UI_NO_INIT_ID);
+
+// Initializer - called from constructor.
+TextField.prototype.init = function(id, caption, value, masked) {
+    uiLogger.debug("TextField.init(" + id + ", " + caption + ", " + value + ", " + masked + ")");
+    
+    // call superclass initializer
+    TextEntryControl.prototype.init.call(this, id, caption);
+    
+    // create the peer element
+    this.peerElement = document.createElement("input");
+    this.peerElement.type = masked ? "password" : "text";
+    this.controlElement.appendChild(this.peerElement);
+    
+    // set the value
+    this.peerElement.value = (value == null) ? "" : value;
+    
+    // bind event listeners
+    this.bindTextEntryControlListeners();
+    
+    // update the style
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+TextField.prototype.updateStyleFromState = function() {
+    uiLogger.debug("TextField.updateStyleFromState()");
+    
+    // determine the state name
+    var stateName = this.getStyleStateName();
+    
+    // set element class names
+    this.setClassName(this.rootElement, "Control");
+    this.setClassName(this.controlElement, "ControlElement");
+    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssembly" + stateName);
+    this.setClassName(this.captionElement, "ControlCaption ControlCaption" + stateName);
+    
+    // set peer element class names
+    var peerStateName = this.isEnabled() ? stateName : "Disabled";
+    this.setClassName(this.peerElement, "TextField TextField" + peerStateName);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/TextPane.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,73 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+// The TextPane class implements a control that displays HTML content.
+
+// Constructor.
+function TextPane(id, caption, text) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id, caption, text);
+    }
+}
+
+// TextPane inherits from Control.
+TextPane.prototype = new Control(UI_NO_INIT_ID);
+
+// Content element for TextPane text.
+TextPane.prototype.contentElement = null;
+
+// Initializer - called from constructor.
+TextPane.prototype.init = function(id, caption, text) {
+    uiLogger.debug("TextPane.init(" + id + ", " + caption + ", " + text + ")");
+    
+    // call superclass initializer
+    Control.prototype.init.call(this, id, caption);
+    
+    // create content element
+    this.contentElement = document.createElement("div");
+    this.controlElement.appendChild(this.contentElement);
+    
+    // set the text
+    this.setText(text);
+}
+
+// Returns the enabled state for the control.
+TextPane.prototype.isEnabled = function() {
+    return true;
+}
+
+// Returns the focusable state for the control.
+TextPane.prototype.isFocusable = function() {
+    return false;
+}
+
+// Returns the control text.
+TextPane.prototype.getText = function() {
+    return this.contentElement.innerHTML;
+}
+
+// Sets the text for the control.
+TextPane.prototype.setText = function(text) {
+    uiLogger.debug("TextPane.setText(" + text + ")");
+    this.contentElement.innerHTML = (text == null) ? "" : text;
+    this.updateStyleFromState();
+}
+
+// Updates the style of the control to reflects the state of the control.
+TextPane.prototype.updateStyleFromState = function() {
+    uiLogger.debug("TextPane.updateStyleFromState()");
+    
+    // set element class names
+    this.setClassName(this.rootElement, "TextPane");
+//    this.setClassName(this.assemblyElement, "ControlAssembly ControlAssemblyNormal");
+//    this.setClassName(this.captionElement, "ControlCaption ControlCaptionNormal");
+//    this.setClassName(this.controlElement, "ControlElement");
+//    this.setClassName(this.contentElement, "TextPane");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/UIElement.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,114 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (“Nokia”) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia’s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The UIElement class is the base class for all user interface elements.
+
+// Constructor.
+function UIElement(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// UI element identifier.
+UIElement.prototype.id = null;
+
+// Root HTML element in the UI element.
+UIElement.prototype.rootElement = null;
+
+// Initializer for UIElement.
+UIElement.prototype.init = function(id) {
+    uiLogger.debug("UIElement.init(" + id + ")");
+    
+    // copy identifier
+    this.id = id;
+    
+    // init event listener array
+    this.eventListeners = [];
+    
+    // create the root element
+    this.rootElement = document.createElement("div");
+    if (id != null) {
+        this.rootElement.id = id;
+    }
+}
+
+// Returns an array containing the current event listeners.
+UIElement.prototype.getEventListeners = function() {
+    return this.eventListeners;
+}
+
+// Adds an event listener.
+UIElement.prototype.addEventListener = function(eventType, listener) {
+    var listenerDef = { type: eventType, listener: listener };
+    this.eventListeners.push(listenerDef);
+}
+
+// Removes an event listener.
+UIElement.prototype.removeEventListener = function(eventType, listener) {
+    // iterate through current listeners and remove the specified
+    // listener when its found
+    for (var i = 0; i < this.eventListeners.length; i++) {
+        var listenerDef = this.eventListeners[i];
+        if ((listenerDef.type == eventType) &&
+                (listenerDef.listener == listener)) {
+            this.eventListeners.splice(i, 1);
+            return;
+        }
+    }
+}
+
+// Factory method for an event object where this object is the source object.
+UIElement.prototype.createEvent = function(type, value) {
+    return { source: this, type: type, value: value };
+}
+
+// Fires an event to all listeners.
+UIElement.prototype.fireEvent = function(event) {
+    // iterate through all event listeners and notify them of the event
+    for (var i = 0; i < this.eventListeners.length; i++) {
+        var listenerDef = this.eventListeners[i];
+        if (listenerDef.type == null || listenerDef.type == event.type) {
+            listenerDef.listener.call(this, event);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/UIInit.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,49 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The UIInit script is included before the rest of the UI scripts to setup
+// any resources needed by the UI toolkit.
+
+// Create UI logger.
+var uiLogger = new Logger();
+uiLogger.level = uiLogger.LOG_LEVEL_DEBUG;
+uiLogger.filter = ["QECR"];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/UIManager.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,277 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+
+///////////////////////////////////////////////////////////////////////////////
+// The UI manager manages a set of views and other user interface elements.
+
+// Constructor.
+function UIManager(viewParentElement, scrollbarParentElement, enableScrollBar, delayInit) {    
+    uiLogger.debug("UIManager(" + viewParentElement + ", " + scrollbarParentElement + ")");
+    if (delayInit == null) {
+        this.init(viewParentElement, enableScrollBar, scrollbarParentElement);
+    }
+}
+
+// Parent element for views.
+UIManager.prototype.viewParentElement = null;
+
+// Parent element for scrollbar.
+UIManager.prototype.scrollbarParentElement = null;
+
+// The currently displayed view.
+UIManager.prototype.currentView = null;
+
+// Reference to the scrollbar.
+UIManager.prototype.scrollbar = null;
+
+// Current scroll Y position.
+UIManager.prototype.scrollY = -1;
+
+// Current viewport height.
+UIManager.prototype.viewportHeight = -1;
+
+// Current document height.
+UIManager.prototype.documentHeight = -1;
+
+// Timer identifier or null if no active timer.
+UIManager.prototype.timerId = null;
+
+// Interval for timer ticks for the UI manager timer (in milliseconds)
+UIManager.prototype.TIMER_INTERVAL = 250;
+
+// Reference to the notification popup used to displays notifications.
+UIManager.prototype.notificationPopup = null;
+
+// is scrollbar enabled
+UIManager.prototype.enableScrollBar = null;
+
+// View switch animation
+UIManager.prototype.viewSwitchAnimation = false;
+UIManager.prototype.viewSwitchTimer = null;
+UIManager.prototype.viewSwitchDivPos = 0;
+UIManager.prototype.VIEW_SWITCH_TIMER_INTERVAL = 25;
+
+// init function
+UIManager.prototype.init = function(viewParentElement, enableScrollBar, scrollbarParentElement) {
+    this.enableScrollBar = enableScrollBar;
+    
+    // parent element for views
+    if (viewParentElement == null) {
+        // create a parent for views
+        this.viewParentElement = document.createElement("div");
+        this.viewParentElement.className = "ViewContainer";
+        document.body.appendChild(this.viewParentElement);
+    }
+    else {
+        this.viewParentElement = viewParentElement;
+    }
+    
+    // parent element for scrollbar
+    if (enableScrollBar) {
+        if (scrollbarParentElement == null) {
+            // create a parent for the scrollbar
+            this.scrollbarParentElement = document.createElement("div");
+            this.scrollbarParentElement.className = "DocumentScrollbarContainer";
+            document.body.appendChild(this.scrollbarParentElement);
+        }
+        else {
+            this.scrollbarParentElement = scrollbarParentElement;
+        }
+    }
+    
+    // currently selected view
+    this.currentView = null;
+    
+    // create the notification popup
+    // the notification popup adds itself as a child element to the document body
+    this.notificationPopup = new NotificationPopup();
+    
+    // create scrollbar
+    if (enableScrollBar) {
+        this.scrollbar = new Scrollbar(this.scrollbarParentElement);
+    }
+    
+    // setup scrollbar tracking
+    var self = this;
+    this.startTimer();
+    if (enableScrollBar) {
+        window.addEventListener("resize", function(){
+            self.updateScrollbar();
+        }, false);
+        window.addEventListener("scroll", function(){
+            self.updateScrollbar();
+        }, false);
+    }
+}
+
+// Returns the current view.
+UIManager.prototype.getView = function() {
+    return this.currentView;
+}
+
+// Switches to the specified view.
+UIManager.prototype.setView = function(view){
+	uiLogger.debug("View set to " + view.id);
+	if ( this.viewSwitchTimer != null ) {
+		return;
+	}
+	if (this.viewSwitchAnimation && this.currentView != null) {
+		var self = this;
+		this.viewSwitchDivPos = 0;
+		this.viewSwitchTimer = setInterval(function(){
+			self.animateViewSwitch(view);
+		}, this.VIEW_SWITCH_TIMER_INTERVAL);
+	}
+	else {
+		this.doSetView(view);
+	}
+}
+
+UIManager.prototype.animateViewSwitch = function(view) {
+	if (this.viewSwitchDivPos + window.innerWidth < 0 ) {
+		clearTimeout(this.viewSwitchTimer);
+		var tmp = this.currentView;
+		this.doSetView(view);
+		tmp.rootElement.style.left = null;
+		this.viewSwitchTimer = null;
+	}
+	else {
+		this.viewSwitchDivPos -= 25;
+		this.currentView.rootElement.style.left = this.viewSwitchDivPos;
+	}
+}
+
+
+UIManager.prototype.doSetView = function(view) {
+    // remove the current view from the parent element
+    if (this.currentView != null) {
+		//this.currentView.saveScrollPos();
+        this.viewParentElement.removeChild(this.currentView.rootElement);
+    }
+        
+    // add the new view to the parent element
+    if (view != null) {
+        this.currentView = view;
+        this.currentView.resetControlFocusStates();
+        this.viewParentElement.appendChild(this.currentView.rootElement);
+    }
+    
+	window.scrollTo(0,0);
+	
+    // update scrollbar
+    if (this.enableScrollBar) {
+        this.updateScrollbar();
+    }
+    
+    // focus the first focusable control
+    // a timer is used to prevent unwanted focus shift
+    setTimeout(function() { view.focusFirstControl(); }, 1);
+}
+
+// Updates the scrollbar.
+UIManager.prototype.updateScrollbar = function() {
+    if (this.enableScrollBar) {
+        // get current viewport and document position and dimensions
+        var scrollY = window.scrollY;
+        var viewportHeight = window.innerHeight;
+        var documentHeight = Math.max(document.documentElement.scrollHeight, document.height);
+        
+        // check if the scroll position or view has changed
+        if (this.scrollY != scrollY ||
+                this.viewportHeight != viewportHeight ||
+                this.documentHeight != documentHeight) {
+            // scroll position or view has changed
+            this.scrollY = scrollY;
+            this.viewportHeight = viewportHeight;
+            this.documentHeight = documentHeight;
+            
+            // update the scrollbar
+            this.scrollbar.update(scrollY, viewportHeight, documentHeight);
+            uiLogger.debug("Scrollbar updated");
+        }
+    }
+}
+
+// Starts the view manager timer.
+UIManager.prototype.startTimer = function() {
+    if (this.timerId == null) {
+        uiLogger.debug("UIManager timer started");
+        var self = this;
+        // setup the timer
+        this.timerId = setInterval(function() { self.onTimer(); }, this.TIMER_INTERVAL);
+    } else {
+        uiLogger.warn("UIManager timer already running");
+    }
+}
+
+// Stops the view manager timer.
+UIManager.prototype.stopTimer = function() {
+    if (this.timerId != null) {
+        // stop the timer
+        clearTimeout(this.timerId);
+        this.timerId = null;
+    } else {
+        uiLogger.warn("UIManager timer already stopped");
+    }
+}
+
+// Timer callback function.
+UIManager.prototype.onTimer = function() {
+    if (this.enableScrollBar) {
+        // make sure the scrollbar is up to date
+        this.updateScrollbar();
+    }
+}
+
+// Displays a notification.
+UIManager.prototype.showNotification = function(displayTime, type, text, progress) {
+    uiLogger.debug("UIManager.showNotification(" + displayTime + ", " + type + ", " + text + ", " + progress + ")");
+    // use the notification popup to show the notification
+    this.notificationPopup.showNotification(displayTime, type, text, progress);
+}
+
+// Hides the currently displayed notification.
+UIManager.prototype.hideNotification = function() {
+    uiLogger.debug("UIManager.hideNotification()");
+    // hide the notification popup
+    this.notificationPopup.hideNotification();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/UI/View.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,154 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// The View class is an abstract base class for views in the UI toolkit.
+// Don't use the View directly - instead use a concrete subclass like ListView.
+
+// Constructor.
+function View(id) {
+    if (id != UI_NO_INIT_ID) {
+        this.init(id);
+    }
+}
+
+// View inherits from UIElement.
+View.prototype = new UIElement(UI_NO_INIT_ID);
+
+// Currently focused control.
+View.prototype.focusedControl = null;
+
+// Allows going back from every view
+View.prototype.previousView = null;
+
+// Allows going back to the same scroll position
+View.prototype.scrollTop = 0;
+
+// Initializer - called from constructor.
+View.prototype.init = function(id) {
+    uiLogger.debug("View.init(" + id + ")");
+    
+    // call superclass initializer
+    UIElement.prototype.init.call(this, id);
+}
+
+// Returns the currently focused control; null if none.
+View.prototype.getFocusedControl = function() {
+    return this.focusedControl;
+}
+
+// Used to notify the view that the focused control has changed.
+View.prototype.focusedControlChanged = function(control) {
+    uiLogger.debug("View.focusedControlChanged(" + control + ")");
+    this.focusedControl = control;
+    // notify event listeners
+    this.fireEvent(this.createEvent("FocusedControlChanged", this.focusedControl));
+}
+
+// Attempts to focus the first focusable control.
+// Override in subclasses as required.
+View.prototype.focusFirstControl = function() {
+    uiLogger.debug("View.focusFirstControl()");
+}
+
+// Attempts to reset all control focus states.
+// Override in subclasses as required.
+View.prototype.resetControlFocusStates = function() {
+    uiLogger.debug("View.resetControlFocusStates()");
+}
+
+
+// ////////////////////////////////////////////////////////////////////
+// Added functions
+
+// set up soft keys. Default implementation sets right soft
+// key to Back if the previous view is set
+View.prototype.setupSoftKeys = function()  {
+    if (window.widget) {
+		if (this.previousView != null) {
+			var self = this;
+			menu.setRightSoftkeyLabel("Back", function(){self.goBack();});
+		} else {
+			menu.setRightSoftkeyLabel("Exit", function(){window.close();});
+		}
+    }
+}
+
+// show the view - sets up soft keys
+View.prototype.show = function () {
+	this.setupSoftKeys();
+	if (window.widget) {
+		widget.setNavigationEnabled(false);
+	}
+	this.update(false);
+	uiManager.setView(this);
+	//this.restoreScrollPos();
+}
+
+// abstract function for updating page content
+View.prototype.update = function(forceUpdate){
+}
+
+View.prototype.saveScrollPos = function() {
+	this.scrollTop = window.pageYOffset;
+//	alert("Saving scroll pos: " + this.scrollTop);
+}
+
+View.prototype.restoreScrollPos = function() {
+//	alert("Restoring scroll pos: " + this.scrollTop);
+	window.scrollTo(0, this.scrollTop);
+}
+
+// Default back button handler takes us to previous view
+// if one is set
+View.prototype.goBack = function()  {
+	if ( this.previousView != null ) {
+		// transition looks funky
+		if (window.widget) {
+			widget.prepareForTransition("fade");
+		}
+		this.previousView.show();
+		if (window.widget) {
+			widget.performTransition();
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/Utils/Logger.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,117 @@
+/*
+© Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (ÒNokiaÓ) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under NokiaÕs copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// Logger utility class that uses the Firebug console class.
+
+// Constructor (everything is static so this is empty).
+function Logger() {
+    // Set default logger level.
+    this.level = this.LOG_LEVEL_OFF;
+}
+
+// Logger levels.
+Logger.prototype.LOG_LEVEL_DEBUG = 0;
+Logger.prototype.LOG_LEVEL_INFO = 1;
+Logger.prototype.LOG_LEVEL_WARN = 2;
+Logger.prototype.LOG_LEVEL_ERROR = 3;
+Logger.prototype.LOG_LEVEL_OFF = 4;
+
+Logger.prototype.level = null;
+Logger.prototype.filter = null;
+
+// Disable logging on other browsers except Firefox.
+Logger.prototype.enabled = (navigator.userAgent.indexOf("Firefox") != -1);
+
+// Dumps an objects properties and methods to the console.
+Logger.prototype.dump = function(obj) {
+    if (this.enabled) {
+        console.dir(obj);
+    }
+}
+
+// Dumps a stracktrace to the console.
+Logger.prototype.trace = function() {
+    if (this.enabled) {
+        console.trace();
+    }
+}
+
+// Prints a debug message to the console.
+Logger.prototype.debug = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_DEBUG) {
+        if (this.filter == null) {
+            console.debug(str);
+        } else {
+            var show = false;
+            for (i in this.filter) {
+                if (str.indexOf(this.filter[i]) >= 0) {
+                    show = true;
+                    break;
+                }
+            }
+            if (show) {
+                console.debug(str);
+            }
+        }
+    }
+}
+
+// Prints an info message to the console.
+Logger.prototype.info = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_INFO) {
+        console.info(str);
+    }
+}
+
+// Prints a warning message to the console.
+Logger.prototype.warn = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_WARN) {
+        console.warn(str);
+    }
+}
+
+// Prints an error message to the console.
+Logger.prototype.error = function(str) {
+    if (this.enabled && this.level <= this.LOG_LEVEL_ERROR) {
+        console.error(str);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/WRTKit/WRTKit.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,93 @@
+/*
+� Copyright 2008 Nokia Corporation. All rights reserved.
+
+IMPORTANT:  The Nokia software ("WRTKit and Example Widget files") is supplied to you by Nokia
+Corporation (�Nokia�) in consideration of your agreement to the following terms. Your use, installation
+and/or redistribution of the WRTKit and Example Widget files constitutes acceptance of these terms. If
+you do not agree with these terms, please do not use, install, or redistribute the WRTKit and Example
+Widget files.
+
+In consideration of your agreement to abide by the following terms, and subject to these terms, Nokia
+grants you a personal, non-exclusive license, under Nokia�s copyrights in the WRTKit and Example
+Widget files, to use, reproduce, and redistribute the WRTKit and Example files, in text form (for HTML,
+CSS, or JavaScript files) or binary form (for associated images), for the sole purpose of creating S60
+Widgets.
+
+If you redistribute the WRTKit and Example files, you must retain this entire notice in all such
+redistributions of the WRTKit and Example files.
+
+You may not use the name, trademarks, service marks or logos of Nokia to endorse or promote products
+that include the WRTKit and Example files without the prior written explicit agreement with Nokia.
+Except as expressly stated in this notice, no other rights or licenses, express or implied, are granted by
+Nokia herein, including but not limited to any patent rights that may be infringed by your products that
+incorporate the WRTKit and Example files or by other works in which the WRTKit and Example files
+may be incorporated.
+
+The WRTKit and Example files are provided on an "AS IS" basis.  NOKIA MAKES NO
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
+WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE, REGARDING THE EXAMPLES OR ITS USE AND OPERATION
+ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL NOKIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, AND/OR
+DISTRIBUTION OF THE EXAMPLES, HOWEVER CAUSED AND WHETHER UNDER THEORY
+OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE,
+EVEN IF NOKIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// This script includes the WRTKit for use in a widget.
+
+// WRTKit version (major.minor.revision, e.g. 1.0.0).
+var WRTKIT_VERSION_MAJOR = 1;
+var WRTKIT_VERSION_MINOR = 0;
+var WRTKIT_VERSION_REVISION = 0;
+var WRTKIT_RESOURCE_DIRECTORY = "WRTKit/Resources/";
+
+// Include util script files.
+includeScript("WRTKit/Utils/Logger.js");
+
+// Include UI visual definition.
+//includeStyleSheet("WRTKit/Resources/UI.css");  // included in index.html
+
+// Include all UI toolkit script files.
+var UI_NO_INIT_ID = "UI_NO_INIT_ID";
+
+includeScript("WRTKit/UI/UIInit.js");
+includeScript("WRTKit/UI/UIElement.js");
+includeScript("WRTKit/UI/Scrollbar.js");
+includeScript("WRTKit/UI/NotificationPopup.js");
+includeScript("WRTKit/UI/UIManager.js");
+includeScript("WRTKit/UI/View.js");
+includeScript("WRTKit/UI/ListView.js");
+includeScript("WRTKit/UI/Control.js");
+includeScript("WRTKit/UI/Separator.js");
+includeScript("WRTKit/UI/Label.js");
+includeScript("WRTKit/UI/ContentPanel.js");
+includeScript("WRTKit/UI/TextEntryControl.js");
+includeScript("WRTKit/UI/TextField.js");
+includeScript("WRTKit/UI/TextArea.js");
+includeScript("WRTKit/UI/SelectionControl.js");
+includeScript("WRTKit/UI/SelectionMenu.js");
+includeScript("WRTKit/UI/SelectionList.js");
+includeScript("WRTKit/UI/ActionControl.js");
+includeScript("WRTKit/UI/FormButton.js");
+includeScript("WRTKit/UI/NavigationButton.js");
+includeScript("WRTKit/UI/TextPane.js");
+includeScript("WRTKit/UI/TabView.js");
+includeScript("WRTKit/UI/Ajax.js");
+includeScript("WRTKit/UI/ImageLabel.js");
+
+// Includes a script file by writing a script tag.
+function includeScript(src) {
+    document.write("<script type=\"text/javascript\" src=\"" + src + "\"></script>");
+}
+
+// Includes a style sheet by writing a style tag.
+function includeStyleSheet(src) {
+    document.write("<style type=\"text/css\"> @import url(\"" +  src + "\"); </style>");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/autoupdate.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,64 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+var updatePageAjax;
+var versionURL = "http://developer.symbian.org/wiki/index.php/SEE_2009_Widget";
+var downloadUrl = "http://developer.symbian.org/wiki/images/7/74/See09Widget.wgz";
+var myVersion = "1.0rc3";
+var versionPrefixString = "Current Widget Version is: [";
+var versionSuffixString = "]";
+
+function CheckForUpdates() {
+	if (IsHSViewMode()) {
+		setTimeout(function() {CheckForUpdates();}, 600000);
+		return;
+	}
+
+	uiManager.showNotification(-1, "wait", "Checking for updates...", -1);
+	updatePageAjax = new Ajax();
+	updatePageAjax.onreadystatechange = function(){
+		CheckForUpdatesStage2();
+	};
+	updatePageAjax.open('GET', nocache(versionURL), true);
+	updatePageAjax.send(null);	
+}
+
+function CheckForUpdatesStage2() {
+    if (updatePageAjax.readyState == 4) {
+		// extract version number
+		var content = updatePageAjax.responseText;
+		var ind = content.indexOf(versionPrefixString);
+		if ( ind == -1 ) {
+			uiManager.showNotification(3000, "warning", "Update failed, check manually.");
+			return;
+		}
+		ind += versionPrefixString.length;
+		var ind2 = content.indexOf(versionSuffixString,ind);
+		if ( ind2 == -1 || (ind2-ind) > 10 ) {
+			uiManager.showNotification(3000, "warning", "Update failed, check manually.");
+			return;
+		}
+		var version = content.substring(ind,ind2);
+		// compare to this version
+		if ( version != myVersion ) {
+			var answer = confirm("Install new version " + version + "?");
+			if (answer) {
+				// ok, we have the update
+				uiManager.hideNotification();
+				openURL(nocache(downloadUrl));
+				setTimeout(function () {window.close();}, 1000);
+			} else {
+				uiManager.showNotification(3000, "info", "Update cancelled.");
+			}
+		} else {
+			// No need to show anything
+			 uiManager.showNotification(3000, "info", "Up to date!");
+		}
+	}
+}
Binary file See09/blank.png has changed
Binary file See09/day-icon.png has changed
Binary file See09/day1.png has changed
Binary file See09/day2.png has changed
Binary file See09/home.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/index.html	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title></title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />		
+        <script type="text/javascript" src="WRTKit/WRTKit.js"></script>
+        <script type="text/javascript" src="main.js"></script>
+        <script type="text/javascript" src="utils.js"></script>
+        <script type="text/javascript" src="autoupdate.js"></script>
+        <script type="text/javascript" src="session.js"></script>
+        <script type="text/javascript" src="schedule.js"></script>
+        <script type="text/javascript" src="twitter.js"></script>
+		<link rel="stylesheet" href="WRTKit/Resources/UI.css" id="stylesheet">
+        <link rel="stylesheet" href="style.css" type="text/css">
+    </head>
+    <body onload="javascript:init();" onShow="javascript:SetViewMode();" onResize="javascript:SetViewMode();" >
+    	<div id="main" style="margin: 0px 0px; padding: 0px 0px; border: none; overflow: hidden;"></div>
+    	<div id="mini" style="margin: 0px 0px; padding: 0px 0px; border: none; overflow: hidden;"></div>
+	</body>
+</html>
\ No newline at end of file
Binary file See09/logo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/main.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,239 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+var uiManager;
+var homeView;
+var mainView;
+var scheduleView = null;
+var twitterView = null;
+var venueView = null;
+
+var schedule;
+var scheduleFile = "see09.csv";
+var scheduleUrl;
+
+var twitter;
+
+// used as a title bar in all views
+var header = "<img src=home.png>";
+
+
+var day1 = "27-Oct-09";
+var day2 = "28-Oct-09";
+var showingDay = day1;
+
+
+function ShowTopicView(topic) {
+	var topicView = new ListView(null, header);
+	var day = ( showingDay == day1 ) ? "day1": "day2";
+	var titleButton = new NavigationButton(null, day+".png", "<b>" + topic + "</b>");
+	//titleButton.setEnabled(false);
+	topicView.addControl(titleButton);
+	topicView.previousView = scheduleView;
+	addSessions(topic, topicView);
+	topicView.show();
+}
+
+function addSessions(topic, topicView) {
+	var sessions = schedule.GetSessions(topic, showingDay);
+	for ( var i = 0; i < sessions.length ; i++ ) {
+		var session = sessions[i];
+		var content = new ContentPanel(null, null, null, true);
+		var contentHtml = session.GetContentHTML();
+		// initialize feed item control
+		var title = session.title;
+		if ( title.length < 2 ) {
+			title = session.chair;
+			if (title.length < 2) {
+				title = session.speakers;
+			}
+			title += "'s talk";
+		}
+		content.setCaption(session.startTime + ": " + title);
+		content.setContent(contentHtml);
+		content.setExpanded(false);		
+		topicView.addControl(content);
+	}
+}
+
+function ShowScheduleView(){
+	scheduleView = new ListView(null, header);
+	var title = ( showingDay == day1 ) ? "day1": "day2";
+	var dayButton = new NavigationButton(null, "day-icon.png", "<img src="+title+".png border=0 align=center>");
+	//dayButton.setEnabled(false);
+	scheduleView.addControl(dayButton);
+	scheduleView.previousView = mainView;
+	// add 'general' sessions
+	addSessions(schedule.topics[0], scheduleView);
+	
+	var trailsButton = new NavigationButton(null, "day-icon.png", "<img src=trailz.png border=0 align=center>");
+	trailsButton.setEnabled(false);
+	scheduleView.addControl(trailsButton);
+	for ( var i = 1; i < schedule.topics.length ; i++ ) {
+		var topic = schedule.topics[i];
+		var scheduleButton = new NavigationButton(topic, "schedule-icon"+(i%4)+".png", topic);
+		scheduleButton.addEventListener("ActionPerformed", function(event){
+			var topic = event.source.id;
+			ShowTopicView(topic);
+		});
+		scheduleView.addControl(scheduleButton);
+	}
+	scheduleView.show();
+}
+
+
+// Called when the data is loaded
+function ShowMainView(){
+	if (mainView == null) {
+		UpdateMiniView();
+		mainView = new ListView(null, header);
+		var currentSessions = schedule.GetCurrentSessions();
+		if (currentSessions != null) {
+		// todo
+		}
+		
+		var scheduleButton = new NavigationButton(null, "schedule-icon.png", "<img src='schedule.png' border=0>");
+		scheduleButton.setEnabled(false);
+		mainView.addControl(scheduleButton);
+		var day1Button = new NavigationButton(null, "blank.png", "<img src=day1.png border=0 align=center>");
+		day1Button.addEventListener("ActionPerformed", function(event){
+			showingDay = day1;
+			ShowScheduleView();
+		});
+		mainView.addControl(day1Button);
+		var day2Button = new NavigationButton(null, "blank.png", "<img src=day2.png border=0 align=center>");
+		day2Button.addEventListener("ActionPerformed", function(event){
+			showingDay = day2;
+			ShowScheduleView();
+		});
+		mainView.addControl(day2Button);
+		
+		venueView = new ListView(null, header);
+		venueView.previousView = mainView;
+		var venueMap = new ImageLabel(null, null, "venue.png");
+		venueMap.contentElement.style.textAlign = "center";
+		venueView.addControl(venueMap);
+	
+		var venueButton = new NavigationButton(null, "schedule-icon1.png", "<img src='venuelabel.png' border=0>");
+		venueButton.addEventListener("ActionPerformed", function(event){
+			venueView.show();
+		});
+		mainView.addControl(venueButton);
+		
+		twitterView.previousView = mainView;
+		var twitterTitle = new NavigationButton(null, "tweetz-icon.png", "<img src='tweetz.png' border=0>");
+		twitterTitle.addEventListener("ActionPerformed", function(event){
+				if ( twitter == null ) {
+					twitter = new Twitter(twitterView);
+				}
+				twitter.Update(10);
+				twitterView.show();
+				});
+		mainView.addControl(twitterTitle);
+//		twitter = new Twitter(mainView);
+//		twitter.Update(10);
+		mainView.previousView = null;
+	}
+	mainView.show();	
+}
+
+// Called from the onload event handler to initialize the widget.
+function init() {
+	
+    if (window.widget) {
+        widget.setNavigationEnabled(false);
+        menu.showSoftkeys();
+        var updateMenuItem = new MenuItem("Check for updates", 0);
+        updateMenuItem.onSelect = CheckForUpdates;
+        menu.append(updateMenuItem);
+		setInterval("if ( IsHSViewMode() ) UpdateMiniView();", 30000); // wrt bug fix
+    }
+	
+	// create UI manager
+	uiManager = new UIManager(document.getElementById("main"));
+	
+	homeView = new ListView(null, "<img style='margin: 0px 0px; padding: 0px 0px; border: none' src='home.png'>");
+	
+	var homeViewImage2 = new ImageLabel(null, null, "logo.png");
+	homeViewImage2.contentElement.style.textAlign = "center";
+	homeView.addControl(homeViewImage2);
+	
+	setDefaultFontSizeForScreenSize();
+	SetViewMode();
+	homeView.show();
+
+	twitterView = new ListView(null, "<img style='margin: 0px 0px; padding: 0px 0px; border: none' src='home.png'>");
+
+	schedule = new Schedule();
+	schedule.Init(scheduleFile, function(event){
+		ShowMainView();
+	});
+	
+//	if ( !window.widget ) {
+//		// for firefox / firebug testing
+//		CheckForUpdates();
+//	}
+	
+}
+
+
+// ////////////////////////////////////////////////////////////////
+// Support for home screen view
+// ////////////////////////////////////////////////////////////////
+var HS_VIEW_THRESHOLD = 150;
+
+function SetViewMode(){
+	var mainDiv = document.getElementById("main");
+	var miniDiv = document.getElementById("mini");
+	var hsView = IsHSViewMode(); 
+	if ( !hsView ) {
+		// normal view		
+		mainDiv.style.visibility = 'visible';
+		miniDiv.style.visibility = 'hidden';
+		miniDiv.style.position = 'static';
+		miniDiv.style.top = null;
+	}
+	else {
+		// home screen view
+		mainDiv.style.visibility = 'hidden';
+		miniDiv.style.visibility = 'visible';
+		miniDiv.style.position = 'absolute';
+		miniDiv.style.top = '0';
+	}
+	setDefaultFontSizeForScreenSize();
+	UpdateMiniView();
+}
+
+function IsHSViewMode() {
+	//var screenHeight = document.body.clientHeight;
+	var screenHeight = window.innerHeight;
+	//alert(screenHeight);
+	return ( screenHeight < HS_VIEW_THRESHOLD );
+}
+
+function UpdateMiniView() {
+	var text = "";
+	var current;
+	if (schedule) {
+		current = schedule.GetCurrentSessions();
+	}
+	if ( current && current.length > 0 ) {
+		text = "Now: " + current[0].title;
+		if ( current.length > 1 ) {
+			text += "<br>Now: " + current[1].title;
+		}
+	} else if( twitter && twitter.buttons && twitter.buttons.length > 0  ){
+		text = twitter.buttons[0].getText();
+	} else {
+		text = "Symbian Exchange & Exposition 2009<br>Earls Court 2, 27-28 October 2009" 
+	}
+	var mini = document.getElementById("mini");
+	mini.innerHTML = "<table border=0><tr><td><img src=minilogo.png></td><td><span style='font-size: 10px'>"+text+"</span></td></tr></table>";
+}
+
Binary file See09/minilogo.png has changed
Binary file See09/schedule-icon.png has changed
Binary file See09/schedule-icon0.png has changed
Binary file See09/schedule-icon1.png has changed
Binary file See09/schedule-icon2.png has changed
Binary file See09/schedule-icon3.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/schedule.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,173 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+// The Schedule class is used to load, keep and filter sessions   
+function Schedule() {
+	this.callBackFunction = null;
+	this.sessions = null;
+	this.topics = new Array( "Main Stage", "Application Development", "Open Source Business Models", "Device Creation and Contributing to Symbian", "Hands-on Lab 1", "Hands-on Lab 2", "Birds of a Feather" );
+	this.scheduleFileName = null;
+	this.http = null;
+	this.parseCounter = 0;
+	this.rawData = null;
+}
+
+// Kick off loading
+Schedule.prototype.Init = function(csvfile, cbfunc){
+	this.callBackFunction = cbfunc;
+	this.scheduleFileName = csvfile;
+	var self = this;
+	setTimeout( function() {self.Load();}, 100);
+}
+
+// 'public' functions 
+Schedule.prototype.GetTopics = function() {
+	return this.topics;
+}
+
+Schedule.prototype.GetSessions = function(topic, day) {
+	var cnt = this.sessions.length;
+	var ret = new Array();
+	for( var i = 0; i < cnt ; i++ ) {
+		var session = this.sessions[i];
+		if ( session.topic == topic && day == session.date ) {
+			ret.push(session);
+		}
+	}
+	return ret;
+}
+
+Schedule.prototype.GetCurrentSessions = function() {
+	var now = GetUtcTime(new Date());
+	if ( ! this.sessions || this.sessions == null ) {
+		return;
+	}
+	var cnt = this.sessions.length;
+	var ret = new Array();
+	for( var i = 0; i < cnt ; i++ ) {
+		var session = this.sessions[i];
+		var sessionStart = session.GetStartUtc();
+		var sessionEnd = session.GetEndUtc();
+		if( now > sessionStart && now < sessionEnd ) {
+			ret.push(session);
+		}
+	}
+	return ret;
+}
+
+
+// 'private' functions
+
+// Loading and parsing
+Schedule.prototype.Load = function(){
+	// Prepare asynchronous download
+	this.http = new Ajax();
+	var self = this;
+	this.http.onreadystatechange = function() { self.LoadComplete(); };
+	this.http.open("GET", this.scheduleFileName, true); // false means synchronous
+	this.http.send(null);
+}
+	
+Schedule.prototype.LoadComplete = function() {
+	// request complete?
+    if (this.http.readyState == 4) {
+		try {
+			this.rawData = this.http.responseText;
+			this.http = null; 
+			// parse data
+			this.sessions = new Array();
+			this.Parse(); // Prepare and set the data for the parser.
+		} 
+		catch (x) {
+			uiManager.showNotification(5000, "warning", "Error processing feed");
+		}
+	}
+}
+
+Schedule.prototype.Parse = function() {
+	var session = new Session();
+	var fieldCounter = 0;
+	var fieldBuf = "";
+	var quoted = false;
+	for(; this.parseCounter < this.rawData.length; this.parseCounter++ ) {
+		var ch = this.rawData.charAt(this.parseCounter);
+		if ( !quoted && ( ch == ',' || ch == '\n') ) {
+			session.SetFieldByOrdinal(fieldCounter++, fieldBuf);
+			if (fieldCounter == session.GetNumberOfFields()) {
+				this.AddSession(session);
+				this.parseCounter++;
+				var self = this;
+				setTimeout(function(){self.Parse();}, 1);
+				return;
+			}
+			fieldBuf = "";
+		} else if ( ch == '"' ) {
+			if (quoted) {
+				if (this.parseCounter < this.rawData.length - 1 && this.rawData.charAt(this.parseCounter + 1) == '"') {
+					// escaped quote, ignore this and next
+					this.parseCounter++;
+				} else {
+					quoted = false;
+				}
+			} else {
+				quoted = true;
+			}
+		} else if ( ch == '\r' ) {
+			// ignore carriage return 
+		} else if ( ch == '\n' ) { // quoted = true
+			// replace newline with <br> 
+			fieldBuf += "<br>";
+		} else {
+			fieldBuf += ch;
+		}
+	}
+	this.Sort();
+	if (this.callBackFunction) {
+		this.callBackFunction.call();
+	}
+	uiManager.hideNotification();
+}
+
+Schedule.prototype.Sort = function (){
+	// we get the schedule all messy so here we sort things out
+	var cnt = this.sessions.length;
+	for( var i = 0 ; i < cnt ; i++ ) {
+		for( var j = i+1 ; j < cnt ; j++ ) {
+			var si = this.sessions[i];
+			var sj = this.sessions[j];
+			if ( si.startTime > sj.startTime ) {
+				// swap
+				this.sessions[i] = sj;
+				this.sessions[j] = si;
+			}
+		}	 
+	}	 
+}
+
+Schedule.prototype.AddSession = function (session) {
+	if ( ! session.topic || session.topic == null || session.topic.length == 0 ) {
+		return;
+	}
+	// add to list of sessions
+	this.sessions.push(session);
+}
+
+function trim(text) {
+	return text;
+}
+
+
+function GetUtcTime(d){
+	// convert to msec since Jan 1 1970
+	var localTime = d.getTime();
+	// obtain local UTC offset and convert to msec
+	var localOffset = d.getTimezoneOffset() * 60000;
+	// obtain UTC time in msec
+	return localTime + localOffset;
+}
\ No newline at end of file
Binary file See09/schedule.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/see09.csv	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,182 @@
+27-Oct-09,Application Development Theatre,12:30,13:00,Application Development,,Olli Airaksinen,Key Components for Successful Mobile Application Development,
+27-Oct-09,Application Development Theatre,13:00,14:00,Application Development,Alex Pressland,"Jim Carroll
+Josh Alner
+Tim Haysom","Panel Discussion: Choosing a Mobile Development Platform: Considerations, Questions, the Future",
+27-Oct-09,Application Development Theatre,14:00,14:30,Application Development,,Pekka Kosonen,Next Generation Hybrid Applications - Utilizing your Web Development Skills with Qt based Solutions,Qt is a cross-platform application and UI framework. The integration of the open source WebKit browser engine and Qt application and UI framework blurs the line between application and content. The resulting mixed-mode services are efficient to build and deliver functionality that would be difficult or impossible to develop using only web APIs or only native development environments. Combining the simplicity of web technologies with the power of the Qt application framework allows designers and coders to concentrate on what they do best.
+27-Oct-09,Application Development Theatre,15:00,15:30,Application Development,,Zach Berke,Building mobile quickly!  One development team's story of a four week Symbian WRT development project: the Wine.com mobile application. ,"Wine.com came to Exygy with a great idea (build a mobile Symbian app on top of the beta Wine API) and an insane timeline (get it done in 4 weeks). Exygy identified Symbian WRT as an easy to use framework that would allow for rapid development by leveraging well understood web technologies (mainly JavaScript). Exygy worked with Wine.com and Symbian to get a core application built rapidly and continues to work with Wine.com to build new features.&nbsp; In this talk, we'll look at the Wine.com app as a case study illustrating the pros and cons of Symbian WRT development highlighting lessons learned during this rapid development project."
+27-Oct-09,Application Development Theatre,15:30,16:00,Application Development,,Craig Heath,How to Write Secure Applications ,
+27-Oct-09,Application Development Theatre,16:00,16:30,Application Development,,Matt McAlister,Mobile Mashup Quickfire: The Guardian,
+27-Oct-09,Application Development Theatre,16:30,17:00,Application Development,,Daniel Jacobson,Mobile Mashup Quickfire: NPR ,
+27-Oct-09,Application Development Theatre,17:00,17:30,Application Development,,Paul Beusterien,The Open Road:Tools roadmap for an open source mobile platform and next gen web apps,"1. Tools Plans - Overview of the strategy and plans for Symbian tools
+2. Web Development Tools - In recent years, the web is transitioning to be a first-class development platform. I'll give a survey of some of the different technologies and directions like phonegap, Blinki, Appcelerator, RhoMobile, and WRT"
+28-Oct-09,Application Development Theatre,13:00,13:30,Application Development,,John Carpenter,From Concept to Commercialization: User Feedback Techniques to Make Great Mobile Software,"In order to make great software, users MUST be included in the development process. But, unlike traditional client/server and web development, mobile software offers significant challenges to engage users in both functional and usability feedback. So, many firms choose to ignore or just do basic functional testing. It's not enough... no wonder that 50% of applications crash on intended handsets or that only 3% of applications are still in use after 3 months. Great software leads to stickiness; increased customer loyalty to your brand (also known as 'going viral'). In a world where developers have limited marketing budgets, they must rely on a great user experience so that people will tell their friends and post great reviews. This word of mouth leads to sustained growth and mobile app success!<br /><br />In this session, we'll review two software product feedback techniques as they apply to mobile development: Townhalls and Customer Loyalty 2.0.<br /><br />1) Challenges of user feedback in mobile app development due to fragmentation<br />2) Using 'Townhall' techniques in the alpha cycle to get product feedback to optimize the user experience BEFORE you port or release<br />3) Using 'Customer Loyalty' techniques in the beta cycle to assess feedback in real-world situations, as well as identifying if your apps will go viral<br />"
+28-Oct-09,Application Development Theatre,13:30,14:00,Application Development,,Mark Doherty,Mobile Application development with the Flash Platform,
+28-Oct-09,Application Development Theatre,14:00,14:30,Application Development,,John Forster,LBS and the Power of Community,
+28-Oct-09,Application Development Theatre,14:30,15:00,Application Development,,Sami Viitanen,Widget Meets Home Screen and Platform Services,"This presentation gives the big picture about the S60 Web Runtime (WRT) Widgets and Platform Services providing all needed information to develop Web Runtime Widgets from the beginning (tools, technologies and practices) to the end (device support and distribution). The development of WRT Widgets is based on traditional Web technologies like HTML, CSS and JavaScript adding S60 specific packaging to provide installable package, native application like end-user experience and tight integration to platform features like messaging, contacts or location via JavaScript. Presentation is divided in 2 parts:
+
+1) Theoretical approach to technology providing needed background information.
+2) Practical approach with instructor led widget coding to show how to utilize available tools for WRT widget development. Presentation will cover for example: 
+
+* Essentials of Web Runtime widgets 
+* How to use Aptana with Nokia WRT plugin 2.0 (creation, testing, debugging and deployment of widgets with the home screen feature)
+* What can I do with platform services on my widget - integration to platform features"
+28-Oct-09,Application Development Theatre,15:00,15:30,Application Development,,Jon Billings,BBC iPlayer on mobile: An internal exam: A review of the anatomy of the widget for BBC iPlayer on mobile.,"Discusses how well factored software design leads to cost effective and affordable repurposing of AV content for new platforms such as mobile, and shows how Symbian Widget Runtime effectively enables pure web shops such as BBC to deliver compelling home screen applications"
+28-Oct-09,Application Development Theatre,15:30,16:00,Application Development,Shaun Puckrin,"Demian Perry
+Michael  Coffey
+Patrick Mork
+Redg Snodgrass",Panel Discussion: Beyond the Store: How do you go about getting traction and distribution for your app?,
+27-Oct-09,Application Development Theatre,14:30,15:00,Application Development,,Michael Moore,Symbian and Location: Trends and Technology,"With GPS capabilities becoming de facto on mobile devices, LBS have the ability to bridge the virtual and physical worlds and really extend the use of the mobile phone. Learn about trends in the location based application industry and how to include the technology in your own application. The presentation will cover: 
+-  An overview of positioning technologies and handset trends and their impact on the future of LBS, including: 
+-  higher accuracy in positioning 
+-  the importance of high-quality map data and location content
+-  a wide range of handset technologies, from browsers, sensors/ accelerometers, cameras and OCR (optical character recognition) technology to haptics and their usefulness for LBS apps 
+-  How location and context awareness enables a new era of mobile apps, e.g. multi-modal navigation, location-based entertainment, social networking and location-based advertising
+-  How to get started using NAVTEQ map data and location content
+-  Overview of some available APIs and technical resources"
+27-Oct-09,Area 1,14:00,15:00,Birds of a Feather,,Remek Zajac,Bearer Mobility (the future of),
+27-Oct-09,Area 1,15:00,16:00,Birds of a Feather,,"Jo Stichbury
+Hamish Willee",Building knowledge through wiki documentation ,
+27-Oct-09,Area 1,16:00,17:00,Birds of a Feather,,"Dan McNeil
+Roderick Burns",Symbian Signed,
+28-Oct-09,Area 1,14:00,15:00,Birds of a Feather,,"Allix Harrison-D'Arcy
+Joe Neale",The Future of Augmented Reality: How to create a working framework of standards ,
+28-Oct-09,Area 1,15:00,16:00,Birds of a Feather,,Salvatore Rinaldo,Mobile development with Qt for Symbian,
+27-Oct-09,Area 4,14:00,15:00,Birds of a Feather,,"Chris Dudding
+Stefan Williams","Persistent Data, File Systems and Memory - Past, Present and Future ",
+27-Oct-09,Area 2,15:00,16:00,Birds of a Feather,,"Jezar Wakefield
+James Nash",NGMA & OpenMAX components in Multimedia ,
+27-Oct-09,Area 2,16:00,17:00,Birds of a Feather,,Scott Weiss,Live UI Brainstorm - User Interface BoF ,
+28-Oct-09,Area 2,14:00,15:00,Birds of a Feather,,Mark Mitchell,Open-Source Tools for Symbian App Development,
+28-Oct-09,Area 2,15:00,16:00,Birds of a Feather,,Dennis Lee,Symbian Developer - App developer needs online,
+27-Oct-09,Area 3,17:00,18:00,Birds of a Feather,,James Aley,Social Networks in Mobile,
+27-Oct-09,Area 3,14:00,15:00,Birds of a Feather,,Victor Palau,"Build, Integration, Testing and Releasing of the Symbian Platform ",
+27-Oct-09,Area 3,15:00,16:00,Birds of a Feather,,John Imhofe,Kernel and Hardware Service BoF,
+28-Oct-09,Area 3,14:00,15:00,Birds of a Feather,,Robert Ackland,The future of Managed Runtimes on Symbian,
+28-Oct-09,Area 3,15:00,16:00,Birds of a Feather,,Sebastian Brannstrom,Symbian in a Linux world,
+27-Oct-09,Area 2,14:00,15:00,Birds of a Feather,,Gordon MacLachlan,Graphics Graphics Graphics,
+27-Oct-09,Area 4,15:00,16:00,Birds of a Feather,,"Billy Gibson
+Richard Collins",Location Location Location ,
+28-Oct-09,Area 4,14:00,15:00,Birds of a Feather,,Richard Kinder,OTA Software Updating Fulfill Customers' Needs,
+27-Oct-09,Area 4,16:00,17:00,Birds of a Feather,,Thibaut Rouffineau,What happened to the Mobile enterprise?,
+27-Oct-09,Device Creation Theatre,13:00,13:30,Device Creation and Contributing to Symbian,,Fred Blesser,"Reach New Heights with Symbian-based Designs: The World is your Stage, TI's OMAP Technology is your Platform",A look inside the tool box: TI's presence and involvement in the Symbian Foundation community sets the stage for the market-changing OMAP- and Symbian Foundation-based mobile devices. <br /><br />- Preparing for today and tomorrow's advancements: How TI
+27-Oct-09,Device Creation Theatre,13:30,14:00,Device Creation and Contributing to Symbian,,Gernot Heiser,Mobile Virtualization: reducing time-to-market and development cost for handsets while opening new markets,"-  Mobile virtualization defined, including differences in application and technology relative to virtualization in the IT world
+-  Virtualization enabled solutions for the mobile ecosystem with benefits for semiconductor providers, handset OEMS, and MNO"
+27-Oct-09,Device Creation Theatre,14:00,14:30,Device Creation and Contributing to Symbian,,Robert Ackland,Contribution A-Z: How to contribute to the Symbian platform,"- What you must know when thinking about making a contribution
+- An overview over the contribution process for three use-cases: contributing a bug-fix, contributing an enhancement and contributing an extension to the platform 
+- A brief overview of Symb"
+27-Oct-09,Device Creation Theatre,14:30,15:00,Device Creation and Contributing to Symbian,,Mik Kersten,Coordinating Contributions: Lessons learned Growing an Open Source Community,"In less than four years, the Eclipse Mylyn's project transitioned from a university whiteboard into the hands of hundreds of thousands of developers. We achieved this by growing an open source community around the technology, fostering an open development process, and inviting participation both in the terms of feedback and code contributions. In the process we created an Eclipse-based open source collaboration tool that has made it possible for a small team to apply and review hundreds of patches a year, and to effectively manage an enormous user base and backlog of feature requests. The end result is one of the most successful Eclipse projects, a de facto standard for ALM integrations with the Eclipse IDE, an active ecosystem of vendor extensions, and an ongoing stream of contributions that's helping evolve the technology and APIs. This talk will start with a summary of what we did, and then overview lessons learned for project managers and tips for potential contributors."
+27-Oct-09,Device Creation Theatre,15:00,15:30,Device Creation and Contributing to Symbian,,Abhijit Kabra,Unleashing the Power of 4G and Open Development to Accelerate Growth in the Smartphone industry,"As 4G moves into production, smartphone companies are gearing to create and enable creation of new applications and services to deliver the next wow experience to the users. To meet ever rising user expectations and have a competitive advantage, smartphone companies have started leveraging the power of Open development. With 4G promising higher bandwidth and richer content and new advancements happening in semiconductor and open software technologies, smartphone companies are poised for exciting growth opportunities by transforming their products into a vehicle of growth in 4G era. Based on Accenture's research and client experiences world wide, this presentation will provide insights on: - the trends related to smartphones: the design, form factor, new challenges, application, user experience etc. - the trends related to content: HD video, HF audio, integration of content, application, advertisements etc. - the trends related to software: closed, open, open source etc - the trends related to next generation software: consumer insight built-in, ecosystem support etc. - the new/unique opportunities and challenges these trends unfold for the smartphone industry - Accenture's recommendation for the smartphone industry to achieve high performance in 4G era"
+27-Oct-09,Device Creation Theatre,15:30,16:00,Device Creation and Contributing to Symbian,,Morten Grauballe,Mobile Software Management and Open Source: The Key to Addressing Consumer Demand,"The standards, the progress and the challenges of getting new software to the consumer faster using Mobile Software Management 
+Analysis of the Symbian Foundation's open source principles that make software more manageable and attractive"
+27-Oct-09,Device Creation Theatre,16:00,16:30,Device Creation and Contributing to Symbian,,Takahiro Kikuchi,Shifting towards Open Mobile in Japan,- Japan's history in the mobile Internet and personal services with cell phones. There were three major steps when we look back on Japan's mobile data market. The first one was the Internet access from cell phones like i-mode. The second step was the evol
+27-Oct-09,Device Creation Theatre,16:30,17:00,Device Creation and Contributing to Symbian,,Yael Aharon,Developing Webkit for Symbian,
+27-Oct-09,Device Creation Theatre,17:00,17:30,Device Creation and Contributing to Symbian,,Maximilian Odendahl,Contributing CalDAV Support to Symbian: A Case Study of an Early Contribution,"This presentation will talk about the experience of one of the first outside contributions, a CalDAV calendar synchronization plugin. Besides an introduction about CalDAV and the contribution by Sun Microsystems itself, it will highlight some important facts about the contribution process and its guidelines, the tools and plugins used for day-to-day work and provide some tips and learned lessons for potential contributors."
+28-Oct-09,Device Creation Theatre,13:00,14:00,Device Creation and Contributing to Symbian,,Espen Riskedal,Introducing Qt to Symbian Developers,"This presentation will introduce Qt to developers. It will include:
+1. An introduction to Qt, including a breakdown of the tools and main modules
+2. Demonstration of Qt-based applications and demos
+3. A guide to getting started with Qt
+4. Migration details on how to move to Qt "
+28-Oct-09,Device Creation Theatre,14:00,14:30,Device Creation and Contributing to Symbian,,Marco  Cornero,Enabling Symmetric Multi-processing for Symbian Mobile Devices,"1. What the market wants, what the market gets
+2. The next step in mobile architecture: multi-core processors and SMP
+3. SMP and open source software"
+28-Oct-09,Device Creation Theatre,14:30,15:00,Device Creation and Contributing to Symbian,,Ian Hutton,Symbian^x Roadmap Update,"1. Find out where the Symbian platform is going next
+2. Get an insight into the strategy behind the evolution
+3. Join the conversation and discuss the future of mobile"
+28-Oct-09,Device Creation Theatre,15:00,15:30,Device Creation and Contributing to Symbian,Tim Haysom,"Craig Heath
+Raanan Tzemach
+Simo J&#228;rvinen",Panel Discussion: Open Source DRM: Can it be Secure?,"Symbian^2 includes an implementation of OMA DRM, soon to be released as open source under the Eclipse Public License. The panellists will discuss their views on the security challenges of providing effective Digital Rights Management in the context of an open source project, given that secrecy of the implementation is not an option."
+28-Oct-09,Device Creation Theatre,15:30,16:00,Device Creation and Contributing to Symbian,,Daniel Rubio,Symbian^x Platform Overview: How to achieve HW adstraction and Faster Device Creation,"The mobile devices business is fast paced, most often than not forcing device creators to replan their portfolios in order to address market shifts. As a result of this the timescales for device creation are shrinking time and time again, increasing the pressure on the developement teams to deliver accordingly. This can only be achieved through a modular SW/HW architecture, with pretested SW provided by Silicon/HW vendors, a high degree of HW abstraction that facilitates SW reuse and a very complete base SW platform with minimal gaps eliminating having to fill such gaps during the device creation cycle. New proposals such as SHAI (Symbian Hardware Abstraction Interface) and some other initiatives put forward by the SF will address those issues"
+28-Oct-09,Device Creation Theatre,16:00,16:30,Device Creation and Contributing to Symbian,,Mark Shkolnikov,Making the smart phones smarter ,
+27-Oct-09,Hands-on Lab 1,13:00,13:30,Hands-on Lab 1,,Scott Gilbert,"Presentation - Smarter, Faster Path to Defining a Cool App","Different mobile application market segments have radically different market dynamics. These unique dynamics influence how companies should consider product development investments and in turn what upfront market research is appropriate and how best to go about it.&nbsp; This session will be a combination of conversations, workshops and live simulations that will allow attendees to understand, explore and experience new market research ideas and techniques."
+27-Oct-09,Hands-on Lab 1,13:45,14:45,Hands-on Lab 1,,Scott Gilbert,Break-out session Interactive Product Concepting by App Category,"Different mobile application market segments have radically different market dynamics. These unique dynamics influence how companies should consider product development investments and in turn what upfront market research is appropriate and how best to go about it.&nbsp; This session will be a combination of conversations, workshops and live simulations that will allow attendees to understand, explore and experience new market research ideas and techniques."
+27-Oct-09,Hands-on Lab 1,15:00,16:00,Hands-on Lab 1,,Scott Gilbert,Hands-on Workshop - Buy a Feature,"Different mobile application market segments have radically different market dynamics. These unique dynamics influence how companies should consider product development investments and in turn what upfront market research is appropriate and how best to go about it.&nbsp; This session will be a combination of conversations, workshops and live simulations that will allow attendees to understand, explore and experience new market research ideas and techniques."
+28-Oct-09,Hands-on Lab 1,13:00,14:30,Hands-on Lab 1,,Adam Fleming,Anatomy of a Mobile Audio Streaming Application,"The Session will present a tear down and in-depth description of the NPR open source streaming media application covering subjects such as: Audio Streaming, Location Awareness and Web Service Access. After the session, the audience should have a good understanding of building a streaming media application, be able to understand the NPR application at an architectural level and the relevant APIs as presented by Symbian."
+28-Oct-09,Hands-on Lab 1,14:30,16:00,Hands-on Lab 1,,David Caabeiro,Implementing your own Augmented Reality App,
+29-Oct-09,Hands-on Lab 2,16:30,17:30,Hands-on Lab 2,,Tasneem Sayeed,Improving Mobile Web Developer Experience,
+27-Oct-09,Hands-on Lab 2,11:45,12:30,Hands-on Lab 2,,Javier  Orensanz,Non-intrusive Symbian Application Profiling with the ARM Profiler,"This session consists of a presentation and demo of Symbian application profiling using the ARM Profiler. The ARM Profiler uses ETM trace or an interface to ARM Fast models to gather non-intrusively information about every single instruction executed by the processor. This information is processed and presented in useful profiling, call chain, code coverage and stack analysis views. This information enables developers to identify critical functions and software bottlenecks, and evaluate how efficiently the processor and system resources are used."
+27-Oct-09,Hands-on Lab 2,12:30,13:00,Hands-on Lab 2,,Ronnie King,Device Debug Technologies,"Device debug enables developers to rapidly isolate defects as well as inspect an applications runtime state on Symbian devices. This demo will showcase the latest updates to on-device debugging including device side agent discovery, plug-n-play connectivity support, and integrated debug/trace support."
+27-Oct-09,Hands-on Lab 2,13:00,13:30,Hands-on Lab 2,,Maximilian Odendahl,CalDAV support for Symbian ,"This presentation will talk about the work being done of one of the first outside contributions, a CalDAV calendar synchronization plugin. Besides an introduction about CalDAV, it will give a demo about the feature itself and have a look into possible features for the future."
+27-Oct-09,Hands-on Lab 2,13:30,14:30,Hands-on Lab 2,,Gareth Long,Zoom2 for Symbian,"We will give a brief presentation about the Zoom 2 development system featuring the TI OMAP 3430 SoC, followed by demonstrating Symbian running on the Zoom 2 system, and hands-on exercises to build a simple program running on Symbian on Zoom 2 hardware"
+27-Oct-09,Hands-on Lab 2,14:30,15:30,Hands-on Lab 2,,Jonathan White,QEMU Simulator & Symbian Foundation,"* Description of QEMU based solution and benefits of open source
+* Syborg baseport and mapping Symbian onto QEMU
+* ARM based not x86 - same binaries as target, same tool chain, benefits
+* Whats implemented
+* Whats not yet implemented "
+27-Oct-09,Hands-on Lab 2,15:30,16:00,Hands-on Lab 2,,Andrew Jordan,The beagle board port for SF^2,"1) What is the Beagle Board and why it was selected at the time we started the project
+2) How we implemented the baseport: the basics of getting the port up and running.
+3) A brief overview of the baseport
+4) Using that hardware expansion to add additional features, such as a touch screen, akeypad, accelerometer etc.
+5) Enabling S60 UI in PDA mode"
+27-Oct-09,Hands-on Lab 2,16:00,17:00,Hands-on Lab 2,,Dan Podwall,Extending Carbide.C++,The Carbide.c++ Developer Kit(CDK) provides the tools needed to create plugins or extensions for the Carbide.c++ development environment. This tutorial wi
+27-Oct-09,Hands-on Lab 2,17:00,17:30,Hands-on Lab 2,,Deepak  Kumar Gupta,Evolution of internet protocol based networking on symbian OS,"Once part of high end smartphones to affordable mobile handsets today, Internet protocols based packet data access has come a long way. With high demand of affordable services and upcoming infrastructure (LTE), a seamless access of almost every business and personal applications (email, social networking, voice/video calls etc) are on the cards over all-Internet Protocol based networks. These high speed infrastructure like LTE will be a reality soon. <br />In this seminar, I'll talk about the challenges faced by this fast evolution and what a mobile device needs to support this?<br /><br />    "
+28-Oct-09,Hands-on Lab 2,11:00,12:00,Hands-on Lab 2,,Mik Kersten,Tool support for open source collaboration in the Symbian ecosystem,"In order to support collaboration and contributions, the Symbian Foundation has set up a Bugzilla repository for task and defect tracking and a Mercurial (Hg) repository for source control.&nbsp; In order for developers to work effectively with these technologies, tool support is needed to integrate them into the daily workflow.&nbsp; The Eclipse Mylyn project, and the Tasktop Certified collection of integrations, means that you can have access to these Symbian resources right from your Carbide IDE.&nbsp; In this tutorial, you will learn how to set up your Carbide environment to connect to the Symbian environment by first installing the necessary integrations, and then connecting to the Symbian Foundation resources.&nbsp; We will cover setting up queries in order to watch the Symbian components of interest, and how to communicate to other developers in the Symbian ecosystem right from your IDE.&nbsp; We will then cover various use cases such as requesting enhancements, setting up your workspace to connect to Mercurial, and making contributions via patches.&nbsp; We will conclude by reviewing how to create a more streamlined workflow for all of your development activities by connecting your other ALM and project management and collaboration tools within the Carbide environment, and outside of it if for non-development activities such as project tacking and management."
+28-Oct-09,Hands-on Lab 2,12:00,12:30,Hands-on Lab 2,,"Mark Sage
+Sihem Merah",Short introduction to the problems Orange face in testing apps and our solution to it ,"Demo of the UserEmulator - Sihem Merah
+Description and benefits of the UserEmulator
+Orange has created and provided to the Symbian Foundation a test tool that enables application developers, operators and handset manufactures a simple way to automate the creation of tests, to execute and manage the results
+The UserEmulator is an on-device application which simulates user activity by generating key press and pointer input events. The tool helps in writing, reusing and executing tests on the applications under development. It is useful for automating functional, regression and stress testing, and can be used with other tools for monitoring memory use, power consumption and CPU activity over a period of time.
+The UserEmulator uses an XML test script to describe events or can run in random mode. Tester can create the scripts using a text editor or can use the UserEmulator to record them on a device. Test scripts can be edited if necessary. The scripts contains XML tags for launching applications (using the application UID or name), taking screenshots and adding markers to the log file. When the UserEmulator is running it automatically takes screenshots of panics and logs them."
+28-Oct-09,Hands-on Lab 2,12:30,13:00,Hands-on Lab 2,,Adrian Issott,Performance analysis and diagnostics,"How to use the open system trace and on-target debugging solutions in Carbide.c++ to monitor, profile and fix the performance of your component, whether it's an application or system service. You'll see learn to time how long your code takes to execute, work out what threads, functions and binaries are using the most CPU time, step through the suspicious functions using the debugger, fix the code and test the improvement all on a real device."
+28-Oct-09,Hands-on Lab 2,13:00,14:00,Hands-on Lab 2,,Simon Howkins,Contributing to Symbian with Bugzilla and Mercurial,"We will explain and demonstrate how Bugzilla and Mercurial are used by the Symbian comunity to deal with all sorts of Change and Codeline Management
+* Reporting a bug in Bugzilla: Bugs, Enhancements, Creating reports, Triaging, Assigning
+* Mercurial: Installing, Configuring, Understanding
+* Common Mercurial operations: clone, update, commit, pull, push, branch
+* Contributing the bugfix back to the Foundation: Patches, FCLs, Bugzilla again, Package Owners, Kudos
+* Bigger changes: Codelines, Features, Roadmaps, Projects, Community"
+28-Oct-09,Hands-on Lab 2,14:00,15:00,Hands-on Lab 2,,Daniel Jacobs,Raptor - the next generation of build for Symbian development ,
+28-Oct-09,Hands-on Lab 2,15:00,16:00,Hands-on Lab 2,,Jo Stichbury,"The Hitch Hikers Guide to Symbian Documentation: Find it, write it, improve it!","- Symbian documentation is evolving. Our wiki has taken shape over the last months, and we want to show off what we have, get your opinion on what's missing and what we need to improve 
+- If you're a budding author or novice wiki contributor, this demo l"
+27-Oct-09,Main Stage,09:30,10:00,Main Stage,,Lee Williams,Welcome from the Symbian Foundation: See the Future of Mobile,"- Innovation in the Open Mobile Environment 
+- With the proliferation of devices and development of open source, where is the future headed? 
+- Where will the mobile space be in 10 years?
+- What is the future of the device?"
+27-Oct-09,Main Stage,10:00,11:00,Main Stage,,Jimmy Wales,Presentation,
+27-Oct-09,Main Stage,11:00,12:00,Main Stage,,"Antti Vasara
+David Rivas",Smartphones For All. Apps For Everyone,
+27-Oct-09,Main Stage,12:00,13:00,Main Stage,,"Leisa Reichelt
+Mik Kersten
+Peter Sikking
+Scott Weiss
+Adam Jollans",Panel Session: Open Source and User Experience. Oil and Water?,
+28-Oct-09,Main Stage,09:30,10:00,Main Stage,,Rob Chandhok,A Better Open,
+28-Oct-09,Main Stage,10:00,11:00,Main Stage,,Geoffrey Moore,Building an Innovation Strategy to win the Smart Phone Market,
+28-Oct-09,Main Stage,11:00,12:00,Main Stage,Lee Williams,"Bengt-Arne  Molin Ph.D.
+Hideyuki  Saso
+Mats  Sv&#228;rdh
+Toshio  Miki
+Yong-suk  Moon
+David Rivas
+Pierre Garnier","Panel Session: Open Innovation, The Collaborative Evolution of Symbian","With more than 250 million phones in market, across 245 models and 250 carriers worldwide, Symbian holds the greatest marketshare of any mobile platform today. Leading handset manufacturers Nokia, Sony Ericsson, Samsung, Sharp and Fujitsu are all evolving the Symbian platform. Together, through the Symbian Foundation, along with other major ecosystem players like AT&T, Orange, Vodafone, STMicroelectronics and Texas Instruments, they are collaborating in an open environment to accelerate innovation on the Symbian Platform to produce next generation devices that meet the ever-increasing demands of mobile customers.
+Come listen to these senior executives as they discuss the Symbian platform movement issues, the benefits and challenges of the open collaboration model and how each is contributing to the vision of Symbian becoming the most used software platform on the planet."
+28-Oct-09,Main Stage,12:00,13:00,Main Stage,Ted Shelton,"David  Caabeiro
+John  Moberg
+Raimo van der Klein
+Simon Daniel",Panel Session: Augmented Reality - This is Only The Beginning,"Over the last year Augmented Reality entered the mainstream on mobile platforms, generating lots of media attention. This session will provide a walk-through on the development of a so-called 'augmented reality browser' on Symbian OS, describing pitfalls, limitations and possible improvements.   "
+28-Oct-09,Business Models Theatre,16:15,16:45,Open Source Business Models,Matt Millar,Matt Millar,Ruthlessly exploiting open source for profit,
+27-Oct-09,Business Models Theatre,13:00,13:45,Open Source Business Models,Shaun Puckrin,"Annaig Burnel
+Gerard Grech
+Patrick Mork
+Balbir Blugan
+Tim Massey",App store Showdown: Multiple app stores talk about the opportunity for developers,"Appstores have been the biggest story in Mobile over the last 12 months. We have seen the introduction of new stores from Operators and OEMs as well as renewed efforts from existing independent stores This Panel session will have leaders from a number of Leading Appstores that distribute Symbian applications answer questions about how the future of Appstores will evolve
+- What is the future of Appstores?
+- How do you differentiaite an Appstore?
+- What is the opportunity for developers through the Appstores?
+- What should developers do to improve their sucess in Appstores?
+- How can developers ensure the best response to their applications?
+- What does your app store do to attract and keep developers?"
+27-Oct-09,Business Models Theatre,13:45,14:30,Open Source Business Models,,Matt Asay,Don't be afraid of Free: Why Open-Source Symbian makes sound Financial Sense,"Giving your software away isn't tantamount to a monastic vow of poverty. In fact, done correctly, open-source software models can deliver outstanding sales and profits. The key is learning how to foster abundance while appropriately monetizing complementary scarcity. In this session, Matt Asay will detail executive strategies for making money while giving your software away."
+27-Oct-09,Business Models Theatre,14:30,15:00,Open Source Business Models,,Boaz Zilberman,Translating Open Source into Real Money,"In this session Fring will examine the commercial opportunities for open source software projects and products. We'll investigate the different ways of generating revenue from open source software and how to select open source software technologies for building easy-to-market products. For Fring, the open source revenue model is one based on a service revenue stream rather than a licence revenue stream. We will explore the opportunities from different perspectives, including selling hardware accessories; selling services and add-on capabilities, dual-licensing the software and differentiating between basic and premium versions. Please bring your own ideas and experiences to share during the Q&A."
+27-Oct-09,Business Models Theatre,15:00,15:30,Open Source Business Models,,"Panu Kause
+Soren  Kristensen",OSS Business Models throughout the Mobile Value Chain,"The key point of open source software is that it's not the software itself that's worth paying for - it's the things built with it. With open source, all stakeholders can build on and add value to an existing infrastructure, thus providing better products and services. In general, this results in faster time to market in a more cost-efficient manner. Ixonos will elaborate on a number of experiences and perspectives of the open source money-making opportunities for device manufacturers, application and middleware developers, as well as for service providers of different kinds. They will touch upon key questions such as the value-add items of a platform, the importance of having a wide developer community and product quality for the end-user market."
+27-Oct-09,Business Models Theatre,15:30,16:00,Open Source Business Models,,Belinda Parmar,How to improve your Bottom Line in a Recession,"Belinda Parmar is the founder of Lady Geek, which helps technology clients improve their bottom line by selling more to women. She has been advising and partnering with technology clients for over 12 years. Her clients include IBM, Cisco and Hewlett Packard. She will cover the missed financial opportunity of not targeting women in the right way in the tech sector, marketing strategies and advertising that appeal to women, and how women and men are different when it comes to purchasing and buying technology."
+27-Oct-09,Business Models Theatre,16:00,16:30,Open Source Business Models,,Andrew Till,Avoiding the Pitfalls of Open Source,"Teleca will provide practical insights on how to work with OSS in a productive and profitable way and avoid the pitfalls that can exist when transitioning to this model. The presentation will cover issues such as what to contribute, what licenses you should contribute under, how to avoid alienating your potential customers, and how to make money when working with OSS."
+27-Oct-09,Business Models Theatre,16:30,17:00,Open Source Business Models,,Srikar Kasarla,Shortening the path from code to cash,"Sony Ericsson will talk about the benefits that an open source, multi-platform developer ecosystem confers upon content partners. They will cover such topics as why open source is the future in an unpredictable global marketplace, nascent mobile content markets and ways in which Symbian developers can position themselves to capitalise on their growth."
+28-Oct-09,Business Models Theatre,13:00,13:45,Open Source Business Models,,Stefano Maffulli,Show me the Money!,"It can be notoriously difficult to make money from open source. This talk examines popular dual-licensing and services models of open source companies, and discusses their applicability to other projects. It also covers how Software as a Service (SaaS) is both a major opportunity for commercial open source projects as well as a challenge. Funambol will share the experience of how its popular mobile open source project has adapted its business model over time to uniquely make money from mobile service providers, while not attempting to monetize its developers or users, yet still gaining significant value from its community. The talk will be of interest to anyone trying to figure out a successful business model for mobile open source."
+28-Oct-09,Business Models Theatre,13:45,14:15,Open Source Business Models,,Tim Ocock,Adapting to the Open Source Ecosystem,"As the mobile industry adopts a wide variety of open source projects as cornerstones, including Symbian OS, WebKit, Qt, Linux and Android, traditional business models built on proprietary software development have to change. Symsource is riding the wave of the mobile open source revolution and will be talking about their business has adapted to take advantage of the new opportunities on offer.
+1 Business opportunities presented by open source in the mobile ecosystem
+2. How Symsource is taking advantage of these opportunities
+3. A closer look at one of Symsource's open source projects"
+28-Oct-09,Business Models Theatre,14:15,14:45,Open Source Business Models,,Pasi Ollikainen,Symbian Operator Variants: Capturing Additional Value for Operator Branded Services,Symbian customization and variation possibilities; Symbian Foundation platform advantages in customization; Building Operator asset for service differentation and customer value add; Business benefits of 'Integrated Innovations' - ARPU up and Churn down; Using open-source as base for custom service creation; Case examples of operator customization
+28-Oct-09,Business Models Theatre,14:45,15:15,Open Source Business Models,,Konstantin Shpunt,Making Even More Money Now that Symbian is Open Source,"How can the fact that the Symbian platform is now open source make even more money for a commercial, profit-oriented company? 5Pro Software will give real-life examples of how open source Symbian makes better technical sense, encourages new consulting contracts and gives customers a greater sense of confidence."
+28-Oct-09,Business Models Theatre,15:15,15:45,Open Source Business Models,,Igor  Netto,How to Add Value in an Open Mobile Ecosystem,"Where is the value in an open mobile ecosystem? Opera will show how to implement the write once, deploy everywhere strategy using Mobile Widgets and demonstrate its effectiveness through case studies involving T-Mobile and Vodafone."
+28-Oct-09,Business Models Theatre,15:45,16:15,Open Source Business Models,,Ville Virtanen,"Monetization of free, beyond advertizing","With the advent of intelligent analytics, interaction, targeted advertising, recommendation and transaction technologies, operators and handset manufacturers can evolve towards a Multisided Market Platform, a marketplace, which links two or more distinct but interdependent groups of customers, with the value to each group increasing with the number of users. "
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/session.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,111 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+// Session class is used to encapsulate all session data
+function Session(){
+	this.date = null;
+	this.location = null;
+	this.startTime = null;
+	this.endTime = null;
+	this.topic = null;
+	this.chair = null;
+	this.speakers = null;
+	this.title = null;
+	this.description = null;
+}
+
+Session.prototype.GetContentHTML = function () {
+	var buf = "<small><i>" + this.startTime + " - " + this.endTime;
+	if ( this.location ) {
+		buf += ", " + this.location;
+	}
+	buf += "</i>";
+	var haschair = false;
+	if ( this.chair && this.chair != null && this.chair.length > 0 ) {
+		var ch = this.chair.replace(/<br>/g, ", ");
+		buf += "<br><b>Chair: " + ch + "</b>";
+		haschair = true;
+	}
+	if (this.speakers && this.speakers != null && this.speakers.length > 0) {
+		buf += "<b>, "
+		if ( haschair ) {
+			buf += "Speakers: ";
+		}
+		// remove nasty newlines
+		var spk = this.speakers.replace(/<br>/g, ", ");
+		buf += spk + "</b>";
+	}
+	buf += "<br>" + this.description + "</small>";
+	return buf;
+}
+
+
+// Used when parsing to assign a value by ordinal
+Session.prototype.SetFieldByOrdinal = function(ordinal, val) {
+	switch(ordinal) {
+		case 0: this.date = val; break;
+		case 1: this.location = val; break;
+		case 2: this.startTime = val; break;
+		case 3: this.endTime = val; break;
+		case 4: this.topic = val; break;
+		case 5: this.chair = val; break;
+		case 6: this.speakers = val; break;
+		case 7: this.title = val; break;
+		case 8: this.description = val; break;
+	}
+}
+
+Session.prototype.GetNumberOfFields = function () {
+	return 9;
+}
+
+Session.prototype.GetStartUtc = function(){
+	return this.GetUtcTime(this.date, this.startTime);
+}
+
+Session.prototype.GetEndUtc = function(){
+	return this.GetUtcTime(this.date, this.endTime);
+}
+
+Session.prototype.GetUtcTime = function(dateString, timeString){
+	// make a date, then we'll mod it
+	var d = new Date();
+	// dateString is in the format DD-mmm-YY
+	var parts = dateString.split("-");
+	d.setFullYear(parseInt(parts[2]) + 2000);
+	d.setDate(parseInt(parts[0]));
+	d.setMonth(indexOfMonth(parts[1]));
+	// time is in the format HH:MM
+	parts = timeString.split(":");
+	d.setHours(parseInt(parts[0]));
+	d.setMinutes(parseInt(parts[1]));
+	// convert to msec since Jan 1 1970
+	var localTime = d.getTime();
+	// obtain local UTC offset and convert to msec
+	var localOffset = d.getTimezoneOffset() * 60000;
+	// obtain UTC time in msec
+	return localTime + localOffset;
+}
+
+function indexOfMonth(m){
+	switch(m.toLowerCase()) {
+		case "jan": return 1;
+		case "feb": return 2;
+		case "mar": return 3;
+		case "apr": return 4;
+		case "may": return 5;
+		case "jun": return 6;
+		case "jul": return 7;
+		case "aug": return 8;
+		case "sep": return 9;
+		case "oct": return 10;
+		case "nov": return 11;
+		case "dec": return 12;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/style.css	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,33 @@
+/* Feed item date */
+.FeedItemDate {
+    font-style: italic;
+}
+
+/* Feed item text */
+.FeedItemDescription {
+    padding: 4px 0px;
+}
+
+/* Feed item links */
+.FeedItemLink {
+    font-weight: bold;
+}
+
+/* Anchor tags in the context of a feed item link */
+.FeedItemLink a {
+    text-decoration: underline;
+    font-weight: bold;
+    color: black;
+}
+
+/* Focused anchor tags */
+.FeedItemLink a:focus {
+    background: none;
+    color: black;
+}
+
+/* Focused anchor tags */
+.FeedItemLink a:hover {
+    background: none;
+    color: black;
+}
Binary file See09/trailz.png has changed
Binary file See09/tweet.png has changed
Binary file See09/tweetz-icon.png has changed
Binary file See09/tweetz.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/twitter.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,130 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+
+var twitterurl = "http://twitter.com/statuses/user_timeline/21138778.rss";
+
+function Twitter(parentView) {
+	this.parentView = parentView;
+	this.buttons = null;	
+	this.numToShow = 5;
+	this.http = null;
+}
+
+Twitter.prototype.Update = function(numToShow){
+	this.numToShow = numToShow;
+	if ( this.buttons == null ) {
+		// add the separator
+		var separator = new NavigationButton(null, "tweetz-icon.png", "<img src='tweetz.png' border=0>");
+		separator.setEnabled(false);
+		this.parentView.addControl(separator);
+		// create buttons
+		this.buttons = new Array();
+		for( var i = 0 ; i < this.numToShow; i++ ) {
+			var button = new NavigationButton("twitter_button_"+i, null , "");
+			this.parentView.addControl(button);
+			this.buttons.push(button);
+		}
+		this.buttons[0].setText("Loading twitter feed...");
+	}
+	var self = this;
+	// get the rss 
+	// Prepare synchronous download
+	this.http = new Ajax();
+    this.http.open("GET", twitterurl , true); // false means synchronous
+    this.http.onreadystatechange = function() { self.DoUpdate(); };
+    this.http.send(null);
+}
+
+Twitter.prototype.DoUpdate = function(){
+    if (this.http.readyState == 4) {
+	
+		try {
+			// Get parsed Doc
+			var xmlDoc = this.http.responseXML;
+			if (xmlDoc == null) {
+				// if the content type is not set correctly, we get the response as text
+				var xmlparser = new DOMParser();
+				xmlDoc = xmlparser.parseFromString(this.http.responseText, "text/xml");
+			}
+			var itemElements = xmlDoc.getElementsByTagName("item");
+			var loopEnd = Math.min(this.numToShow, itemElements.length);
+			// traverse elements and create buttons
+			for (var i = 0; i < loopEnd; i++) {
+				// iterate through child nodes of this item and gather tweets
+				var title = null;
+				var date = null;
+				
+				node = itemElements[i].firstChild;
+				while (node != null) {
+					if (node.nodeType == Node.ELEMENT_NODE) {
+						if (node.nodeName == "title") {
+							// item title
+							title = getTextOfNode(node);
+						}
+						else 
+							if (node.nodeName == "pubDate" || node.nodeName == "dc:date") {
+								// item publishing date
+								date = getTextOfNode(node);
+							}
+					}
+					node = node.nextSibling;
+				}
+				
+				this.buttons[i].setText("<font size=0.6em><i>" + date + "</i> " + title + "</font>");
+				this.buttons[i].setImage("tweet.png");
+			}
+		} 
+		catch (x) {
+			this.buttons[0].setText("<font size=0.6em>Uh-Oh! Tweetz not tweeting right now.</font>");
+			for (var i = 0; i < this.numToShow; i++) {
+				this.buttons[i].setText("");
+				this.buttons[i].setImage(null);
+			}
+		}
+	}
+}
+
+// Returns the text of a node.
+function getTextOfNode(node) {
+    var buf = "";
+	// iterate through all child elements and collect all text to the buffer
+	var child = node.firstChild;
+	while (child != null) {
+		if (child.nodeType == Node.TEXT_NODE || child.nodeType == Node.CDATA_SECTION_NODE) {
+			// append text to buffer
+			if (buf != "") {
+				buf += " ";
+			}
+			buf += child.nodeValue;
+		}
+		child = child.nextSibling;
+	}
+	// make link if there is a url
+	var ind = buf.indexOf("http://");
+	var endind = buf.indexOf(" ", ind);
+	if ( ind != -1 ) {
+		var tmp = buf.substring(0,ind);
+		var url = "";
+		if ( endind == -1 ) {
+			url = buf.substring(ind);
+		} else {
+			url = buf.substring(ind, endind);
+		}
+		tmp += "<div class=\"FeedItemLink\">";
+        tmp += "<a href=\"JavaScript:void(0)\" onclick=\"openURL('" + url + "'); return false;\">";
+		tmp += url + "</a></div>";
+			
+		if ( endind != -1 ) {
+			tmp += buf.substring(endind);
+		}
+		buf = tmp;
+	}
+	return buf;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/utils.js	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,107 @@
+// ////////////////////////////////////////////////////////////////////////////
+// Symbian Foundation Example Code
+//
+// This software is in the public domain. No copyright is claimed, and you 
+// may use it for any purpose without license from the Symbian Foundation.
+// No warranty for any purpose is expressed or implied by the authors or
+// the Symbian Foundation. 
+// ////////////////////////////////////////////////////////////////////////////
+
+// Loads widget preferences.
+function loadPreferences() {
+    if (window.widget) {
+        // load settings from widget preferences store
+        data = widget.preferenceForKey("data");
+    }
+}
+
+// Loads widget preferences.
+function savePreferences() {
+    if (window.widget) {
+        // save settings in widget preferences store
+        widget.setPreferenceForKey(data, "data");
+    }
+}
+
+
+
+function nocache(url) {
+    if (url.indexOf("?") == -1) {
+        url += "?";
+    } else {
+        url += "&";
+    }
+    url += "nocache=" + (new Date().getTime());
+	return url;
+}
+
+
+function sessionMatches(session, startDate) {
+	var m_date = session.getDate()==startDate.getDate();
+	var m_year = session.getFullYear()==startDate.getFullYear();
+	var m_month = session.getMonth()==startDate.getMonth();
+	var m_hour = session.getHours()==startDate.getHours();
+	var m_minute = session.getMinutes()==startDate.getMinutes();
+	return m_date && m_month && m_year && m_hour && m_minute; 
+}
+
+function dayToString(day) {
+	return day.toDateString(); 	
+}
+
+function dayMatches(day, startDate){
+	var m_date = day.getDate()==startDate.getDate();
+	var m_year = day.getFullYear()==startDate.getFullYear();
+	var m_month = day.getMonth()==startDate.getMonth();
+	return m_date && m_month && m_year; 
+}
+
+function sessionTimeToString(session) {
+	return ""+session.getHours()+":"+pad(session.getMinutes(),2); 	
+}
+
+function dateToString(day) {
+	var full = day.toDateString();
+	// remove year as it doesn't fit on small screens
+	return full.substring(0, full.length-4); 	
+}
+
+function pad(num, digits) {
+	var str = "" + num;
+	while ( str.length < digits ) {
+		str = "0" + str;
+	}
+	return str;
+}
+
+// Opens a URL in a separate browser window
+function openURL(url) {
+    if (window.widget) {
+        // in WRT
+        widget.openURL(url);
+    } else {
+        // outside WRT
+        window.open(url, "NewWindow");
+    }
+}
+
+function setDefaultFontSizeForScreenSize(){
+	// no preference available, check screen size
+	if (window.innerWidth > 400 || window.innerHeight > 400) {
+		// hi res screen, use large font
+		setLargeView();
+	}
+	else {
+		// lo res screen, use small font
+		setSmallView();
+	}
+}
+
+function setLargeView(){
+	document.getElementById('stylesheet').href = 'WRTKit/Resources/UI-large.css';
+}
+
+function setSmallView(){
+	document.getElementById('stylesheet').href = 'WRTKit/Resources/UI.css';
+}
+
Binary file See09/venue.png has changed
Binary file See09/venuelabel.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/wrt_preview_frame.html	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,218 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<title>Nokia WRT Preview</title>
+	<!-- jQuery-ui Begins -->
+		<link type="text/css" rel="stylesheet"  href="preview/script/jquery-ui/css/ui-darkness/ui.all.css"/>	
+		<script type="text/javascript" src="preview/script/jquery-ui/js/jquery-1.2.6.min.js"></script>
+		<script type="text/javascript" src="preview/script/jquery-ui/js/jquery-ui-1.6.custom.min.js"></script>
+	<!-- jQuery-ui Ends -->	
+	<script type="text/javascript" language="JavaScript" src="preview/script/xml2json.js"></script>
+	<script type="text/javascript" language="JavaScript" src="preview/script/nokia.js"></script>
+	<script type="text/javascript" language="JavaScript" src="preview/script/resolution.js"></script>
+	<link type="text/css" rel="stylesheet"  href="preview/css/style.css"/>
+</head>
+<body>
+	<div id="preview-ui-top">
+		<div id="DeviceDisplayLayout" class="hide">
+			<div id="DisplaySFKWrapper">
+				<div id="DisplayArea">
+					<div id="IconArea"></div>
+					<div id="WidgetArea">
+						<div id="iframeMask" class="hide"></div>
+						<iframe src=""></iframe>
+					</div>
+					<div id="MenuItemsArea" class="scroll-pane">
+						<ul>
+							<li><a href="javascript:void(0);">Exit</a></li>
+						</ul>
+					</div>
+					<div id="SoftKeysArea">
+						<ul>
+							<li id="LskLabel"><a href="javascript:void(0);">Options</a></li>
+							<li id="RskLabel"><a href="javascript:void(0);">Exit</a></li>
+						</ul>
+					</div>
+				</div>
+				<div id="SoftKeys">
+					<a href="javascript:void(0);"><img src="preview/images/TransperantImage.png" name="LskArea" border="0" id="LskArea"/></a><a href="javascript:void(0);"><img src="preview/images/TransperantImage.png" name="RskArea" border="0" id="RskArea"/></a> </div>
+				</div>
+			</div>
+		<div id="Dialog" title="Notification window"></div>
+<div id="PreferencesTab" class="hide">
+	<div id="tabs">
+		<ul>
+			<li><a href="#tabs-1">Preferences</a></li>
+			<li><a href="#tabs-2">Event Triggers</a></li>
+		</ul>
+		<div id="tabs-1">
+			<div id="settings-view">
+		<table width="100%" cellpadding="0" cellspacing="0">
+			<tr>
+				<th>
+					Resolution
+				</th>
+				<td>
+					<select id="resOptions">
+						<option selected="true" value="http://www.forum.nokia.com/devices/matrix_240x320_1.html">240x320</option>
+						<option value="http://www.forum.nokia.com/devices/matrix_320x240_1.html">320x240</option>
+						<option value="http://www.forum.nokia.com/devices/matrix_360x640_1.html">360x640</option>
+						<option value="http://www.forum.nokia.com/devices/E90_Communicator">800x352</option>
+					</select>&nbsp; 
+					<a class="link" target="_blank" href="http://www.forum.nokia.com/devices/matrix_240x320_1.html" id="resSupportLink">Device matrix featuring this resolution</a>
+					<span id="dwDeviceHelp" class="hide" >See WRT Help for device specifications</span>
+				</td>
+			</tr>
+			<tr>
+				<th>
+					Orientation					
+				</th>
+				<td>
+					<div id="Orientation_Controls" class="hide">
+						<label><input type="radio" name="input_orientation" id="input_portrait" value="portrait"/> Portrait</label>	
+						<label><input type="radio" name="input_orientation" id="input_landscape" value="landscape"/> Landscape</label>	
+					</div>
+					<div id="Orientation_Info" class="hide">
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<th>
+					WRT Version
+				</th>
+				<td>
+					<label><input type="radio" name="wrt_version" id="wrt_version_1_0" value="WRT 1.0"/> WRT 1.0</label>	
+					<label><input type="radio" name="wrt_version" id="wrt_version_1_1" value="WRT 1.1"/> WRT 1.1</label>	
+				</td>
+			</tr>
+			<tr>
+				<th>
+					Home Screen view
+				</th>
+				<td>
+					<div id="HS_Control_Info">
+						Hello
+					</div>
+				</td>
+			</tr>
+		</table>
+		</div>
+		
+			<div id="mini-view-info" class="hide">
+				<div class="ui-panel">
+					<a class="ui-button" id="mini-view-back">Back</a>
+				</div>
+				<table cellpadding='0' cellspacing='0' width="100%">
+					<tr>
+						<th>To enable Mini view support for HomeScreen widget </th>
+					</tr>
+					<tr>
+						<td>
+							Add this line in Info.plist file
+							<code>&lt;key&gt;MiniViewEnabled&lt;/key&gt;<br/>&lt;true/&gt;</code>
+							and optionally add the following to the MainHTML file
+							<code>&lt;div id="miniView"&gt; &lt;--  Define your Home Screen view here  --&gt; &lt;/div&gt;</code><br/>
+							See Web Developer's Library for <a class="link" href="http://library.forum.nokia.com/index.jsp?topic=/Web_Developers_Library/GUID-63F4E17E-8895-4054-82AD-762B90610B30.html" target="_blank">more details</a>
+						</td>
+					</tr>
+				</table>
+			</div>
+		
+		
+		</div>
+		<div id="tabs-2">
+			
+			<div id="event-icons">
+				<div id="event-battery"></div>
+				<div id="event-messaging"></div>
+				<div id="event-memory"></div>
+			</div>
+
+			<div id="event-battery-info" class="hide">
+				<div class="ui-panel">
+					<a class="ui-button" id="event-battery-back">Back</a>
+				</div>
+				<table cellpadding='0' cellspacing='0' width="100%">
+					<tr>
+						<th colspan="2">Battery Triggers</th>
+					</tr>
+					<tr>
+						<td>Charging status</td>
+						<td>
+							<a class="ui-button-fixed" id="connect-charger">Connect charger</a>
+							<a class="ui-button-fixed" id="disconnect-charger">Disconnect charger</a>
+						</td>
+					</tr>
+					<tr>
+						<td>Battery Strength</td>
+						<td>
+							<div id="slider"></div>
+							<div id="slider-value-panel"><span>0</span></div>
+							<div><a class="ui-button-fixed" id="update-batter-strength">Update</a></div>
+						</td>
+					</tr>
+				</table>
+			</div>
+
+			<div id="event-messaging-info" class="hide">
+				<div class="ui-panel">
+					<a class="ui-button" id="event-messaging-back">Back</a>
+				</div>
+				<table cellpadding='0' cellspacing='0' width="100%">
+					<tr>
+						<th colspan="2">Message Triggers</th>
+					</tr>
+					<tr>
+						<td>New message</td>
+						<td>
+							<a class="ui-button-fixed" id="send-sms">Trigger new SMS</a>
+							<a class="ui-button-fixed" id="send-mms">Trigger new MMS</a>
+						</td>
+					</tr>
+				</table>
+			</div>
+
+			<div id="event-memory-info" class="hide">
+				<div class="ui-panel">
+					<a class="ui-button" id="event-memory-back">Back</a>
+				</div>
+				<table cellpadding='0' cellspacing='0' width="100%">
+					<tr>
+						<th colspan="2">Memory Triggers</th>
+					</tr>
+					<tr>
+						<td>Memory Card</td>
+						<td>
+							<a class="ui-button-fixed" id="connect-memory-card">Connect</a>
+							<a class="ui-button-fixed" id="disconnect-memory-card">Disconnect</a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			
+		</div>
+	</div>
+</div>
+	</div>
+	<div id="preview-ui-bottom">
+		<div id="preview-ui-bottom-header">
+			<div>Console window</div>
+			<span class="open" id="Console-Toggle-Button"></span>
+			<span id="Console-Clear-Button"></span>
+		</div>
+		<div style="clear:left;"></div>
+		<div id="preview-ui-bottom-body">
+		</div>
+	</div>
+	<div id="PreferencesBtn" class="hide"></div>
+	<div id="orientationIcon"></div>
+	<div id="loaderDiv"></div>
+	<div id="NotificationDiv" class="hide">
+		<p>NOKIA WRT Simulation may not work properly on this browser, <br/>Firefox is recommended for widget preview and debugging.  <br/><br/><strong>Continue?</strong></p>
+	</div>
+	<div id="BrowserNotificationBar" class="hide">
+		<p><a></a>NOKIA WRT Simulation may not work properly on this browser, Firefox is recommended for widget preview and debugging</p>
+	</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/See09/wrt_preview_main.html	Thu Oct 22 15:52:58 2009 +0100
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+	<script language="JavaScript" type="text/javascript" src="preview/script/lib/loader.js"></script>
+
+        <title></title>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />		
+        <script type="text/javascript" src="WRTKit/WRTKit.js"></script>
+        <script type="text/javascript" src="main.js"></script>
+        <script type="text/javascript" src="utils.js"></script>
+        <script type="text/javascript" src="autoupdate.js"></script>
+        <script type="text/javascript" src="session.js"></script>
+        <script type="text/javascript" src="schedule.js"></script>
+        <script type="text/javascript" src="twitter.js"></script>
+		<link rel="stylesheet" href="WRTKit/Resources/UI.css" id="stylesheet">
+        <link rel="stylesheet" href="style.css" type="text/css">
+    </head>
+    <body onload="javascript:init();" onShow="javascript:SetViewMode();" onResize="javascript:SetViewMode();" >
+    	<div id="main" style="margin: 0px 0px; padding: 0px 0px; border: none; overflow: hidden;"></div>
+    	<div id="mini" style="margin: 0px 0px; padding: 0px 0px; border: none; overflow: hidden;"></div>
+	</body>
+</html>
\ No newline at end of file