Added WRT previewer, Mozilla Xulrunner, and Mozilla XP Com. Integrated Xulrunner browser into WRT Previewer.
authortasneems@symbian.org
Wed, 20 Jan 2010 16:51:26 -0800
changeset 37 641b65b14318
parent 35 ec3f1313ae92
child 38 954dbf7baac6
Added WRT previewer, Mozilla Xulrunner, and Mozilla XP Com. Integrated Xulrunner browser into WRT Previewer.
org.symbian.tools.wrttools.editing/.classpath
org.symbian.tools.wrttools.editing/.project
org.symbian.tools.wrttools.editing/.settings/org.eclipse.jdt.core.prefs
org.symbian.tools.wrttools.editing/META-INF/MANIFEST.MF
org.symbian.tools.wrttools.editing/build.properties
org.symbian.tools.wrttools.editing/icons/obj16/html-editor.gif
org.symbian.tools.wrttools.editing/plugin.xml
org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/Activator.java
org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/html/HTMLEditor.java
org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/preview/PreviewPage.java
org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/preview/PreviewView.java
org.symbian.tools.wrttools.previewer/.classpath
org.symbian.tools.wrttools.previewer/.project
org.symbian.tools.wrttools.previewer/.settings/org.eclipse.jdt.core.prefs
org.symbian.tools.wrttools.previewer/META-INF/MANIFEST.MF
org.symbian.tools.wrttools.previewer/build.properties
org.symbian.tools.wrttools.previewer/icons/Thumbs.db
org.symbian.tools.wrttools.previewer/icons/deploy_settings.gif
org.symbian.tools.wrttools.previewer/icons/deploy_widget.gif
org.symbian.tools.wrttools.previewer/icons/error_over.gif
org.symbian.tools.wrttools.previewer/icons/error_ovr.gif
org.symbian.tools.wrttools.previewer/icons/exclude_archive.gif
org.symbian.tools.wrttools.previewer/icons/icon.gif
org.symbian.tools.wrttools.previewer/icons/icon32.gif
org.symbian.tools.wrttools.previewer/icons/include_archive.gif
org.symbian.tools.wrttools.previewer/icons/main16.gif
org.symbian.tools.wrttools.previewer/icons/package_widget.gif
org.symbian.tools.wrttools.previewer/icons/upgrade-project-over.gif
org.symbian.tools.wrttools.previewer/icons/upgrade_project.gif
org.symbian.tools.wrttools.previewer/icons/upgrade_red.gif
org.symbian.tools.wrttools.previewer/icons/validate_widget.gif
org.symbian.tools.wrttools.previewer/jtidy/jtidy-8.0-20060801.131059-3.jar
org.symbian.tools.wrttools.previewer/plugin.xml
org.symbian.tools.wrttools.previewer/preview/css/style.css
org.symbian.tools.wrttools.previewer/preview/data/appManager_data.js
org.symbian.tools.wrttools.previewer/preview/data/calendar_data.js
org.symbian.tools.wrttools.previewer/preview/data/contact_data.js
org.symbian.tools.wrttools.previewer/preview/data/landmarks_data.js
org.symbian.tools.wrttools.previewer/preview/data/location_data.js
org.symbian.tools.wrttools.previewer/preview/data/logging_data.js
org.symbian.tools.wrttools.previewer/preview/data/mediaManagement_data.js
org.symbian.tools.wrttools.previewer/preview/data/messaging_data.js
org.symbian.tools.wrttools.previewer/preview/data/sensor_data.js
org.symbian.tools.wrttools.previewer/preview/data/sysInfo_data.js
org.symbian.tools.wrttools.previewer/preview/images/BrowserNotificationBar-Toogle.gif
org.symbian.tools.wrttools.previewer/preview/images/Gradient0Background.png
org.symbian.tools.wrttools.previewer/preview/images/IconArea-hover.png
org.symbian.tools.wrttools.previewer/preview/images/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/TransperantImage.png
org.symbian.tools.wrttools.previewer/preview/images/active-orientation-icon.png
org.symbian.tools.wrttools.previewer/preview/images/battery-icon.png
org.symbian.tools.wrttools.previewer/preview/images/console-clear-button.png
org.symbian.tools.wrttools.previewer/preview/images/console-close-icon.png
org.symbian.tools.wrttools.previewer/preview/images/console-icon.gif
org.symbian.tools.wrttools.previewer/preview/images/console-open-icon.png
org.symbian.tools.wrttools.previewer/preview/images/default-Icon.png
org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Landscape.png
org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Portrait.png
org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Landscape.png
org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Portrait.png
org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Landscape.png
org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Portrait.png
org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/device/360x640/hs-landscape.png
org.symbian.tools.wrttools.previewer/preview/images/device/360x640/hs-portrait.png
org.symbian.tools.wrttools.previewer/preview/images/device/800x352/Landscape.png
org.symbian.tools.wrttools.previewer/preview/images/device/800x352/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/device/MenuItem-keys-Bg2.png
org.symbian.tools.wrttools.previewer/preview/images/device/Thumbs.db
org.symbian.tools.wrttools.previewer/preview/images/device/device.7z
org.symbian.tools.wrttools.previewer/preview/images/device/menuKeys-bg.png
org.symbian.tools.wrttools.previewer/preview/images/errorIcon.png
org.symbian.tools.wrttools.previewer/preview/images/gradient-bg.png
org.symbian.tools.wrttools.previewer/preview/images/hs-iframeMask.png
org.symbian.tools.wrttools.previewer/preview/images/infoIcon.png
org.symbian.tools.wrttools.previewer/preview/images/memory-icon.png
org.symbian.tools.wrttools.previewer/preview/images/messaging-icon.png
org.symbian.tools.wrttools.previewer/preview/images/normal-orientation-icon.png
org.symbian.tools.wrttools.previewer/preview/images/settings-icon.png
org.symbian.tools.wrttools.previewer/preview/images/statusBar_240x320.png
org.symbian.tools.wrttools.previewer/preview/images/statusBar_320x240.png
org.symbian.tools.wrttools.previewer/preview/images/statusBar_360x640.png
org.symbian.tools.wrttools.previewer/preview/images/statusBar_640x360.png
org.symbian.tools.wrttools.previewer/preview/images/statusBar_800x352.png
org.symbian.tools.wrttools.previewer/preview/images/sub-menu-arrow.png
org.symbian.tools.wrttools.previewer/preview/images/th-bg-gradient.png
org.symbian.tools.wrttools.previewer/preview/images/warningIcon.png
org.symbian.tools.wrttools.previewer/preview/images/wrt-help-icon.png
org.symbian.tools.wrttools.previewer/preview/nopreview.html
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/000000_40x100_textures_05_inset_soft_25.png
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/0078a3_40x100_textures_02_glass_40.png
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_arrows_leftright.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_arrows_updown.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_close.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_doc.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_folder_closed.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_folder_open.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_minus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_plus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_down.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_left.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_right.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_up.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/555555_40x100_textures_02_glass_20.png
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_arrows_leftright.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_arrows_updown.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_close.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_doc.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_folder_closed.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_folder_open.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_minus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_plus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_resize_se.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_down.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_left.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_right.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_up.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/f58400_40x100_textures_05_inset_soft_30.png
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_arrows_leftright.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_arrows_updown.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_close.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_doc.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_folder_closed.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_folder_open.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_minus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_plus.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_down.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_left.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_right.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_up.gif
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/slider-handle.png
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/ui.all.css
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/js/jquery-1.2.6.min.js
org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/js/jquery-ui-1.6.custom.min.js
org.symbian.tools.wrttools.previewer/preview/script/lib/console.js
org.symbian.tools.wrttools.previewer/preview/script/lib/device.js
org.symbian.tools.wrttools.previewer/preview/script/lib/loader.js
org.symbian.tools.wrttools.previewer/preview/script/lib/menu.js
org.symbian.tools.wrttools.previewer/preview/script/lib/menuItem.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/AppManager.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Calendar.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Contact.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Landmarks.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Location.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Logging.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/MediaManagement.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Messaging.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Sensor.js
org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/SysInfo.js
org.symbian.tools.wrttools.previewer/preview/script/lib/systeminfo.js
org.symbian.tools.wrttools.previewer/preview/script/lib/widget.js
org.symbian.tools.wrttools.previewer/preview/script/nokia.js
org.symbian.tools.wrttools.previewer/preview/script/resolution.js
org.symbian.tools.wrttools.previewer/preview/script/xml2json.js
org.symbian.tools.wrttools.previewer/preview/wrt_preview.html
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/Activator.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/WrtRootPreferences.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/PreviewSupport.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewBrowser.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewPreferenceInitializer.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewPreferencePage.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/Check.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/FileUtils.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/IDisposable.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/ITimedTask.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/ListenerList.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/Logging.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/TrackedResource.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/UtilsPlugin.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/noexport/Messages.java
org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/noexport/messages.properties
org.symbian.tools.wrttools.previewer/wrt.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/.classpath	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/.project	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.symbian.tools.wrttools.editing</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/.settings/org.eclipse.jdt.core.prefs	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,8 @@
+#Tue Jan 12 14:30:42 PST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/META-INF/MANIFEST.MF	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Editing Support for WRT Tools
+Bundle-SymbolicName: org.symbian.tools.wrttools.editing;singleton:=true
+Bundle-Version: 0.0.1.qualifier
+Bundle-Activator: org.symbian.tools.wrttools.editing.Activator
+Bundle-Vendor: Symbian Foundation
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.wst.sse.core;bundle-version="1.1.400",
+ org.eclipse.wst.sse.ui;bundle-version="1.1.100",
+ org.eclipse.wst.xml.core;bundle-version="1.1.400",
+ org.eclipse.wst.xml.ui;bundle-version="1.1.0",
+ org.eclipse.jface.text;bundle-version="3.5.0",
+ org.eclipse.wst.html.core;bundle-version="1.1.300",
+ org.eclipse.wst.html.ui;bundle-version="1.0.400",
+ org.mozilla.xulrunner;bundle-version="1.9.1";resolution:=optional,
+ org.eclipse.core.resources;bundle-version="3.5.0",
+ org.eclipse.wst.css.core;bundle-version="1.1.300",
+ org.eclipse.wst.jsdt.core;bundle-version="1.0.200"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ActivationPolicy: lazy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/build.properties	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
Binary file org.symbian.tools.wrttools.editing/icons/obj16/html-editor.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/plugin.xml	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="org.symbian.tools.wrttools.editing.html.HTMLEditor"
+            contributorClass="org.eclipse.wst.html.ui.internal.edit.ui.ActionContributorHTML"
+            default="false"
+            icon="icons/obj16/html-editor.gif"
+            id="org.symbian.tools.wrttools.editing.editor2"
+            name="HTML Editor"
+            symbolicFontName="org.eclipse.wst.sse.ui.textfont">
+         <contentTypeBinding
+               contentTypeId="org.eclipse.wst.html.core.htmlsource">
+         </contentTypeBinding>
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="true"
+            class="org.symbian.tools.wrttools.editing.preview.PreviewView"
+            icon="icons/obj16/html-editor.gif"
+            id="org.symbian.tools.wrttools.editing.wrtpreview"
+            name="WRT Preview"
+            restorable="true">
+      </view>
+   </extension>
+
+</plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/Activator.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,62 @@
+package org.symbian.tools.wrttools.editing;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.symbian.tools.wrttools.editing";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	public static void log(CoreException e) {
+		log(e.getLocalizedMessage(), e);
+	}
+
+	private static void log(String message, Exception e) {
+		final IStatus status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, message, e);
+		getDefault().getLog().log(status);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/html/HTMLEditor.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.editing.html;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+
+public class HTMLEditor extends StructuredTextEditor {
+	@Override
+	public void createPartControl(Composite parent) {
+		Composite pane = new Composite(parent, SWT.NONE);
+		pane.setLayout(new FormLayout());
+		CTabFolder tabFolder = new CTabFolder(pane, SWT.NONE);
+		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
+		ToolBar toolBar = new ToolBar(tabFolder, SWT.NONE);
+		tabItem.setControl(toolBar);
+		tabItem.setText("HTML");
+		ToolItem item = new ToolItem(toolBar, SWT.PUSH);
+		item.setText("Table");
+		tabFolder.setSelection(tabItem);
+		
+		FormData data = new FormData();
+		data.top = new FormAttachment(0, 0);
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		tabFolder.setLayoutData(data);
+		
+		Composite editor = new Composite(pane, SWT.BORDER);
+		editor.setLayout(new FillLayout());
+		data = new FormData();
+		data.top = new FormAttachment(tabFolder, 0);
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(100, 0);
+		data.bottom = new FormAttachment(100, 0);
+		editor.setLayoutData(data);
+		
+		super.createPartControl(editor);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/preview/PreviewPage.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,141 @@
+package org.symbian.tools.wrttools.editing.preview;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Collection;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.IPageBookViewPage;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+import org.osgi.framework.Bundle;
+
+public class PreviewPage extends Page implements IPageBookViewPage {
+	private static final String XUL_RUNNER_PATH_PARAMETER = "org.eclipse.swt.browser.XULRunnerPath";
+	
+	private final IAction refreshAction = new Action("Refresh") {
+		public void run() {
+			refresh();
+		};
+	};
+	private final IAction toggleRefresh = new Action("Toggle Refresh", IAction.AS_RADIO_BUTTON) {
+		public void run() {
+			toggleRefresh();
+		};
+	};
+
+	private final IProject project;
+	private Browser browser;
+	private boolean toggleState = true;
+
+	public PreviewPage(IProject project) {
+		this.project = project;
+	}
+
+	protected void toggleRefresh() {
+		toggleState = !toggleState;
+		toggleRefresh.setChecked(toggleState);
+	}
+
+	private synchronized void initMozilla() {
+		if (System.getProperty(XUL_RUNNER_PATH_PARAMETER) == null) {
+			Bundle bundle = Platform.getBundle("org.mozilla.xulrunner"); //$NON-NLS-1$
+			if (bundle != null) {
+				URL resourceUrl = bundle.getResource("xulrunner"); //$NON-NLS-1$
+				if (resourceUrl != null) {
+					try {
+						URL fileUrl = FileLocator.toFileURL(resourceUrl);
+						File file = new File(fileUrl.toURI());
+						System.setProperty(XUL_RUNNER_PATH_PARAMETER, file
+								.getAbsolutePath()); //$NON-NLS-1$
+					} catch (IOException e) {
+						// log the exception
+					} catch (URISyntaxException e) {
+						// log the exception
+					}
+				}
+			}
+		}
+	}
+
+	
+	@Override
+	public void createControl(Composite parent) {
+		initMozilla();
+		browser = new Browser(parent, SWT.MOZILLA);
+		browser.setUrl(getURL());
+	}
+
+	private String getURL() {
+		return project.getFile("wrt_preview_frame.html").getLocationURI().toASCIIString();
+	}
+
+
+	@Override
+	public Control getControl() {
+		return browser;
+	}
+
+	@Override
+	public void setFocus() {
+		browser.setFocus();
+	}
+
+	public void process(Collection<IFile> files) {
+		if (needsRefresh(files)) {
+			getControl().getDisplay().asyncExec(new Runnable() {
+				@Override
+				public void run() {
+					if (toggleState) {
+						refresh();
+					}
+				}
+			});
+		}
+	}
+
+	private boolean needsRefresh(Collection<IFile> files) {
+		for (IFile iFile : files) {
+			if (iFile.getProject().equals(project)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	protected void refresh() {
+		browser.refresh();
+	}
+
+	@Override
+	public void init(IPageSite pageSite) {
+		super.init(pageSite);
+		IToolBarManager toolBar = pageSite.getActionBars().getToolBarManager();
+		ImageDescriptor image = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED);
+		refreshAction.setImageDescriptor(image);
+		refreshAction.setDescription("Refresh the preview browser");
+		refreshAction.setToolTipText("Refresh the preview browser");
+		toolBar.add(refreshAction);
+		
+		toggleRefresh.setImageDescriptor(image);
+		toggleRefresh.setDescription("Enable or disable automatic refresh");
+		toggleRefresh.setToolTipText("Enable or disable automatic refresh");
+		toggleRefresh.setChecked(toggleState);
+		toolBar.add(toggleRefresh);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.editing/src/org/symbian/tools/wrttools/editing/preview/PreviewView.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,151 @@
+package org.symbian.tools.wrttools.editing.preview;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.MessagePage;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.ui.part.PageBookView;
+import org.eclipse.wst.css.core.internal.provisional.contenttype.ContentTypeIdForCSS;
+import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
+import org.eclipse.wst.jsdt.core.JavaScriptCore;
+import org.symbian.tools.wrttools.editing.Activator;
+
+public class PreviewView extends PageBookView {
+	private static final Set<String> CONTENT_TYPES = new TreeSet<String>(Arrays.asList(ContentTypeIdForCSS.ContentTypeID_CSS, ContentTypeIdForHTML.ContentTypeID_HTML, JavaScriptCore.JAVA_SOURCE_CONTENT_TYPE));
+	
+	private static final class ChangedResourcesCollector implements IResourceDeltaVisitor {
+		public final Collection<IFile> files = new HashSet<IFile>();
+		@Override
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			if (isRelevantResource(delta.getResource())) {
+				files.add((IFile) delta.getResource());
+			}
+			return true;
+		}
+	}
+	
+	private final IResourceChangeListener resourceListener = new IResourceChangeListener() {
+		@Override
+		public void resourceChanged(IResourceChangeEvent event) {
+			ChangedResourcesCollector visitor = new ChangedResourcesCollector();
+			try {
+				event.getDelta().accept(visitor);
+			} catch (CoreException e) {
+				Activator.log(e);
+			}
+			refreshPages(visitor.files);
+		}
+	};
+	
+	private Map<IProject, PreviewPage> projectToPage = new HashMap<IProject, PreviewPage>();
+	
+	@Override
+	protected IPage createDefaultPage(PageBook book) {
+		MessagePage messagePage = new MessagePage();
+		messagePage.setMessage("Open editor to preview WRT widget");
+		return messagePage;
+	}
+
+	protected void refreshPages(Collection<IFile> files) {
+		Collection<PreviewPage> values = projectToPage.values();
+		for (PreviewPage page : values) {
+			page.process(files);
+		}
+	}
+
+	public static boolean isRelevantResource(IResource resource) {
+		if (resource.getType() == IResource.FILE) {
+			IContentType contentType;
+			try {
+				contentType = ((IFile) resource).getContentDescription().getContentType();
+				if (contentType != null) {
+					return CONTENT_TYPES.contains(contentType.getId());
+				}
+			} catch (CoreException e) {
+				Activator.log(e);
+			}
+		}
+		return false;
+	}
+
+	@Override
+	protected PageRec doCreatePage(IWorkbenchPart part) {
+		// All checks we need were done in isImportant method
+		IResource resource = (IResource) ((IEditorPart) part).getEditorInput().getAdapter(IResource.class);
+		
+		IProject project = resource.getProject();
+		PreviewPage page = projectToPage.get(project);
+		
+		if (page == null) {
+			page = new PreviewPage(project);
+			initPage(page);
+			page.createControl(getPageBook());
+			projectToPage.put(project, page);
+		}
+		
+		return new PageRec(part, page);
+	}
+
+	@Override
+	protected void doDestroyPage(IWorkbenchPart part, PageRec pageRecord) {
+		// We do not need to delete the page
+	}
+
+	@Override
+	protected IWorkbenchPart getBootstrapPart() {
+		IEditorPart activeEditor = getSite().getPage().getActiveEditor();
+		if (activeEditor != null) {
+			if (isImportant(activeEditor)) {
+				return activeEditor;
+			}
+		}
+		return null;
+	}
+
+	@Override
+	protected boolean isImportant(IWorkbenchPart part) {
+		if (part instanceof IEditorPart) {
+			IResource resource = (IResource) ((IEditorPart) part).getEditorInput().getAdapter(IResource.class);
+			if (resource != null) {
+				return isWrtProject(resource.getProject());
+			}
+		}
+		return false;
+	}
+
+	private boolean isWrtProject(IProject project) {
+		return project.getFile("wrt_preview_frame.html").exists();
+	}
+	
+	@Override
+	public void createPartControl(Composite parent) {
+		super.createPartControl(parent);
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceListener);
+	}
+	
+	@Override
+	public void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener);
+		super.dispose();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/.classpath	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/.project	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.symbian.tools.wrttools.previewer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/.settings/org.eclipse.jdt.core.prefs	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,8 @@
+#Wed Jan 13 17:40:14 PST 2010
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/META-INF/MANIFEST.MF	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Previewer
+Bundle-SymbolicName: org.symbian.tools.wrttools.previewer;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.symbian.tools.wrttools.previewer.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources;bundle-version="3.5.0",
+ org.eclipse.core.net;bundle-version="1.2.0",
+ org.mozilla.xpcom;bundle-version="1.9.1"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/build.properties	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
Binary file org.symbian.tools.wrttools.previewer/icons/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/icons/deploy_settings.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/deploy_widget.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/error_over.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/error_ovr.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/exclude_archive.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/icon.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/icon32.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/include_archive.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/main16.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/package_widget.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/upgrade-project-over.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/upgrade_project.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/upgrade_red.gif has changed
Binary file org.symbian.tools.wrttools.previewer/icons/validate_widget.gif has changed
Binary file org.symbian.tools.wrttools.previewer/jtidy/jtidy-8.0-20060801.131059-3.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/plugin.xml	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="org.symbian.tools.wrttools.editing.html.HTMLEditor"
+            contributorClass="org.eclipse.wst.html.ui.internal.edit.ui.ActionContributorHTML"
+            default="false"
+            icon="icons/obj16/html-editor.gif"
+            id="org.symbian.tools.wrttools.editing.editor2"
+            name="HTML Editor"
+            symbolicFontName="org.eclipse.wst.sse.ui.textfont">
+         <contentTypeBinding
+               contentTypeId="org.eclipse.wst.html.core.htmlsource">
+         </contentTypeBinding>
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            allowMultiple="true"
+            class="org.symbian.tools.wrttools.editing.preview.PreviewView"
+            icon="icons/obj16/html-editor.gif"
+            id="org.symbian.tools.wrttools.editing.wrtpreview"
+            name="WRT Preview"
+            restorable="true">
+      </view>
+   </extension>
+ <extension
+       point="org.eclipse.ui.views">
+    <browser class="org.symbian.tools.wrttools.previewer.preview.WidgetPreviewBrowser">
+       <label
+             os="win32"
+             value="Nokia Web Runtime (WRT)"/>
+       <label
+             os="macosx"
+             value="Nokia Web Runtime (WRT)"/>
+       <label
+             os="linux"
+             value="Nokia Web Runtime (WRT)"/>
+
+    </browser>
+ </extension>
+ 
+<extension
+       point="org.eclipse.core.runtime.preferences">
+    <initializer class="org.symbian.tools.wrttools.previewer.preview.WidgetPreviewPreferenceInitializer"/>
+ </extension>
+ <extension
+       point="org.eclipse.ui.preferencePages">
+    <page
+          class="org.symbian.tools.wrttools.previewer.preview.WidgetPreviewPreferencePage"
+          id="org.symbian.tools.wrttools.previewer.preview.WidgetPreviewPreferencePage"
+          category="org.symbian.tools.wrttools.previewer.preview.WrtRootPreferences"
+          name="Preview"/>
+
+    <page
+          class="org.symbian.tools.wrttools.previewer.preview.WrtRootPreferences"
+          id="org.symbian.tools.wrtttools.previewer.preview.WrtRootPreferences"
+          name="Web Runtime">
+    </page>
+ </extension>
+ 
+  </plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/css/style.css	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,633 @@
+@charset "utf-8";
+body {
+	background-image: url(../images/Gradient0Background.png);
+	background-repeat: repeat-x;
+	margin: 0px;
+	font-family: "Nokia Sans", "Nokia Sans SemiBold", "Arial Narrow";
+	padding: 0px;
+	overflow: hidden;
+}
+.hide{
+	display:none;
+}
+.show{
+	display:block;
+}
+
+code{
+	background-color: #ffffa6;
+	color: #000000;
+	padding: 3px;
+	display: block;
+	font-size: 110%;
+	margin: 3px 0px;
+}
+
+#DisplaySFKWrapper{
+	overflow: hidden;
+}
+#DisplayArea {
+	margin-right: auto;
+	margin-left: auto;
+	overflow: hidden;
+
+}
+
+#WidgetArea{
+	position: relative;
+	z-index: 99;
+}
+#WidgetArea iframe{
+	width: 100%;
+	height: 100%;
+	border: 0px;
+	margin-left: auto;
+	margin-top: auto;
+}
+
+#WidgetArea.hs_portrait{
+	background-image: url(../images/device/360x640/hs-portrait.png);
+	background-repeat: no-repeat;
+}
+
+#WidgetArea.hs_landscape{
+	background-image: url(../images/device/360x640/hs-landscape.png);
+	background-repeat: no-repeat;
+}
+#WidgetArea.hs_portrait iframe{
+	width: 306px;
+	height: 76px;
+	margin-left: 26px;
+	margin-top: 321px;
+	overflow: hidden !important;
+}
+
+#WidgetArea.hs_landscape iframe{
+	width: 306px;
+	height: 76px;
+	margin-left: 322px !important;
+	margin-top: 151px !important;
+	overflow: hidden !important;
+}
+
+#iframeMask
+{
+	width: 328px;
+	height: 100px;
+	position: absolute;
+	z-index: 900;
+	background-image: url(../images/hs-iframeMask.png);
+	background-repeat: no-repeat;
+	background-position: top left;
+}
+
+#iframeMask:hover
+{
+	background-repeat: no-repeat;
+	background-position: bottom left;
+}
+
+
+#WidgetArea.hs_portrait #iframeMask{
+	margin-left: 16px !important;
+	margin-top: 310px !important;
+}
+#WidgetArea.hs_landscape #iframeMask{
+	margin-left: 312px !important;
+	margin-top: 140px !important;
+}
+
+
+#SoftKeys{
+	height: 50px;
+	width: 240px;
+	margin-right: auto;
+	margin-left: auto;
+	margin-top: 10px;
+}
+
+div.clear{
+	clear: both;
+}
+#DeviceDisplayLayout {
+	background-repeat: no-repeat;
+	background-position: center center;
+	margin-right: auto;
+	margin-left: auto;
+	margin-top: 0px;
+	overflow: hidden;
+}
+
+#DeviceDisplayLayout.portrait_240x320 {
+	background-image: url(../images/device/240x320/Portrait.png);
+	width: 600px;
+	height: 536px;
+}
+
+#DeviceDisplayLayout.landscape_240x320 {
+	background-image: url(../images/device/240x320/Landscape.png);
+	width: 848px;
+	height: 408px;
+}
+
+#SoftKeysArea{
+	z-index: 101;
+	position: relative;
+/*	background-image: url(../images/device/menuKeys-bg.png);
+	background-repeat: no-repeat;
+	background-position: center top;
+*/
+	background-color: #666666;
+}
+
+#SoftKeysArea ul{
+	list-style: none;
+	margin: 0px;
+	padding: 0px;
+	
+}
+
+#SoftKeysArea ul li{
+	margin: 0px;
+	font-weight: bold;
+	font-size: 15px;
+	float: left;
+	padding: 5px;
+}
+
+
+#SoftKeysArea ul li a{
+	color: #FFFFFF;
+	text-decoration: none;
+	display: block;
+}
+
+li#RskLabel{
+	text-align: right;
+}
+
+#MenuItemsArea{
+	z-index: 100;
+	display: none;
+}	
+
+#MenuItemsArea ul{
+	margin: 0px;
+	padding: 5px;
+	list-style-position: inside;
+	list-style-image: none;
+	list-style-type: none;
+	background-color: #CCCCCC;
+}
+
+#MenuItemsArea ul li{
+	font-size: 13px;
+	font-weight: bold;
+}
+
+#MenuItemsArea li.active{
+	background-color: #75ea00;
+}
+
+#MenuItemsArea a{
+	color: #000;
+	text-decoration: none;
+	display: block;
+	padding: 5px;
+	height: 14px;
+}
+#MenuItemsArea a:hover{
+	background-color: #75ea00;
+}
+
+#MenuItemsArea a.subMenuItem{
+	background-image: url(../images/sub-menu-arrow.png);
+	background-repeat: no-repeat;
+	background-position: right 0px;
+}
+
+#MenuItemsArea a.subMenuItem:hover{
+	background-position: right -20px;
+}
+#MenuItemsArea a.subMenuItem:active{
+	background-position: right -40px;
+}
+
+#MenuItemsArea li.active a.subMenuItem{
+	background-position: right -20px;
+}
+div#IconArea{
+	display: none;
+	font-size: 0.9em;
+	font-weight: bold;
+	background-repeat: no-repeat;
+}
+
+div#IconArea.portrait240x320{
+	background-image: url(../images/statusBar_240x320.png);
+}
+div#IconArea.landscape240x320{
+	background-image: url(../images/statusBar_320x240.png);
+}
+
+div#IconArea.portrait320x240{
+	background-image: url(../images/statusBar_320x240.png);
+}
+div#IconArea.landscape320x240{
+	background-image: url(../images/statusBar_240x320.png);
+}
+
+div#IconArea.portrait360x640{
+	background-image: url(../images/statusBar_360x640.png);
+}
+div#IconArea.landscape360x640{
+	background-image: url(../images/statusBar_640x360.png);
+}
+
+div#IconArea.landscape800x352{
+	background-image: url(../images/statusBar_800x352.png);
+}
+
+
+div.IconFile{
+	margin-left: auto;
+	margin-right: auto;
+	text-align: center;
+	padding: 20px;
+}
+
+div.IconFile:hover{
+	background-image: url(../images/IconArea-hover.png);
+	background-position: center center;
+	background-repeat: no-repeat;
+}
+
+div.IconFile p{
+	margin: 0px;
+}
+
+
+
+p.highlight span{
+	background-color: #fbf7a2;
+	font-weight: normal;
+	font-size: 0.8em;
+	padding: 3px;
+}
+
+/*
+	preferences CSS
+*/
+
+div#PreferencesBtn{
+	width: 75px;
+	height: 85px;
+	background-image: url(../images/settings-icon.png);
+	position: absolute;
+	top: 10px;
+	left: 10px;
+	background-position: left bottom;
+	z-index: 200;
+}
+
+div#PreferencesBtn:hover{
+	background-position: left top;
+}
+
+div#loaderDiv{
+	padding: 10px;
+	font-size: 1.1em;
+	position: absolute;
+	top: 0px;
+	right: 0px;
+	display: none;
+	z-index: 202;
+}
+
+div#loaderDiv.green{
+	background-color: #5abd2b;
+	color: #FFFFFF;
+}
+
+div#loaderDiv.yellow{
+	background-color: #ffff00;
+	color: #000000;
+}
+
+div#orientationIcon{
+	background-image: url(../images/normal-orientation-icon.png);
+	background-repeat: no-repeat;
+	width: 191px;
+	height: 72px;
+	float: left;
+	position: absolute;
+	left: 10px;
+	top: 0px;
+	display: none;
+}
+div#orientationIcon:hover{
+	background-image: url(../images/active-orientation-icon.png);
+}
+
+table{
+	border-top: 1px solid #808080;
+	border-left: 1px solid #808080;
+}
+
+table a.link{
+	background-color: #20c41c;
+	color: #ffffff;
+	font-weight: bold;
+	border: 1px solid #4e872c;
+	padding: 3px 2px;
+	text-decoration: none;
+	font-size: 80%;
+}
+
+table th, table td{
+	padding: 6px 5px;
+	border-bottom: 1px solid #808080;
+	border-right: 1px solid #808080;
+	font-size: 0.9em;
+}
+table th{
+	width: 150px;
+	text-align: left;
+	background-image: url(../images/th-bg-gradient.png);
+	background-repeat: repeat-x;
+	background-position: left bottom;
+}
+
+#NotificationDiv p{
+	color: #ffffff;
+	font-size: 95%;
+	padding: 5px;
+}
+
+strong{
+	color: #eee46c;
+}
+
+#BrowserNotificationBar{
+	z-index: 2000;
+	background-color: #f2eb8e;
+	border-bottom: 2px solid #f0d25e;
+	display: none;
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+	font-size: 80%;
+	font-weight: bolder;
+	text-align: right;
+	margin: 0px;
+	opacity: 0.9;
+}
+#BrowserNotificationBar a{
+	height: 10px;
+	width: 10px;
+	float: right;
+	background-image: url(../images/BrowserNotificationBar-Toogle.gif);
+	background-position: 0px -10px;
+	margin : 4px 15px 0px 10px;
+	cursor: hand;
+	overflow: hidden;
+}
+/*
+	Event Triggering CSS
+*/
+
+h2{
+	font-size: 120%;
+	margin: 3px 0px;
+	padding: 0px;
+}
+
+#tabs-1, #tabs-2{
+	height: 223px;
+	overflow: auto;
+}
+
+#connect-charger-icon, #dis-connect-charger-icon{
+	background-repeat: no-repeat;
+	background-position: left top;
+	width: 165px;
+	height: 36px;
+	margin: 5px auto;
+}
+
+#connect-charger-icon{
+	background-image: url(../images/connect-charger-icon.png);
+}
+
+#dis-connect-charger-icon{
+	background-image: url(../images/dis-connect-charger-icon.png);
+}
+
+#connect-charger-icon:hover, #dis-connect-charger-icon:hover{
+	background-position: left bottom;
+}
+
+div#event-battery, div#event-messaging, div#event-memory{
+	float: left;
+	width: 150px;
+	height: 50px;
+	background-position: left top;
+	margin: 10px;
+	background-repeat: no-repeat;
+	border: 1px solid #6f6f6f;
+}
+
+div#event-battery.active:hover, div#event-messaging.active:hover, div#event-memory.active:hover{
+	background-position: 0px -50px;
+	border: 1px solid #75ea4f;
+}
+
+div#event-messaging.inactive, div#event-memory.inactive{
+	background-position: 0px -100px;
+	border: 1px solid #676767;
+}
+
+
+div#event-battery{
+	background-image: url(../images/battery-icon.png);
+}
+
+div#event-messaging{
+	background-image: url(../images/messaging-icon.png);
+}
+
+div#event-memory{
+	background-image: url(../images/memory-icon.png);
+}
+
+div.ui-panel{
+	height:30px;	
+}
+
+a.ui-button, a.ui-button-fixed {
+	background:#555555 url(../script/jquery-ui/css/ui-darkness/images/555555_40x100_textures_02_glass_20.png) repeat-x scroll 0 50%;
+	border:1px solid #666666;
+	color:#EEEEEE;
+	cursor:pointer;
+	font-size:0.9em;
+	font-weight:bolder;
+	line-height:1.4em;
+	margin:0.5em 8px 0.5em 0;
+	padding:0.2em 0.6em 0.3em;
+	text-decoration: none;
+}
+a.ui-button:hover, a.ui-button-fixed:hover {
+	background:#0078A3 url(../script/jquery-ui/css/ui-darkness/images/0078a3_40x100_textures_02_glass_40.png) repeat-x scroll 0 50%;
+	border:1px solid #4bd94b;
+	color:#FFFFFF;
+}
+
+a.ui-button-fixed{
+	float: left;
+	padding: 0.4em 0.6em 0.8em;
+	text-align: center;
+	width: 145px !important;
+}
+
+div#slider-value-panel{
+	text-align: center;
+	margin-top: 10px;
+}
+
+div#slider-value-panel span{
+	padding: 3px;
+	background:#0078A3 url(../script/jquery-ui/css/ui-darkness/images/0078a3_40x100_textures_02_glass_40.png) repeat-x scroll 0 50%;
+	border:1px solid #4bd94b;
+	color:#FFFFFF;
+	font-weight: bolder;
+}
+
+
+/*
+	Console UI
+*/
+#preview-ui-top{
+	overflow:auto;
+}
+
+#preview-ui-bottom{
+	overflow:hidden;
+	display: none;
+}
+#preview-ui-bottom-header{
+	background-color: #aeaeae;
+	background-image: url(../images/console-icon.gif);
+	background-repeat: repeat-x;
+	background-position: 0px -28px;
+}
+span#Console-Toggle-Button{
+	height: 9px;
+	width: 15px;
+	float: right;
+	background-repeat: no-repeat;
+	margin : 12px 8px 0px 0px;
+	cursor: hand;
+}
+
+span#Console-Toggle-Button.open{
+	background-position: 0px 0px;
+	background-image: url(../images/console-close-icon.png);
+}
+
+span#Console-Toggle-Button.open:hover{
+	background-position: 0px -9px;
+}
+
+span#Console-Toggle-Button.open:active{
+	background-position: 0px -18px;
+}
+
+
+span#Console-Toggle-Button.close{
+	background-position: 0px 0px;
+	background-image: url(../images/console-open-icon.png);
+}
+
+span#Console-Toggle-Button.close:hover{
+	background-position: 0px -9px;
+}
+
+span#Console-Toggle-Button.close:active{
+	background-position: 0px -18px;
+}
+
+
+span#Console-Clear-Button{
+	height: 16px;
+	width: 39px;
+	float: right;
+	background-image: url(../images/console-clear-button.png);
+	background-repeat: no-repeat;
+	margin : 10px 10px 0px 0px;
+	cursor: hand;
+}
+span#Console-Clear-Button:hover{
+	background-position: -0px -16px;
+}
+
+#preview-ui-bottom-body{
+	overflow:auto;
+	background-color: #ffffff;
+	display: none;
+}
+
+#preview-ui-bottom-body p{
+	font-family: "Courier New", Courier, monospace;
+	font-size: 11px;
+	padding: 2px 5px;
+	border-bottom: 1px solid silver;
+	margin: 0px;
+}
+
+#preview-ui-bottom-body p.log{
+
+}
+
+#preview-ui-bottom-body p.info{
+	background-image: url(../images/infoIcon.png);
+	background-repeat: no-repeat;
+	background-position: 5px center;
+	padding-left: 26px;
+}
+#preview-ui-bottom-body p.warn{
+	background: #00ffff url(../images/warningIcon.png);
+	background-repeat: no-repeat;
+	background-position: 5px center;
+	padding-left: 26px;
+}
+#preview-ui-bottom-body p.error{
+	background: #ffffe0 url(../images/errorIcon.png);
+	background-repeat: no-repeat;
+	background-position: 5px center;
+	padding-left: 26px;
+	color: #ff0000;
+}
+
+
+#preview-ui-bottom-header div{
+	float: left;
+	margin: 9px;
+	color: #ffffff;
+	font-size: 11px;
+	font-weight: bolder;
+	font-family: "Arial";
+}
+
+
+span#wrt-help{
+	height: 28px;
+	width: 28px;
+	float: right;
+	background-repeat: no-repeat;
+	background-image: url(../images/wrt-help-icon.png);
+}
+
+span#wrt-help:hover{
+	background-position: -28px 0px;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/appManager_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,99 @@
+/**
+ * SAPI Sample Data - AppManager
+ */
+
+
+(function(){  
+	
+    var data_apps = [
+    {
+        "Path": "C:\\private\\10282822\\com.nokia.forum.widget.accuwidget\\AccuWidget\\accuwidget.xhtml",
+        "Uid": "0x2000dad2",
+        "Caption": "AccuWidget",
+        "ShortCaption": "AccuWidget"
+    }, {
+        "Path": "C:\\private\\10282822\\com.nokia.wrt.tools.sapi.CreatorWidget\\CreatorWidget\\index.html",
+        "Uid": "0x2000dadb",
+        "Caption": "Creator Widget",
+        "ShortCaption": "Creator Widget"
+	},{
+        "Path": "Z:\\sys\\bin\\lcapp.exe",
+        "Uid": "0x10283139",
+        "Caption": "Location",
+        "ShortCaption": "Location"
+    }, {
+        "Path": "Z:\\sys\\bin\\javadrmmanager.exe",
+        "Uid": "0x1028246e",
+        "Caption": "javadrmmanager",
+        "ShortCaption": "javadrmmanager"
+    }, {
+        "Path": "Z:\\sys\\bin\\iaupdater.exe",
+        "Uid": "0x2000f85d",
+        "Caption": "iaupdater",
+        "ShortCaption": "iaupdater"
+    }, {
+        "Path": "Z:\\sys\\bin\\iaupdate.exe",
+        "Uid": "0x2000f85a",
+        "Caption": "App. update",
+        "ShortCaption": "App. update"
+    }, {
+        "Path": "Z:\\sys\\bin\\SAFlash.exe",
+        "Uid": "0x101fd693",
+        "Caption": "Flash Lite",
+        "ShortCaption": "Flash Lite"
+    }, {
+        "Path": "Z:\\sys\\bin\\eswt.exe",
+        "Uid": "0x101f9516",
+        "Caption": "eswt",
+        "ShortCaption": "eswt"
+    }, {
+        "Path": "Z:\\sys\\bin\\DRMRightsManager.exe",
+        "Uid": "0x101f85c7",
+        "Caption": "Licences",
+        "ShortCaption": "Licences"
+    }, {
+        "Path": "Z:\\sys\\bin\\RoapApp.exe",
+        "Uid": "0x10008d64",
+        "Caption": "Licence download",
+        "ShortCaption": "Licence download"
+    }, {
+        "Path": "Z:\\sys\\bin\\DdViewer.exe",
+        "Uid": "0x10008d3f",
+        "Caption": "Download",
+        "ShortCaption": "Download"
+	}, {
+		"Path": "Z:\\sys\\bin\\MediaGallery2.exe",
+		"Uid": "0x101f8599",
+		"Caption": "Gallery",
+		"ShortCaption": "Gallery"
+    }, {
+        "Path": "Z:\\sys\\bin\\CodViewer.exe",
+        "Uid": "0x10008d4a",
+        "Caption": "Download",
+        "ShortCaption": "Download"
+    }];
+		
+		
+		
+    var data_packages = [{
+        "PackageName": "Mobiola Screen Capture",
+        "Uid": "0x2000be16",
+        "Version": "3:0",
+        "Vendor": "Warelex LLC",
+        "Drive": "E"
+    }, {
+        "PackageName": "Facebook",
+        "Uid": "0x20011184",
+        "Version": "1:0",
+        "Vendor": "Nokia Corporation",
+        "Drive": "C"
+    }];
+	
+	
+	/**
+	 * register data!
+	 */
+	device.implementation.loadData('Service.AppManager', 'Application', data_apps);
+	device.implementation.loadData('Service.AppManager', 'UserInstalledPackage', data_packages);
+
+})()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/calendar_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,136 @@
+/**
+ * SAPI Sample Data - Calendar
+ */
+
+
+(function(){  
+
+
+    var data_entries = [{
+        "Type": "ToDo",
+        "Summary": "Face head on my problems",
+        "Description": "Face head on my problems",
+        "EndTime": "Wednesday, 15 April, 2009 12:00:00 am",
+        "id": "ihiwykmkjzcowqEnnEbeDnJpzWhPWrgNpNgudjdwgPfisvvQscuibwwSmgkdhdiBzIfyqvfIBmiYavfklygBssoKmWpJuxftbkdLsfmuwudczlJikohlFbQecaMlbaPnwyddzqXcjrhldXignjYtWyfqfzbpcxlH",
+        "LocalId": "34",
+        "Priority": 1,
+        "Replication": "Open"
+    }, {
+        "Type": "ToDo",
+        "Summary": "Believe myself first",
+        "Description": "Believe myself first",
+        "EndTime": "Sunday, 22 March, 2009 12:00:00 am",
+        "AlarmTime": "Saturday, 21 March, 2009 11:30:00 pm",
+        "id": "rjutskelXlDdoaebCyPzjopwgxMxluuLesqqsrykvIxrFLbxvuhBImBbhqwlSRfFtvWktkrvqpjfvxCoBxpsDlbgugvqjudregvyoebgtihRiSarcnryZovfwyHTcmXqZdjdrVPvSGnqroYgXdtpafqxTzrnkMKpzLihcxfaxwmdrkuGifsgbglhyfwqmtiPyzpeuxvKFfnrmhaqnrUarustDySMgKakjpFpkhtbonmTyBvhlzv",
+        "LocalId": "35",
+        "Priority": 1,
+        "Replication": "Open"
+    }, {
+        "Type": "Meeting",
+        "Summary": "Meeting with the professor",
+        "Description": "Meeting with the professor",
+        "StartTime": "Monday, 23 March, 2009 11:56:00 am",
+        "EndTime": "Monday, 23 March, 2009 2:31:00 pm",
+        "AlarmTime": "Monday, 23 March, 2009 11:01:00 am",
+        "InstanceStartTime": "Monday, 23 March, 2009 11:56:00 am",
+        "InstanceEndTime": "Monday, 23 March, 2009 2:31:00 pm",
+        "id": "hifXqeBiUOlelbioirmeoniClarsiybNhNxdlQbqBzcngmhxtzlRoebdeYxupjaxnapugxrKnmhGjzdwtChVydzwOdwrHPokjqjvyaPwbqCjdtpukjcoyjdkjkkrndZzwjCYQPxgvereyuktnOtIndpoyimtjzPzEnkxCfzhxaDTvUgclfpsfbtgtvwk",
+        "LocalId": "31",
+        "Priority": 0,
+        "Organizer": {
+            "CommonName": "Frideswide Farprington",
+            "Address": "Christian.Wilbar@Melleva.com"
+        },
+        "Replication": "Open"
+    }, {
+        "Type": "Meeting",
+        "Summary": "Work issues",
+        "Description": "Work issues",
+        "StartTime": "Saturday, 28 March, 2009 1:22:00 am",
+        "EndTime": "Saturday, 28 March, 2009 7:56:00 am",
+        "AlarmTime": "Saturday, 28 March, 2009 12:49:00 am",
+        "InstanceStartTime": "Saturday, 28 March, 2009 1:22:00 am",
+        "InstanceEndTime": "Saturday, 28 March, 2009 7:56:00 am",
+        "id": "symstNdkqdznkcettruqqyefdjkzikeBXmcamanzrygnusjyFYheprwaxksxzrqsdbnkTqemtsqqZbqnbbircyqtohmymWvqEc",
+        "LocalId": "30",
+        "Priority": 0,
+        "Organizer": {
+            "CommonName": "Margery Worthley",
+            "Address": "Grace.Wilbar@Peger.com"
+        },
+        "Replication": "Open"
+    }, {
+        "Type": "Reminder",
+        "Summary": "Remeber to harvest corn field",
+        "Description": "Remeber to harvest corn field",
+        "StartTime": "Thursday, 02 April, 2009 12:00:00 am",
+        "AlarmTime": "Wednesday, 01 April, 2009 11:52:00 pm",
+        "id": "uwtxgvTsowwGbnsgboEprwxvmihUkkDczxeohsnsXpUzUaHgjBJmjhpfOjaoyvRrjwIkgafrcszvbCSooutemfhejtyfonHviomgouimvPtexgdWmzDgGP",
+        "LocalId": "36",
+        "Priority": 0,
+        "Replication": "Open"
+    }, {
+        "Type": "Reminder",
+        "Summary": "Remeber to wax cross country skiis",
+        "Description": "Remeber to wax cross country skiis",
+        "StartTime": "Monday, 06 April, 2009 12:00:00 am",
+        "AlarmTime": "Sunday, 05 April, 2009 11:44:00 pm",
+        "id": "ivunsxcjmrsdaKkdtbqpskSIGIFOftMLwTuvCbiHmrkJnxdZgsapbqhoxNrhsbheyztgyOfvdqGrIlawVrvEwnYjnzoSlyimcxlKcSqetcruzf",
+        "LocalId": "37",
+        "Priority": 0,
+        "Replication": "Open"
+    }, {
+        "Type": "DayEvent",
+        "Summary": "Go the bank",
+        "Description": "Go the bank",
+        "StartTime": "Monday, 06 April, 2009 6:16:00 pm",
+        "EndTime": "Monday, 06 April, 2009 7:19:00 pm",
+        "AlarmTime": "Monday, 06 April, 2009 6:07:00 pm",
+        "id": "QvcvlpXpflemwqjtniukLPsjkSengqBEfajerjclkrwysdy",
+        "LocalId": "33",
+        "Priority": 0,
+        "Replication": "Open"
+    }, {
+        "Type": "DayEvent",
+        "Summary": "School day",
+        "Description": "School day",
+        "StartTime": "Thursday, 16 April, 2009 5:27:00 pm",
+        "EndTime": "Thursday, 16 April, 2009 9:39:00 pm",
+        "AlarmTime": "Thursday, 16 April, 2009 4:35:00 pm",
+        "id": "zmHupjqghnkEepdfghSCcsmFnrrducaqEyqyetauTcmxscSptpchgimxeEnOzxdiyEldyrikjmxvgzibauvjQfdbzgoumlVyAjqfhqlgpTtbiffqdzgpzWrquiyAdidvccvffzZxmpgjjbjUCqyeuBiikiedtclqabbsdazAbb",
+        "LocalId": "32",
+        "Priority": 0,
+        "Replication": "Open"
+    }];
+	
+	
+
+	name = "C:MyCalendar";
+	id = 200;
+	localId = 20;
+		
+/** start data block **/	
+var data2 = [];
+	
+	for (var i = 1; i <= 10; i++) {
+		data2.push({
+			Type		: 'Meeting',
+			id			: id++,
+			LocalId		: localId++,
+			CalendarName: name,
+			StartTime	: new Date('3/'+i+'/2009'),
+			Endtime		: new Date('3/'+(1+i)+'/2009'),
+			Description	: 'sample meeting ' + i
+		});
+	}
+/** end data block **/	
+
+
+
+	/**
+	 * register data!
+	 */
+	device.implementation.loadData('Service.Calendar', 'C:Calendar', data_entries);
+	device.implementation.loadData('Service.Calendar', 'C:MyCalendar', data2);
+
+})()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/contact_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,158 @@
+/**
+ * SAPI Sample Data - Contacts
+ */
+
+(function(){
+
+
+	var data_contacts = [{
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€†î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Alice"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "Moller"
+	    },
+	    "LandPhoneGen": {
+	        "Label": "Telephone",
+	        "Value": "0230328732"
+	    },
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    }
+	}, {
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€ˆî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Amy"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "Kammer"
+	    },
+	    "LandPhoneGen": {
+	        "Label": "Telephone",
+	        "Value": "0492303652"
+	    },
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    }
+	}, {
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‚",
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "Bierman"
+	    },
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Michael"
+	    },
+	    "MobilePhoneGen": {
+	        "Label": "Mobile",
+	        "Value": "4084256071"
+	    }
+	}, {
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‡î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Ralph"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "Jacmor"
+	    },
+	    "LandPhoneGen": {
+	        "Label": "Telephone",
+	        "Value": "0432443343"
+	    },
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    }
+	}, {
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€…",
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Robert"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "Richards"
+	    },
+	    "LandPhoneGen": {
+	        "Label": "Telephone",
+	        "Value": "+4443433434"
+	    },
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    }
+	}, {
+	    "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€„",
+	    "FirstName": {
+	        "Label": "First name",
+	        "Value": "Ursula"
+	    },
+	    "LastName": {
+	        "Label": "Last name",
+	        "Value": "West"
+	    },
+	    "LandPhoneGen": {
+	        "Label": "Telephone",
+	        "Value": "0213443434"
+	    },
+	    "SyncClass": {
+	        "Label": "Synchronisation",
+	        "Value": "private"
+	    }
+	}];  
+	
+
+    var data_groups = [{
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€ƒî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "TestGroupName"
+    }, {
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‰î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "Silver club #5488",
+        "Contents": ["î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‚", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€„", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€…", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€†î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‡î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€ˆî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿"]
+    }, {
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€Šî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "The buddies #9926"
+    }, {
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‹î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "Football team #5940",
+        "Contents": ["î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‚", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€„"]
+    }, {
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€Œî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "Science group #2742",
+        "Contents": ["î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‚", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€„", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€…", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€†î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‡î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€ˆî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿"]
+    }, {
+        "id": "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿",
+        "GroupLabel": "Rockers #3062",
+        "Contents": ["î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‚", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€„", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€…", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€†î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€‡î€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿", "î€î€€î€–î£î€€î®î€€î´î€€î¤î€€î¢î€€î€ºî€€î€¯î€€î€¯î€€î£î€€î€ºî€€î£î€€î¯î€€î®î€€î´î€€î¡î€€î£î€€î´î€€î³î€€î€®î€€î£î€€î¤î€€î¢î€€î€î€€î€€î€€î€€î€€î€‰î€€î€€î€€î€î€ˆî€€î€€î€€îƒ¿îƒ¿îƒ¿îƒ¿"]
+    }];
+		
+		
+    var data_database = [{
+        "DBUri": "cntdb://c:contacts.cdb"
+    },{
+        "DBUri": "sim://global_adn"
+	}];
+    
+    
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.Contact', 'Contact', data_contacts);
+    device.implementation.loadData('Service.Contact', 'Group', data_groups);
+    device.implementation.loadData('Service.Contact', 'Database', data_database);
+    
+})()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/landmarks_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,339 @@
+/**
+ * SAPI Sample Data - Landmark
+ */
+
+(function(){
+
+	var data_landmark =	[{
+		"id":"47",
+		"LandmarkName":"Best food ever!",
+		"LandmarkPosition":{
+			"Latitude":-17.5423,
+			"Longitude":-54.8163,
+			"Altitude":82,
+			"HAccuracy":2,
+			"VAccuracy":4
+		},
+		"CategoryInfo":["1"],
+		"LandmarkDesc":"Place looks really nice.",
+		"LandmarkFields":{
+			"Country":"Finland",
+			"City":"Tokyo",
+			"AreaCode":"FI-70100",
+			"Street":"Plains Road",
+			"Telephone":"+4443433434"
+		}
+	},{
+		"id":"44",
+		"LandmarkName":"Food store",
+		"LandmarkPosition":{
+			"Latitude":65.4233,
+			"Longitude":-93.4225,
+			"Altitude":54,
+			"HAccuracy":1,
+			"VAccuracy":1
+		},
+		"CategoryInfo":["10"],
+		"LandmarkDesc":"Words are not enough to describe this landmark",
+		"LandmarkFields":{
+			"Country":"Finland",
+			"City":"St. Michel",
+			"AreaCode":"11233",
+			"Street":"McKenzie Avenue",
+			"Telephone":"0432443343"
+		}
+	},{
+		"id":"40",
+		"LandmarkName":"Hospital",
+		"LandmarkPosition":{
+			"Latitude":-2.4616,
+			"Longitude":51.4958,
+			"Altitude":43,
+			"HAccuracy":3,
+			"VAccuracy":3
+		},
+		"CategoryInfo":["13"],
+		"LandmarkDesc":"Place looks really nice.",
+		"LandmarkFields":{
+			"Country":"United States of America",
+			"City":"London",
+			"AreaCode":"11233",
+			"Street":"Pukershire Avenue",
+			"Telephone":"0565645455"
+		}
+	},{
+		"id":"45",
+		"LandmarkName":"John’s home",
+		"LandmarkPosition":{
+			"Latitude":36.9077,
+			"Longitude":134.4066,
+			"Altitude":42,
+			"HAccuracy":3,
+			"VAccuracy":5
+		},
+		"CategoryInfo":["14"],
+		"LandmarkDesc":"This is my favorite place",
+		"LandmarkFields":{
+			"City":"Los Angeles",
+			"AreaCode":"00310",
+			"Street":"McKenzie Lane",
+			"Telephone":"+35854553456",
+			"Country":"Japan"
+		}
+	},{
+		"id":"48",
+		"LandmarkName":"John’s home",
+		"LandmarkPosition":{
+			"Latitude":17.1817,
+			"Longitude":113.4183,
+			"Altitude":29,
+			"HAccuracy":3,
+			"VAccuracy":2
+		},
+		"CategoryInfo":["3"],
+		"LandmarkDesc":"Words are not enough to describe this landmark",
+		"LandmarkFields":{
+			"Country":"Norway",
+			"City":"St. Petersburg",
+			"AreaCode":"FI-70100",
+			"Street":"Windsor Road",
+			"Telephone":"+4465665456"
+		}
+	},{
+		"id":"49",
+		"LandmarkName":"Nice beach",
+		"LandmarkPosition":{
+			"Latitude":-22.0327,
+			"Longitude":-33.0193,
+			"Altitude":57,
+			"HAccuracy":1,
+			"VAccuracy":0
+		},
+		"CategoryInfo":["7"],
+		"LandmarkDesc":"This is my favorite place",
+		"LandmarkFields":{
+			"Telephone":"+35854553456",
+			"Country":"Finland",
+			"City":"Bangkok",
+			"AreaCode":"00310",
+			"Street":"Highland Avenue Extension"
+		}
+	},{
+		"id":"42",
+		"LandmarkName":"Nice view",
+		"LandmarkPosition":{
+			"Latitude":-1.5979999999999999,
+			"Longitude":177.5871,
+			"Altitude":23,
+			"HAccuracy":1,
+			"VAccuracy":4
+		},
+		"CategoryInfo":["5"],
+		"LandmarkDesc":"Words are not enough to describe this landmark",
+		"LandmarkFields":{
+			"Country":"Thailand",
+			"City":"St. Petersburg",
+			"AreaCode":"00310",
+			"Street":"Pukershire Avenue",
+			"Telephone":"0435445454"
+		}
+	},{
+		"id":"41",
+		"LandmarkName":"Summer cottage",
+		"LandmarkPosition":{
+			"Latitude":-80.6438,
+			"Longitude":78.5627,
+			"Altitude":60,
+			"HAccuracy":1,
+			"VAccuracy":4
+		},
+		"CategoryInfo":["11"],
+		"LandmarkDesc":"Place looks really nice.",
+		"LandmarkFields":{
+			"Country":"Thailand",
+			"City":"Havana",
+			"AreaCode":"99002",
+			"Street":"Eastman Street",
+			"Telephone":"+4465665456"
+		}
+	},{
+		"id":"43",
+		"LandmarkName":"Summer cottage",
+		"LandmarkPosition":{
+			"Latitude":23.6319,
+			"Longitude":-141.5323,
+			"Altitude":60,
+			"HAccuracy":2,
+			"VAccuracy":2
+		},
+		"CategoryInfo":["1"],
+		"LandmarkDesc":"This is my favorite place",
+		"LandmarkFields":{
+			"Country":"Norway",
+			"City":"Nairobi",
+			"AreaCode":"FI-70100",
+			"Street":"Windsor Avenue",
+			"Telephone":"0785434444"
+		}
+	},{
+		"id":"46",
+		"LandmarkName":"Work place",
+		"LandmarkPosition":{
+			"Latitude":1.7755,
+			"Longitude":66.132,
+			"Altitude":36,
+			"HAccuracy":5,
+			"VAccuracy":5
+		},
+		"CategoryInfo":["3"],
+		"LandmarkDesc":"Delicious strawberries sold here. Must visit again sometime!",
+		"LandmarkFields":{
+			"Country":"Kenya",
+			"City":"Havana",
+			"AreaCode":"99002",
+			"Street":"Barnes Street",
+			"Telephone":"0342303777"
+		}
+	}];
+	
+	
+	var data_category =	[{
+		"id":"1",
+		"CategoryName":"Accommodation",
+		"GlobalId":"3000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16384,
+		"IconMaskIndex":16385
+	},{
+
+		"id":"2",
+		"CategoryName":"Businesses",
+		"GlobalId":"6000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16386,
+		"IconMaskIndex":16387
+	},{
+		"id":"3",
+		"CategoryName":"Telecommunications",
+		"GlobalId":"9000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16388,
+		"IconMaskIndex":16389
+	},{
+		"id":"4",
+		"CategoryName":"Education",
+		"GlobalId":"12000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16390,
+		"IconMaskIndex":16391
+	},{
+		"id":"5",
+		"CategoryName":"Entertainment",
+		"GlobalId":"15000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16392,
+		"IconMaskIndex":16393
+	},{
+		"id":"6",
+		"CategoryName":"Food and drink",
+		"GlobalId":"18000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16394,
+		"IconMaskIndex":16395
+	},{
+		"id":"7",
+		"CategoryName":"Geographical locations",
+		"GlobalId":"21000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16396,
+		"IconMaskIndex":16397
+	},{
+		"id":"8",
+		"CategoryName":"Outdoor activities",
+		"GlobalId":"24000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16398,
+		"IconMaskIndex":16399
+	},{
+		"id":"9",
+		"CategoryName":"People",
+		"GlobalId":"27000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16400,
+		"IconMaskIndex":16401
+	},{
+		"id":"10",
+		"CategoryName":"Public services",
+		"GlobalId":"30000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16402,
+		"IconMaskIndex":16403
+	},{
+		"id":"11",
+		"CategoryName":"Places of worship",
+		"GlobalId":"33000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16404,
+		"IconMaskIndex":16405
+	},{
+		"id":"12",
+		"CategoryName":"Shopping",
+		"GlobalId":"36000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16406,
+		"IconMaskIndex":16407
+	},{
+		"id":"13",
+		"CategoryName":"Sightseeing",
+		"GlobalId":"39000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16408,
+		"IconMaskIndex":16409
+	},{
+		"id":"14",
+		"CategoryName":"Sports",
+		"GlobalId":"42000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16410,
+		"IconMaskIndex":16411
+	},{
+		"id":"15",
+		"CategoryName":"Transport",
+		"GlobalId":"45000",
+		"IconFile":"\resource\apps\eposlmglcategories.mif",
+		"IconIndex":16412,
+		"IconMaskIndex":16413
+	},{
+		"id":"24",
+		"CategoryName":"All places",
+		"IconFile":"Z:\resource\apps\smart2go.mif",
+		"IconIndex":16384,
+		"IconMaskIndex":16385
+	},{
+		"id":"25",
+		"CategoryName":"Nokia maps",
+		"IconFile":"Z:\resource\apps\LmkUi.mif",
+		"IconIndex":16402,
+		"IconMaskIndex":16403
+	}];
+	
+	var data_database =	[{
+		"DatabaseURI":"file://C:eposlm.ldb",
+		"DatabaseName":"",
+		"DbProtocol":"file",
+		"DbActive":false,
+		"DbSize":226,
+		"DbDrive":"C",
+		"DbMedia":9
+	}]; 
+
+
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.Landmarks', 'Landmark', data_landmark);
+    device.implementation.loadData('Service.Landmarks', 'Category', data_category);
+    device.implementation.loadData('Service.Landmarks', 'Database', data_database);
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/location_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,39 @@
+/**
+ * SAPI Sample Data - Location
+ */
+
+(function(){
+
+		
+var data_basicLocationInformation = {
+			"Longitude":77.694589331833,
+			"Latitude":12.942209068513,
+			"Altitude":836.5
+		}
+		
+var data_genericLocationInfo = {
+			"Longitude":77.694546416505,
+			"Latitude":12.942233711299,
+			"Altitude":836,
+			"HorizontalSpeed":0.05999999865889549,
+			"HorizontalSpeedError":1.0199999809265137,
+			"SatelliteNumView":11,
+			"SatelliteNumViewUsed":7,
+			"Heading":203.89999389648438,
+			"HeadingError":2.89898989898232,
+			"MagneticCourse":205.89999389600000,
+			"MagneticCourseError":1.09090389600000,
+			"TrueCourse":203.89999389648438,
+			"TrueCourseError":2.89898989898232,
+			"MagneticHeading":205.89999389600000,
+			"MagneticHeadingError":1.09090389600000
+		}; 
+
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.Location', 'BasicLocationInformation', data_basicLocationInformation);
+    device.implementation.loadData('Service.Location', 'GenericLocationInfo', data_genericLocationInfo);
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/logging_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,377 @@
+/**
+ * SAPI Sample Data - Logging
+ */
+
+(function(){
+
+
+	var logging_data = [{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":5518,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:42 am",
+		"Subject":"A",
+		"PhoneNumber":"5270443",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"30",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":472,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:42 am",
+		"Subject":"A",
+		"PhoneNumber":"1247463",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"29",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":1914,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:42 am",
+		"Subject":"A",
+		"PhoneNumber":"8759891",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"28",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":3130,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:32 am",
+		"Subject":"A",
+		"PhoneNumber":"3200343",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"27",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":4128,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:32 am",
+		"Subject":"A",
+		"PhoneNumber":"2101692",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"26",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":2012,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:32 am",
+		"Subject":"A",
+		"PhoneNumber":"8813355",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"25",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:24 am",
+		"Subject":"A",
+		"PhoneNumber":"8092875",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"24",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:24 am",
+		"Subject":"A",
+		"PhoneNumber":"3702771",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"23",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:24 am",
+		"Subject":"A",
+		"PhoneNumber":"2680939",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"22",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:11 am",
+		"Subject":"A",
+		"PhoneNumber":"1075503",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"21",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:11 am",
+		"Subject":"A",
+		"PhoneNumber":"9781533",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"20",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:17:11 am",
+		"Subject":"A",
+		"PhoneNumber":"4185107",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"19",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":4,
+		"RemoteParty":"Mobile Office",
+		"EventDuration":90,
+		"EventTime":"Wednesday, 08 April, 2009 11:18:37 am",
+		"Subject":"",
+		"PhoneNumber":"",
+		"Description":"Packet Data",
+		"Link":0,
+		"id":"18",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":4,
+		"RemoteParty":"Mobile Office",
+		"EventDuration":80,
+		"EventTime":"Wednesday, 08 April, 2009 11:15:30 am",
+		"Subject":"",
+		"PhoneNumber":"",
+		"Description":"Packet Data",
+		"Link":0,
+		"id":"18",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":4,
+		"RemoteParty":"Mobile Office",
+		"EventDuration":16,
+		"EventTime":"Wednesday, 08 April, 2009 11:12:33 am",
+		"Subject":"",
+		"PhoneNumber":"",
+		"Description":"Packet Data",
+		"Link":0,
+		"id":"17",
+		"Direction":1,
+		"EventData":"8303,17570"
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":2998,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:20 am",
+		"Subject":"A",
+		"PhoneNumber":"1716582",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"16",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":681,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:20 am",
+		"Subject":"A",
+		"PhoneNumber":"9888150",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"15",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":2294,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:20 am",
+		"Subject":"A",
+		"PhoneNumber":"8378283",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"14",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":4232,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:19 am",
+		"Subject":"A",
+		"PhoneNumber":"6818380",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"13",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":599,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:19 am",
+		"Subject":"A",
+		"PhoneNumber":"5933409",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"12",
+		"Direction":1,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":6376,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:12 am",
+		"Subject":"A",
+		"PhoneNumber":"5487982",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"11",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":6325,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:12 am",
+		"Subject":"A",
+		"PhoneNumber":"2859596",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"10",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":6571,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:12 am",
+		"Subject":"A",
+		"PhoneNumber":"2820138",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"9",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":4929,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:12 am",
+		"Subject":"A",
+		"PhoneNumber":"6356454",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"8",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":2620,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:12 am",
+		"Subject":"A",
+		"PhoneNumber":"4461166",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"7",
+		"Direction":0,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:02 am",
+		"Subject":"A",
+		"PhoneNumber":"8811808",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"6",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:02 am",
+		"Subject":"A",
+		"PhoneNumber":"2985843",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"5",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:02 am",
+		"Subject":"A",
+		"PhoneNumber":"9714278",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"4",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:02 am",
+		"Subject":"A",
+		"PhoneNumber":"5044910",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"3",
+		"Direction":5,
+		"EventData":""
+	},{
+		"EventType":0,
+		"RemoteParty":"",
+		"EventDuration":0,
+		"EventTime":"Wednesday, 08 April, 2009 11:09:02 am",
+		"Subject":"A",
+		"PhoneNumber":"6519793",
+		"Description":"Voice call",
+		"Link":0,
+		"id":"2",
+		"Direction":5,
+		"EventData":""
+	}];
+
+
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.Logging', 'Log', logging_data);
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/mediaManagement_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,233 @@
+/**
+ * SAPI Sample Data - MediaManagement
+ */
+
+(function(){
+
+	var music_data = [{
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\Breathless.mp3",
+		"Type":"Media",
+		"FileName":"Breathless",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":4552794,
+		"Artist":"ABC",
+		"SongName":"Breathless",
+		"TrackNumber":"1",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	},{
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\New song.mp3",
+		"Type":"Media",
+		"FileName":"New song",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":1232794,
+		"Artist":"ABC",
+		"SongName":"New song",
+		"TrackNumber":"2",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	},{		
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\Classic song.mp3",
+		"Type":"Media",
+		"FileName":"Classic song",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":3212794,
+		"Artist":"ABC",
+		"SongName":"Classic song",
+		"TrackNumber":"3",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	},{		
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\Folk sonk.mp3",
+		"Type":"Media",
+		"FileName":"Folk sonk",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":3412794,
+		"Artist":"ABC",
+		"SongName":"Folk sonk",
+		"TrackNumber":"4",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	},{		
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\National anthem.mp3",
+		"Type":"Media",
+		"FileName":"National anthem",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":4512794,
+		"Artist":"ABC",
+		"SongName":"National anthem",
+		"TrackNumber":"5",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	},{
+		"FileNameAndPath":"E:\\Sounds\\Digital\\Album1\\Dance sequence.mp3",
+		"Type":"Media",
+		"FileName":"Dance sequence",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":9110000,
+		"Artist":"ABC",
+		"SongName":"Dance sequence",
+		"TrackNumber":"6",
+		"Album":"Album1",
+		"Genre":"Pop",
+		"Composer":"XYZ"
+	}];
+	
+	var sound_data = [{
+		"FileNameAndPath":"E:\\Sounds\\Simple\\Dance sequence-old.mp3",
+		"Type":"Media",
+		"FileName":"Dance sequence-old",
+		"FileExtension":".mp3",
+		"Drive":"E:",
+		"MimeType":"audio/mpeg",
+		"MediaType":1,
+		"FileDate":"Friday, 13 February, 2009 12:01:24 am",
+		"FileSize":1002794,
+	},{
+		"FileNameAndPath": "E:\\Sounds\\Simple\\Rooster.mp3",
+		"Type": "Media",
+		"FileName": "Rooster",
+		"FileExtension": ".mp3",
+		"Drive": "E:",
+		"MimeType": "audio/mpeg",
+		"MediaType": 1,
+		"FileDate": "Friday, 13 February, 2009 12:01:24 am",
+		"FileSize": 911000,
+	
+	}];
+	var image_data = [{
+		"FileNameAndPath":"E:\\IMAGES\\Water.JPG",
+		"Type":"Media",
+		"FileName":"Water",
+		"FileExtension":".JPG",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Monday, 04 August, 2008 8:31:46 pm",
+		"FileSize":25275
+	},{
+		"FileNameAndPath":"E:\\IMAGES\\Beach.JPG",
+		"Type":"Media",
+		"FileName":"Beach",
+		"FileExtension":".JPG",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Wednesday, 28 May, 2008 8:52:16 am",
+		"FileSize":35151
+	},{
+		"FileNameAndPath":"E:\\IMAGES\\CountrySide.jpg",
+		"Type":"Media",
+		"FileName":"CountrySide",
+		"FileExtension":".jpg",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Monday, 24 March, 2008 12:27:32 am",
+		"FileSize":44318
+	},{
+		"FileNameAndPath":"E:\\IMAGES\\CoolBlue.JPG",
+		"Type":"Media",
+		"FileName":"CoolBlue",
+		"FileExtension":".JPG",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Monday, 04 August, 2008 8:31:46 pm",
+		"FileSize":25275
+	},{
+		"FileNameAndPath":"E:\\IMAGES\\Swimming.JPG",
+		"Type":"Media",
+		"FileName":"Swimming",
+		"FileExtension":".JPG",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Wednesday, 28 May, 2008 8:52:16 am",
+		"FileSize":35151
+	},{
+		"FileNameAndPath":"E:\\IMAGES\\Sky.jpg",
+		"Type":"Media",
+		"FileName":"Sky",
+		"FileExtension":".jpg",
+		"Drive":"E:",
+		"MimeType":"image/jpeg",
+		"MediaType":3,
+		"FileDate":"Monday, 24 March, 2008 12:27:32 am",
+		"FileSize":44318
+	}];
+
+	var video_data = [{
+		"FileNameAndPath":"C:\\Data\\Videos\\Inside water.3gp",
+		"Type":"Media",
+		"FileName":"Inside water",
+		"FileExtension":".3gp",
+		"Drive":"C:",
+		"MimeType":"video/3gpp",
+		"MediaType":4,
+		"FileDate":"Wednesday, 08 April, 2009 5:04:18 pm",
+		"FileSize":1103067
+	},{
+		"FileNameAndPath":"C:\\Data\\Videos\\Daring.mp4",
+		"Type":"Media",
+		"FileName":"Daring",
+		"FileExtension":".mp4",
+		"Drive":"C:",
+		"MimeType":"video/mp4",
+		"MediaType":4,
+		"FileDate":"Wednesday, 08 April, 2009 5:04:18 pm",
+		"FileSize":1020200
+	},{
+		"FileNameAndPath":"C:\\Data\\Videos\\On the train.mp4",
+		"Type":"Media",
+		"FileName":"On the train",
+		"FileExtension":".mp4",
+		"Drive":"C:",
+		"MimeType":"video/mp4",
+		"MediaType":4,
+		"FileDate":"Wednesday, 08 April, 2009 5:04:18 pm",
+		"FileSize":9090900
+	}];
+	
+	var streaming_data = [{}]; 	
+		
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.MediaManagement', 'Music', music_data);
+    device.implementation.loadData('Service.MediaManagement', 'Sound', sound_data);
+    device.implementation.loadData('Service.MediaManagement', 'Image', image_data);
+    device.implementation.loadData('Service.MediaManagement', 'Video', video_data);
+    device.implementation.loadData('Service.MediaManagement', 'StreamingURL', streaming_data);
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/messaging_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,193 @@
+/**
+ * SAPI Sample Data - Messaging
+ */
+
+(function(){
+
+
+var data_messaging = [{
+	 	"MessageType": "SMS",
+		"Sender": "0435445454",
+		"Subject": "Reproduction, transfer, distribu",
+		"Time": "Wednesday, 01 April, 2009 6:11:32 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1048980,
+		"BodyText": "Reproduction, transfer, distribution or storage of"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "+35854553456",
+		"Subject": "If you place an order for a prod",
+		"Time": "Wednesday, 01 April, 2009 6:11:32 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1048981,
+		"BodyText": "If you place an order for a product, request a ser"
+	},{
+		"MessageType": "SMS",
+		"Sender": "+4465655656",
+		"Subject": "You also agree that we have no c",
+		"Time": "Wednesday, 01 April, 2009 6:11:33 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1048982,
+		"BodyText": "You also agree that we have no control over the co"
+	
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "+4443433434",
+		"Subject": "We may use this information to r",
+		"Time": "Wednesday, 01 April, 2009 6:11:33 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1048983,
+		"BodyText": "We may use this information to respond to your req"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "0565645455",
+		"Subject": "In order to respond to your ques",
+		"Time": "Wednesday, 01 April, 2009 6:11:33 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1048984,
+		"BodyText": "In order to respond to your questions or manage in"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "0231343243",
+		"Subject": "We consents to you browsing the ",
+		"Time": "Wednesday, 01 April, 2009 6:11:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1048985,
+		"BodyText": "We consents to you browsing the pages on your computer or printing copies of extracts from these pag"
+	},{
+		"MessageType": "SMS",
+		"Sender": "0545545454",
+		"Subject": "If you place an order for a prod",
+		"Time": "Wednesday, 01 April, 2009 6:11:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1048986,
+		"BodyText": "If you place an order for a product, request a service or submit content to this site, we may need t"
+	},{
+		"MessageType": "unknown",
+		"Sender": "Edith",
+		"Subject": "You will win the battle, GUARANT",
+		"Time": "Wednesday, 01 April, 2009 6:12:22 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1048987
+	},{
+		"MessageType": "unknown",
+		"Sender": "Edith",
+		"Subject": "You will win the battle, GUARANT",
+		"Time": "Wednesday, 01 April, 2009 6:12:23 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1048989
+	},{
+		"MessageType": "unknown",
+		"Sender": "+4443433434",
+		"Subject": "Join us at the OSGi 2003 World C",
+		"Time": "Wednesday, 01 April, 2009 6:14:10 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1049013
+	},{
+		"MessageType": "unknown",
+		"Sender": "0231343243",
+		"Subject": "Put your subject line here",
+		"Time": "Wednesday, 01 April, 2009 6:14:10 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": true,
+		"MessageId": 1049014
+	},{
+		"MessageType": "MMS",
+		"Sender": "0455454454",
+		"Subject": "A very funny game",
+		"Time": "Wednesday, 01 April, 2009 6:16:01 pm",
+		"Priority": "Medium",
+		"Attachment": true,
+		"Unread": true,
+		"MessageId": 1049043,
+		"BodyText": ""
+	},{
+		"MessageType": "MMS",
+		"Sender": "0542303286",
+		"Subject": "Weedmon say: call, we be open 7 ",
+		"Time": "Wednesday, 01 April, 2009 6:16:03 pm",
+		"Priority": "Medium",
+		"Attachment": true,
+		"Unread": true,
+		"MessageId": 1049044,
+		"BodyText": ""
+	},{
+		"MessageType": "SMS",
+		"Sender": "+4465656565",
+		"Subject": "In addition, a link to a such si",
+		"Time": "Wednesday, 01 April, 2009 6:16:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1049045,
+		"BodyText": "In addition, a link to a such site does not imply that we endorses the site or the products or servi"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "0433032865",
+		"Subject": "The contents of these pages are ",
+		"Time": "Wednesday, 01 April, 2009 6:16:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1049046,
+		"BodyText": "The contents of these pages are copyrighted. Any rights not expressly granted herein are reserved. T"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "+4465655656",
+		"Subject": "We may use this information to r",
+		"Time": "Wednesday, 01 April, 2009 6:16:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1049047,
+		"BodyText": "We may use this information to respond to your requests, or to contact you via mail, e-mail or phone"
+	},{ 
+		"MessageType": "SMS",
+		"Sender": "+35876653456",
+		"Subject": "The use of press releases and ot",
+		"Time": "Wednesday, 01 April, 2009 6:16:59 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1049048,
+		"BodyText": "The use of press releases and other documents classified as public is permitted in public communicat"
+	},{
+		"MessageType": "SMS",
+		"Sender": "0530328732",
+		"Subject": "The use of press releases and ot",
+		"Time": "Wednesday, 01 April, 2009 6:17:00 pm",
+		"Priority": "Medium",
+		"Attachment": false,
+		"Unread": false,
+		"MessageId": 1049054,
+		"BodyText": "The use of press releases and other documents classified as public is permitted in public communicat"
+	}];
+
+    /**
+     * register data!
+     */
+    device.implementation.loadData('Service.Messaging', 'Inbox', data_messaging);
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/sensor_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,469 @@
+/**
+ * SAPI Sample Data - Sensor
+ */
+
+(function(){
+
+var property = {
+	"AccelerometerAxis":{
+		"Availability":{
+			"PropertyId":"Availability",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+			},
+		"ChannelAccuracy":{
+			"PropertyId":"ChannelAccuracy",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":10
+			},
+		"ChannelDataFormat":
+		{
+			"PropertyId":"ChannelDataFormat",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":2
+		},
+		"ChannelScale":
+		{
+			"PropertyId":"ChannelScale",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"ChannelUnit":
+		{
+			"PropertyId":"ChannelUnit",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":10
+		},
+		"ConnectionType":
+		{
+			"PropertyId":"ConnectionType",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+		},
+		"DataRate":
+		{
+			"PropertyId":"DataRate",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"Description":
+		{
+			"PropertyId":"Description",
+			"PropertyDataType":2,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":"Accelerometer"
+		},
+		"MeasureRange":
+		{
+			"PropertyId":"MeasureRange",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"ScaledRange":
+		{
+			"PropertyId":"ScaledRange",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":8
+		}
+	},
+	"AccelerometerDoubleTapping":
+	{
+		"Availability":
+		{
+			"PropertyId":"Availability",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+		},
+		"ChannelAccuracy":
+		{
+			"PropertyId":"ChannelAccuracy",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":10
+		},
+		"ChannelDataFormat":
+		{
+			"PropertyId":"ChannelDataFormat",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":2
+		},
+		"ChannelScale":
+		{
+			"PropertyId":"ChannelScale",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"ChannelUnit":
+		{
+			"PropertyId":"ChannelUnit",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":10
+		},
+		"ConnectionType":
+		{
+			"PropertyId":"ConnectionType",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+		},
+		"Description":
+		{
+			"PropertyId":"Description",
+			"PropertyDataType":2,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":"Accelerometer"
+		},
+		"MeasureRange":
+		{
+			"PropertyId":"MeasureRange",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"ScaledRange":
+		{
+			"PropertyId":"ScaledRange",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":8
+		}
+	},
+	"Orientation":
+	{
+		"Availability":
+		{
+			"PropertyId":"Availability",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+		},
+		"DataRate":
+		{
+			"PropertyId":"DataRate",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"MeasureRange":
+		{
+			"PropertyId":"MeasureRange",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		}
+	},
+	"Rotation":
+	{
+		"Availability":
+		{
+			"PropertyId":"Availability",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":1
+		},
+		"ChannelAccuracy":
+		{
+			"PropertyId":"ChannelAccuracy",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0.041666666666666664
+		},
+		"DataRate":
+		{
+			"PropertyId":"DataRate",
+			"PropertyDataType":0,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":0
+		},
+		"MeasureRange":
+		{
+			"PropertyId":"MeasureRange",
+			"PropertyDataType":1,
+			"ItemIndex":-1,
+			"ReadOnly":true,
+			"PropertyValue":359
+		}
+	}
+};
+var data_all =[{
+		"ChannelId":7,
+		"ContextType":2,
+		"Quantity":10,
+		"ChannelType":270553214,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":24,
+		"ChannelDataTypeId":270553214
+		},
+		{
+		"ChannelId":8,
+		"ContextType":2,
+		"Quantity":11,
+		"ChannelType":270553217,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":16,
+		"ChannelDataTypeId":270553215
+		},
+		{
+		"ChannelId":10,
+		"ContextType":3,
+		"Quantity":12,
+		"ChannelType":270553224,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":16,
+		"ChannelDataTypeId":270553224
+		},
+		{
+		"ChannelId":11,
+		"ContextType":3,
+		"Quantity":13,
+		"ChannelType":270553225,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":24,
+		"ChannelDataTypeId":270553225
+		}];
+		
+var data_accelerometerAxis = [{
+		"ChannelId":7,
+		"ContextType":2,
+		"Quantity":10,
+		"ChannelType":270553214,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":24,
+		"ChannelDataTypeId":270553214
+		}];
+		
+var data_accelerometerDoubleTapping = [{
+		"ChannelId":8,
+		"ContextType":2,
+		"Quantity":11,
+		"ChannelType":270553217,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":16,
+		"ChannelDataTypeId":270553215
+		}];
+		
+var data_orientation = [{
+		"ChannelId":10,
+		"ContextType":3,
+		"Quantity":12,
+		"ChannelType":270553224,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":16,
+		"ChannelDataTypeId":270553224
+		}];
+		
+var data_rotation = [{
+		"ChannelId":11,
+		"ContextType":3,
+		"Quantity":13,
+		"ChannelType":270553225,
+		"Location":"NoLoc",
+		"VendorId":"Nokia",
+		"DataItemSize":24,
+		"ChannelDataTypeId":270553225
+		}];
+
+
+var dataRet_accelerometerAxis = [{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":30,
+		"YAxisData":30,
+		"ZAxisData":30
+		},{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":35,
+		"YAxisData":30,
+		"ZAxisData":30
+		},{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":30,
+		"YAxisData":35,
+		"ZAxisData":30
+		},{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":30,
+		"YAxisData":30,
+		"ZAxisData":35
+		},{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":40,
+		"YAxisData":30,
+		"ZAxisData":30
+		},{
+		"DataType":"AxisData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XAxisData":30,
+		"YAxisData":40,
+		"ZAxisData":30
+		}];
+		
+var dataRet_accelerometerDoubleTapping = [{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":30
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":40
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":50
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":60
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":70
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":80
+		},{
+		"DataType":"DoubleTappingData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",		
+		"DeviceDirection":90
+		}];
+		
+var dataRet_orientation = [{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayUp"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayDown"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayLeftUp"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayRightUp"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayUpwards"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"DisplayDownwards"		
+		},{
+		"DataType":"OrientationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"DeviceOrientation":"Undefined"		
+		}];
+		
+var dataRet_rotation = [{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":30,
+		"YRotation":35,
+		"ZRotation":30
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":35,
+		"YRotation":30,
+		"ZRotation":30
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":30,
+		"YRotation":30,
+		"ZRotation":35
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":40,
+		"YRotation":30,
+		"ZRotation":30
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":30,
+		"YRotation":40,
+		"ZRotation":30
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":30,
+		"YRotation":30,
+		"ZRotation":40
+		},{
+		"DataType":"RotationData",
+		"TimeStamp":"Wednesday, 15 April, 2009 12:00:00 am",
+		"XRotation":50,
+		"YRotation":50,
+		"ZRotation":50
+		}];
+
+    /**
+     * register data!
+     */
+	device.implementation.loadData('Service.Sensor','SensorProperty',property);
+    device.implementation.loadData('Service.Sensor', 'All', data_all);
+    device.implementation.loadData('Service.Sensor', 'AccelerometerAxis', data_accelerometerAxis);
+    device.implementation.loadData('Service.Sensor', 'AccelerometerDoubleTapping', data_accelerometerDoubleTapping);
+    device.implementation.loadData('Service.Sensor', 'Orientation', data_orientation);
+    device.implementation.loadData('Service.Sensor', 'Rotation', data_rotation);
+/*    device.implementation.loadData('Service.Sensor', 'AccelerometerAxisRet', dataRet_accelerometerAxis);
+    device.implementation.loadData('Service.Sensor', 'AccelerometerDoubleTappingRet', dataRet_accelerometerDoubleTapping);
+    device.implementation.loadData('Service.Sensor', 'OrientationRet', dataRet_orientation);
+    device.implementation.loadData('Service.Sensor', 'RotationRet', dataRet_rotation);*/
+
+})()
+	
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/data/sysInfo_data.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,345 @@
+/**
+ * SAPI Sample Data - SysInfo
+ */
+
+
+(function(){  
+
+var data_5800 = {
+			"battery":{
+				"batterystrength":{
+					"Status":85,
+					"Entity":"Battery",
+					"Key":"BatteryStrength"
+					},
+				"chargingstatus":{
+					"Status":0,
+					"Entity":"Battery",
+					"Key":"ChargingStatus"
+					}
+			},
+			"connectivity":{
+				"bluetooth":{
+					"Status":1,
+					"Entity":"Connectivity",
+					"Key":"BlueTooth"
+					},
+				"infrared":{
+					"Status":-1,
+					"Entity":"Connectivity",
+					"Key":"InfraRed"
+					},
+				"activeconnections":{
+					"ConnectionList":[{
+								"IAPID":5,
+								"IAPName":"Browser",
+								"IAPConnectionName":"",
+								"NetworkName":"Browser",
+								"ConnectionType":7,
+								"ConnectionStatus":1
+								},{
+								"IAPID":1,
+								"IAPName":"airtelgprs.com",
+								"IAPConnectionName":"Mobile Office",
+								"NetworkName":"GPRS",
+								"ConnectionType":6,
+								"ConnectionStatus":1
+								}],
+					"Entity":"Connectivity",
+					"Key":"ActiveConnections"
+				},					
+				"wlanmacaddress":{
+					"StringData":"00:21:fe:97:c5:27",
+					"Entity":"Connectivity",
+					"Key":"WLanMacAddress"
+					}
+			},
+			"device":{
+				"firmwareversion":{
+					"StringData":"V 20.0.012 RnD\n04-03-09\nRM-356\n(c)NMP",
+					"Entity":"Device",
+					"Key":"FirmwareVersion"},
+				"platformversion":{
+					"MajorVersion":"5",
+					"MinorVersion":"0",
+					"Entity":"Device",
+					"Key":"PlatformVersion"
+					},
+				"producttype":{
+					"StringData":"RM-356",
+					"Entity":"Device",
+					"Key":"ProductType"
+					},
+				"manufacturer":{
+					"StringData":"Nokia",
+					"Entity":"Device",
+					"Key":"Manufacturer"
+					},
+				"machineid":{
+					"Status":536926806,
+					"Entity":"Device",
+					"Key":"MachineId"
+					},
+				"phonemodel":{
+					"StringData":"5800 XpressMusic",
+					"Entity":"Device",
+					"Key":"PhoneModel"
+					},
+				"imei":{
+					"StringData":"004401102480155",
+					"Entity":"Device",
+					"Key":"IMEI"
+					}
+			},
+			"display":{
+				"brightness":{
+					"Status":50,
+					"Entity":"Display",
+					"Key":"Brightness"
+					},
+				"screensavertimeout":{
+					"Status":15,
+					"Entity":"Display",
+					"Key":"ScreenSaverTimeout"
+					},
+				"keyguardtime":{
+					"Status":60,
+					"Entity":"Display",
+					"Key":"KeyGuardTime"
+					},
+				"keyguardtime":{
+					"Status":60,
+					"Entity":"Display",
+					"Key":"KeyGuardTime"
+					},
+				"autolocktime":{
+					"Status":0,
+					"Entity":"Display",
+					"Key":"AutoLockTime"
+					},
+				"autolockstatus":{
+					"Status":0,
+					"Entity":"Display",
+					"Key":"AutoLockStatus"
+					},
+				"lighttimeout":{
+					"Status":45,
+					"Entity":"Display",
+					"Key":"LightTimeout"
+					},
+				"displayresolution":{
+					"XPixels":640,
+					"YPixels":360,
+					"Entity":"Display",
+					"Key":"DisplayResolution"
+					},
+				"displayorientation":{
+					"Status":3,
+					"Entity":"Display",
+					"Key":"DisplayOrientation"
+					},
+				"wallpaper":{
+					"StringData":"C://Data//Others//wallpaper.jpeg",
+					"Entity":"Display",
+					"Key":"Wallpaper"
+					}
+				
+			},
+			"features":{
+				"bluetooth":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"BlueTooth"
+					},
+				"infrared":{
+					"Status":0,
+					"Entity":"Features",
+					"Key":"InfraRed"
+					},
+				"camera":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"CAMERA"
+					},
+				"memorycard":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"MemoryCard"
+					},
+				"fmradio":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"FMRADIO"
+					},
+				"qwerty":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"QWERTY"
+					},
+				"wlan":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"WLAN"
+					},
+				"usb":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"USB"
+					},
+				"pen":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"Pen"
+					},
+				"led":{
+					"Status":0,
+					"Entity":"Features",
+					"Key":"LED"
+					},
+				"coverui":{
+					"Status":0,
+					"Entity":"Features",
+					"Key":"CoverUI"
+					},
+				"sidevolumekeys":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"SideVolumeKeys"
+					},
+				"vibra":{
+					"Status":1,
+					"Entity":"Features",
+					"Key":"Vibra"
+					}
+			},
+			"general":{
+				"connectedaccessories":{
+					"AccessoryList":[{"AccessoryType":0,"AccessoryState":1}],
+					"Entity":"General",
+					"Key":"ConnectedAccessories"
+					},
+				"accessorystatus":{
+					"AccessoryInfo":{"AccessoryType":0,"AccessoryState":0},
+					"Entity":"General",
+					"Key":"AccessoryStatus"
+					},
+				"inputlanguage":{
+					"Status":1,
+					"Entity":"General",
+					"Key":"InputLanguage"
+					},
+				"supportedlanguages":{
+					"LanguageList":[1,2,3,5,13,4],
+					"Entity":"General",
+					"Key":"SupportedLanguages"
+					},
+				"predictivetext":{
+					"Status":0,
+					"Entity":"General",
+					"Key":"PredictiveText"
+					},
+				"vibraactive":{
+					"Status":1,
+					"Entity":"General",
+					"Key":"VibraActive"
+					},
+				"availableusbmodes":{
+					"StringList":["PC Suite","Mass storage","Image transfer","Media transfer"],
+					"Entity":"General",
+					"Key":"AvailableUSBModes"
+					},
+				"activeusbmode":{
+					"StringData":"Mass storage",
+					"Entity":"General",
+					"Key":"ActiveUSBMode"
+					},
+				"flipstatus":{
+					"Status":-1,
+					"Entity":"General",
+					"Key":"FlipStatus"
+					},
+				"gripstatus":{
+					"Status":1,
+					"Entity":"General",
+					"Key":"GripStatus"
+					}
+			},
+			"memory":{
+				"listdrives":{
+					"DriveList":["C:\\","D:\\","E:\\","Z:\\"],
+					"Entity":"Memory",
+					"Key":"ListDrives"
+					},
+				"memorycard":{
+					"Status":1,
+					"Entity":"Memory",
+					"Key":"MemoryCard"
+					},
+				"driveinfo":{
+					"Drive": {
+							"C:\\": {
+								"Drive": "C:\\",
+								"CriticalSpace": 131072,
+								"MediaType": 9,
+								"TotalSpace": 90210304,
+								"FreeSpace": 79319040,
+								"DriveName": "",
+								"BatterState": 0
+								},
+							"D:\\": {
+								"Drive": "D:\\",
+								"CriticalSpace": 2700000,
+								"MediaType": 5,
+								"TotalSpace": 52469760,
+								"FreeSpace": 52457472,
+								"DriveName": "",
+								"BatterState": 0
+								},
+							"Z:\\": {
+								"Drive": "Z:\\",
+								"CriticalSpace": 131072,
+								"MediaType": 7,
+								"TotalSpace": 0,
+								"FreeSpace": 0,
+								"DriveName": "RomDrive",
+								"BatterState": 0
+								}
+							},
+					"Entity":"Memory",
+					"Key":"DriveInfo"
+					}
+			},
+			"network":{
+				"registrationstatus":{
+					"Status":4,
+					"Entity":"Network",
+					"Key":"RegistrationStatus"
+					},
+				"networkmode":{
+					"Status":0,
+					"Entity":"Network",
+					"Key":"NetworkMode"
+					},
+				"signalstrength":{
+					"Status":61,
+					"Entity":"Network",
+					"Key":"SignalStrength"
+					},
+				"currentnetwork":{
+					"NetworkName":"Airtel",
+					"NetworkStatus":1,
+					"NetworkMode":1,
+					"CountryCode":"404",
+					"NetworkCode":"45",
+					"LocationStatus":false,
+					"Entity":"Network",
+					"Key":"CurrentNetwork"
+					}
+			}
+	}; 
+	/**
+	 * register data!
+	 */
+	device.implementation.loadData('Service.SysInfo', '', data_5800);
+
+})()
Binary file org.symbian.tools.wrttools.previewer/preview/images/BrowserNotificationBar-Toogle.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/Gradient0Background.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/IconArea-hover.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/TransperantImage.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/active-orientation-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/battery-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/console-clear-button.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/console-close-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/console-icon.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/console-open-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/default-Icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Landscape.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Portrait.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/240x320/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Landscape.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Portrait.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/320x240/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Landscape.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Portrait.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/360x640/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/360x640/hs-landscape.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/360x640/hs-portrait.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/800x352/Landscape.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/800x352/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/MenuItem-keys-Bg2.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/Thumbs.db has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/device.7z has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/device/menuKeys-bg.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/errorIcon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/gradient-bg.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/hs-iframeMask.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/infoIcon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/memory-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/messaging-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/normal-orientation-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/settings-icon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/statusBar_240x320.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/statusBar_320x240.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/statusBar_360x640.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/statusBar_640x360.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/statusBar_800x352.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/sub-menu-arrow.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/th-bg-gradient.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/warningIcon.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/images/wrt-help-icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/nopreview.html	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,44 @@
+<!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>
+<style type="text/css">
+body {
+	background-image: url(images/Gradient0Background.png);
+	background-repeat: repeat-x;
+	font-family: "Nokia Sans", "Nokia Sans SemiBold", "Arial Narrow";
+	overflow: hidden;
+	color: #FFFFFF;
+}
+div {
+	text-align: center;
+	padding: 20px;
+	margin-top: 50px;
+	margin-right: auto;
+	margin-left: auto;
+	width: 500px;
+	font-size: x-large;
+	font-weight: normal;
+	background-color: #CC3300;
+	border-top-width: 2px;
+	border-right-width: 2px;
+	border-bottom-width: 2px;
+	border-left-width: 2px;
+	border-top-style: solid;
+	border-right-style: solid;
+	border-bottom-style: solid;
+	border-left-style: solid;
+	border-top-color: #FF3300;
+	border-right-color: #710000;
+	border-bottom-color: #710000;
+	border-left-color: #FF3300;
+}
+strong {
+	color: #FFCC00;
+}
+</style>
+</head>
+<body>
+<div> Widget preview is not available for this file, it is not the <strong>MainHtml</strong> file for the widget.
+</div>
+</body>
+</html>
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/000000_40x100_textures_05_inset_soft_25.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/0078a3_40x100_textures_02_glass_40.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_arrows_leftright.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_arrows_updown.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_close.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_doc.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_folder_closed.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_folder_open.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_minus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_11x11_icon_plus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_down.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_left.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_right.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/222222_7x7_arrow_up.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/555555_40x100_textures_02_glass_20.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_arrows_leftright.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_arrows_updown.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_close.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_doc.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_folder_closed.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_folder_open.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_minus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_plus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_11x11_icon_resize_se.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_down.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_left.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_right.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/cccccc_7x7_arrow_up.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/f58400_40x100_textures_05_inset_soft_30.png has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_arrows_leftright.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_arrows_updown.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_close.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_doc.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_folder_closed.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_folder_open.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_minus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_11x11_icon_plus.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_down.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_left.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_right.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/ffffff_7x7_arrow_up.gif has changed
Binary file org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/images/slider-handle.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/css/ui-darkness/ui.all.css	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,630 @@
+/*
+ * jQuery UI screen structure and presentation
+ * This CSS file was generated by ThemeRoller, a Filament Group Project for jQuery UI
+ * Author: Scott Jehl, scott@filamentgroup.com, http://www.filamentgroup.com
+ * Visit ThemeRoller.com
+*/
+
+/*
+ * Note: If your ThemeRoller settings have a font size set in ems, your components will scale according to their parent element's font size.
+ * As a rule of thumb, set your body's font size to 62.5% to make 1em = 10px.
+ * body {font-size: 62.5%;}
+*/
+
+
+
+/*UI accordion*/
+.ui-accordion {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	font-size: 0.8em;
+	border-bottom: 1px solid #666666;
+}
+.ui-accordion-group {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	border: 1px solid #666666;
+	border-bottom: none;
+}
+.ui-accordion-header {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	cursor: pointer;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+}
+.ui-accordion-header a {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	display: block;
+	font-size: 0.8em;
+	font-weight: bold;
+	text-decoration: none;
+	padding: .5em .5em .5em 1.7em;
+	color: #eeeeee;
+	background: url(images/cccccc_7x7_arrow_right.gif) .5em 50% no-repeat;
+}
+.ui-accordion-header a:hover {
+	background: url(images/ffffff_7x7_arrow_right.gif) .5em 50% no-repeat;
+	color: #ffffff;
+}
+.ui-accordion-header:hover {
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+	color: #ffffff;
+}
+.selected .ui-accordion-header, .selected .ui-accordion-header:hover {
+	background: #f58400 url(images/f58400_40x100_textures_05_inset_soft_30.png) 0 50% repeat-x;
+}
+.selected .ui-accordion-header a, .selected .ui-accordion-header a:hover {
+	color: #ffffff;
+	background: url(images/222222_7x7_arrow_down.gif) .5em 50% no-repeat;
+}
+.ui-accordion-content {
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+	color: #ffffff;
+	font-size: 0.8em;
+}
+.ui-accordion-content p {
+	padding: 0.8em 1.7em 0.6em;
+}
+
+
+
+
+
+
+/*UI tabs*/
+.ui-tabs-nav {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	font-size: 1.0.8em;
+/*
+	float: left;
+
+*/	position: relative;
+	z-index: 1;
+/*
+	border-right: 1px solid #666666;
+*/
+	bottom: -1px;
+}
+.ui-tabs-nav ul {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+}
+.ui-tabs-nav li {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	float: left;
+	border: 1px solid #666666;
+	border-right: none;
+}
+.ui-tabs-nav li a {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	float: left;
+	font-size: 0.8em;
+	font-weight: bold;
+	text-decoration: none;
+	padding: .5em 1.7em;
+	color: #eeeeee;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+}
+.ui-tabs-nav li a:hover {
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+	color: #ffffff;
+}
+.ui-tabs-nav li.ui-tabs-selected {
+	border-bottom-color: #f58400;
+}
+.ui-tabs-nav li.ui-tabs-selected a, .ui-tabs-nav li.ui-tabs-selected a:hover {
+	background: #f58400 url(images/f58400_40x100_textures_05_inset_soft_30.png) 0 50% repeat-x;
+	color: #ffffff;
+}
+.ui-tabs-panel {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	clear:left;
+	border-top: 1px solid #666666;
+/*
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+
+*/	color: #ffffff;
+	padding: 15px;	
+	font-size: 1.0.8em;
+}
+.ui-tabs-hide {
+	display: none;/* for accessible hiding: position: absolute; left: -99999999px*/;
+}
+
+
+
+
+
+/*slider*/
+.ui-slider {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	font-size: 1.0.8em;
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+	border: 1px solid #666666;
+	height: .8em;
+	position: relative;
+}
+.ui-slider-handle {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	position: absolute;
+	z-index: 2;
+	top: -7px;
+/*	width: 1.2em;
+	height: 1.2em;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+	border: 1px solid #666666;
+*/
+	background-image: url(images/slider-handle.png);
+	background-repeat: no-repeat;
+	background-position: 0px 0px;
+	height: 19px;
+	width: 17px;
+}
+.ui-slider-handle:hover {
+	background-position: 0px -19px;
+}
+.ui-slider-handle-active, .ui-slider-handle-active:hover {
+	background-position: 0px -38px;
+}
+.ui-slider-range {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	height: .8em;
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+	position: absolute;
+	border: 1px solid #666666;
+	border-left: 0;
+	border-right: 0;
+	top: -1px;
+	z-index: 1;
+	opacity:.7;
+/*
+	filter:Alpha(Opacity=70);
+
+*/}
+
+
+
+
+
+
+/*dialog*/
+.ui-dialog {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	font-size: 0.9em;
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+	color: #ffffff;
+	border: 4px solid #666666;
+	position: relative;
+}
+.ui-resizable-handle {
+	position: absolute;
+	font-size: 0.1px;
+	z-index: 99999;
+}
+.ui-resizable .ui-resizable-handle {
+	display: block; 
+}
+body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+.ui-resizable-n { 
+	cursor: n-resize; 
+	height: 7px; 
+	width: 100%; 
+	top: -5px; 
+	left: 0px;  
+}
+.ui-resizable-s { 
+	cursor: s-resize; 
+	height: 7px; 
+	width: 100%; 
+	bottom: -5px; 
+	left: 0px; 
+}
+.ui-resizable-e { 
+	cursor: e-resize; 
+	width: 7px; 
+	right: -5px; 
+	top: 0px; 
+	height: 100%; 
+}
+.ui-resizable-w { 
+	cursor: w-resize; 
+	width: 7px; 
+	left: -5px; 
+	top: 0px; 
+	height: 100%;
+}
+.ui-resizable-se { 
+	cursor: se-resize; 
+	width: 13px; 
+	height: 13px; 
+	right: 0px; 
+	bottom: 0px; 
+	background: url(images/cccccc_11x11_icon_resize_se.gif) no-repeat 0 0;
+}
+.ui-resizable-sw { 
+	cursor: sw-resize; 
+	width: 9px; 
+	height: 9px; 
+	left: 0px; 
+	bottom: 0px;  
+}
+.ui-resizable-nw { 
+	cursor: nw-resize; 
+	width: 9px; 
+	height: 9px; 
+	left: 0px; 
+	top: 0px; 
+}
+.ui-resizable-ne { 
+	cursor: ne-resize; 
+	width: 9px; 
+	height: 9px; 
+	right: 0px; 
+	top: 0px; 
+}
+.ui-dialog-titlebar {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	padding: .5em 1.5em .5em 0.8em;
+	color: #eeeeee;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+	border-bottom: 1px solid #666666;
+	font-size: 0.8em;
+	font-weight: bold;
+	position: relative;
+}
+.ui-dialog-title {}
+.ui-dialog-titlebar-close {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	background: url(images/cccccc_11x11_icon_close.gif) 0 0 no-repeat;
+	position: absolute;
+	right: 8px;
+	top: .7em;
+	width: 11px;
+	height: 11px;
+	z-index: 100;
+	cursor: pointer !important;
+}
+.ui-dialog-titlebar-close-hover, .ui-dialog-titlebar-close:hover {
+	background: url(images/ffffff_11x11_icon_close.gif) 0 0 no-repeat;
+}
+.ui-dialog-titlebar-close:active {
+	background: url(images/222222_11x11_icon_close.gif) 0 0 no-repeat;
+}
+.ui-dialog-titlebar-close span {
+	display: none;
+}
+.ui-dialog-content {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	color: #ffffff;
+/*
+	padding: 1.5em 1.7em;	
+*/
+	padding-left: 1px;
+}
+.ui-dialog-buttonpane {
+	position: absolute;
+	bottom: 0;
+	width: 100%;
+	text-align: left;
+	border-top: 1px solid #666666;
+	background: #000000;
+}
+.ui-dialog-buttonpane button {
+	margin: .5em 8px .5em 0;
+	color: #eeeeee;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+	font-size: 0.8em;
+	font-weight: bolder;
+	border: 1px solid #666666;
+	cursor: pointer;
+	padding: .2em .6em .3em .6em;
+	line-height: 1.4em;
+	float: right;
+}
+.ui-dialog-buttonpane button:hover {
+	color: #ffffff;
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+	border: 1px solid #4bd94b;
+}
+.ui-dialog-buttonpane button:active {
+	color: #ffffff;
+	background: #f58400 url(images/f58400_40x100_textures_05_inset_soft_30.png) 0 50% repeat-x;
+	border: 1px solid #ffaf0f;
+}
+/* This file skins dialog */
+.ui-dialog.ui-draggable .ui-dialog-titlebar,
+.ui-dialog.ui-draggable .ui-dialog-titlebar {
+	cursor: move;
+}
+
+
+
+
+
+
+
+/*datepicker*/
+/* Main Style Sheet for jQuery UI date picker */
+.ui-datepicker-div, .ui-datepicker-inline, #ui-datepicker-div {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+	font-size: 1.0.8em;
+	border: 4px solid #666666;
+	width: 15.5em;
+	padding: 2.5em .5em .5em .5em;
+	position: relative;
+}
+.ui-datepicker-div, #ui-datepicker-div {
+	z-index: 9999; /*must have*/
+	display: none;
+}
+.ui-datepicker-inline {
+	float: left;
+	display: block;
+}
+.ui-datepicker-control {
+	display: none;
+}
+.ui-datepicker-current {
+	display: none;
+}
+.ui-datepicker-next, .ui-datepicker-prev {
+	position: absolute;
+	left: .5em;
+	top: .5em;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+}
+.ui-datepicker-next {
+	left: 14.6em;
+}
+.ui-datepicker-next:hover, .ui-datepicker-prev:hover {
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+}
+.ui-datepicker-next a, .ui-datepicker-prev a {
+	text-indent: -999999px;
+	width: 1.3em;
+	height: 1.4em;
+	display: block;
+	font-size: 0.8em;
+	background: url(images/cccccc_7x7_arrow_left.gif) 50% 50% no-repeat;
+	border: 1px solid #666666;
+	cursor: pointer;
+}
+.ui-datepicker-next a {
+	background: url(images/cccccc_7x7_arrow_right.gif) 50% 50% no-repeat;
+}
+.ui-datepicker-prev a:hover {
+	background: url(images/ffffff_7x7_arrow_left.gif) 50% 50% no-repeat;
+}
+.ui-datepicker-next a:hover {
+	background: url(images/ffffff_7x7_arrow_right.gif) 50% 50% no-repeat;
+}
+.ui-datepicker-prev a:active {
+	background: url(images/222222_7x7_arrow_left.gif) 50% 50% no-repeat;
+}
+.ui-datepicker-next a:active {
+	background: url(images/222222_7x7_arrow_right.gif) 50% 50% no-repeat;
+}
+.ui-datepicker-header select {
+	border: 1px solid #666666;
+	color: #eeeeee;
+	background: #555555;
+	font-size: 0.8em;
+	line-height: 1.4em;
+	position: absolute;
+	top: .5em;
+	margin: 0 !important;
+}
+.ui-datepicker-header option:focus, .ui-datepicker-header option:hover {
+	background: #0078a3;
+}
+.ui-datepicker-header select.ui-datepicker-new-month {
+	width: 7em;
+	left: 2.2em;
+}
+.ui-datepicker-header select.ui-datepicker-new-year {
+	width: 5em;
+	left: 9.4em;
+}
+table.ui-datepicker {
+	width: 15.5em;
+	text-align: right;
+}
+table.ui-datepicker td a {
+	padding: .0.8em .3em .0.8em 0;
+	display: block;
+	color: #eeeeee;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+	cursor: pointer;
+	border: 1px solid #000000;
+}
+table.ui-datepicker td a:hover {
+	border: 1px solid #4bd94b;
+	color: #ffffff;
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+}
+table.ui-datepicker td a:active {
+	border: 1px solid #ffaf0f;
+	color: #ffffff;
+	background: #f58400 url(images/f58400_40x100_textures_05_inset_soft_30.png) 0 50% repeat-x;
+}
+table.ui-datepicker .ui-datepicker-title-row td {
+	padding: .3em 0;
+	text-align: center;
+	font-size: .9em;
+	color: #ffffff;
+	text-transform: uppercase;
+}
+table.ui-datepicker .ui-datepicker-title-row td a {
+	color: #ffffff;
+}
+.ui-datepicker-cover {
+	display: none;
+	display: block;
+	position: absolute;
+	z-index: -1;
+/*
+	filter: mask();
+
+*/	top: -4px;
+	left: -4px;
+	width: 193px;
+	height: 200px;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+Generic ThemeRoller Classes
+>> Make your jQuery Components ThemeRoller-Compatible!
+*/
+
+/*component global class*/
+.ui-component {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+	font-family: Segoe UI, Arial, sans-serif;
+	font-size: 1.0.8em;
+}
+/*component content styles*/
+.ui-component-content {
+	border: 1px solid #666666;
+	background: #000000 url(images/000000_40x100_textures_05_inset_soft_25.png) 0 bottom repeat-x;
+	color: #ffffff;
+}
+.ui-component-content a {
+	color: #ffffff;
+	text-decoration: underline;
+}
+/*component states*/
+.ui-default-state {
+	border: 1px solid #666666;
+	background: #555555 url(images/555555_40x100_textures_02_glass_20.png) 0 50% repeat-x;
+	font-weight: bold;
+	color: #eeeeee !important;
+}
+.ui-default-state a {
+	color: #eeeeee;
+}
+.ui-default-state:hover, .ui-hover-state {
+	border: 1px solid #4bd94b;
+	background: #0078a3 url(images/0078a3_40x100_textures_02_glass_40.png) 0 50% repeat-x;
+	font-weight: bold;
+	color: #ffffff !important;
+}
+.ui-hover-state a {
+	color: #ffffff;
+}
+.ui-default-state:active, .ui-active-state {
+	border: 1px solid #ffaf0f;
+	background: #f58400 url(images/f58400_40x100_textures_05_inset_soft_30.png) 0 50% repeat-x;
+	font-weight: bold;
+	color: #ffffff !important;
+	outline: none;
+}
+.ui-active-state a {
+	color: #ffffff;
+	outline: none;
+}
+/*icons*/
+.ui-arrow-right-default {background: url(images/cccccc_7x7_arrow_right.gif) no-repeat 50% 50%;}
+.ui-arrow-right-default:hover, .ui-arrow-right-hover {background: url(images/ffffff_7x7_arrow_right.gif) no-repeat 50% 50%;}
+.ui-arrow-right-default:active, .ui-arrow-right-active {background: url(images/222222_7x7_arrow_right.gif) no-repeat 50% 50%;}
+.ui-arrow-right-content {background: url(images/cccccc_7x7_arrow_right.gif) no-repeat 50% 50%;}
+
+.ui-arrow-left-default {background: url(images/cccccc_7x7_arrow_left.gif) no-repeat 50% 50%;}
+.ui-arrow-left-default:hover, .ui-arrow-left-hover {background: url(images/ffffff_7x7_arrow_left.gif) no-repeat 50% 50%;}
+.ui-arrow-left-default:active, .ui-arrow-left-active {background: url(images/222222_7x7_arrow_left.gif) no-repeat 50% 50%;}
+.ui-arrow-left-content {background: url(images/cccccc_7x7_arrow_left.gif) no-repeat 50% 50%;}
+
+.ui-arrow-down-default {background: url(images/cccccc_7x7_arrow_down.gif) no-repeat 50% 50%;}
+.ui-arrow-down-default:hover, .ui-arrow-down-hover {background: url(images/ffffff_7x7_arrow_down.gif) no-repeat 50% 50%;}
+.ui-arrow-down-default:active, .ui-arrow-down-active {background: url(images/222222_7x7_arrow_down.gif) no-repeat 50% 50%;}
+.ui-arrow-down-content {background: url(images/cccccc_7x7_arrow_down.gif) no-repeat 50% 50%;}
+
+.ui-arrow-up-default {background: url(images/cccccc_7x7_arrow_up.gif) no-repeat 50% 50%;}
+.ui-arrow-up-default:hover, .ui-arrow-up-hover {background: url(images/ffffff_7x7_arrow_up.gif) no-repeat 50% 50%;}
+.ui-arrow-up-default:active, .ui-arrow-up-active {background: url(images/222222_7x7_arrow_up.gif) no-repeat 50% 50%;}
+.ui-arrow-up-content {background: url(images/cccccc_7x7_arrow_up.gif) no-repeat 50% 50%;}
+
+.ui-close-default {background: url(images/cccccc_11x11_icon_close.gif) no-repeat 50% 50%;}
+.ui-close-default:hover, .ui-close-hover {background: url(images/ffffff_11x11_icon_close.gif) no-repeat 50% 50%;}
+.ui-close-default:active, .ui-close-active {background: url(images/222222_11x11_icon_close.gif) no-repeat 50% 50%;}
+.ui-close-content {background: url(images/222222_11x11_icon_close.gif) no-repeat 50% 50%;}
+
+.ui-folder-closed-default {background: url(images/cccccc_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
+.ui-folder-closed-default:hover, .ui-folder-closed-hover {background: url(images/ffffff_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
+.ui-folder-closed-default:active, .ui-folder-closed-active {background: url(images/222222_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
+.ui-folder-closed-content {background: url(images/cccccc_11x11_icon_folder_closed.gif) no-repeat 50% 50%;}
+
+.ui-folder-open-default {background: url(images/cccccc_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
+.ui-folder-open-default:hover, .ui-folder-open-hover {background: url(images/ffffff_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
+.ui-folder-open-default:active, .ui-folder-open-active {background: url(images/222222_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
+.ui-folder-open-content {background: url(images/222222_11x11_icon_folder_open.gif) no-repeat 50% 50%;}
+
+.ui-doc-default {background: url(images/cccccc_11x11_icon_doc.gif) no-repeat 50% 50%;}
+.ui-doc-default:hover, .ui-doc-hover {background: url(images/ffffff_11x11_icon_doc.gif) no-repeat 50% 50%;}
+.ui-doc-default:active, .ui-doc-active {background: url(images/222222_11x11_icon_doc.gif) no-repeat 50% 50%;}
+.ui-doc-content {background: url(images/cccccc_11x11_icon_doc.gif) no-repeat 50% 50%;}
+
+.ui-arrows-leftright-default {background: url(images/cccccc_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
+.ui-arrows-leftright-default:hover, .ui-arrows-leftright-hover {background: url(images/ffffff_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
+.ui-arrows-leftright-default:active, .ui-arrows-leftright-active {background: url(images/222222_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
+.ui-arrows-leftright-content {background: url(images/cccccc_11x11_icon_arrows_leftright.gif) no-repeat 50% 50%;}
+
+.ui-arrows-updown-default {background: url(images/cccccc_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
+.ui-arrows-updown-default:hover, .ui-arrows-updown-hover {background: url(images/ffffff_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
+.ui-arrows-updown-default:active, .ui-arrows-updown-active {background: url(images/222222_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
+.ui-arrows-updown-content {background: url(images/cccccc_11x11_icon_arrows_updown.gif) no-repeat 50% 50%;}
+
+.ui-minus-default {background: url(images/cccccc_11x11_icon_minus.gif) no-repeat 50% 50%;}
+.ui-minus-default:hover, .ui-minus-hover {background: url(images/ffffff_11x11_icon_minus.gif) no-repeat 50% 50%;}
+.ui-minus-default:active, .ui-minus-active {background: url(images/222222_11x11_icon_minus.gif) no-repeat 50% 50%;}
+.ui-minus-content {background: url(images/cccccc_11x11_icon_minus.gif) no-repeat 50% 50%;}
+
+.ui-plus-default {background: url(images/cccccc_11x11_icon_plus.gif) no-repeat 50% 50%;}
+.ui-plus-default:hover, .ui-plus-hover {background: url(images/ffffff_11x11_icon_plus.gif) no-repeat 50% 50%;}
+.ui-plus-default:active, .ui-plus-active {background: url(images/222222_11x11_icon_plus.gif) no-repeat 50% 50%;}
+.ui-plus-content {background: url(images/cccccc_11x11_icon_plus.gif) no-repeat 50% 50%;}
+
+/*hidden elements*/
+.ui-hidden {
+	display: none;/* for accessible hiding: position: absolute; left: -99999999px*/;
+}
+.ui-accessible-hidden {
+	 position: absolute; left: -99999999px;
+}
+/*reset styles*/
+.ui-reset {
+	/*resets*/margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none;
+}
+/*clearfix class*/
+.ui-clearfix:after {
+    content: "."; 
+    display: block; 
+    height: 0; 
+    clear: both; 
+    visibility: hidden;
+}
+.ui-clearfix {display: block;}
+/* Hides from IE-mac \*/
+* html .ui-clearfix {height: 1%;}
+.ui-clearfix {display: block;}
+/* End hide from IE-mac */
+
+/* Note: for resizable styles, use the styles listed above in the dialog section */
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/js/jquery-1.2.6.min.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/jquery-ui/js/jquery-ui-1.6.custom.min.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,78 @@
+/*
+ * jQuery UI 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
(function(C){var I=C.fn.remove,D=C.browser.mozilla&&(parseFloat(C.browser.version)<1.9);C.ui={version:"1.6",plugin:{add:function(K,L,N){var M=C.ui[K].prototype;for(var J in N){M.plugins[J]=M.plugins[J]||[];M.plugins[J].push([L,N[J]])}},call:function(J,L,K){var N=J.plugins[L];if(!N){return }for(var M=0;M<N.length;M++){if(J.options[N[M][0]]){N[M][1].apply(J.element,K)}}}},contains:function(L,K){var J=C.browser.safari&&C.browser.version<522;if(L.contains&&!J){return L.contains(K)}if(L.compareDocumentPosition){return !!(L.compareDocumentPosition(K)&16)}while(K=K.parentNode){if(K==L){return true}}return false},cssCache:{},css:function(J){if(C.ui.cssCache[J]){return C.ui.cssCache[J]}var K=C('<div class="ui-gen">').addClass(J).css({position:"absolute",top:"-5000px",left:"-5000px",display:"block"}).appendTo("body");C.ui.cssCache[J]=!!((!(/auto|default/).test(K.css("cursor"))||(/^[1-9]/).test(K.css("height"))||(/^[1-9]/).test(K.css("width"))||!(/none/).test(K.css("backgroundImage"))||!(/transparent|rgba\(0, 0, 0, 0\)/).test(K.css("backgroundColor"))));try{C("body").get(0).removeChild(K.get(0))}catch(L){}return C.ui.cssCache[J]},hasScroll:function(M,K){if(C(M).css("overflow")=="hidden"){return false}var J=(K&&K=="left")?"scrollLeft":"scrollTop",L=false;if(M[J]>0){return true}M[J]=1;L=(M[J]>0);M[J]=0;return L},isOverAxis:function(K,J,L){return(K>J)&&(K<(J+L))},isOver:function(O,K,N,M,J,L){return C.ui.isOverAxis(O,N,J)&&C.ui.isOverAxis(K,M,L)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(D){var F=C.attr,E=C.fn.removeAttr,H="http://www.w3.org/2005/07/aaa",A=/^aria-/,B=/^wairole:/;C.attr=function(K,J,L){var M=L!==undefined;return(J=="role"?(M?F.call(this,K,J,"wairole:"+L):(F.apply(this,arguments)||"").replace(B,"")):(A.test(J)?(M?K.setAttributeNS(H,J.replace(A,"aaa:"),L):F.call(this,K,J.replace(A,"aaa:"))):F.apply(this,arguments)))};C.fn.removeAttr=function(J){return(A.test(J)?this.each(function(){this.removeAttributeNS(H,J.replace(A,""))}):E.call(this,J))}}C.fn.extend({remove:function(){C("*",this).add(this).each(function(){C(this).triggerHandler("remove")});return I.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var J;if((C.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){J=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(C.curCSS(this,"position",1))&&(/(auto|scroll)/).test(C.curCSS(this,"overflow",1)+C.curCSS(this,"overflow-y",1)+C.curCSS(this,"overflow-x",1))}).eq(0)}else{J=this.parents().filter(function(){return(/(auto|scroll)/).test(C.curCSS(this,"overflow",1)+C.curCSS(this,"overflow-y",1)+C.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!J.length?C(document):J}});C.extend(C.expr[":"],{data:function(K,L,J){return C.data(K,J[3])},tabbable:function(L,M,K){var N=L.nodeName.toLowerCase();function J(O){return !(C(O).is(":hidden")||C(O).parents(":hidden").length)}return(L.tabIndex>=0&&(("a"==N&&L.href)||(/input|select|textarea|button/.test(N)&&"hidden"!=L.type&&!L.disabled))&&J(L))}});function G(M,N,O,L){function K(Q){var P=C[M][N][Q]||[];return(typeof P=="string"?P.split(/,?\s+/):P)}var J=K("getter");if(L.length==1&&typeof L[0]=="string"){J=J.concat(K("getterSetter"))}return(C.inArray(O,J)!=-1)}C.widget=function(K,J){var L=K.split(".")[0];K=K.split(".")[1];C.fn[K]=function(P){var N=(typeof P=="string"),O=Array.prototype.slice.call(arguments,1);if(N&&P.substring(0,1)=="_"){return this}if(N&&G(L,K,P,O)){var M=C.data(this[0],K);return(M?M[P].apply(M,O):undefined)}return this.each(function(){var Q=C.data(this,K);(!Q&&!N&&C.data(this,K,new C[L][K](this,P)));(Q&&N&&C.isFunction(Q[P])&&Q[P].apply(Q,O))})};C[L]=C[L]||{};C[L][K]=function(O,N){var M=this;this.widgetName=K;this.widgetEventPrefix=C[L][K].eventPrefix||K;this.widgetBaseClass=L+"-"+K;this.options=C.extend({},C.widget.defaults,C[L][K].defaults,C.metadata&&C.metadata.get(O)[K],N);this.element=C(O).bind("setData."+K,function(Q,P,R){return M._setData(P,R)}).bind("getData."+K,function(Q,P){return M._getData(P)}).bind("remove",function(){return M.destroy()});this._init()};C[L][K].prototype=C.extend({},C.widget.prototype,J);C[L][K].getterSetter="option"};C.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName)},option:function(L,M){var K=L,J=this;if(typeof L=="string"){if(M===undefined){return this._getData(L)}K={};K[L]=M}C.each(K,function(N,O){J._setData(N,O)})},_getData:function(J){return this.options[J]},_setData:function(J,K){this.options[J]=K;if(J=="disabled"){this.element[K?"addClass":"removeClass"](this.widgetBaseClass+"-disabled")}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(K,L,M){var J=(K==this.widgetEventPrefix?K:this.widgetEventPrefix+K);L=L||C.event.fix({type:J,target:this.element[0]});return this.element.triggerHandler(J,[L,M],this.options[K])}};C.widget.defaults={disabled:false};C.ui.mouse={_mouseInit:function(){var J=this;this.element.bind("mousedown."+this.widgetName,function(K){return J._mouseDown(K)}).bind("click."+this.widgetName,function(K){if(J._preventClickEvent){J._preventClickEvent=false;return false}});if(C.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(C.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(L){(this._mouseStarted&&this._mouseUp(L));this._mouseDownEvent=L;var K=this,M=(L.which==1),J=(typeof this.options.cancel=="string"?C(L.target).parents().add(L.target).filter(this.options.cancel).length:false);if(!M||J||!this._mouseCapture(L)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){K.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(L)&&this._mouseDelayMet(L)){this._mouseStarted=(this._mouseStart(L)!==false);if(!this._mouseStarted){L.preventDefault();return true}}this._mouseMoveDelegate=function(N){return K._mouseMove(N)};this._mouseUpDelegate=function(N){return K._mouseUp(N)};C(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);if(!C.browser.safari){L.preventDefault()}return true},_mouseMove:function(J){if(C.browser.msie&&!J.button){return this._mouseUp(J)}if(this._mouseStarted){this._mouseDrag(J);return J.preventDefault()}if(this._mouseDistanceMet(J)&&this._mouseDelayMet(J)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,J)!==false);(this._mouseStarted?this._mouseDrag(J):this._mouseUp(J))}return !this._mouseStarted},_mouseUp:function(J){C(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=true;this._mouseStop(J)}return false},_mouseDistanceMet:function(J){return(Math.max(Math.abs(this._mouseDownEvent.pageX-J.pageX),Math.abs(this._mouseDownEvent.pageY-J.pageY))>=this.options.distance)},_mouseDelayMet:function(J){return this.mouseDelayMet},_mouseStart:function(J){},_mouseDrag:function(J){},_mouseStop:function(J){},_mouseCapture:function(J){return true}};C.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);/*
+ * jQuery UI Draggable 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	ui.core.js
+ */
(function(A){A.widget("ui.draggable",A.extend({},A.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.cssNamespace&&this.element.addClass(this.options.cssNamespace+"-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return }this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(B){var C=this.options;if(this.helper||C.disabled||A(B.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(B);if(!this.handle){return false}return true},_mouseStart:function(B){var C=this.options;this.helper=this._createHelper(B);this._cacheHelperProportions();if(A.ui.ddmanager){A.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};A.extend(this.offset,{click:{left:B.pageX-this.offset.left,top:B.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});if(C.cursorAt){this._adjustOffsetFromHelper(C.cursorAt)}this.originalPosition=this._generatePosition(B);if(C.containment){this._setContainment()}this._propagate("start",B);this._cacheHelperProportions();if(A.ui.ddmanager&&!C.dropBehaviour){A.ui.ddmanager.prepareOffsets(this,B)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(B,true);return true},_mouseDrag:function(B,C){this.position=this._generatePosition(B);this.positionAbs=this._convertPositionTo("absolute");if(!C){this.position=this._propagate("drag",B)||this.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(A.ui.ddmanager){A.ui.ddmanager.drag(this,B)}return false},_mouseStop:function(C){var D=false;if(A.ui.ddmanager&&!this.options.dropBehaviour){var D=A.ui.ddmanager.drop(this,C)}if((this.options.revert=="invalid"&&!D)||(this.options.revert=="valid"&&D)||this.options.revert===true||(A.isFunction(this.options.revert)&&this.options.revert.call(this.element,D))){var B=this;A(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){B._propagate("stop",C);B._clear()})}else{this._propagate("stop",C);this._clear()}return false},_getHandle:function(B){var C=!this.options.handle||!A(this.options.handle,this.element).length?true:false;A(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==B.target){C=true}});return C},_createHelper:function(C){var D=this.options;var B=A.isFunction(D.helper)?A(D.helper.apply(this.element[0],[C])):(D.helper=="clone"?this.element.clone():this.element);if(!B.parents("body").length){B.appendTo((D.appendTo=="parent"?this.element[0].parentNode:D.appendTo))}if(B[0]!=this.element[0]&&!(/(fixed|absolute)/).test(B.css("position"))){B.css("position","absolute")}return B},_adjustOffsetFromHelper:function(B){if(B.left!=undefined){this.offset.click.left=B.left+this.margins.left}if(B.right!=undefined){this.offset.click.left=this.helperProportions.width-B.right+this.margins.left}if(B.top!=undefined){this.offset.click.top=B.top+this.margins.top}if(B.bottom!=undefined){this.offset.click.top=this.helperProportions.height-B.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var B=this.offsetParent.offset();if((this.offsetParent[0]==document.body&&A.browser.mozilla)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&A.browser.msie)){B={top:0,left:0}}return{top:B.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:B.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var B=this.element.position();return{top:B.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:B.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var E=this.options;if(E.containment=="parent"){E.containment=this.helper[0].parentNode}if(E.containment=="document"||E.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,A(E.containment=="document"?document:window).width()-this.offset.relative.left-this.offset.parent.left-this.helperProportions.width-this.margins.left-(parseInt(this.element.css("marginRight"),10)||0),(A(E.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.offset.relative.top-this.offset.parent.top-this.helperProportions.height-this.margins.top-(parseInt(this.element.css("marginBottom"),10)||0)]}if(!(/^(document|window|parent)$/).test(E.containment)){var C=A(E.containment)[0];var D=A(E.containment).offset();var B=(A(C).css("overflow")!="hidden");this.containment=[D.left+(parseInt(A(C).css("borderLeftWidth"),10)||0)-this.offset.relative.left-this.offset.parent.left-this.margins.left,D.top+(parseInt(A(C).css("borderTopWidth"),10)||0)-this.offset.relative.top-this.offset.parent.top-this.margins.top,D.left+(B?Math.max(C.scrollWidth,C.offsetWidth):C.offsetWidth)-(parseInt(A(C).css("borderLeftWidth"),10)||0)-this.offset.relative.left-this.offset.parent.left-this.helperProportions.width-this.margins.left,D.top+(B?Math.max(C.scrollHeight,C.offsetHeight):C.offsetHeight)-(parseInt(A(C).css("borderTopWidth"),10)||0)-this.offset.relative.top-this.offset.parent.top-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(D,F){if(!F){F=this.position}var C=D=="absolute"?1:-1;var B=this[(this.cssPosition=="absolute"?"offset":"scroll")+"Parent"],E=(/(html|body)/i).test(B[0].tagName);return{top:(F.top+this.offset.relative.top*C+this.offset.parent.top*C+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(E?0:B.scrollTop()))*C+this.margins.top*C),left:(F.left+this.offset.relative.left*C+this.offset.parent.left*C+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():(E?0:B.scrollLeft()))*C+this.margins.left*C)}},_generatePosition:function(D){var G=this.options,C=this[(this.cssPosition=="absolute"?"offset":"scroll")+"Parent"],H=(/(html|body)/i).test(C[0].tagName);var B={top:(D.pageY-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(H?0:C.scrollTop()))),left:(D.pageX-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():H?0:C.scrollLeft()))};if(!this.originalPosition){return B}if(this.containment){if(B.left<this.containment[0]){B.left=this.containment[0]}if(B.top<this.containment[1]){B.top=this.containment[1]}if(B.left>this.containment[2]){B.left=this.containment[2]}if(B.top>this.containment[3]){B.top=this.containment[3]}}if(G.grid){var F=this.originalPosition.top+Math.round((B.top-this.originalPosition.top)/G.grid[1])*G.grid[1];B.top=this.containment?(!(F<this.containment[1]||F>this.containment[3])?F:(!(F<this.containment[1])?F-G.grid[1]:F+G.grid[1])):F;var E=this.originalPosition.left+Math.round((B.left-this.originalPosition.left)/G.grid[0])*G.grid[0];B.left=this.containment?(!(E<this.containment[0]||E>this.containment[2])?E:(!(E<this.containment[0])?E-G.grid[0]:E+G.grid[0])):E}return B},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_propagate:function(C,B){A.ui.plugin.call(this,C,[B,this._uiHash()]);if(C=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return this.element.triggerHandler(C=="drag"?C:"drag"+C,[B,this._uiHash()],this.options[C])},plugins:{},_uiHash:function(B){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,options:this.options}}}));A.extend(A.ui.draggable,{version:"1.6",defaults:{appendTo:"parent",axis:false,cancel:":input",connectToSortable:false,containment:false,cssNamespace:"ui",cursor:"default",cursorAt:null,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:1,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:null}});A.ui.plugin.add("draggable","connectToSortable",{start:function(B,D){var C=A(this).data("draggable");C.sortables=[];A(D.options.connectToSortable).each(function(){A(this+"").each(function(){if(A.data(this,"sortable")){var E=A.data(this,"sortable");C.sortables.push({instance:E,shouldRevert:E.options.revert});E._refreshItems();E._propagate("activate",B,C)}})})},stop:function(B,D){var C=A(this).data("draggable");A.each(C.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;C.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(B);this.instance.element.triggerHandler("sortreceive",[B,A.extend(this.instance._ui(),{sender:C.element})],this.instance.options["receive"]);this.instance.options.helper=this.instance.options._helper;if(C.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._propagate("deactivate",B,C)}})},drag:function(C,F){var E=A(this).data("draggable"),B=this;var D=function(I){var N=this.offset.click.top,M=this.offset.click.left;var G=this.positionAbs.top,K=this.positionAbs.left;var J=I.height,L=I.width;var O=I.top,H=I.left;return A.ui.isOver(G+N,K+M,O,H,J,L)};A.each(E.sortables,function(G){if(D.call(E,this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=A(B).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return F.helper[0]};C.target=this.instance.currentItem[0];this.instance._mouseCapture(C,true);this.instance._mouseStart(C,true,true);this.instance.offset.click.top=E.offset.click.top;this.instance.offset.click.left=E.offset.click.left;this.instance.offset.parent.left-=E.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=E.offset.parent.top-this.instance.offset.parent.top;E._propagate("toSortable",C)}if(this.instance.currentItem){this.instance._mouseDrag(C)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._mouseStop(C,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}E._propagate("fromSortable",C)}}})}});A.ui.plugin.add("draggable","cursor",{start:function(C,D){var B=A("body");if(B.css("cursor")){D.options._cursor=B.css("cursor")}B.css("cursor",D.options.cursor)},stop:function(B,C){if(C.options._cursor){A("body").css("cursor",C.options._cursor)}}});A.ui.plugin.add("draggable","iframeFix",{start:function(B,C){A(C.options.iframeFix===true?"iframe":C.options.iframeFix).each(function(){A('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(A(this).offset()).appendTo("body")})},stop:function(B,C){A("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});A.ui.plugin.add("draggable","opacity",{start:function(C,D){var B=A(D.helper);if(B.css("opacity")){D.options._opacity=B.css("opacity")}B.css("opacity",D.options.opacity)},stop:function(B,C){if(C.options._opacity){A(C.helper).css("opacity",C.options._opacity)}}});A.ui.plugin.add("draggable","scroll",{start:function(C,D){var E=D.options;var B=A(this).data("draggable");if(B.scrollParent[0]!=document&&B.scrollParent[0].tagName!="HTML"){B.overflowOffset=B.scrollParent.offset()}},drag:function(D,E){var F=E.options,B=false;var C=A(this).data("draggable");if(C.scrollParent[0]!=document&&C.scrollParent[0].tagName!="HTML"){if((C.overflowOffset.top+C.scrollParent[0].offsetHeight)-D.pageY<F.scrollSensitivity){C.scrollParent[0].scrollTop=B=C.scrollParent[0].scrollTop+F.scrollSpeed}else{if(D.pageY-C.overflowOffset.top<F.scrollSensitivity){C.scrollParent[0].scrollTop=B=C.scrollParent[0].scrollTop-F.scrollSpeed}}if((C.overflowOffset.left+C.scrollParent[0].offsetWidth)-D.pageX<F.scrollSensitivity){C.scrollParent[0].scrollLeft=B=C.scrollParent[0].scrollLeft+F.scrollSpeed}else{if(D.pageX-C.overflowOffset.left<F.scrollSensitivity){C.scrollParent[0].scrollLeft=B=C.scrollParent[0].scrollLeft-F.scrollSpeed}}}else{if(D.pageY-A(document).scrollTop()<F.scrollSensitivity){B=A(document).scrollTop(A(document).scrollTop()-F.scrollSpeed)}else{if(A(window).height()-(D.pageY-A(document).scrollTop())<F.scrollSensitivity){B=A(document).scrollTop(A(document).scrollTop()+F.scrollSpeed)}}if(D.pageX-A(document).scrollLeft()<F.scrollSensitivity){B=A(document).scrollLeft(A(document).scrollLeft()-F.scrollSpeed)}else{if(A(window).width()-(D.pageX-A(document).scrollLeft())<F.scrollSensitivity){B=A(document).scrollLeft(A(document).scrollLeft()+F.scrollSpeed)}}}if(B!==false&&A.ui.ddmanager&&!F.dropBehaviour){A.ui.ddmanager.prepareOffsets(C,D)}if(B!==false&&C.cssPosition=="absolute"&&C.scrollParent[0]!=document&&A.ui.contains(C.scrollParent[0],C.offsetParent[0])){C.offset.parent=C._getParentOffset()}if(B!==false&&C.cssPosition=="relative"&&!(C.scrollParent[0]!=document&&C.scrollParent[0]!=C.offsetParent[0])){C.offset.relative=C._getRelativeOffset()}}});A.ui.plugin.add("draggable","snap",{start:function(B,D){var C=A(this).data("draggable");C.snapElements=[];A(D.options.snap.constructor!=String?(D.options.snap.items||":data(draggable)"):D.options.snap).each(function(){var F=A(this);var E=F.offset();if(this!=C.element[0]){C.snapElements.push({item:this,width:F.outerWidth(),height:F.outerHeight(),top:E.top,left:E.left})}})},drag:function(M,K){var E=A(this).data("draggable");var Q=K.options.snapTolerance;var P=K.absolutePosition.left,O=P+E.helperProportions.width,D=K.absolutePosition.top,C=D+E.helperProportions.height;for(var N=E.snapElements.length-1;N>=0;N--){var L=E.snapElements[N].left,J=L+E.snapElements[N].width,I=E.snapElements[N].top,S=I+E.snapElements[N].height;if(!((L-Q<P&&P<J+Q&&I-Q<D&&D<S+Q)||(L-Q<P&&P<J+Q&&I-Q<C&&C<S+Q)||(L-Q<O&&O<J+Q&&I-Q<D&&D<S+Q)||(L-Q<O&&O<J+Q&&I-Q<C&&C<S+Q))){if(E.snapElements[N].snapping){(E.options.snap.release&&E.options.snap.release.call(E.element,M,A.extend(E._uiHash(),{snapItem:E.snapElements[N].item})))}E.snapElements[N].snapping=false;continue}if(K.options.snapMode!="inner"){var B=Math.abs(I-C)<=Q;var R=Math.abs(S-D)<=Q;var G=Math.abs(L-O)<=Q;var H=Math.abs(J-P)<=Q;if(B){K.position.top=E._convertPositionTo("relative",{top:I-E.helperProportions.height,left:0}).top}if(R){K.position.top=E._convertPositionTo("relative",{top:S,left:0}).top}if(G){K.position.left=E._convertPositionTo("relative",{top:0,left:L-E.helperProportions.width}).left}if(H){K.position.left=E._convertPositionTo("relative",{top:0,left:J}).left}}var F=(B||R||G||H);if(K.options.snapMode!="outer"){var B=Math.abs(I-D)<=Q;var R=Math.abs(S-C)<=Q;var G=Math.abs(L-P)<=Q;var H=Math.abs(J-O)<=Q;if(B){K.position.top=E._convertPositionTo("relative",{top:I,left:0}).top}if(R){K.position.top=E._convertPositionTo("relative",{top:S-E.helperProportions.height,left:0}).top}if(G){K.position.left=E._convertPositionTo("relative",{top:0,left:L}).left}if(H){K.position.left=E._convertPositionTo("relative",{top:0,left:J-E.helperProportions.width}).left}}if(!E.snapElements[N].snapping&&(B||R||G||H||F)){(E.options.snap.snap&&E.options.snap.snap.call(E.element,M,A.extend(E._uiHash(),{snapItem:E.snapElements[N].item})))}E.snapElements[N].snapping=(B||R||G||H||F)}}});A.ui.plugin.add("draggable","stack",{start:function(B,C){var D=A.makeArray(A(C.options.stack.group)).sort(function(F,E){return(parseInt(A(F).css("zIndex"),10)||C.options.stack.min)-(parseInt(A(E).css("zIndex"),10)||C.options.stack.min)});A(D).each(function(E){this.style.zIndex=C.options.stack.min+E});this[0].style.zIndex=C.options.stack.min+D.length}});A.ui.plugin.add("draggable","zIndex",{start:function(C,D){var B=A(D.helper);if(B.css("zIndex")){D.options._zIndex=B.css("zIndex")}B.css("zIndex",D.options.zIndex)},stop:function(B,C){if(C.options._zIndex){A(C.helper).css("zIndex",C.options._zIndex)}}})})(jQuery);/*
+ * jQuery UI Droppable 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	ui.core.js
+ *	ui.draggable.js
+ */
(function(A){A.widget("ui.droppable",{_init:function(){var C=this.options,B=C.accept;this.isover=0;this.isout=1;this.options.accept=this.options.accept&&A.isFunction(this.options.accept)?this.options.accept:function(D){return D.is(B)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};A.ui.ddmanager.droppables[this.options.scope]=A.ui.ddmanager.droppables[this.options.scope]||[];A.ui.ddmanager.droppables[this.options.scope].push(this);(this.options.cssNamespace&&this.element.addClass(this.options.cssNamespace+"-droppable"))},destroy:function(){var B=A.ui.ddmanager.droppables[this.options.scope];for(var C=0;C<B.length;C++){if(B[C]==this){B.splice(C,1)}}this.element.removeClass("ui-droppable-disabled").removeData("droppable").unbind(".droppable")},_setData:function(B,C){if(B=="accept"){this.options.accept=C&&A.isFunction(C)?C:function(D){return D.is(accept)}}else{A.widget.prototype._setData.apply(this,arguments)}},_activate:function(C){var B=A.ui.ddmanager.current;A.ui.plugin.call(this,"activate",[C,this.ui(B)]);if(B){this.element.triggerHandler("dropactivate",[C,this.ui(B)],this.options.activate)}},_deactivate:function(C){var B=A.ui.ddmanager.current;A.ui.plugin.call(this,"deactivate",[C,this.ui(B)]);if(B){this.element.triggerHandler("dropdeactivate",[C,this.ui(B)],this.options.deactivate)}},_over:function(C){var B=A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return }if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"over",[C,this.ui(B)]);this.element.triggerHandler("dropover",[C,this.ui(B)],this.options.over)}},_out:function(C){var B=A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return }if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"out",[C,this.ui(B)]);this.element.triggerHandler("dropout",[C,this.ui(B)],this.options.out)}},_drop:function(C,D){var B=D||A.ui.ddmanager.current;if(!B||(B.currentItem||B.element)[0]==this.element[0]){return false}var E=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var F=A.data(this,"droppable");if(F.options.greedy&&A.ui.intersect(B,A.extend(F,{offset:F.element.offset()}),F.options.tolerance)){E=true;return false}});if(E){return false}if(this.options.accept.call(this.element,(B.currentItem||B.element))){A.ui.plugin.call(this,"drop",[C,this.ui(B)]);this.element.triggerHandler("drop",[C,this.ui(B)],this.options.drop);return this.element}return false},plugins:{},ui:function(B){return{draggable:(B.currentItem||B.element),helper:B.helper,position:B.position,absolutePosition:B.positionAbs,options:this.options,element:this.element}}});A.extend(A.ui.droppable,{version:"1.6",defaults:{accept:"*",activeClass:null,cssNamespace:"ui",greedy:false,hoverClass:null,scope:"default",tolerance:"intersect"}});A.ui.intersect=function(O,I,M){if(!I.offset){return false}var D=(O.positionAbs||O.position.absolute).left,C=D+O.helperProportions.width,L=(O.positionAbs||O.position.absolute).top,K=L+O.helperProportions.height;var F=I.offset.left,B=F+I.proportions.width,N=I.offset.top,J=N+I.proportions.height;switch(M){case"fit":return(F<D&&C<B&&N<L&&K<J);break;case"intersect":return(F<D+(O.helperProportions.width/2)&&C-(O.helperProportions.width/2)<B&&N<L+(O.helperProportions.height/2)&&K-(O.helperProportions.height/2)<J);break;case"pointer":var G=((O.positionAbs||O.position.absolute).left+(O.clickOffset||O.offset.click).left),H=((O.positionAbs||O.position.absolute).top+(O.clickOffset||O.offset.click).top),E=A.ui.isOver(H,G,N,F,I.proportions.height,I.proportions.width);return E;break;case"touch":return((L>=N&&L<=J)||(K>=N&&K<=J)||(L<N&&K>J))&&((D>=F&&D<=B)||(C>=F&&C<=B)||(D<F&&C>B));break;default:return false;break}};A.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(E,G){var B=A.ui.ddmanager.droppables[E.options.scope];var F=G?G.type:null;var H=(E.currentItem||E.element).find(":data(droppable)").andSelf();droppablesLoop:for(var D=0;D<B.length;D++){if(B[D].options.disabled||(E&&!B[D].options.accept.call(B[D].element,(E.currentItem||E.element)))){continue}for(var C=0;C<H.length;C++){if(H[C]==B[D].element[0]){B[D].proportions.height=0;continue droppablesLoop}}B[D].visible=B[D].element.css("display")!="none";if(!B[D].visible){continue}B[D].offset=B[D].element.offset();B[D].proportions={width:B[D].element[0].offsetWidth,height:B[D].element[0].offsetHeight};if(F=="dragstart"||F=="sortactivate"){B[D]._activate.call(B[D],G)}}},drop:function(B,C){var D=false;A.each(A.ui.ddmanager.droppables[B.options.scope],function(){if(!this.options){return }if(!this.options.disabled&&this.visible&&A.ui.intersect(B,this,this.options.tolerance)){D=this._drop.call(this,C)}if(!this.options.disabled&&this.visible&&this.options.accept.call(this.element,(B.currentItem||B.element))){this.isout=1;this.isover=0;this._deactivate.call(this,C)}});return D},drag:function(B,C){if(B.options.refreshPositions){A.ui.ddmanager.prepareOffsets(B,C)}A.each(A.ui.ddmanager.droppables[B.options.scope],function(){if(this.options.disabled||this.greedyChild||!this.visible){return }var E=A.ui.intersect(B,this,this.options.tolerance);var G=!E&&this.isover==1?"isout":(E&&this.isover==0?"isover":null);if(!G){return }var F;if(this.options.greedy){var D=this.element.parents(":data(droppable):eq(0)");if(D.length){F=A.data(D[0],"droppable");F.greedyChild=(G=="isover"?1:0)}}if(F&&G=="isover"){F["isover"]=0;F["isout"]=1;F._out.call(F,C)}this[G]=1;this[G=="isout"?"isover":"isout"]=0;this[G=="isover"?"_over":"_out"].call(this,C);if(F&&G=="isout"){F["isout"]=0;F["isover"]=1;F._over.call(F,C)}})}};A.ui.plugin.add("droppable","activeClass",{activate:function(B,C){A(this).addClass(C.options.activeClass)},deactivate:function(B,C){A(this).removeClass(C.options.activeClass)},drop:function(B,C){A(this).removeClass(C.options.activeClass)}});A.ui.plugin.add("droppable","hoverClass",{over:function(B,C){A(this).addClass(C.options.hoverClass)},out:function(B,C){A(this).removeClass(C.options.hoverClass)},drop:function(B,C){A(this).removeClass(C.options.hoverClass)}})})(jQuery);/*
+ * jQuery UI Accordion 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	ui.core.js
+ */
(function(E){E.widget("ui.accordion",{_init:function(){var H=this.options;if(H.navigation){var K=this.element.find("a").filter(H.navigationFilter);if(K.length){if(K.filter(H.header).length){H.active=K}else{H.active=K.parent().parent().prev();K.addClass("current")}}}H.headers=this.element.find(H.header);H.active=C(H.headers,H.active);if(E.browser.msie){this.element.find("a").css("zoom","1")}if(!this.element.hasClass("ui-accordion")){this.element.addClass("ui-accordion");E('<span class="ui-accordion-left"></span>').insertBefore(H.headers);E('<span class="ui-accordion-right"></span>').appendTo(H.headers);H.headers.addClass("ui-accordion-header")}var J;if(H.fillSpace){J=this.element.parent().height();H.headers.each(function(){J-=E(this).outerHeight()});var I=0;H.headers.next().each(function(){I=Math.max(I,E(this).innerHeight()-E(this).height())}).height(J-I)}else{if(H.autoHeight){J=0;H.headers.next().each(function(){J=Math.max(J,E(this).outerHeight())}).height(J)}}this.element.attr("role","tablist");var G=this;H.headers.attr("role","tab").bind("keydown",function(L){return G._keydown(L)}).next().attr("role","tabpanel");H.headers.not(H.active||"").attr("aria-expanded","false").attr("tabIndex","-1").next().hide();if(!H.active.length){H.headers.eq(0).attr("tabIndex","0")}else{H.active.attr("aria-expanded","true").attr("tabIndex","0").parent().andSelf().addClass(H.selectedClass)}if(!E.browser.safari){H.headers.find("a").attr("tabIndex","-1")}if(H.event){this.element.bind((H.event)+".accordion",F)}},destroy:function(){this.options.headers.parent().andSelf().removeClass(this.options.selectedClass);this.options.headers.prev(".ui-accordion-left").remove();this.options.headers.children(".ui-accordion-right").remove();this.options.headers.next().css("display","");if(this.options.fillSpace||this.options.autoHeight){this.options.headers.next().css("height","")}E.removeData(this.element[0],"accordion");this.element.removeClass("ui-accordion").unbind(".accordion")},_keydown:function(J){if(this.options.disabled||J.altKey||J.ctrlKey){return }var K=E.ui.keyCode;var I=this.options.headers.length;var G=this.options.headers.index(J.target);var H=false;switch(J.keyCode){case K.RIGHT:case K.DOWN:H=this.options.headers[(G+1)%I];break;case K.LEFT:case K.UP:H=this.options.headers[(G-1+I)%I];break;case K.SPACE:case K.ENTER:return F.call(this.element[0],{target:J.target})}if(H){E(J.target).attr("tabIndex","-1");E(H).attr("tabIndex","0");H.focus();return false}return true},activate:function(G){F.call(this.element[0],{target:C(this.options.headers,G)[0]})}});function B(H,G){return function(){return H.apply(G,arguments)}}function D(I){if(!E.data(this,"accordion")){return }var G=E.data(this,"accordion");var H=G.options;H.running=I?0:--H.running;if(H.running){return }if(H.clearStyle){H.toShow.add(H.toHide).css({height:"",overflow:""})}G._trigger("change",null,H.data)}function A(G,N,K,L,O){var Q=E.data(this,"accordion").options;Q.toShow=G;Q.toHide=N;Q.data=K;var H=B(D,this);E.data(this,"accordion")._trigger("changestart",null,Q.data);Q.running=N.size()===0?G.size():N.size();if(Q.animated){var J={};if(!Q.alwaysOpen&&L){J={toShow:E([]),toHide:N,complete:H,down:O,autoHeight:Q.autoHeight}}else{J={toShow:G,toHide:N,complete:H,down:O,autoHeight:Q.autoHeight}}if(!Q.proxied){Q.proxied=Q.animated}if(!Q.proxiedDuration){Q.proxiedDuration=Q.duration}Q.animated=E.isFunction(Q.proxied)?Q.proxied(J):Q.proxied;Q.duration=E.isFunction(Q.proxiedDuration)?Q.proxiedDuration(J):Q.proxiedDuration;var P=E.ui.accordion.animations,I=Q.duration,M=Q.animated;if(!P[M]){P[M]=function(R){this.slide(R,{easing:M,duration:I||700})}}P[M](J)}else{if(!Q.alwaysOpen&&L){G.toggle()}else{N.hide();G.show()}H(true)}N.prev().attr("aria-expanded","false").attr("tabIndex","-1");G.prev().attr("aria-expanded","true").attr("tabIndex","0").focus()}function F(L){var J=E.data(this,"accordion").options;if(J.disabled){return false}if(!L.target&&!J.alwaysOpen){J.active.parent().andSelf().toggleClass(J.selectedClass);var I=J.active.next(),M={options:J,newHeader:E([]),oldHeader:J.active,newContent:E([]),oldContent:I},G=(J.active=E([]));A.call(this,G,I,M);return false}var K=E(L.target);K=E(K.parents(J.header)[0]||K);var H=K[0]==J.active[0];if(J.running||(J.alwaysOpen&&H)){return false}if(!K.is(J.header)){return }J.active.parent().andSelf().toggleClass(J.selectedClass);if(!H){K.parent().andSelf().addClass(J.selectedClass)}var G=K.next(),I=J.active.next(),M={options:J,newHeader:H&&!J.alwaysOpen?E([]):K,oldHeader:J.active,newContent:H&&!J.alwaysOpen?E([]):G,oldContent:I},N=J.headers.index(J.active[0])>J.headers.index(K[0]);J.active=H?E([]):K;A.call(this,G,I,M,H,N);return false}function C(H,G){return G?typeof G=="number"?H.filter(":eq("+G+")"):H.not(H.not(G)):G===false?E([]):H.filter(":eq(0)")}E.extend(E.ui.accordion,{version:"1.6",defaults:{autoHeight:true,alwaysOpen:true,animated:"slide",event:"click",header:"a",navigationFilter:function(){return this.href.toLowerCase()==location.href.toLowerCase()},running:0,selectedClass:"selected"},animations:{slide:function(G,J){G=E.extend({easing:"swing",duration:300},G,J);if(!G.toHide.size()){G.toShow.animate({height:"show"},G);return }var I=G.toHide.height(),L=G.toShow.height(),N=L/I,K=G.toShow.outerHeight()-G.toShow.height(),H=G.toShow.css("marginBottom"),M=G.toShow.css("overflow");tmargin=G.toShow.css("marginTop");G.toShow.css({height:0,overflow:"hidden",marginTop:0,marginBottom:-K}).show();G.toHide.filter(":hidden").each(G.complete).end().filter(":visible").animate({height:"hide"},{step:function(O){var P=(I-O)*N;if(E.browser.msie||E.browser.opera){P=Math.ceil(P)}G.toShow.height(P)},duration:G.duration,easing:G.easing,complete:function(){if(!G.autoHeight){G.toShow.css("height","auto")}G.toShow.css({marginTop:tmargin,marginBottom:H,overflow:M});G.complete()}})},bounceslide:function(G){this.slide(G,{easing:G.down?"easeOutBounce":"swing",duration:G.down?1000:200})},easeslide:function(G){this.slide(G,{easing:"easeinout",duration:700})}}})})(jQuery);/*
+ * jQuery UI Dialog 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	ui.core.js
+ *	ui.draggable.js
+ *	ui.resizable.js
+ */
(function(B){var A={dragStart:"start.draggable",drag:"drag.draggable",dragStop:"stop.draggable",maxHeight:"maxHeight.resizable",minHeight:"minHeight.resizable",maxWidth:"maxWidth.resizable",minWidth:"minWidth.resizable",resizeStart:"start.resizable",resize:"drag.resizable",resizeStop:"stop.resizable"};B.widget("ui.dialog",{_init:function(){this.originalTitle=this.element.attr("title");this.options.title=this.options.title||this.originalTitle;var M=this,N=this.options,F=this.element.removeAttr("title").addClass("ui-dialog-content").wrap("<div></div>").wrap("<div></div>"),I=(this.uiDialogContainer=F.parent()).addClass("ui-dialog-container").css({position:"relative",width:"100%",height:"100%"}),E=(this.uiDialogTitlebar=B("<div></div>")).addClass("ui-dialog-titlebar").mousedown(function(){M.moveToTop()}).prependTo(I),J=B('<a href="#"/>').addClass("ui-dialog-titlebar-close").attr("role","button").appendTo(E),G=(this.uiDialogTitlebarCloseText=B("<span/>")).text(N.closeText).appendTo(J),L=N.title||"&nbsp;",D=B.ui.dialog.getTitleId(this.element),C=B("<span/>").addClass("ui-dialog-title").attr("id",D).html(L).prependTo(E),K=(this.uiDialog=I.parent()).appendTo(document.body).hide().addClass("ui-dialog").addClass(N.dialogClass).css({position:"absolute",width:N.width,height:N.height,overflow:"hidden",zIndex:N.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(O){(N.closeOnEscape&&O.keyCode&&O.keyCode==B.ui.keyCode.ESCAPE&&M.close())}).attr({role:"dialog","aria-labelledby":D}).mouseup(function(){M.moveToTop()}),H=(this.uiDialogButtonPane=B("<div></div>")).addClass("ui-dialog-buttonpane").css({position:"absolute",bottom:0}).appendTo(K),J=B(".ui-dialog-titlebar-close",E).hover(function(){B(this).addClass("ui-dialog-titlebar-close-hover")},function(){B(this).removeClass("ui-dialog-titlebar-close-hover")}).mousedown(function(O){O.stopPropagation()}).click(function(){M.close();return false});E.find("*").add(E).disableSelection();(N.draggable&&B.fn.draggable&&this._makeDraggable());(N.resizable&&B.fn.resizable&&this._makeResizable());this._createButtons(N.buttons);this._isOpen=false;(N.bgiframe&&B.fn.bgiframe&&K.bgiframe());(N.autoOpen&&this.open())},destroy:function(){(this.overlay&&this.overlay.destroy());this.uiDialog.hide();this.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content").hide().appendTo("body");this.uiDialog.remove();(this.originalTitle&&this.element.attr("title",this.originalTitle))},close:function(){if(false===this._trigger("beforeclose",null,{options:this.options})){return }(this.overlay&&this.overlay.destroy());this.uiDialog.hide(this.options.hide).unbind("keypress.ui-dialog");this._trigger("close",null,{options:this.options});B.ui.dialog.overlay.resize();this._isOpen=false},isOpen:function(){return this._isOpen},moveToTop:function(F){if((this.options.modal&&!F)||(!this.options.stack&&!this.options.modal)){return this._trigger("focus",null,{options:this.options})}var E=this.options.zIndex,D=this.options;B(".ui-dialog:visible").each(function(){E=Math.max(E,parseInt(B(this).css("z-index"),10)||D.zIndex)});(this.overlay&&this.overlay.$el.css("z-index",++E));var C={scrollTop:this.element.attr("scrollTop"),scrollLeft:this.element.attr("scrollLeft")};this.uiDialog.css("z-index",++E);this.element.attr(C);this._trigger("focus",null,{options:this.options})},open:function(){if(this._isOpen){return }this.overlay=this.options.modal?new B.ui.dialog.overlay(this):null;(this.uiDialog.next().length&&this.uiDialog.appendTo("body"));this._position(this.options.position);this.uiDialog.show(this.options.show);(this.options.autoResize&&this._size());this.moveToTop(true);(this.options.modal&&this.uiDialog.bind("keypress.ui-dialog",function(E){if(E.keyCode!=B.ui.keyCode.TAB){return }var D=B(":tabbable",this),F=D.filter(":first")[0],C=D.filter(":last")[0];if(E.target==C&&!E.shiftKey){setTimeout(function(){F.focus()},1)}else{if(E.target==F&&E.shiftKey){setTimeout(function(){C.focus()},1)}}}));this.uiDialog.find(":tabbable:first").focus();this._trigger("open",null,{options:this.options});this._isOpen=true},_createButtons:function(F){var E=this,C=false,D=this.uiDialogButtonPane;D.empty().hide();B.each(F,function(){return !(C=true)});if(C){D.show();B.each(F,function(G,H){B('<button type="button"></button>').text(G).click(function(){H.apply(E.element[0],arguments)}).appendTo(D)})}},_makeDraggable:function(){var C=this,D=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content",helper:D.dragHelper,handle:".ui-dialog-titlebar",start:function(){C.moveToTop();(D.dragStart&&D.dragStart.apply(C.element[0],arguments))},drag:function(){(D.drag&&D.drag.apply(C.element[0],arguments))},stop:function(){(D.dragStop&&D.dragStop.apply(C.element[0],arguments));B.ui.dialog.overlay.resize()}})},_makeResizable:function(F){F=(F===undefined?this.options.resizable:F);var C=this,E=this.options,D=typeof F=="string"?F:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",helper:E.resizeHelper,maxWidth:E.maxWidth,maxHeight:E.maxHeight,minWidth:E.minWidth,minHeight:E.minHeight,start:function(){(E.resizeStart&&E.resizeStart.apply(C.element[0],arguments))},resize:function(){(E.autoResize&&C._size.apply(C));(E.resize&&E.resize.apply(C.element[0],arguments))},handles:D,stop:function(){(E.autoResize&&C._size.apply(C));(E.resizeStop&&E.resizeStop.apply(C.element[0],arguments));B.ui.dialog.overlay.resize()}})},_position:function(H){var D=B(window),E=B(document),F=E.scrollTop(),C=E.scrollLeft(),G=F;if(B.inArray(H,["center","top","right","bottom","left"])>=0){H=[H=="right"||H=="left"?H:"center",H=="top"||H=="bottom"?H:"middle"]}if(H.constructor!=Array){H=["center","middle"]}if(H[0].constructor==Number){C+=H[0]}else{switch(H[0]){case"left":C+=0;break;case"right":C+=D.width()-this.uiDialog.outerWidth();break;default:case"center":C+=(D.width()-this.uiDialog.outerWidth())/2}}if(H[1].constructor==Number){F+=H[1]}else{switch(H[1]){case"top":F+=0;break;case"bottom":F+=(B.browser.opera?window.innerHeight:D.height())-this.uiDialog.outerHeight();break;default:case"middle":F+=((B.browser.opera?window.innerHeight:D.height())-this.uiDialog.outerHeight())/2}}F=Math.max(F,G);this.uiDialog.css({top:F,left:C})},_setData:function(D,E){(A[D]&&this.uiDialog.data(A[D],E));switch(D){case"buttons":this._createButtons(E);break;case"closeText":this.uiDialogTitlebarCloseText.text(E);break;case"draggable":(E?this._makeDraggable():this.uiDialog.draggable("destroy"));break;case"height":this.uiDialog.height(E);break;case"position":this._position(E);break;case"resizable":var C=this.uiDialog,F=this.uiDialog.is(":data(resizable)");(F&&!E&&C.resizable("destroy"));(F&&typeof E=="string"&&C.resizable("option","handles",E));(F||this._makeResizable(E));break;case"title":B(".ui-dialog-title",this.uiDialogTitlebar).html(E||"&nbsp;");break;case"width":this.uiDialog.width(E);break}B.widget.prototype._setData.apply(this,arguments)},_size:function(){var D=this.uiDialogContainer,G=this.uiDialogTitlebar,E=this.element,F=(parseInt(E.css("margin-top"),10)||0)+(parseInt(E.css("margin-bottom"),10)||0),C=(parseInt(E.css("margin-left"),10)||0)+(parseInt(E.css("margin-right"),10)||0);E.height(D.height()-G.outerHeight()-F);E.width(D.width()-C)}});B.extend(B.ui.dialog,{version:"1.6",defaults:{autoOpen:true,autoResize:true,bgiframe:false,buttons:{},closeOnEscape:true,closeText:"close",draggable:true,height:200,minHeight:100,minWidth:150,modal:false,overlay:{},position:"center",resizable:true,stack:true,width:300,zIndex:1000},getter:"isOpen",uuid:0,getTitleId:function(C){return"ui-dialog-title-"+(C.attr("id")||++this.uuid)},overlay:function(C){this.$el=B.ui.dialog.overlay.create(C)}});B.extend(B.ui.dialog.overlay,{instances:[],events:B.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(C){return C+".dialog-overlay"}).join(" "),create:function(D){if(this.instances.length===0){setTimeout(function(){B("a, :input").bind(B.ui.dialog.overlay.events,function(){var F=false;var H=B(this).parents(".ui-dialog");if(H.length){var E=B(".ui-dialog-overlay");if(E.length){var G=parseInt(E.css("z-index"),10);E.each(function(){G=Math.max(G,parseInt(B(this).css("z-index"),10))});F=parseInt(H.css("z-index"),10)>G}else{F=true}}return F})},1);B(document).bind("keydown.dialog-overlay",function(E){(D.options.closeOnEscape&&E.keyCode&&E.keyCode==B.ui.keyCode.ESCAPE&&D.close())});B(window).bind("resize.dialog-overlay",B.ui.dialog.overlay.resize)}var C=B("<div></div>").appendTo(document.body).addClass("ui-dialog-overlay").css(B.extend({borderWidth:0,margin:0,padding:0,position:"absolute",top:0,left:0,width:this.width(),height:this.height()},D.options.overlay));(D.options.bgiframe&&B.fn.bgiframe&&C.bgiframe());this.instances.push(C);return C},destroy:function(C){this.instances.splice(B.inArray(this.instances,C),1);if(this.instances.length===0){B("a, :input").add([document,window]).unbind(".dialog-overlay")}C.remove()},height:function(){if(B.browser.msie&&B.browser.version<7){var D=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);var C=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);if(D<C){return B(window).height()+"px"}else{return D+"px"}}else{if(B.browser.opera){return Math.max(window.innerHeight,B(document).height())+"px"}else{return B(document).height()+"px"}}},width:function(){if(B.browser.msie&&B.browser.version<7){var C=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);var D=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);if(C<D){return B(window).width()+"px"}else{return C+"px"}}else{if(B.browser.opera){return Math.max(window.innerWidth,B(document).width())+"px"}else{return B(document).width()+"px"}}},resize:function(){var C=B([]);B.each(B.ui.dialog.overlay.instances,function(){C=C.add(this)});C.css({width:0,height:0}).css({width:B.ui.dialog.overlay.width(),height:B.ui.dialog.overlay.height()})}});B.extend(B.ui.dialog.overlay.prototype,{destroy:function(){B.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);/*
+ * jQuery UI Slider 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	ui.core.js
+ */
(function(A){A.fn.unwrap=A.fn.unwrap||function(B){return this.each(function(){A(this).parents(B).eq(0).after(this).remove()})};A.widget("ui.slider",{_init:function(){var B=this;this.element.addClass("ui-slider");this._initBoundaries();this.handle=A(this.options.handle,this.element);if(!this.handle.length){B.handle=B.generated=A(B.options.handles||[0]).map(function(){var D=A("<div/>").addClass("ui-slider-handle").appendTo(B.element);if(this.id){D.attr("id",this.id)}return D[0]})}var C=function(D){this.element=A(D);this.element.data("mouse",this);this.options=B.options;this.element.bind("mousedown",function(){if(B.currentHandle){this.blur(B.currentHandle)}B._focus(this,true)});this._mouseInit()};A.extend(C.prototype,A.ui.mouse,{_mouseCapture:function(){return true},_mouseStart:function(D){return B._start.call(B,D,this.element[0])},_mouseDrag:function(D){return B._drag.call(B,D,this.element[0])},_mouseStop:function(D){return B._stop.call(B,D,this.element[0])},trigger:function(D){this._mouseDown(D)}});A(this.handle).each(function(){new C(this)}).wrap('<a href="#" style="outline:none;border:none;"></a>').parent().bind("click",function(){return false}).bind("focus",function(D){B._focus(this.firstChild)}).bind("blur",function(D){B._blur(this.firstChild)}).bind("keydown",function(D){if(!B.options.noKeyboard){return B._keydown(D.keyCode,this.firstChild)}});this.element.bind("mousedown.slider",function(D){if(A(D.target).is(".ui-slider-handle")){return }B._click.apply(B,[D]);B.currentHandle.data("mouse").trigger(D);B.firstValue=B.firstValue+1});A.each(this.options.handles||[],function(D,E){B.moveTo(E.start,D,true)});if(!isNaN(this.options.startValue)){this.moveTo(this.options.startValue,0,true)}this.previousHandle=A(this.handle[0]);if(this.handle.length==2&&this.options.range){this._createRange()}},destroy:function(){this.element.removeClass("ui-slider ui-slider-disabled").removeData("slider").unbind(".slider");if(this.handle&&this.handle.length){this.handle.unwrap("a");this.handle.each(function(){var B=A(this).data("mouse");B&&B._mouseDestroy()})}this.generated&&this.generated.remove()},_start:function(B,C){var D=this.options;if(D.disabled){return false}this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};if(!this.currentHandle){this._focus(this.previousHandle,true)}this.offset=this.element.offset();this.handleOffset=this.currentHandle.offset();this.clickOffset={top:B.pageY-this.handleOffset.top,left:B.pageX-this.handleOffset.left};this.firstValue=this.value();this._propagate("start",B);this._drag(B,C);return true},_drag:function(C,E){var F=this.options;var B={top:C.pageY-this.offset.top-this.clickOffset.top,left:C.pageX-this.offset.left-this.clickOffset.left};if(!this.currentHandle){this._focus(this.previousHandle,true)}B.left=this._translateLimits(B.left,"x");B.top=this._translateLimits(B.top,"y");if(F.stepping.x){var D=this._convertValue(B.left,"x");D=this._round(D/F.stepping.x)*F.stepping.x;B.left=this._translateValue(D,"x")}if(F.stepping.y){var D=this._convertValue(B.top,"y");D=this._round(D/F.stepping.y)*F.stepping.y;B.top=this._translateValue(D,"y")}B.left=this._translateRange(B.left,"x");B.top=this._translateRange(B.top,"y");if(F.axis!="vertical"){this.currentHandle.css({left:B.left})}if(F.axis!="horizontal"){this.currentHandle.css({top:B.top})}this.currentHandle.data("mouse").sliderValue={x:this._round(this._convertValue(B.left,"x"))||0,y:this._round(this._convertValue(B.top,"y"))||0};if(this.rangeElement){this._updateRange()}this._propagate("slide",C);return false},_stop:function(B){this._propagate("stop",B);if(this.firstValue!=this.value()){this._propagate("change",B)}this._focus(this.currentHandle,true);return false},_round:function(B){return this.options.round?parseInt(B,10):parseFloat(B)},_setData:function(B,C){A.widget.prototype._setData.apply(this,arguments);if(/min|max|steps/.test(B)){this._initBoundaries()}if(B=="range"){C?this.handle.length==2&&this._createRange():this._removeRange()}},_initBoundaries:function(){var B=this.element[0],C=this.options;this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};A.extend(C,{axis:C.axis||(B.offsetWidth<B.offsetHeight?"vertical":"horizontal"),max:!isNaN(parseInt(C.max,10))?{x:parseInt(C.max,10),y:parseInt(C.max,10)}:({x:C.max&&C.max.x||100,y:C.max&&C.max.y||100}),min:!isNaN(parseInt(C.min,10))?{x:parseInt(C.min,10),y:parseInt(C.min,10)}:({x:C.min&&C.min.x||0,y:C.min&&C.min.y||0})});C.realMax={x:C.max.x-C.min.x,y:C.max.y-C.min.y};C.stepping={x:C.stepping&&C.stepping.x||parseInt(C.stepping,10)||(C.steps?C.realMax.x/(C.steps.x||parseInt(C.steps,10)||C.realMax.x):0),y:C.stepping&&C.stepping.y||parseInt(C.stepping,10)||(C.steps?C.realMax.y/(C.steps.y||parseInt(C.steps,10)||C.realMax.y):0)}},_keydown:function(F,E){if(this.options.disabled){return }var C=F;if(/(33|34|35|36|37|38|39|40)/.test(C)){var G=this.options,B,I;if(/(35|36)/.test(C)){B=(C==35)?G.max.x:G.min.x;I=(C==35)?G.max.y:G.min.y}else{var H=/(34|37|40)/.test(C)?"-=":"+=";var D=/(37|38|39|40)/.test(C)?"_oneStep":"_pageStep";B=H+this[D]("x");I=H+this[D]("y")}this.moveTo({x:B,y:I},E);return false}return true},_focus:function(B,C){this.currentHandle=A(B).addClass("ui-slider-handle-active");if(C){this.currentHandle.parent()[0].focus()}},_blur:function(B){A(B).removeClass("ui-slider-handle-active");if(this.currentHandle&&this.currentHandle[0]==B){this.previousHandle=this.currentHandle;this.currentHandle=null}},_click:function(C){var D=[C.pageX,C.pageY];var B=false;this.handle.each(function(){if(this==C.target){B=true}});if(B||this.options.disabled||!(this.currentHandle||this.previousHandle)){return }if(!this.currentHandle&&this.previousHandle){this._focus(this.previousHandle,true)}this.offset=this.element.offset();this.moveTo({y:this._convertValue(C.pageY-this.offset.top-this.currentHandle[0].offsetHeight/2,"y"),x:this._convertValue(C.pageX-this.offset.left-this.currentHandle[0].offsetWidth/2,"x")},null,!this.options.distance)},_createRange:function(){if(this.rangeElement){return }this.rangeElement=A("<div></div>").addClass("ui-slider-range").css({position:"absolute"}).appendTo(this.element);this._updateRange()},_removeRange:function(){this.rangeElement.remove();this.rangeElement=null},_updateRange:function(){var C=this.options.axis=="vertical"?"top":"left";var B=this.options.axis=="vertical"?"height":"width";this.rangeElement.css(C,(this._round(A(this.handle[0]).css(C))||0)+this._handleSize(0,this.options.axis=="vertical"?"y":"x")/2);this.rangeElement.css(B,(this._round(A(this.handle[1]).css(C))||0)-(this._round(A(this.handle[0]).css(C))||0))},_getRange:function(){return this.rangeElement?this._convertValue(this._round(this.rangeElement.css(this.options.axis=="vertical"?"height":"width")),this.options.axis=="vertical"?"y":"x"):null},_handleIndex:function(){return this.handle.index(this.currentHandle[0])},value:function(D,B){if(this.handle.length==1){this.currentHandle=this.handle}if(!B){B=this.options.axis=="vertical"?"y":"x"}var C=A(D!=undefined&&D!==null?this.handle[D]||D:this.currentHandle);if(C.data("mouse").sliderValue){return this._round(C.data("mouse").sliderValue[B])}else{return this._round(((this._round(C.css(B=="x"?"left":"top"))/(this.actualSize[B=="x"?"width":"height"]-this._handleSize(D,B)))*this.options.realMax[B])+this.options.min[B])}},_convertValue:function(C,B){return this.options.min[B]+(C/(this.actualSize[B=="x"?"width":"height"]-this._handleSize(null,B)))*this.options.realMax[B]},_translateValue:function(C,B){return((C-this.options.min[B])/this.options.realMax[B])*(this.actualSize[B=="x"?"width":"height"]-this._handleSize(null,B))},_translateRange:function(D,B){if(this.rangeElement){if(this.currentHandle[0]==this.handle[0]&&D>=this._translateValue(this.value(1),B)){D=this._translateValue(this.value(1,B)-this._oneStep(B),B)}if(this.currentHandle[0]==this.handle[1]&&D<=this._translateValue(this.value(0),B)){D=this._translateValue(this.value(0,B)+this._oneStep(B),B)}}if(this.options.handles){var C=this.options.handles[this._handleIndex()];if(D<this._translateValue(C.min,B)){D=this._translateValue(C.min,B)}else{if(D>this._translateValue(C.max,B)){D=this._translateValue(C.max,B)}}}return D},_translateLimits:function(C,B){if(C>=this.actualSize[B=="x"?"width":"height"]-this._handleSize(null,B)){C=this.actualSize[B=="x"?"width":"height"]-this._handleSize(null,B)}if(C<=0){C=0}return C},_handleSize:function(C,B){return A(C!=undefined&&C!==null?this.handle[C]:this.currentHandle)[0]["offset"+(B=="x"?"Width":"Height")]},_oneStep:function(B){return this.options.stepping[B]||1},_pageStep:function(B){return 10},moveTo:function(F,E,G){var H=this.options;this.actualSize={width:this.element.outerWidth(),height:this.element.outerHeight()};if(E==undefined&&!this.currentHandle&&this.handle.length!=1){return false}if(E==undefined&&!this.currentHandle){E=0}if(E!=undefined){this.currentHandle=this.previousHandle=A(this.handle[E]||E)}if(F.x!==undefined&&F.y!==undefined){var B=F.x,I=F.y}else{var B=F,I=F}if(B!==undefined&&B.constructor!=Number){var D=/^\-\=/.test(B),C=/^\+\=/.test(B);if(D||C){B=this.value(null,"x")+this._round(B.replace(D?"=":"+=",""))}else{B=isNaN(this._round(B))?undefined:this._round(B)}}if(I!==undefined&&I.constructor!=Number){var D=/^\-\=/.test(I),C=/^\+\=/.test(I);if(D||C){I=this.value(null,"y")+this._round(I.replace(D?"=":"+=",""))}else{I=isNaN(this._round(I))?undefined:this._round(I)}}if(H.axis!="vertical"&&B!==undefined){if(H.stepping.x){B=this._round(B/H.stepping.x)*H.stepping.x}B=this._translateValue(B,"x");B=this._translateLimits(B,"x");B=this._translateRange(B,"x");H.animate?this.currentHandle.stop().animate({left:B},(Math.abs(parseInt(this.currentHandle.css("left"),10)-B))*(!isNaN(parseInt(H.animate,10))?H.animate:5)):this.currentHandle.css({left:B})}if(H.axis!="horizontal"&&I!==undefined){if(H.stepping.y){I=this._round(I/H.stepping.y)*H.stepping.y}I=this._translateValue(I,"y");I=this._translateLimits(I,"y");I=this._translateRange(I,"y");H.animate?this.currentHandle.stop().animate({top:I},(Math.abs(parseInt(this.currentHandle.css("top"),10)-I))*(!isNaN(parseInt(H.animate,10))?H.animate:5)):this.currentHandle.css({top:I})}if(this.rangeElement){this._updateRange()}this.currentHandle.data("mouse").sliderValue={x:this._round(this._convertValue(B,"x"))||0,y:this._round(this._convertValue(I,"y"))||0};if(!G){this._propagate("start",null);this._propagate("slide",null);this._propagate("stop",null);this._propagate("change",null)}},_propagate:function(C,B){A.ui.plugin.call(this,C,[B,this.ui()]);this.element.triggerHandler(C=="slide"?C:"slide"+C,[B,this.ui()],this.options[C])},plugins:{},ui:function(B){return{options:this.options,handle:this.currentHandle,value:this.options.axis!="both"||!this.options.axis?this._round(this.value(null,this.options.axis=="vertical"?"y":"x")):{x:this._round(this.value(null,"x")),y:this._round(this.value(null,"y"))},range:this._getRange()}}});A.extend(A.ui.slider,{getter:"value",version:"1.6",defaults:{animate:false,distance:1,handle:".ui-slider-handle",round:true}})})(jQuery);/*
+ * jQuery UI Tabs 1.6
+ *
+ * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	ui.core.js
+ */
(function(A){A.widget("ui.tabs",{_init:function(){this._tabify(true)},destroy:function(){var B=this.options;this.element.unbind(".tabs").removeClass(B.navClass).removeData("tabs");this.$tabs.each(function(){var C=A.data(this,"href.tabs");if(C){this.href=C}var D=A(this).unbind(".tabs");A.each(["href","load","cache"],function(E,F){D.removeData(F+".tabs")})});this.$lis.add(this.$panels).each(function(){if(A.data(this,"destroy.tabs")){A(this).remove()}else{A(this).removeClass([B.selectedClass,B.deselectableClass,B.disabledClass,B.panelClass,B.hideClass].join(" "))}});if(B.cookie){this._cookie(null,B.cookie)}},_setData:function(B,C){if((/^selected/).test(B)){this.select(C)}else{this.options[B]=C;this._tabify()}},length:function(){return this.$tabs.length},_tabId:function(B){return B.title&&B.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+A.data(B)},_sanitizeSelector:function(B){return B.replace(/:/g,"\\:")},_cookie:function(){var B=this.cookie||(this.cookie="ui-tabs-"+A.data(this.element[0]));return A.cookie.apply(null,[B].concat(A.makeArray(arguments)))},_tabify:function(N){this.$lis=A("li:has(a[href])",this.element);this.$tabs=this.$lis.map(function(){return A("a",this)[0]});this.$panels=A([]);var O=this,C=this.options;this.$tabs.each(function(Q,P){if(P.hash&&P.hash.replace("#","")){O.$panels=O.$panels.add(O._sanitizeSelector(P.hash))}else{if(A(P).attr("href")!="#"){A.data(P,"href.tabs",P.href);A.data(P,"load.tabs",P.href);var S=O._tabId(P);P.href="#"+S;var R=A("#"+S);if(!R.length){R=A(C.panelTemplate).attr("id",S).addClass(C.panelClass).insertAfter(O.$panels[Q-1]||O.element);R.data("destroy.tabs",true)}O.$panels=O.$panels.add(R)}else{C.disabled.push(Q+1)}}});if(N){this.element.addClass(C.navClass);this.$panels.addClass(C.panelClass);if(C.selected===undefined){if(location.hash){this.$tabs.each(function(Q,P){if(P.hash==location.hash){C.selected=Q;return false}})}else{if(C.cookie){var I=parseInt(O._cookie(),10);if(I&&O.$tabs[I]){C.selected=I}}else{if(O.$lis.filter("."+C.selectedClass).length){C.selected=O.$lis.index(O.$lis.filter("."+C.selectedClass)[0])}}}}C.selected=C.selected===null||C.selected!==undefined?C.selected:0;C.disabled=A.unique(C.disabled.concat(A.map(this.$lis.filter("."+C.disabledClass),function(Q,P){return O.$lis.index(Q)}))).sort();if(A.inArray(C.selected,C.disabled)!=-1){C.disabled.splice(A.inArray(C.selected,C.disabled),1)}this.$panels.addClass(C.hideClass);this.$lis.removeClass(C.selectedClass);if(C.selected!==null){this.$panels.eq(C.selected).removeClass(C.hideClass);var E=[C.selectedClass];if(C.deselectable){E.push(C.deselectableClass)}this.$lis.eq(C.selected).addClass(E.join(" "));var J=function(){O._trigger("show",null,O.ui(O.$tabs[C.selected],O.$panels[C.selected]))};if(A.data(this.$tabs[C.selected],"load.tabs")){this.load(C.selected,J)}else{J()}}A(window).bind("unload",function(){O.$tabs.unbind(".tabs");O.$lis=O.$tabs=O.$panels=null})}else{C.selected=this.$lis.index(this.$lis.filter("."+C.selectedClass)[0])}if(C.cookie){this._cookie(C.selected,C.cookie)}for(var G=0,M;M=this.$lis[G];G++){A(M)[A.inArray(G,C.disabled)!=-1&&!A(M).hasClass(C.selectedClass)?"addClass":"removeClass"](C.disabledClass)}if(C.cache===false){this.$tabs.removeData("cache.tabs")}var B,H;if(C.fx){if(C.fx.constructor==Array){B=C.fx[0];H=C.fx[1]}else{B=H=C.fx}}function D(P,Q){P.css({display:""});if(A.browser.msie&&Q.opacity){P[0].style.removeAttribute("filter")}}var K=H?function(P,Q){Q.animate(H,H.duration||"normal",function(){Q.removeClass(C.hideClass);D(Q,H);O._trigger("show",null,O.ui(P,Q[0]))})}:function(P,Q){Q.removeClass(C.hideClass);O._trigger("show",null,O.ui(P,Q[0]))};var L=B?function(Q,P,R){P.animate(B,B.duration||"normal",function(){P.addClass(C.hideClass);D(P,B);if(R){K(Q,R,P)}})}:function(Q,P,R){P.addClass(C.hideClass);if(R){K(Q,R)}};function F(R,T,P,S){var Q=[C.selectedClass];if(C.deselectable){Q.push(C.deselectableClass)}T.addClass(Q.join(" ")).siblings().removeClass(Q.join(" "));L(R,P,S)}this.$tabs.unbind(".tabs").bind(C.event+".tabs",function(){var S=A(this).parents("li:eq(0)"),P=O.$panels.filter(":visible"),R=A(O._sanitizeSelector(this.hash));if((S.hasClass(C.selectedClass)&&!C.deselectable)||S.hasClass(C.disabledClass)||A(this).hasClass(C.loadingClass)||O._trigger("select",null,O.ui(this,R[0]))===false){this.blur();return false}C.selected=O.$tabs.index(this);if(C.deselectable){if(S.hasClass(C.selectedClass)){O.options.selected=null;S.removeClass([C.selectedClass,C.deselectableClass].join(" "));O.$panels.stop();L(this,P);this.blur();return false}else{if(!P.length){O.$panels.stop();var Q=this;O.load(O.$tabs.index(this),function(){S.addClass([C.selectedClass,C.deselectableClass].join(" "));K(Q,R)});this.blur();return false}}}if(C.cookie){O._cookie(C.selected,C.cookie)}O.$panels.stop();if(R.length){var Q=this;O.load(O.$tabs.index(this),P.length?function(){F(Q,S,P,R)}:function(){S.addClass(C.selectedClass);K(Q,R)})}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(A.browser.msie){this.blur()}return false});if(C.event!="click"){this.$tabs.bind("click.tabs",function(){return false})}},add:function(E,D,C){if(C==undefined){C=this.$tabs.length}var G=this.options;var I=A(G.tabTemplate.replace(/#\{href\}/g,E).replace(/#\{label\}/g,D));I.data("destroy.tabs",true);var H=E.indexOf("#")==0?E.replace("#",""):this._tabId(A("a:first-child",I)[0]);var F=A("#"+H);if(!F.length){F=A(G.panelTemplate).attr("id",H).addClass(G.hideClass).data("destroy.tabs",true)}F.addClass(G.panelClass);if(C>=this.$lis.length){I.appendTo(this.element);F.appendTo(this.element[0].parentNode)}else{I.insertBefore(this.$lis[C]);F.insertBefore(this.$panels[C])}G.disabled=A.map(G.disabled,function(K,J){return K>=C?++K:K});this._tabify();if(this.$tabs.length==1){I.addClass(G.selectedClass);F.removeClass(G.hideClass);var B=A.data(this.$tabs[0],"load.tabs");if(B){this.load(C,B)}}this._trigger("add",null,this.ui(this.$tabs[C],this.$panels[C]))},remove:function(B){var D=this.options,E=this.$lis.eq(B).remove(),C=this.$panels.eq(B).remove();if(E.hasClass(D.selectedClass)&&this.$tabs.length>1){this.select(B+(B+1<this.$tabs.length?1:-1))}D.disabled=A.map(A.grep(D.disabled,function(G,F){return G!=B}),function(G,F){return G>=B?--G:G});this._tabify();this._trigger("remove",null,this.ui(E.find("a")[0],C[0]))},enable:function(B){var C=this.options;if(A.inArray(B,C.disabled)==-1){return }var D=this.$lis.eq(B).removeClass(C.disabledClass);if(A.browser.safari){D.css("display","inline-block");setTimeout(function(){D.css("display","block")},0)}C.disabled=A.grep(C.disabled,function(F,E){return F!=B});this._trigger("enable",null,this.ui(this.$tabs[B],this.$panels[B]))},disable:function(C){var B=this,D=this.options;if(C!=D.selected){this.$lis.eq(C).addClass(D.disabledClass);D.disabled.push(C);D.disabled.sort();this._trigger("disable",null,this.ui(this.$tabs[C],this.$panels[C]))}},select:function(B){if(typeof B=="string"){B=this.$tabs.index(this.$tabs.filter("[href$="+B+"]")[0])}this.$tabs.eq(B).trigger(this.options.event+".tabs")},load:function(G,K){var L=this,D=this.options,E=this.$tabs.eq(G),J=E[0],H=K==undefined||K===false,B=E.data("load.tabs");K=K||function(){};if(!B||!H&&A.data(J,"cache.tabs")){K();return }var M=function(N){var O=A(N),P=O.find("*:last");return P.length&&P.is(":not(img)")&&P||O};var C=function(){L.$tabs.filter("."+D.loadingClass).removeClass(D.loadingClass).each(function(){if(D.spinner){M(this).parent().html(M(this).data("label.tabs"))}});L.xhr=null};if(D.spinner){var I=M(J).html();M(J).wrapInner("<em></em>").find("em").data("label.tabs",I).html(D.spinner)}var F=A.extend({},D.ajaxOptions,{url:B,success:function(P,N){A(L._sanitizeSelector(J.hash)).html(P);C();if(D.cache){A.data(J,"cache.tabs",true)}L._trigger("load",null,L.ui(L.$tabs[G],L.$panels[G]));try{D.ajaxOptions.success(P,N)}catch(O){}K()}});if(this.xhr){this.xhr.abort();C()}E.addClass(D.loadingClass);L.xhr=A.ajax(F)},url:function(C,B){this.$tabs.eq(C).removeData("cache.tabs").data("load.tabs",B)},ui:function(C,B){return{options:this.options,tab:C,panel:B,index:this.$tabs.index(C)}}});A.extend(A.ui.tabs,{version:"1.6",getter:"length",defaults:{ajaxOptions:null,cache:false,cookie:null,deselectable:false,deselectableClass:"ui-tabs-deselectable",disabled:[],disabledClass:"ui-tabs-disabled",event:"click",fx:null,hideClass:"ui-tabs-hide",idPrefix:"ui-tabs-",loadingClass:"ui-tabs-loading",navClass:"ui-tabs-nav",panelClass:"ui-tabs-panel",panelTemplate:"<div></div>",selectedClass:"ui-tabs-selected",spinner:"Loading&#8230;",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'}});A.extend(A.ui.tabs.prototype,{rotation:null,rotate:function(C,F){F=F||false;var B=this,E=this.options.selected;function G(){B.rotation=setInterval(function(){E=++E<B.$tabs.length?E:0;B.select(E)},C)}function D(H){if(!H||H.clientX){clearInterval(B.rotation)}}if(C){G();if(!F){this.$tabs.bind(this.options.event+".tabs",D)}else{this.$tabs.bind(this.options.event+".tabs",function(){D();E=B.options.selected;G()})}}else{D();this.$tabs.unbind(this.options.event+".tabs",D)}}})})(jQuery);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/console.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,121 @@
+//	for console support
+if ((typeof window.parent.console == 'undefined') || ( (/AppleWebKit/i.test(navigator.userAgent)) && !(/Version/i.test(navigator.userAgent))) ){
+	window.console = {
+	
+			sprintf: function(args){
+				if (typeof args == 'undefined') {
+					return null;
+				}
+				
+				if (args.length < 1) {
+					return null;
+				};
+				
+				if (typeof args[0] != 'string') {
+					return null;
+				}
+				
+				if (typeof RegExp == 'undefined') {
+					return null;
+				}
+				
+				if (args.length == 1) {
+					return args[0];
+				}
+				
+				
+				var str = args[0];
+				var newString = args[0];
+				var arr = new Array();
+				var exp = new RegExp(/[^%](%)([a-zA-Z])/g);
+				var match = null;
+				var lastMatch = 0;
+				var argPos = 1;
+				while (match = exp.exec(str) && argPos < args.length) {
+					if (str[exp.lastIndex - 1] == "%") {
+						
+					}
+					else 
+						if (str[exp.lastIndex - 1] == "d") {
+							arr.push(str.substring(lastMatch, exp.lastIndex - 2));
+							arr.push(args[argPos++]);
+						}
+						else 
+							if (str[exp.lastIndex - 1] == "i") {
+								arr.push(str.substring(lastMatch, exp.lastIndex - 2));
+								arr.push(args[argPos++]);
+							}
+							else 
+								if (str[exp.lastIndex - 1] == "f") {
+									arr.push(str.substring(lastMatch, exp.lastIndex - 2));
+									arr.push(args[argPos++]);
+								}
+								else 
+									if (str[exp.lastIndex - 1] == "s") {
+										arr.push(str.substring(lastMatch, exp.lastIndex - 2));
+										arr.push(args[argPos++]);
+									}
+									else 
+										if (str[exp.lastIndex - 1] != "%") {
+											arr.push(str.substring(lastMatch, exp.lastIndex - 2));
+											arr.push("\"");
+											arr.push(args[argPos++]);
+											arr.push("\"");
+										}
+					lastMatch = exp.lastIndex;
+				}
+				if (lastMatch < str.length) {
+					arr.push(str.substring(lastMatch, str.length));
+				}
+				while (argPos < args.length) {
+					arr.push(" ");
+					arr.push(args[argPos++]);
+				}
+				return arr.join("").replace(/\%\%/g,"%");
+			},
+		error: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				_BRIDGE_REF.nokia.layout.log('error', errorStr);
+			}
+		},
+		info: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				_BRIDGE_REF.nokia.layout.log('info', errorStr);
+			}
+		},
+		warn: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				_BRIDGE_REF.nokia.layout.log('warn', errorStr);
+			}
+		},
+		log: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				_BRIDGE_REF.nokia.layout.log('log', errorStr);
+			}
+		},
+		debug: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				_BRIDGE_REF.nokia.layout.log('debug', errorStr);
+			}
+		},
+		assert: function(){
+			var errorStr = console.sprintf(arguments);
+			if (errorStr) {
+				//	@todo
+			}
+		}
+	}
+	
+	//	enable the Console.
+	_BRIDGE_REF.nokia.layout._console_enabled = true;
+	_BRIDGE_REF.nokia.layout.render();
+
+}
+
+//	make TRUE console.js script loaded
+window.parent.NOKIA.scriptsLoaded.console = true;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/device.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,544 @@
+/**
+ * device.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+
+/**
+ * device object. entry point to device service API (SAPI)
+ */
+var device = {
+	/**
+	 * device API public method
+	 * 
+	 * @method
+	 * @param {string} provider Name of service provider, eg, "Service.Calendar"
+	 * @param {string} Interface Name of interface, eg, "IDataSource"
+	 * @return {Object} service object  
+	 */
+	getServiceObject: function(provider, Interface){
+
+		if (!device.implementation.context)
+			throw 'device implementation object not instantiated!'
+
+		if (device.implementation.options.enabled) 
+			return device.implementation.getInterface(provider, Interface);
+		else {
+			device.implementation.context.notify('device SAPI is disabled.');
+			throw 'device not defined!';
+		}
+	}
+};
+
+
+
+/**
+ * implementation of device emulation mode
+ * 
+ * @param {String} 		version - version number (default: current version)
+ * @return {Object} 	returns new implementation context object 
+ * @constructor 		
+ */
+device.implementation = function(version){
+
+	this.version = version || '';
+	
+	// set context to current object
+	device.implementation.context = this;	
+
+	var libpath = 'preview/script/lib/',
+		datapath = 'preview/data/';
+	
+	// load implementation files
+	// this is done async by the browser engine, so be aware of sync conditions!!
+	if (version == '1')
+		loadSAPI(libpath + 'sapi1/');
+	else if (!version)
+		loadSAPI();
+	else
+		throw 'unsuppported SAPI version!';
+	
+	function loadSAPI(path){
+		var path = path || (libpath + "sapi/");
+		
+		// load API
+		loadScript(path + "AppManager.js");
+		loadScript(path + "Calendar.js");
+		loadScript(path + "Contact.js");
+		loadScript(path + "Landmarks.js");
+		loadScript(path + "Location.js");
+		loadScript(path + "Logging.js");
+		loadScript(path + "MediaManagement.js");
+		loadScript(path + "Messaging.js");
+		loadScript(path + "Sensor.js");
+		loadScript(path + "SysInfo.js");
+		
+		// load sample data
+		loadScript(datapath + "appManager_data.js");
+		loadScript(datapath + "calendar_data.js");
+		loadScript(datapath + "contact_data.js");
+		loadScript(datapath + "landmarks_data.js");
+		loadScript(datapath + "location_data.js");
+		loadScript(datapath + "logging_data.js");
+		loadScript(datapath + "mediaManagement_data.js");
+		loadScript(datapath + "messaging_data.js");
+		loadScript(datapath + "sensor_data.js");
+		loadScript(datapath + "sysInfo_data.js");
+	}
+	
+	function loadScript(src){
+		var head = document.getElementsByTagName("head")[0] || document.documentElement, 
+			script = document.createElement("script");
+		
+		script.type = "text/javascript";
+		script.src = src;
+		head.appendChild(script);
+	}
+};
+
+(function(){
+device.implementation.prototype = {
+	
+	/**
+	 * Result object
+	 * 
+	 * object returned by API calls
+	 * 
+	 * @param {Object} value
+	 * @param {Integer} code
+	 * @param {String} msg
+	 */
+	Result : function(value, code, msg){
+		return {
+			ReturnValue	: value,
+			ErrorCode	: code || 0,
+			ErrorMessage: msg || undefined
+		};
+	},
+	
+	/**
+	 * AsyncResult object
+	 * 
+	 * object returned by API calls with callbacks
+	 * 
+	 * @param {Integer} transaction id
+	 * @param {Integer} code
+	 * @param {String} msg
+	 */
+	AsyncResult : function(id, code, msg){
+		return {
+			TransactionID	: id,
+			ErrorCode		: code || 0,
+			ErrorMessage	: msg || undefined
+		};
+	},
+	/**
+	 * ErrorResult object
+	 * 
+	 * object returned by API calls when error
+	 * 
+	 * @param {Integer} code
+	 * @param {String} msg
+	 */
+	ErrorResult : function(code, msg){
+		device.implementation.context.debug(code, msg);		
+		return {
+			ErrorCode	: code || 0,
+			ErrorMessage: msg || undefined
+		};
+	},
+	
+	/**
+	 * Iterator object
+	 * 
+	 * object returned as ReturnValue by some API
+	 * 
+	 * @param {Array} data
+	 */
+	Iterator : function(data){
+		var index = 0,
+			data = data || [];
+		return {
+			/**
+			 * reset
+			 */
+			reset : function(){
+				index = 0;
+			},
+			
+			/**
+	 		* getNext
+	 		*/
+			getNext : function(){
+				return index < data.length ? data[index++] : undefined;
+			}
+		}
+	},
+	
+	
+	/**
+	 * internal __methods__
+	 */
+	
+	$break: 	{}, // 'not implemented',
+	
+	debug: function() {
+		if (device.implementation.options.debug && window.console && console.log) 
+			console.log(arguments);
+	},
+	
+	// notify developer of api action
+	notify: function(msg){
+		if (window.console && console.warn)
+			console.warn('API Notice -- ' + msg);
+	},
+	
+	getData : function(provider){
+		if (!device.implementation.data[provider])
+			throw "no data defined for provider '"+provider+"'";
+		
+		if (device.implementation.data[provider]['default'])
+			return device.implementation.data[provider]['default'];
+		else 
+			return device.implementation.data[provider]; 
+	},	
+	
+	getUniqueID : function(){
+		return Number(''+Number(new Date())+ Math.floor(1000*Math.random()));
+	},
+	
+	callAsync : function(object, method, criteria, callback, flag){
+		flag = flag || false;
+		var tid = setTimeout(function(){
+			var result,
+				eventCode = {completed:2, error:4, progress:9},
+				code = eventCode.completed;
+			try{
+				// call method in object's context
+				// flag is passed to trigger the method in case of mandatory callback arg
+				if (flag)
+					result = method.call(object, criteria, null, flag);
+				else
+					result = method.call(object, criteria);
+			} 
+			catch(e){
+				code = eventCode.error;
+			}
+			callback(tid, code, result);
+			
+		}, device.implementation.options.callbackDelay);
+		
+		return this.AsyncResult(tid);
+	},
+		
+	addListener : function(provider, eventType, criteria, callback, handler){
+		if (!device.implementation.listeners[provider])
+			device.implementation.listeners[provider] = {};
+			
+		var tid = this.getUniqueID();
+		device.implementation.listeners[provider][eventType] = {
+			'criteria': criteria,
+			'callback': callback,
+			'handler': handler,
+			'transactionID' : tid
+		};
+		return this.AsyncResult(tid);
+	},
+
+	/*
+	 * specify either eventType or transactionID
+	 * return true if found and removed
+	 */
+	removeListener: function(provider, eventType, transactionID){
+		transactionID = transactionID || null;
+		if (transactionID) {
+			var allEvents = device.implementation.listeners[provider];
+			for (var i in allEvents) {
+				var event = allEvents[i];
+				if (event.transactionID == transactionID) {
+					device.implementation.listeners[provider][i] = null;
+					delete device.implementation.listeners[provider][i];
+					return true;
+				}
+			}
+		}
+		else 
+			if (eventType &&
+			this.hasListener(provider, eventType)) {
+				device.implementation.listeners[provider][eventType] = null;
+				delete device.implementation.listeners[provider][eventType];
+				return true;
+			}
+		return false;
+	},
+
+	hasListener: function(provider, eventType) {	
+		if (!device.implementation.listeners[provider]
+			|| !device.implementation.listeners[provider][eventType])
+			return false;
+				
+		return true;
+	},
+
+	// pluck object properties as array	
+	keys: function(obj) {
+		var keys = [];
+		for (var p in obj)
+			keys.push(p);
+		return keys;
+	},
+	
+	// extend object properties 
+	extend: function(root, ext) {
+		for (var p in ext)
+			root[p] = ext[p];
+		return root;
+	},
+	
+	// extended text string functionality 
+	_t: function(str){
+		
+		str = typeof str != 'undefined' ? String(str) : '';
+		return new StringEx(str);
+	}		
+};
+
+	/**
+	 * extended String object (available only within device.implementation.context through _t() method)
+	 */ 
+	var StringEx = function(str){
+		// define base String non-transferrable methods!
+		this.toString = function(){return str;};
+		this.valueOf = function(){return str.valueOf();};
+	};
+	StringEx.prototype = new String();
+
+	
+	/**
+	 * simple sprintf-type functionality
+	 * 
+	 * "string {title} %s and %s and {here} ".arg({title:'T', here:'H'}, 1, 'there')"
+	 * ==> string T 1 and there and H
+	 * hash (if present) must be first argument
+	 *
+	 * @param {Object} [hash] optional hash to replace {tags}
+	 * @param {String,Number} data for %s tags
+	 * @return {String} original string with tags replaced   
+	 */
+	StringEx.prototype.arg = function(){
+	    var pattern = /\%s|\{\w+\}/g;
+	    var args = arguments, 
+			len = arguments.length, 
+			hash = arguments[0],
+			i = typeof hash == 'object' && !(hash instanceof String) ? 1 : 0;
+			
+	    return this.replace(pattern, function(capture){
+			var key = capture != '%s' && capture.match(/\w+/);
+			if (key)
+				return hash && hash[key] ? hash[key] : capture;
+			else		
+				return i < len ? args[i++] : capture;
+		});
+	}
+	
+	/**
+	 * trim whitespace from beginning and end of string
+	 * @return {String} trimmed string
+	 */
+	StringEx.prototype.trim = function(){
+		return this.replace(/^\s+/, '').replace(/\s+$/, '');
+	}
+	
+	/**
+	 * capitalize string
+	 * @return {String} capitalized string
+	 */
+	StringEx.prototype.capitalize = function(){
+    	return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+	}
+	
+})();
+
+
+/*
+ * device.implementation static (class) properties
+ */
+
+
+/**
+ * pointer to current instantiated device.implementation object.
+ * use to access device.implemenation namespace.
+ * 
+ * @see device.implementation 
+ */
+device.implementation.context = null;	
+
+
+/**
+ * emulation settings options
+ */
+device.implementation.options = {
+	
+	/**
+	 * callback delay (msec)
+	 * @property {Number} 
+	 */
+	callbackDelay	: 1200,
+	
+	/**
+	 * debug flag
+	 * @property {Boolean} 
+	 */
+	debug			: false,
+	
+	/**
+	 * enabled flag
+	 * @property {Boolean} 
+	 */
+	enabled			: true
+};
+
+
+/**
+ * store of interfaces (objects) in the current device implementation.
+ * format: [provider][interface]
+ * 
+ * @property {Object} 
+ */
+device.implementation.interfaces = {};
+
+
+/**
+ * store of data objects defined for current implementation.
+ * data is added useing the loadData method. 
+ * 
+ * @property {Object} format depends on data
+ */
+device.implementation.data = {};
+
+
+/**
+ * store of event listeners
+ * format: [provider][eventType]
+ */
+device.implementation.listeners = {}; 
+
+
+/*
+ * device.implementation static (class) methods
+ */
+
+
+/**
+ * Add a service provider to device implementation
+ * 
+ * @param {string} provider Name of service provider, eg, "Service.Calendar"
+ * @param {string} Interface Name of interface, eg, "IDataService"
+ * @param {Object} serviceProvider Service object
+ * @return  none
+ */
+device.implementation.extend = function(provider, Interface, serviceProvider){
+
+	if (!device.implementation.interfaces[provider])
+		device.implementation.interfaces[provider] = {}; 
+	
+	device.implementation.interfaces[provider][Interface] = serviceProvider;
+};
+
+
+/**
+ * Internal implementation to return a service provider interface object
+ * 
+ * @param {String} provider  Service provider name 
+ * @param {String} Interface	Provider interface name
+ * @exception {String} exception thrown if provider or interface is not implemented 
+ * @return {Object} the service provider interface object or 'undefined'
+ */	
+device.implementation.getInterface = function(provider, Interface){
+		
+	if (device.implementation.interfaces[provider] 
+		&& typeof device.implementation.interfaces[provider][Interface] == 'object') 
+	{
+		var service = new Object();
+		service[Interface] = device.implementation.interfaces[provider][Interface];
+		return service;
+	}
+	else
+		throw 'Error: unknown error'; 
+};
+
+
+/**
+ * Loads data to the data store
+ * 
+ * @param {String} provider  Service provider name 
+ * @param {String} type Data name/label
+ * @param {Function,Object,Array} dataFactory Function to generate the data object, or array/object
+ * @return none
+ */
+device.implementation.loadData = function(provider, type, dataFactory){
+
+	type = type || 'default';
+	if (!device.implementation.data[provider]) 
+		device.implementation.data[provider] = {};
+		
+	device.implementation.data[provider][type] = 
+		typeof dataFactory == 'function' 
+			? dataFactory()
+			: dataFactory;
+};
+
+
+/**
+ * trigger an event listener
+ * 
+ * @param {String} provider Service provider name
+ * @param {String} eventType event type 
+ * @param {Variant} data ReturnValue for callback function 
+ */
+device.implementation.triggerListener = function(provider, eventType, data){
+
+	if (!device.implementation.context.hasListener(provider, eventType)) {
+		device.implementation.context.notify('no listener defined for provider=' + provider + ', eventType=' + eventType);
+		return;
+	}
+	var listener = device.implementation.listeners[provider][eventType];
+
+	// call the provider's handler
+	listener.handler(listener.transactionID, listener.criteria, listener.callback, data);
+}
+
+
+
+/*
+ * ERROR CODES
+ */
+device.implementation.ERR_SUCCESS			 		= 0;
+device.implementation.ERR_INVALID_SERVICE_ARGUMENT	= 1000;
+device.implementation.ERR_UNKNOWN_ARGUMENT_NAME		= 1001;
+device.implementation.ERR_BAD_ARGUMENT_TYPE			= 1002;
+device.implementation.ERR_MISSING_ARGUMENT 			= 1003;
+device.implementation.ERR_SERVICE_NOT_SUPPORTED		= 1004;
+device.implementation.ERR_SERVICE_IN_USE 			= 1005;
+device.implementation.ERR_SERVICE_NOT_READY 		= 1006;
+device.implementation.ERR_NO_MEMORY		 			= 1007;
+device.implementation.ERR_HARDWARE_NOT_AVAILABLE	= 1008;
+device.implementation.ERR_SEVER_BUSY				= 1009;
+device.implementation.ERR_ENTRY_EXISTS				= 1010;
+device.implementation.ERR_ACCESS_DENIED				= 1011;
+device.implementation.ERR_NOT_FOUND					= 1012;
+device.implementation.ERR_UNKNOWN_FORMAT			= 1013;
+device.implementation.ERR_GENERAL_ERROR				= 1014;
+device.implementation.ERR_CANCEL_SUCCESS			= 1015;
+device.implementation.ERR_SERVICE_TIMEDOUT			= 1016;
+device.implementation.ERR_PATH_NOT_FOUND			= 1017;
+
+
+
+// instantiate device imlementation
+new device.implementation();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/loader.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,121 @@
+/*
+ * Emulator, which manages the device interacations
+ */
+if (typeof _BRIDGE_REF == "undefined" || !_BRIDGE_REF) {
+
+	var _BRIDGE_REF = {
+		parent: window.parent || false,
+		nokia: window.parent.NOKIA || false,
+		sysInfoObject : null
+	};
+
+	_BRIDGE_REF.namespace = function(name){
+		var parts = name.split('.');
+		var current = _BRIDGE_REF;
+		for (var key in parts) {
+			if (!current[parts[key]]) {
+				current[parts[key]] = {};
+			}
+			current = current[parts[key]];
+		}
+	};
+	
+	/*
+	 * _BRIDGE_REF.helper functions
+	 */
+	_BRIDGE_REF.namespace('helper.loadScript');
+	_BRIDGE_REF.helper = {
+		path: document.location.pathname,
+		loadScript: function(path){
+			var head = document.getElementsByTagName("head")[0] || document.documentElement;
+			var script = document.createElement("script");
+			
+			script.type = "text/javascript";
+			script.src = path;
+			head.appendChild(script);
+		},
+		
+		addEvent: function(obj, type, fn){
+			if (obj.addEventListener) {
+				obj.addEventListener(type, fn, false);
+			}
+			else 
+				if (obj.attachEvent) {
+					obj["e" + type + fn] = fn;
+					obj[type + fn] = function(){
+						obj["e" + type + fn](window.event);
+					}
+					obj.attachEvent("on" + type, obj[type + fn]);
+				}
+		},
+		
+		getElementsLengthInObject : function(items){
+			var count = 0;
+			for (var i in items) 
+				count++;
+			
+			return count;
+		},
+		
+		getBatteryStrength : function(){
+			
+		},
+		
+		console : function(){
+			if (!typeof window.console) {
+				_BRIDGE_REF.helper.loadScript("preview/script/lib/console.js");
+			}			
+		}
+		
+	};
+	
+	
+	/*
+	 Load Scripts
+	 */
+	_BRIDGE_REF.helper.loadScript("preview/script/lib/widget.js");
+	_BRIDGE_REF.helper.loadScript("preview/script/lib/systeminfo.js");
+	_BRIDGE_REF.helper.loadScript("preview/script/lib/menu.js");
+	_BRIDGE_REF.helper.loadScript("preview/script/lib/menuItem.js");
+	_BRIDGE_REF.helper.loadScript("preview/script/lib/console.js");
+
+	//	Inject SAPI scripts	
+	if (_BRIDGE_REF.nokia) {
+		var wrtVersion = _BRIDGE_REF.nokia.helper.readCookie('_WRT_VERSION');
+		if ((typeof wrtVersion == 'undefined') || (wrtVersion == 'WRT 1.1')) {
+			_BRIDGE_REF.nokia.version = 'WRT 1.1';
+			_BRIDGE_REF.nokia.helper.createCookie('_WRT_VERSION', 'WRT 1.1');
+			_BRIDGE_REF.helper.loadScript("preview/script/lib/device.js");
+		}
+		else {
+			_BRIDGE_REF.nokia.version = 'WRT 1.0';
+		}
+	}
+	else {
+		_BRIDGE_REF.helper.loadScript("preview/script/lib/device.js");
+	}
+
+	/*
+	 window native functions over-riding
+	 */
+	if ( (typeof window.frameElement != 'undefined') && (typeof _BRIDGE_REF.nokia  != 'undefined') && window !== window.parent) {
+		//	alert
+		window.alert = function(msg){
+			return window.parent.alert(msg);
+		};
+		
+		//	confirm
+		window.confirm = function(msg){
+			return window.parent.confirm(msg);
+		};
+		
+		//	prompt
+		window.prompt = function(msg, str){
+			return window.parent.prompt(msg, str)
+		};
+	}
+
+	//	make TRUE loader.js script loaded
+	window.parent.NOKIA.scriptsLoaded.loader = true;
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/menu.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,497 @@
+/**
+ * widget object constructor
+ * @param {void}
+ *     widget()
+ * @return {void}
+ */ 
+
+if (typeof window.menu == "undefined" || !window.menu) 
+{
+	window.menu = 
+	{
+		author : 'Nokia WRT Emulation Library',
+		items : [],
+		index : null,
+		isDimmed : false,	
+			
+		//	Event triggers
+		onShow : null,
+		onRightSoftKeySelect : null,
+	};
+	
+	
+	/*
+		Function 	:	menu.append()
+		Argument	:	MenuItem Object
+		Returns		:	Void
+		Description	:	Function appends MenuItem to a Menu Object
+	*/
+	menu.append = function(MenuItem)
+	{
+		if(this.allowedTypeOf(MenuItem))
+		{
+			var i;
+			var flag = true;
+			try{
+			for(var key in this.items)
+			{
+				if(this.items[key].id == MenuItem.id)
+				{	
+					flag = false; 
+					break; 
+				}
+			}} catch(e){ }
+			if(flag)
+			{
+				//	MenuItem.parent = this;
+				this.items[MenuItem.id] = MenuItem;
+			}
+		}
+	}
+	
+	
+	/*
+		Function 	:	menu.remove()
+		Argument	:	MenuItem Object
+		Returns		:	Void
+		Description	:	Function Remove the menuItem and its children from the container options menu.
+	*/
+	menu.remove = function(MenuItem)
+	{
+		if(!this.allowedTypeOf(MenuItem))
+			return false;
+	
+		var flag = false;
+		if (this.items.length) {
+			for (var key in this.items) {
+				if (this.items[key].id == MenuItem.id) {
+					flag = true;
+					break;
+				}
+			}
+		}
+		if(flag)
+		{
+			this.items.splice(key, 1);
+		}
+	}
+	
+	/*
+		Function 	:	menu.clear()
+		Argument	:	Void
+		Returns		:	Void
+		Description	:	Clears (deletes) all the menu items in the menupane.
+	*/
+	menu.clear = function()
+	{
+		try
+		{
+			this.items.splice(0, this.items.length);
+		}catch(e){}
+	}
+	
+	
+	/*
+		Function 	:	Menu.getMenuItemById(id)
+		Argument	:	Integer
+		Returns		:	MenuItem Object
+		Description	:	Function get the MenuItem Object with the reference of id
+	*/
+	menu.getMenuItemById = function(id)
+	{
+		var menuItemRef = menu.menuItemExhistsById(this, id, 0);
+		if(this.allowedTypeOf(menuItemRef))
+			return menuItemRef;
+		else
+			return undefined;
+	}
+	
+	
+	/*
+		Function 	:	Menu.getMenuItemByName(name)
+		Argument	:	String
+		Returns		:	MenuItem Object
+		Description	:	Function get the MenuItem Object with the reference of String name
+	*/
+	menu.getMenuItemByName = function(name)
+	{
+		var menuItemRef = menu.menuItemExhistsById(this, name, 1);
+	
+	//	if(menuItemRef !=null)
+		if(this.allowedTypeOf(menuItemRef))
+			return menuItemRef;
+		else
+			return undefined;
+	}
+	
+	/*
+		Function 	:	Menu.setRightSoftkeyLabel()
+		Argument	:	String, Function
+		Returns		:	Void
+		Description	:	Set the label of the right soft key to str. This enables the default text 
+						to be changed from exit and a new function assigned by setting a callbackfunction
+	*/
+
+	menu.setRightSoftkeyLabel = function(label, callback)
+	{
+		window.menu = this;
+		try
+		{
+			if(typeof label != '' && !label)
+				this.setExitToRsk();			
+
+			else if(typeof callback != 'function' && !callback)
+				this.setExitToRsk();			
+			
+			else if (_BRIDGE_REF.nokia.menu.setRsk(callback)) {
+				_BRIDGE_REF.parent.$("#RskLabel > a")[0].innerHTML = label;
+				_BRIDGE_REF.nokia.menu.rsk_label = label;
+				_BRIDGE_REF.nokia.menu.rsk_event = callback;
+				_BRIDGE_REF.nokia.menu.is_rsk_overridden = true;
+			}
+			else 
+				this.setExitToRsk();
+
+		}catch(e){ 
+			// alert(e);
+		 }
+	}
+
+
+	menu.setExitToRsk = function()
+	{
+		this.onRightSoftKeySelect = null;
+
+		_BRIDGE_REF.nokia.menu.is_rsk_overridden = false;
+		_BRIDGE_REF.nokia.menu.rsk_label = '';
+		_BRIDGE_REF.nokia.menu.rsk_event = null;
+		_BRIDGE_REF.parent.$("#RskLabel > a")[0].innerHTML = 'Exit';
+
+		_BRIDGE_REF.nokia.menu.setRsk(function(){
+			_BRIDGE_REF.nokia.menu.exit();
+		});
+	}
+	
+	/*
+		Function 	:	Menu.showSoftkeys()
+		Argument	:	Void
+		Returns		:	Void
+		Description	:	Makes the softkeys visible. By default the softkeys are not visible
+	
+	*/
+	menu.showSoftkeys = function()
+	{
+		/*
+		 *  Shows showSoftkeys
+		 */
+		_BRIDGE_REF.nokia.menu.softkeys_visibility = true;
+		_BRIDGE_REF.nokia.menu.showSoftKeys();
+	}
+	
+	/*
+		Function 	:	Menu.hideSoftkeys()
+		Argument	:	Void
+		Returns		:	Void
+		Description	:	Makes the softkeys invisible. By default the softkeys are not visible. 
+	
+	*/
+	menu.hideSoftkeys = function()
+	{
+		/*
+		 *  Hide showSoftkeys
+		 */
+		_BRIDGE_REF.nokia.menu.softkeys_visibility = false;
+		_BRIDGE_REF.nokia.menu.hideSoftKeys();
+	}
+	
+	
+	/*	
+	 *  
+	 * ----------------------------------------------------------------
+	 * Exta Functionalities which helps to make main functions to work
+	 * ----------------------------------------------------------------
+	 *  
+	*/
+	
+	menu.cancel = function()
+	{
+		_BRIDGE_REF.nokia.menu.cancel();
+	}
+	
+	menu.exit = function()
+	{
+		_BRIDGE_REF.nokia.menu.exit();
+	}
+	
+	
+	menu.triggeLSKEvent = function()
+	{
+		if(typeof(window.menu.onShow) == 'function')
+		{
+				window.menu.onShow();
+		}
+		_BRIDGE_REF.parent.$('#softKeysPane').show();
+		this.show();
+	}
+	
+	menu.triggerEvent = function(MenuItemId)
+	{
+		try{
+			var menuItemRef = this.menuItemExhistsById(this, MenuItemId, 0);
+			if(menuItemRef != null)
+			{
+				if(typeof menuItemRef.onSelect == 'function')
+					menuItemRef.onSelect(MenuItemId);
+		
+				if(_BRIDGE_REF.helper.getElementsLengthInObject(menuItemRef.items))
+					this.show(MenuItemId);
+				else
+					this.cancel();
+
+			}else
+			{
+				this.show();
+			}
+		}
+		catch(e)
+		{
+			alert('triggeEvent: '+MenuItemId+' >> '+e);
+		}
+	}
+	
+	menu.hasChild = function(parentId)
+	{
+		for(var i in this.items)
+		{
+			if(this.items[i].parentId == parentId)
+			{	
+				 return true;
+			}
+		}
+		return false;
+	}
+	
+	
+	menu.allowedTypeOf = function(MenuItem)
+	{
+		try
+		{
+			if( (typeof(MenuItem) == 'object') && (MenuItem.type == 'MenuItem'))
+				return true;			
+		}
+		catch(e)
+		{
+			return false;
+		}
+	}
+	
+	menu.show = function(parentId)
+	{
+		try
+		{
+			var menuItemsPane = _BRIDGE_REF.parent.$('#MenuItemsArea')
+			menuItemsPane = menuItemsPane[0];
+			
+			menuItemsPane.innerHTML = '';
+			
+			var ul = document.createElement('ul');
+			var ele = window.menu;
+
+			if(typeof parentId != 'undefined' && typeof parentId == 'object')
+			{
+				if (typeof window.menu.onShow != null && typeof window.menu.onShow == 'function') {
+					window.menu.onShow();
+				}
+			}
+
+			if(typeof parentId == 'number')
+			{
+				var tempRef = menu.menuItemExhistsById(ele, parentId, 0);
+	
+				if(typeof parentId != 'undefined' && typeof tempRef != 'undefined')
+					ele = tempRef;
+			}
+
+			if(_BRIDGE_REF.helper.getElementsLengthInObject(ele.items))
+			{
+				for(var key in ele.items)
+				{
+					if(!ele.items[key].isDimmed){
+						
+						try{
+							ul.appendChild(menu.create_menuElement(ele.items[key]));
+						}catch(e){  }
+					}
+				}
+				if(typeof parentId == 'number' && _BRIDGE_REF.helper.getElementsLengthInObject(ele.items))
+				{
+					if(ele.parent)
+						ul.appendChild(menu.create_normalMenuItem('Back', ele.parent.id));	
+					else
+						ul.appendChild(menu.create_normalMenuItem('Back', null));	
+				}
+				else
+				{
+					ul.appendChild(menu.create_exitMenuItem());	
+				}
+
+
+				if(_BRIDGE_REF.helper.getElementsLengthInObject(ele.items) > 5)
+					menuItemsPane.style.overflowY = 'scroll';
+				else
+					menuItemsPane.style.overflowY = 'hidden';
+
+			}
+			else
+			{
+				menuItemsPane.style.overflowY = 'hidden';
+				ul.appendChild(menu.create_exitMenuItem());	
+			}
+			menuItemsPane.innerHTML = '<ul>'+ul.innerHTML+'</ul>';
+			
+			_BRIDGE_REF.nokia.menu.show();
+		}
+		catch(e)
+		{
+			alert('menu.show: '+e);
+		}
+	}
+
+
+
+/*
+*
+*	HELPER FUNCTIONS
+*
+*/
+
+	menu.menuItemExhistsById = function(menuReference, value, argumentType)
+	{
+		var flag = null;
+		
+		for(var key in menuReference.items)
+		{
+			if(!argumentType)
+			{
+				if(menuReference.items[key].id == value)
+				{	
+					flag = true; 
+					break; 
+				}
+			}
+			else
+			{
+				if(menuReference.items[key].name == value)
+				{	
+					flag = true; 
+					break; 
+				}
+			}
+			
+			if(menuReference.items[key].items != undefined && menuReference.items[key].items.length)
+			{
+				var temp = this.menuItemExhistsById(menuReference.items[key], value, argumentType);
+				if(temp)
+					return temp;
+			}
+		}
+		if(flag)
+		{
+			// crate a package and send it
+			menuReference.items[key].index = key;
+			return menuReference.items[key];
+		}
+		else
+			return null;
+	}
+	
+	menu.create_menuElement = function(MenuItem) 
+	{
+		var listitem = document.createElement('li');
+		listitem.id = MenuItem.id;
+		listitem.setAttribute('onClick', 'javascript:NOKIA.emulator.child.menu.triggerEvent('+MenuItem.id+');');
+	
+	    var anchor = document.createElement('a');
+		anchor.id = 'subMenuItem_'+MenuItem.id;
+		anchor.innerHTML = MenuItem.name;
+		if(_BRIDGE_REF.helper.getElementsLengthInObject(MenuItem.items))
+	 	{  
+			anchor.className = 'subMenuItem';
+			anchor.setAttribute('href', 'javascript:NOKIA.emulator.child.menu.show('+MenuItem.id+');');
+		}
+	    listitem.appendChild(anchor);
+		return (listitem);
+	}
+	
+	menu.create_normalMenuItem = function(MenuTitle, index) 
+	{
+	    var listitem = document.createElement('li');
+	
+	    var anchor = document.createElement('a');
+		anchor.id = 'subMenuItem_BACK';
+		anchor.innerHTML = MenuTitle;
+	
+		if (MenuTitle == 'Back') {
+			listitem.className = 'exitOrBackBtn';
+			anchor.setAttribute('href', 'javascript:NOKIA.emulator.child.menu.triggerEvent(' + index + ');');
+		}
+		else 
+			anchor.setAttribute('href', 'javascript:NOKIA.emulator.child.menu.triggerEvent(' + index + ');');
+	    
+		listitem.appendChild(anchor);
+		return (listitem);
+	}
+	
+	menu.create_exitMenuItem = function() 
+	{
+	    var listitem = document.createElement('li');
+		listitem.className = 'exitOrBackBtn';
+	    var anchor = document.createElement('a');
+		anchor.id = 'subMenuItem_EXIT';
+		anchor.innerHTML = 'Exit';
+		anchor.setAttribute('href', 'javascript:NOKIA.emulator.child.menu.exit();');
+		listitem.setAttribute('onClick', 'javascript:NOKIA.emulator.child.menu.exit();');
+		
+	    listitem.appendChild(anchor);
+		return (listitem);
+	}
+	
+	menu.triggeRSK = function()
+	{
+		try {
+			if (window.menu) {
+				if (childToParent_Reference.$('softKeysPane').style.display != 'none') {
+					if (window.menu.onRightSoftKeySelect != null) {
+						window.menu.onRightSoftKeySelect();
+						window.menu.cancel();
+					}
+					else {
+						window.menu.cancel();
+					}
+				}
+			}
+		}catch(e)
+		{
+			alert(e);
+		}
+	}
+	
+	menu.triggeLSK = function()
+	{
+		if(window.menu)
+		{
+			window.menu.show();
+			if(typeof(window.menu.onShow) == 'function')
+			{
+				if(window.menu.onShow)
+				{
+					window.menu.onShow();
+				}
+			}
+		}
+	}
+
+
+	//	make TRUE menu.js script loaded
+	window.parent.NOKIA.scriptsLoaded.menu = true;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/menuItem.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,93 @@
+/*
+	Function 	:	MenuItem()
+	Argument	:	Void
+	Returns		:	Void
+	Description	:	Constructor Function creates a Menu object to the WINDOW
+*/
+
+function MenuItem(name, id)
+{
+	this.id = id;
+	this.name = name;
+	this.isDimmed = false;
+	
+	this.items = [];
+	this.index = null;
+	this.parent = null;
+	this.type = 'MenuItem';
+	
+	
+	//	Event triggers
+	this.onSelect = null;
+}
+
+
+/*
+	Function 	:	MenuItem.append(MenuItem)
+	Argument	:	Menu Object
+	Returns		:	Void
+	Description	:	Function appends childMenuItem to a MenuItem
+*/
+MenuItem.prototype.append = function(childMenuItem)
+{
+	if( (childMenuItem != null) && (childMenuItem.type == 'MenuItem'))
+	{
+		childMenuItem.parent = this;
+		this.items[childMenuItem.id] = childMenuItem;
+	}
+}
+
+
+/*
+	Function 	:	MenuItem.remove()
+	Argument	:	Menu Object
+	Returns		:	Void
+	Description	:	Function Removes childMenuItem and its children from the parent menu item.
+*/
+MenuItem.prototype.remove = function(childMenuItem)
+{
+	if((childMenuItem != null) && (childMenuItem.type == 'MenuItem'))
+	{
+		var i = this.search(childMenuItem);
+		if(i > -1)
+			this.items.splice(i, 1);
+	}
+}
+
+/*
+	Function 	:	MenuItem.remove()
+	Argument	:	Menu Object
+	Returns		:	Void
+	Description	:	If flag is true the MenuItem is hidden and if flag is false the item is shown.
+*/
+MenuItem.prototype.setDimmed = function(flag)
+{
+	this.isDimmed = flag;
+}
+
+
+/*
+	Function 	:	MenuItem.search()
+	Argument	:	MenuItem Object
+	Returns		:	Integer
+	Description	:	Function Replace oldMenuItem with newMenuItem
+*/
+MenuItem.prototype.search = function(MenuItem)
+{
+		var flag = false;
+		for(var i in this.items)
+		{
+			if(this.items[i].id == MenuItem.id)
+			{	
+				flag = true; 
+				break; 
+			}
+		}
+		if(flag)
+			return i;
+		else
+			return -1;		
+}
+
+//	make TRUE menuItem.js script loaded
+window.parent.NOKIA.scriptsLoaded.menuItem = true;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/AppManager.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,223 @@
+/**
+ * AppManager.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.AppManager',
+		Interface = 'IAppManager';
+
+	/**
+	 * AppManager service
+	 */
+	var AppManagerService = function(){
+		this.GetList 	= __GetList;
+		this.LaunchApp	= __LaunchApp;
+		this.LaunchDoc	= __LaunchDoc;
+		this.Cancel 	= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new AppManagerService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * AppManager: GetList
+	 * @param {Object} criteria
+	 */
+	function __GetList(criteria){
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^(Application|UserInstalledPackage)$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+		
+		// check if a callback was provided
+		if (arguments.length > 1)
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.badAsync);
+		
+		var returnValue,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		if (criteria.Filter)
+			context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));
+
+		// Type = UserInstalledPackage
+		if (!/UserInstalledPackage/i.test(criteria.Type)){
+
+			returnValue = context.Iterator( DBase[criteria.Type] || [] );
+
+		} else {
+		// Type = Application
+			// @todo: apply filter criteria
+			
+			returnValue = context.Iterator( DBase[criteria.Type] || [] );
+		}
+
+		return context.Result(returnValue);
+	}
+			
+	/**
+	 * AppManager: LaunchApp
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __LaunchApp(criteria, callback){
+
+		if ((result = validator.apply('LaunchApp', arguments)) !== false)
+			return result; 
+		
+		if (typeof criteria.ApplicationID == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingAppID);
+
+		// app id must be in the form "s60uid://<appid>" where <appid> is 
+		// what is returned by GetList.
+		var appId = criteria.ApplicationID;
+		
+		if (!/^s60uid:\/\/0x/i.test(appId))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+	
+		if (criteria.CmdLind)
+			context.notify(_t('%s:: LaunchApp : CmdLine not implemented in preview').arg(provider));
+
+		if (criteria.Options)
+			context.notify(_t('%s:: LaunchApp : Options not implemented in preview').arg(provider));
+
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		appId = appId.replace(/^s60uid:\/\//i, '');	
+		DBase = context.getData(provider);
+
+		for(var type in DBase){
+			for(var i in DBase[type]) {
+				var item = DBase[type][i];
+				if (item.Uid == appId) {
+					// found!
+					context.notify(_t('%s:: LaunchApp : application found & launched : id=%s').arg(provider, appId));
+					return context.ErrorResult(device.implementation.ERR_SUCCESS);
+				}
+			}
+		}
+		// if not found
+		return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+	}
+			
+	/**
+	 * AppManager: LaunchDoc
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __LaunchDoc(criteria, callback){
+
+		if ((result = validator.apply('LaunchDoc', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Document == 'undefined' && typeof criteria.MimeType == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDoc);
+
+		if (typeof criteria.Document != 'undefined' && !criteria.Document.DocumentPath)
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+
+		if (criteria.Options)
+			context.notify(_t('%s:: LaunchDoc : Options not implemented in preview').arg(provider));
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		// nothing to launch in emulation, just notify user
+		context.notify(_t('%s:: LaunchDoc : document launched').arg(provider));
+		
+		if (criteria.Document)
+			// return success
+			return context.ErrorResult(device.implementation.ERR_SUCCESS);
+		else
+			// for mimetype, return value name of document
+			return context.Result('', device.implementation.ERR_SUCCESS);
+	}
+
+	
+
+	/**
+	 * AppManager: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['AppManager',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+			
+		if (!criteria || typeof criteria != 'object')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		return failed;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType		: '%s:%s:Content Type Missing',
+		badAsync		: 'AppManger:GetList:Asynchronous version of API is not supported',	// typo on device!
+		missingAppID	: '%s:%s:Application ID  Missing',	// double space between ID & missing!!
+		missingDoc		: '%s:%s:Document/MimeType Missing/value more than expected length ',
+		missingTID		: '%s:Incorrect TransactionID',
+		is_invalid		: '%s:%s:%s is invalid'
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Calendar.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,410 @@
+/**
+ * Calendar.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Calendar' ,
+		Interface = 'IDataSource';
+
+	/**
+	 * Calendar service
+	 */
+	var CalendarService = function(){
+		this.GetList 	= __GetList;
+		this.Add 		= __Add;
+		this.Delete 	= __Delete;
+		this.Import 	= __Import;
+		this.Export 	= __Export;
+		this.Cancel 	= __Cancel;
+		this.RequestNotification = __RequestNotification;
+	}
+
+	device.implementation.extend(provider, Interface, new CalendarService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null,
+		default_calendar = 'C:Calendar';
+	
+	/**
+	 * Calendar: GetList
+	 * @param {Object} criteria
+	 */
+	function __GetList(criteria){
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		// Type = Calendar
+		if (!/CalendarEntry/i.test(criteria.Type)){
+			var cals = [default_calendar];
+			if (filter && filter.DefaultCalendar === false)
+				cals = context.keys(DBase)
+
+			returnValue = cals;
+
+		} else {
+		// Type = CalendarEntry
+			var cal = default_calendar;
+			if (filter && filter.CalendarName)
+				cal = filter.CalendarName;
+			
+			if (!(cal in DBase))
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badCalendar);
+
+			// filter by id or LocalId
+			if (filter && (filter.id || filter.LocalId)) {
+				var which = filter.id ? 'id' : 'LocalId', 
+					id = filter[which];
+					
+				for (var i in DBase[cal]) {
+					if (id == DBase[cal][i][which]) {
+						returnValue.push(DBase[cal][i]);
+					}
+				}
+			}
+			// filter by type 
+			else if (filter && filter.Type && !/IncludeAll/i.test(filter.Type)) {
+				for (var i in DBase[cal]) {
+					// match on type is case insensitive
+					if (filter.Type.toLowerCase() == DBase[cal][i].Type.toLowerCase()) {
+						returnValue.push(DBase[cal][i]);
+					}
+				}
+			}
+			// unsupported filters 
+			else if (filter 
+				&& (match = context.keys(filter).join().match(/StartRange|EndRange|SearchText/ig)) ) {
+				context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+			}
+			// return everything 
+			else {
+				returnValue = DBase[cal];
+			}
+		}
+
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+	/**
+	 * Calendar: Add
+	 * @param {Object} criteria
+	 */
+	function __Add(criteria){
+		if ((result = validator.apply('Add', arguments)) !== false)
+			return result; 
+		
+		var Item = criteria.Item || false; 
+		
+		DBase = context.getData(provider);
+
+		// Type = Calendar
+		if (!/CalendarEntry/i.test(criteria.Type)){
+
+			if (!Item || !Item.CalendarName)
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingCalendar);
+				
+			var cal = Item.CalendarName;
+			if (cal in DBase) {
+				return error(device.implementation.ERR_ENTRY_EXISTS);
+			}
+
+			// @todo: validate calendar name <drive>:<name>
+			// return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badCalendar);
+			
+			// create new calendar
+			device.implementation.loadData(provider, cal, []);
+			return error(device.implementation.ERR_SUCCESS);
+
+		} else {
+		// Type = CalendarEntry
+
+			if (!Item)
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_missing, 'Item');
+				
+			var cal = Item.CalendarName || default_calendar;
+
+			// if calendar doesn't exist and it's the default, create it
+			if (!(cal in DBase) && cal == default_calendar)
+				device.implementation.loadData(provider, cal, []);
+			
+			if (!(cal in DBase))
+				return error(device.implementation.ERR_NOT_FOUND);
+
+			// update existing item?
+			if ('LocalId' in Item) {
+				
+				if (!Item.LocalId && Item.LocalId !== 0)
+					return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'LocalId');
+				
+				if ('InstanceStartTime' in Item)
+					context.notify(_t('%s:: Add : InstanceStartTime not implemented in preview.').arg(provider));
+
+				// can't update id
+				delete Item.id;
+				
+				//  search for and update item
+				var found = false;
+				for (var i in DBase[cal]) {
+					var entry = DBase[cal][i];
+					if (entry.LocalId == Item.LocalId) {
+						context.extend(entry, Item);
+						Item.id = entry.id;
+						found = true;
+						break;
+					}
+				}
+				if (!found)
+					return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'LocalId');
+
+			} else {
+			// add new item
+				// generate new id and localId 
+				// -- in calendar id's are string!
+				Item.id = String(context.getUniqueID());
+				Item.LocalId = String(context.getUniqueID());
+				DBase[cal].push(Item);
+			} 
+		} 
+		// return success
+		return context.Result(Item.id, device.implementation.ERR_SUCCESS);
+	}
+			
+
+	/**
+	 * Calendar: Delete
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional - valid only for CalendarEntry)
+	 */
+	function __Delete(criteria, callback){
+		
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		var Data = criteria.Data || false; 
+		if (!Data || typeof Data != 'object')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'Data');
+		
+		// only sync call supported for Calendar
+		if (!/CalendarEntry/i.test(criteria.Type) && typeof callback == 'function')
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.noAsync);
+
+		DBase = context.getData(provider);
+		var cal = Data.CalendarName || default_calendar;			
+		if (!(cal in DBase))
+			return error(device.implementation.ERR_NOT_FOUND);
+		
+		// Type = Calendar
+		if (!/CalendarEntry/i.test(criteria.Type)) {
+			// CalendarName is mandatory
+			if (!Data.CalendarName)
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_missing, 'CalendarName');
+						
+			DBase[cal] = null;
+			delete DBase[cal];
+		}
+		else {
+		// Type = CalendarEntry
+
+			if (!context.keys(Data).join().match(/IdList|LocalIdList|DeleteAll|StartRange|EndRange/ig))
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_missing, 'Data');
+
+			if (typeof callback == 'function') {
+				return context.callAsync(this, arguments.callee, criteria, callback);
+			}
+
+			var which = Data.IdList ? 'IdList' : 'LocalIdList',
+				idList = Data[which] || false;
+				
+			if (idList) {
+				//  search for and delete items
+				for (var id in idList) {
+					id = idList[id];
+					for (var i in DBase[cal]) {
+						if (id == DBase[cal][i][which]) {
+							DBase[cal].splice(i, 1);
+						}
+					}
+				}
+			}
+			else if (Data.DeleteAll && Data.DeleteAll === true){
+				delete DBase[cal];
+				DBase[cal] = [];
+			}
+
+			if (Data.StartRange || Data.EndRange) {
+				context.notify(_t('%s:: Delete : StartRange / EndRange not implemented in preview.').arg(provider));
+			}
+		}
+		// return success
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);				
+	}
+			
+
+	/**
+	 * Calendar: Import
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __Import(criteria, callback){
+
+		if ((result = validator.apply('Import', arguments)) !== false)
+			return result; 
+
+		var Data = criteria.Data || false; 
+		if (!Data)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'Data');
+		
+		if (!Data.FileName)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'FileName');
+
+		if (!Data.Format)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'Format');
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
+		var returnValue = context.Iterator([]);
+		return context.Result(returnValue, device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Calendar: Export
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __Export(criteria, callback){
+
+		if ((result = validator.apply('Export', arguments)) !== false)
+			return result; 
+
+		var Data = criteria.Data || false; 
+		if (!Data)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'Data');
+
+		if (!Data.Format)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.is_invalid, 'Format');
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+		context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
+		var returnValue = '';
+		return context.Result(returnValue, device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Calendar: RequestNotification
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call 
+	 */
+	function __RequestNotification(criteria, callback){
+
+		if ((result = validator.apply('RequestNotification', arguments)) !== false)
+			return result; 
+
+		if (typeof callback != 'function')
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.badAsync);
+
+		context.notify(_t('%s:: RequestNotification : not implemented in preview.').arg(provider));
+		var result = context.ErrorResult(device.implementation.ERR_SUCCESS);
+		result.TransactionID = 0;
+		return result;		
+	}
+			
+
+	/**
+	 * Calendar: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['Calendar',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+			
+		if (!criteria)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+			
+		if (typeof criteria != 'object' || typeof criteria.Type == 'undefined')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+		
+		var TypeRE = /Import|Export|RequestNotification/i.test(method)
+			? /^CalendarEntry$/i
+			: /^(Calendar|CalendarEntry)$/i;
+		 
+		if (!TypeRE.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+		
+		return failed;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		badType			: '%s : %s : Type is invalid',
+		badCalendar		: '%s : %s : CalendarName is invalid',
+		missingCalendar	: '%s : %s : CalendarName is missing',
+		missingTID 		: '%s : %s : TransactionID is missing',
+		badAsync		: '%s : %s : Invalid async parameters',
+		noAsync			: '%s : %s : Async not supported',
+		is_missing		: '%s : %s : %s is missing',
+		is_invalid		: '%s : %s : %s is invalid'
+	};
+		
+
+}) ();
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Contact.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,407 @@
+/**
+ * Contact.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Contact' ,
+		Interface = 'IDataSource';
+
+	/**
+	 * Contact service
+	 */
+	var ContactService = function(){
+		this.GetList 	= __GetList;
+		this.Add 		= __Add;
+		this.Delete 	= __Delete;
+		this.Import 	= __Import;
+		this.Export 	= __Export;
+		this.Organise	= __Organise;
+		this.Cancel 	= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new ContactService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * Contact: GetList
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __GetList(criteria, callback){
+
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+	
+		if (!/^(Contact|Group|Database)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+	
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		// Type = Database
+		if (/Database/i.test(criteria.Type)){
+			returnValue = DBase.Database;
+		} 
+		// Type = Group
+		else if (/Group/i.test(criteria.Type)){
+			// filter by id
+			if (filter && filter.id) {
+				returnValue = findById(DBase.Group, filter.id);
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_NOT_FOUND);
+			}
+			// return all groups 
+			else {
+				returnValue = DBase.Group;
+			}
+		}				
+		// Type = Contact
+		else if (/Contact/i.test(criteria.Type)){
+
+			// filter by id
+			if (filter && filter.id) {
+				returnValue = findById(DBase.Contact, filter.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_NOT_FOUND);
+			}
+			// return all contacts 
+			else {
+				returnValue = DBase.Contact;
+			}
+
+			// unsupported filters 
+			if (filter 
+				&& (match = context.keys(filter).join().match(/SearchVal|DBUri/ig)) ) {
+				context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+			}
+			// unsupported sort			
+			if (criteria.Sort) { 
+				context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
+			}
+		}
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+	/**
+	 * Contact: Add
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Add(criteria, callback){
+
+		if ((result = validator.apply('Add', arguments)) !== false)
+			return result; 
+		
+		if (!/^(Contact|Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		DBase = context.getData(provider);
+		var Data = criteria.Data,
+			item;
+
+		// unsupported!			
+		if (Data.DBUri) {
+			context.notify(_t('%s:: Add : Data.DBUri not implemented in preview').arg(provider));
+		}
+
+		// Type = Group
+		if (/Group/i.test(criteria.Type)){
+
+			if (!Data.GroupLabel)
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingGroupLabel);
+
+			// update
+			if (Data.id) {
+				returnValue = findById(DBase.Group, Data.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+				
+				returnValue[0].GroupLabel = Data.GroupLabel;
+				//@todo: group contents!?
+			}
+			// new
+			else {
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Group.push(item);
+			}
+		} 
+		// Type = Contact
+		else {
+			// update
+			if (Data.id) {
+				returnValue = findById(DBase.Contact, Data.id); 
+				if (returnValue.length == 0)
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+				
+				context.extend(returnValue[0], Data); 
+			}
+			// new
+			else {
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Contact.push(item);
+			}
+		} 
+		// return success
+		return error(device.implementation.ERR_SUCCESS);
+	}
+			
+
+	/**
+	 * Contact: Delete
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Delete(criteria, callback){
+		
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact|Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+		var Data = criteria.Data;
+		if (!Data.IdList)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+		if (typeof Data.IdList != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+		
+		DBase = context.getData(provider);
+		var type = criteria.Type;
+
+		// unsupported!			
+		if (Data.DBUri) {
+			context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));
+		}
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		// for both Group & Contact:
+		var i,j,id,item;
+		for (j in Data.IdList) {
+			id = Data.IdList[j];
+			for (i in DBase[type]) {
+				item = DBase[type][i];
+				if (id == item.id) {
+					DBase[type].splice(i, 1);
+				}
+			}
+		}
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+			
+
+	/**
+	 * Contact: Import
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Import(criteria, callback){
+
+		if ((result = validator.apply('Import', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType3);
+
+		var Data = criteria.Data;
+		if (!Data.SourceFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Export
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Export(criteria, callback){
+
+		if ((result = validator.apply('Export', arguments)) !== false)
+			return result; 
+
+		if (!/^(Contact)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType4);
+
+		var Data = criteria.Data;
+		if (!Data.DestinationFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestinationFile);
+
+		if (!Data.id)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Organise
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Organise(criteria, callback){
+
+		if ((result = validator.apply('Organise', arguments)) !== false)
+			return result; 
+
+		if (!/^(Group)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badType5);
+
+		var Data = criteria.Data;
+		if (!Data.id)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId2);
+
+		if (!Data.IdList)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+
+		if (typeof Data.IdList != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+
+		if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badOperationType);
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Contact: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['Contacts',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+			
+		if (!criteria || typeof criteria != 'object' || typeof criteria.Type == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType, method);
+
+		if (method == 'GetList') return failed;
+
+		var Data = criteria.Data || false; 
+		if (!Data)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData, method);
+		if (typeof Data != 'object')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badData);
+		 
+		return failed;
+	}
+
+
+	function findById(dbase, id){
+		var result = [];
+		for (var i in dbase) {
+			if (id == dbase[i]['id']) {
+				result.push(dbase[i]);
+			}
+		}
+		return result;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType		: '%s : %s : Type is Missing',
+		badType			: '%s: %s : Invalid value for Type, Must be Contact/Group/Database',
+		badType2		: '%s : %s : Invalid Type, must be Contact/Group',
+		badType3		: '%s : %s : Invalid Type,it must be Contact',
+		badType4		: '%s : %s : Invalid Type, it must be Contact',
+		badType5		: '%s : %s : Invalid Content Type, It must be Group',
+		badOperationType: '%s : %s : Invalid Operation Type',
+		missingGroupLabel: '%s : %s : Group Label is Missing',
+		missingTID 		: 'Contact : Cancel : TransactionID is missing',	// not 'Contacts'!!
+		badAsync		: '%s : %s : Invalid async parameters',
+		missingData		: '%s : %s : %s data Missing',
+		badData			: '%s : %s : Invalid Type of Data , Map is required',
+		missingIdList	: '%s : %s : List of Ids is missing',
+		badIdList		: '%s : %s : Type of IdList is wrong, List is required',
+		missingSourceFile: '%s : %s : Import Source Filename is Missing',
+		missingDestinationFile: '%s : %s : Export Destination Filename is Missing',
+		missingId		: '%s : %s : Contact Id to be exported is missing',
+		missingId2		: '%s : %s : GroupId is missing',
+		is_missing		: '%s : %s : %s is missing',
+		is_invalid		: '%s : %s : %s is invalid'
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Landmarks.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,556 @@
+/**
+ * Landmarks.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Landmarks',
+		Interface = 'IDataSource';
+
+	/**
+	 * Landmark service
+	 */
+	var LandmarkService = function(){
+		this.New 		= __New;
+		this.GetList 	= __GetList;
+		this.Add		= __Add;
+		this.Delete		= __Delete;		
+		this.Import 	= __Import;
+		this.Export		= __Export;
+		this.Organise	= __Organise;
+		this.Cancel		= __Cancel;				
+	}
+
+	device.implementation.extend(provider, Interface, new LandmarkService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+
+	/**
+	 * Landmarks: New
+	 * @param {Object} criteria
+	 */
+	function __New(criteria){
+		if ((result = validator.apply('New', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^(Landmark|Category)$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);		
+		
+		var returnValue;
+		
+		if(criteria.Type == 'Landmark')
+		{
+			returnValue = {
+				'LandmarkName'		: '',
+				'id' 				: '',
+				'CategoryInfo'		: '',
+				'LandmarkDesc'		: '',
+				'LandmarkPosition'	: {
+										'Latitude'	: '',
+										'Longitude' : '',
+										'Altitude' 	: '',
+										'HAccuracy' : '',
+										'VAccuracy' : '',
+										'VAccuracy' : ''
+									  },
+				'CoverageRadius'	: '',
+				'IconFile'			: '',
+				'IconIndex'			: '',
+				'IconMaskIndex'		: '',
+				'LandmarkFields'	: {
+										'Street'		: '',
+										'BuildingName'	: '',
+										'District'		: '',
+										'City'			: '',
+										'AreaCode'		: '',
+										'Telephone'		: '',
+										'Country'		: ''
+									  }
+			};
+		}
+		else //Category
+		{
+			returnValue = {
+				'CategoryName'	: '',
+				'id' 			: '',
+				'GlobalId'		: '',
+				'IconFile'		: '',
+				'IconIndex'		: '',
+				'IconMaskIndex'	: ''
+			};
+		}
+
+		return context.Result(returnValue);
+	}
+	
+	/**
+	 * Landmarks: GetList
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __GetList(criteria, callback){
+		
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^(Landmark|Category|Database)$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		if (criteria.Filter)
+			context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));
+
+ 		if(criteria.Sort)
+			context.notify(_t('%s:: GetList : Sort is not implemented in preview').arg(provider));
+
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+		
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+
+		if (/Database/i.test(criteria.Type)) {				// Type = Database
+			
+			returnValue = context.Iterator( DBase.Database || [] );
+			
+		} else if (/Landmark/i.test(criteria.Type)){ 		// Type = Landmark
+			
+			returnValue = context.Iterator( DBase[criteria.Type] || [] );
+			
+		} else {											// Type = Category
+		
+			// @todo: apply filter criteria
+			returnValue = context.Iterator( DBase[criteria.Type] || [] );
+		}
+		return context.Result(returnValue);
+	}
+
+	/**
+	 * Landmarks: Add
+	 * @param {Object} criteria
+	 */
+	function __Add(criteria){
+		
+		if ((result = validator.apply('Add', arguments)) !== false)
+			return result; 
+
+		if (!/^(Landmark|Category)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+
+		var Data = criteria.Data || false; 
+		if(!Data){
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData);
+		}
+
+		DBase = context.getData(provider);
+		
+		// unsupported!			
+		if (Data.DatabaseURI) {
+			context.notify(_t('%s:: Add : Data.DatabaseURI not implemented in preview').arg(provider));
+		}
+		
+		var item;
+		
+		// Type = Landmark
+		if (/Landmark/i.test(criteria.Type)){
+
+			 if (!Data.LandmarkName)
+				Data.LandmarkName="";
+			
+			var landmarkPos = Data.LandmarkPosition;
+			if (typeof landmarkPos != 'undefined') {
+				if ((typeof landmarkPos.Latitude == 'undefined' || typeof landmarkPos.Latitude != 'number') &&
+					(typeof landmarkPos.Longitude == 'undefined' || typeof landmarkPos.Longitude != 'number') &&
+					(typeof landmarkPos.Altitude == 'undefined' || typeof landmarkPos.Altitude != 'number') &&
+					(typeof landmarkPos.HAccuracy == 'undefined' || typeof landmarkPos.HAccuracy != 'number') &&
+					(typeof landmarkPos.VAccuracy == 'undefined' || typeof landmarkPos.VAccuracy != 'number')) {
+						
+						return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+				}
+			}
+			// update
+			if (typeof Data.id != 'undefined') {
+				if(typeof Data.id != 'string')
+						return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+				
+				var retIndex = findById(DBase.Landmark, Data.id); 
+				if (retIndex == -1)
+					return error(device.implementation.ERR_NOT_FOUND);
+				DBase.Landmark[retIndex] = Data;
+				item = Data;
+			}
+			// new
+			else {
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Landmark.push(item);
+			}
+		} else { // Type = Category
+//			alert(typeof Data.CategoryName);
+
+			//alert("Data.id : "+Data.id);
+			// update
+			if (typeof Data.id != 'undefined') {
+				if(typeof Data.id != 'string')
+						return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+	
+				var retIndex = findById(DBase.Category, Data.id); 
+				if (retIndex == -1)
+					return error(device.implementation.ERR_NOT_FOUND);
+
+				DBase.Category[retIndex] = Data;					
+				item = Data;
+			}
+			// new
+			else {
+				if (typeof Data.CategoryName == 'undefined')
+					return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingCategoryName);	
+	
+				if(typeof Data.CategoryName != 'string' || Data.CategoryName.length <= 0)
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+
+				var retIndex = findByName(DBase.Category, Data.CategoryName); 
+				if (retIndex !=  -1)
+					return error(device.implementation.ERR_ENTRY_EXISTS);
+					
+				item = context.extend({}, Data); 
+				item.id = String(context.getUniqueID());
+				DBase.Category.push(item);
+			}
+		} 
+		// return success
+		return context.Result(item.id, device.implementation.ERR_SUCCESS);
+	}
+			
+	/**
+	 * Landmarks: Delete
+	 * @param {Object} criteria
+	 */
+	function __Delete(criteria){
+
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		if (!/^(Landmark|Category)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var Data = criteria.Data || false; 
+		if(!Data){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
+		}
+
+		if (typeof Data.id == 'undefined') {
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
+			}
+
+		if (typeof Data.id != 'undefined' && typeof Data.id != 'string') {
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+		}
+		if(Data.id.length <= 0 )
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);
+			
+		DBase = context.getData(provider);
+		
+		var type = criteria.Type;
+
+		// unsupported!			
+		if (Data.DBUri) {
+			context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));
+		}
+
+		// for both Landmark & Category:
+		var i,item;
+
+		for (i in DBase[type]) {
+			item = DBase[type][i];
+			if (Data.id == item.id) {
+				DBase[type].splice(i, 1);
+			}
+		}
+
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+		
+	/**
+	 * Landmarks: Import
+	 * @param {Object} criteria
+	 */
+	function __Import(criteria){
+		
+		if ((result = validator.apply('Import', arguments)) !== false)
+			return result; 
+
+		if (!/^(Landmark)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
+
+		var Data = criteria.Data || false; 
+		if(!Data)
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
+
+		if (!Data.SourceFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
+
+		if (!Data.MimeType)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);
+
+		if (!/^(application\/vnd.nokia.landmarkcollection\+xml|application\/vnd.nokia.landmark\+wbxml)$/i.test(Data.MimeType))
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.invalidMime);
+
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Landmarks: Export
+	 * @param {Object} criteria
+	 */
+	function __Export(criteria){
+
+		if ((result = validator.apply('Export', arguments)) !== false)
+			return result; 
+
+		context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
+		if (!/^(Landmark)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var Data = criteria.Data || false; 
+		if(!Data){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
+		}
+
+		if (!Data.DestinationFile)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestFile);
+			
+		if (!Data.MimeType)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMimeType);
+
+		if (!Data.IdList)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+			
+
+	/**
+	 * Landmarks: Organise
+	 * @param {Object} criteria
+	 */
+	function __Organise(criteria){
+
+		if ((result = validator.apply('Organise', arguments)) !== false)
+			return result; 
+
+		if (!/^(Landmark)$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var Data = criteria.Data || false; 
+		if(!Data){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingData);
+		}
+
+		if (!Data.id || Data.id == "")
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidId);
+		
+		DBase = context.getData(provider);
+		var categories = DBase['Category'];
+		var landmarks  = DBase['Landmark'];
+		var found = false;
+		
+		
+		for(var i=0;i<categories.length;i++)
+		{
+			var category = categories[i];
+			if (category.id == Data.id) {
+				found = true;
+				break;
+			}
+		}
+		if(!found)
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+
+		try{
+			if(!Data.IdList || Data.IdList.length <=0)
+			{
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+			}
+		}catch(e){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.invalidId);
+		}
+		
+		if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.invalidOpType);
+		
+		context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
+		if(/^Associate$/i.test(criteria.OperationType))
+		{
+			for(var i=0;i<landmarks.length;i++)
+			{
+				for(var j=0;j<Data.IdList.length;j++)
+				{
+					if(landmarks[i] == Data.IdList[j])
+					{
+						if(!landmarks[i].CategoryInfo)
+						{
+							landmarks[i].CategoryInfo = new Array();
+							landmarks[i].CategoryInfo.push(Data.id);					
+						}
+						else{
+							var landmark = landmarks[i];
+							var found = false;
+							for(var k=0;k<landmark.CategoryInfo.length;k++)
+							{
+								if(landmark.CategoryInfo[k] == Data.id)
+									found = true;
+							}
+							if(!found)
+								landmark.CategoryInfo.push(Data.id);
+						}
+						
+					}
+				}
+			}
+		}
+		else
+		{
+			for(var i=0;i<landmarks.length;i++)
+			{
+				for(var j=0;j<Data.IdList.length;j++)
+				{
+					if(landmarks[i] == Data.IdList[j] && landmarks[i].CategoryInfo != undefined)
+					{
+						var landmark = landmarks[i];
+						for(var k=0;k<landmark.CategoryInfo.length;k++)
+						{
+							if(landmark.CategoryInfo[k] == Data.id)
+								landmark.CategoryInfo.splice(k,1);
+						}
+					}
+				}
+			}
+		}
+		
+		return error(device.implementation.ERR_SUCCESS);		
+	}
+		
+
+	/**
+	 * Landmarks: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		
+		if ((result = validator.apply('Cancel', arguments)) !== false)
+			return result;		
+			
+		if (!criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	function error(code, msg /*, args...*/){
+
+		var args = ['Landmarks',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+			
+		if (!criteria || typeof criteria != 'object')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		return failed;
+	}
+	
+	function findById(dbase, id){
+		for (var i in dbase) {
+			if (id == dbase[i]['id']) {
+				return i;
+			}
+		}
+		return -1;
+	}	
+
+	function findByName(dbase, name){
+		for (var i in dbase) {
+			if (name == dbase[i]['CategoryName']) {
+				return i;
+			}
+		}
+		return -1;
+	}	
+
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType			: '%s%s : Type is missing',
+		badType				: '%s%s : Type is invalid',		
+		missingData			: '%s%s : Type or Data is missing',
+		missingId			: '%s%s : Id is missing',
+		invalidId			: '%s%s : id is invalid',
+		missingLandmarkName	: '%s%s : Landmrak name Missing',
+		missingCategoryName	: '%s%s : CategoryName is missing',
+		missingSourceFile	: '%s%s : Import Source Filename is Missing',
+		missingMimeType		: '%s%s : MIME type for source file is Missing',
+		missingDestFile		: '%s%s : DestinationFile is missing',
+		invalidOpType		: '%s%s : OperationType is invalid',
+		missingIdList		: '%s%s : Id list is Missing',
+		missingTID 			: '%s%s : TransactionID is missing',
+		invalidMime			: '%s%s : MimeType is missing',
+		msgNoMsg			: '',
+		
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Location.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,523 @@
+/**
+ * Location.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Location',
+		Interface = 'ILocation';
+
+	/**
+	 * Landmark service
+	 */
+	var LocationService = function(){
+		this.GetLocation 			= __GetLocation;
+		this.Trace 					= __Trace;
+		this.Calculate				= __Calculate;
+		this.CancelNotification		= __CancelNotification;		
+	}
+
+	device.implementation.extend(provider, Interface, new LocationService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+
+
+	var transactionIds = new Array();
+	var tTransactionId = -1;
+	var isTraceInProgress = false;
+	var criteriaTrace;
+	var callbackTrace;
+
+	/**
+	 * Landmarks: GetLocation
+	 * @param {Object} criteria
+	 */
+	function __GetLocation(criteria, callback, flag){	
+		method = "GetLocation";
+		//	Async call
+		flag = flag || false;
+
+		if (!criteria) {
+			criteria = new Object();
+		}	
+		
+		if(typeof criteria.LocationInformationClass == "undefined")
+			criteria.LocationInformationClass = "BasicLocationInformation"; // Default value of LocationInformationClass is "BasicLocationInformation" if not provided
+
+		var result = validateArgument('GetLocation',criteria);
+		if(result.ErrorCode != 0)
+			return result;
+		
+		if (typeof callback == 'function') {
+			
+			var retVal = context.callAsync(this, arguments.callee, criteria, callback,true);
+			transactionIds.push(retVal.TransactionID);  // all transaction ids are pushed on this variable, because CancelNotification function of SAPI doesn't take TransactioID as input
+			return retVal;
+		}
+		
+		if(flag)
+		{
+			transactionIds.shift();  // Remove oldest TransactionID(FIFO) (Async call)
+		}
+		
+		DBase = context.getData(provider);
+		var returnValue = DBase[criteria.LocationInformationClass];
+		locationNotify(criteria.Updateoptions);
+		return context.Result(returnValue);
+	}
+	
+	/**
+	 * Location: Trace
+	 * @param {Object} criteria
+	 * @param {Function} callback function for async call
+	 */
+	function __Trace(criteria, callback){
+		method = "Trace";
+
+		if (!criteria) {
+			criteria = new Object();
+		}	
+		
+		if(typeof criteria.LocationInformationClass == "undefined")
+			criteria.LocationInformationClass = "BasicLocationInformation"; // Default value of LocationInformationClass is "BasicLocationInformation" if not provided
+
+		if (typeof callback != 'function') { // callback should be valid function
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED,msg.msgCommandNotFound); 
+		}
+		
+		var result = validateArgument('Trace',criteria);
+		if(result.ErrorCode != 0)
+			return result;
+		
+		criteriaTrace = criteria;
+		callbackTrace = callback;
+		isTraceInProgress = true;
+		locationNotify(criteria.Updateoptions);
+
+		return traceCall(criteria,callback);
+	}
+
+	/**
+	 * Location: Calculate
+	 * @param {Object} criteria
+	 */
+	function __Calculate(criteria){
+		method = "Calculate";
+		if(!criteria || !criteria.MathRequest)
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcMissingMathReq);
+			
+		if(typeof criteria.MathRequest != "string" || (criteria.MathRequest != "FindDistance" && criteria.MathRequest != "FindBearingTo" && criteria.MathRequest != "MoveCoordinates")) // Error check for wrong MathRequest criteria
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcWrongTypeMathReq);
+			
+		if(typeof criteria.DistanceParamSource != "object" || (typeof criteria.DistanceParamSource.Latitude != "number" || typeof criteria.DistanceParamSource.Longitude != "number" || typeof criteria.DistanceParamSource.Altitude != "number"))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcMissingArgLocCord);
+
+		if(criteria.MathRequest == "FindDistance" || criteria.MathRequest == "FindBearingTo")
+		{
+			if(typeof criteria.DistanceParamSource != "object" || (typeof criteria.DistanceParamDestination.Latitude != "number" || typeof criteria.DistanceParamDestination.Longitude != "number" || typeof criteria.DistanceParamDestination.Altitude != "number"))
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcMissingArgLocCord);
+			if (criteria.MathRequest == "FindDistance") {
+				var dist = LatLon.distHaversine(criteria.DistanceParamDestination.Latitude, criteria.DistanceParamDestination.Longitude, criteria.DistanceParamSource.Latitude, criteria.DistanceParamSource.Longitude)*1000;
+				if (typeof criteria.DistanceParamDestination.Altitude == "number" && typeof criteria.DistanceParamSource.Altitude == "number") {
+					var delta = criteria.DistanceParamDestination.Altitude - criteria.DistanceParamSource.Altitude
+					dist = Math.sqrt(dist * dist + delta * delta);
+				}
+				return context.Result(dist);
+			}
+			else if (criteria.MathRequest == "FindBearingTo"){
+				var bearing = LatLon.bearing( criteria.DistanceParamSource.Latitude, criteria.DistanceParamSource.Longitude,criteria.DistanceParamDestination.Latitude, criteria.DistanceParamDestination.Longitude);
+				return context.Result(bearing);				
+			}
+		}
+		else if(criteria.MathRequest == "MoveCoordinates"){
+
+			if(typeof criteria.MoveByThisDistance == "undefined")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcMissingArgMoveDist);
+			
+			if(typeof criteria.MoveByThisBearing == "undefined")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcMissingArgMoveBear);
+			
+
+			if(typeof criteria.MoveByThisDistance != "number")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcWrongTypeMoveDist);
+			
+			if(typeof criteria.MoveByThisBearing != "number")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCalcWrongTypeMoveBear);
+			
+			var latLon = new LatLon(criteria.DistanceParamSource.Latitude, criteria.DistanceParamSource.Longitude);
+			var dlatLon = latLon.destPoint(criteria.MoveByThisBearing, criteria.MoveByThisDistance/1000);
+			var retVal = new Object();
+			retVal.Longitude = dlatLon.lon;
+			retVal.Latitude = dlatLon.lat;
+			retVal.Altitude = criteria.DistanceParamSource.Altitude;
+			return context.Result(retVal);
+		}
+	}
+			
+	/**
+	 * Location: CancelNotification
+	 * @param {Object} criteria
+	 */
+	function __CancelNotification(criteria){
+		method = "Cancel";
+		if(!criteria)
+				return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgCancelMissingType);
+		
+		var arr = new Array();
+		var i = 0;
+		var key
+		for(key in criteria);
+			arr[i++] = key;
+
+		if(!criteria.CancelRequestType && arr.length)
+				return error(device.implementation.ERR_NOT_FOUND,msg.msgCancelMissingType);
+		
+		if(criteria.CancelRequestType != "GetLocCancel" && criteria.CancelRequestType != "TraceCancel")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgCancelWrongType);
+		
+		if (criteria.CancelRequestType == "GetLocCancel") {
+			for (var i = 0; i < transactionIds.length; i++) {
+				clearTimeout(transactionIds[i])
+			}
+		}
+		
+		if (criteria.CancelRequestType == "TraceCancel")
+		{
+			isTraceInProgress = false;
+			tTransactionId = -1;
+		}
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+		
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+
+	/**
+	 * Location: traceCall
+	 * @param {} 
+	 * This function emulates repetitive trace calls,It calls specified callback function after every UpdateInterval untill 
+	 * CancelNotification is called
+	 */
+	function traceCall(){
+		var tid = setTimeout(function(){
+		if(!isTraceInProgress)
+			return;
+			
+		DBase = context.getData(provider);
+		var returnValue = DBase[criteriaTrace.LocationInformationClass];
+		var result,
+			eventCode = {completed:2, error:4, progress:9},
+		code = eventCode.completed;
+
+		callbackTrace(tTransactionId,code,context.Result(returnValue,0));
+		traceCall();
+		}, criteriaTrace.Updateoptions.UpdateInterval/1000);
+		if(tTransactionId == -1)
+			tTransactionId = tid;
+		return context.AsyncResult(tTransactionId);
+	}
+
+	/**
+	 * Location: validateArgument
+	 * @param {string,object} callingMethod and criteria
+	 * Validates arguments
+	 */
+	function validateArgument(fun,criteria)
+	{
+		method = fun;
+		if(typeof criteria.Updateoptions != "undefined")
+		{
+			if(typeof criteria.Updateoptions != "object") // Checking for error in UpdateOptions criteria
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationBadArg);
+			
+			if(typeof criteria.Updateoptions.UpdateInterval != "undefined" && typeof criteria.Updateoptions.UpdateInterval != "number")
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationWrongType);
+			
+			if(typeof criteria.Updateoptions.UpdateTimeOut != "undefined" && typeof criteria.Updateoptions.UpdateTimeOut != "number")	
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationWrongType);
+
+			if(typeof criteria.Updateoptions.UpdateMaxAge != "undefined" && typeof criteria.Updateoptions.UpdateMaxAge != "number")	
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationWrongType);
+
+			if(typeof criteria.Updateoptions.PartialUpdates != "undefined" && typeof criteria.Updateoptions.PartialUpdates != "boolean")	
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationWrongType);
+
+			if((typeof criteria.Updateoptions.UpdateInterval != "undefined" && criteria.Updateoptions.UpdateInterval  < 0) || 
+					(typeof criteria.Updateoptions.UpdateTimeOut != "undefined" && criteria.Updateoptions.UpdateTimeOut  < 0) ||
+					(typeof criteria.Updateoptions.UpdateMaxAge != "undefined" && criteria.Updateoptions.UpdateMaxAge  < 0))
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationNegInt);
+
+			if(typeof criteria.Updateoptions.UpdateTimeOut != "undefined" && typeof criteria.Updateoptions.UpdateInterval != "undefined" && criteria.Updateoptions.UpdateInterval > criteria.Updateoptions.UpdateTimeOut)
+			{
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgNone);
+			}
+
+			/*if((typeof criteria.Updateoptions.UpdateTimeOut != "undefined" && criteria.Updateoptions.UpdateTimeOut <= 1000000))// || (typeof criteria.Updateoptions.UpdateInterval != "undefined" && criteria.Updateoptions.UpdateInterval <= 1000000))
+			{
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgNone);
+			}*/				
+		}
+
+		if(typeof criteria.LocationInformationClass != "undefined" && criteria.LocationInformationClass != "BasicLocationInformation" && criteria.LocationInformationClass != "GenericLocationInfo") // checking for errors in LocationInformationClass criteria
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgGetLocationWrongCat);
+		
+		if (/^Trace$/i.test(fun)&&(!criteria.Updateoptions || typeof criteria.Updateoptions.UpdateInterval == "undefined")) {
+			if(!criteria.Updateoptions)
+			{
+				criteria.Updateoptions = new Object();
+			}
+			criteria.Updateoptions.UpdateInterval = 1000000;  // Emulation only!! for convenience UpdateInterval is set to 1 second is not specified or if it less than 1 second
+			context.notify("Using default UpdateInterval(1000000 micro seconds)"); 
+		}
+		
+		return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
+		
+	}
+
+	/**
+	 * Location: error
+	 * @param {number,string} ErrorCode and ErrorString
+	 * Replaces Error String with method name
+	 */
+	function error(code, msg /*, args...*/){
+
+		var args = ['location',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+	
+	function locationNotify(updateoptions) {
+		if(!updateoptions)
+			return;
+		if(typeof updateoptions.UpdateTimeOut != "undefined")
+			context.notify(_t("%s:: %s : Updateoptions.UpdateTimeOut not implemented in preview").arg(provider, method));
+
+		if(typeof updateoptions.UpdateMaxAge != "undefined")
+			context.notify(_t("%s:: %s : Updateoptions.UpdateMaxAge not implemented in preview").arg(provider, method));
+
+		if(typeof updateoptions.PartialUpdates != "undefined")
+			context.notify(_t("%s:: %s : Updateoptions.PartialUpdates not implemented in preview").arg(provider, method));
+	}
+
+	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+	/*  Latitude/longitude spherical geodesy formulae & scripts (c) Chris Veness 2002-2009            */
+	/*	http://www.movable-type.co.uk/scripts/latlong.html											  */  
+	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+	
+	/*
+	 * Use Haversine formula to Calculate distance (in km) between two points specified by 
+	 * latitude/longitude (in numeric degrees)
+	 *
+	 * example usage from form:
+	 *   result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), 
+	 *                                       lat2.value.parseDeg(), long2.value.parseDeg());
+	 * where lat1, long1, lat2, long2, and result are form fields
+	 */
+	
+	
+	LatLon.distHaversine = function(lat1, lon1, lat2, lon2) {
+	  var R = 6371; // earth's mean radius in km
+	  var dLat = toRad(lat2-lat1);
+	  var dLon = toRad(lon2-lon1);
+	  lat1 = toRad(lat1), lat2 = toRad(lat2);
+	
+	  var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
+	          Math.cos(lat1) * Math.cos(lat2) * 
+	          Math.sin(dLon/2) * Math.sin(dLon/2);
+	  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
+	  var d = R * c;
+	  return d;
+	}
+	
+	
+	/*
+	 * ditto using Law of Cosines
+	 */
+	LatLon.distCosineLaw = function(lat1, lon1, lat2, lon2) {
+	  var R = 6371; // earth's mean radius in km
+	  var d = Math.acos(Math.sin(toRad(lat1))*Math.sin(toRad(lat2)) +
+	                    Math.cos(toRad(lat1))*Math.cos(toRad(lat2))*Math.cos(toRad(lon2-lon1))) * R;
+	  return d;
+	}
+	
+	
+	/*
+	 * calculate (initial) bearing between two points
+	 *   see http://williams.best.vwh.net/avform.htm#Crs
+	 */
+	LatLon.bearing = function(lat1, lon1, lat2, lon2) {
+	  lat1 = toRad(lat1); lat2 = toRad(lat2);
+	  var dLon = toRad(lon2-lon1);
+
+	  var y = Math.sin(dLon) * Math.cos(lat2);
+	  var x = Math.cos(lat1)*Math.sin(lat2) -
+	          Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
+	  return toBrng(Math.atan2(y, x));
+	}
+	
+	
+	/*
+	 * calculate destination point given start point, initial bearing (deg) and distance (km)
+	 *   see http://williams.best.vwh.net/avform.htm#LL
+	 */
+	LatLon.prototype.destPoint = function(brng, d) {
+	  var R = 6371; // earth's mean radius in km
+	  var lat1 = toRad(this.lat), lon1 = toRad(this.lon);
+	  brng = toRad(brng);
+	
+	  var lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) + 
+	                        Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) );
+	  var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
+	                               Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2));
+	  lon2 = (lon2+Math.PI)%(2*Math.PI) - Math.PI;  // normalise to -180...+180
+	
+	  if (isNaN(lat2) || isNaN(lon2)) return null;
+	  return new LatLon(toDeg(lat2), toDeg(lon2));
+	}
+	
+	
+	/*
+	 * construct a LatLon object: arguments in numeric degrees
+	 *
+	 * note all LatLong methods expect & return numeric degrees (for lat/long & for bearings)
+	 */
+	function LatLon(lat, lon) {
+	  this.lat = lat;
+	  this.lon = lon;
+	}
+	
+	
+	/*
+	 * represent point {lat, lon} in standard representation
+	 */
+	LatLon.prototype.toString = function() {
+	  return this.lat.toLat() + ', ' + this.lon.toLon();
+	}
+	
+	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+	
+	// extend String object with method for parsing degrees or lat/long values to numeric degrees
+	//
+	// this is very flexible on formats, allowing signed decimal degrees, or deg-min-sec suffixed by 
+	// compass direction (NSEW). A variety of separators are accepted (eg 3º 37' 09"W) or fixed-width 
+	// format without separators (eg 0033709W). Seconds and minutes may be omitted. (Minimal validation 
+	// is done).
+	
+	function parseDeg (str) {
+	  if (!isNaN(str)) return Number(str);                 // signed decimal degrees without NSEW
+	
+	  var degLL = str.replace(/^-/,'').replace(/[NSEW]/i,'');  // strip off any sign or compass dir'n
+	  var dms = degLL.split(/[^0-9.]+/);                     // split out separate d/m/s
+	  for (var i in dms) if (dms[i]=='') dms.splice(i,1);    // remove empty elements (see note below)
+	  switch (dms.length) {                                  // convert to decimal degrees...
+	    case 3:                                              // interpret 3-part result as d/m/s
+	      var deg = dms[0]/1 + dms[1]/60 + dms[2]/3600; break;
+	    case 2:                                              // interpret 2-part result as d/m
+	      var deg = dms[0]/1 + dms[1]/60; break;
+	    case 1:                                              // decimal or non-separated dddmmss
+	      if (/[NS]/i.test(str)) degLL = '0' + degLL;       // - normalise N/S to 3-digit degrees
+	      var deg = dms[0].slice(0,3)/1 + dms[0].slice(3,5)/60 + dms[0].slice(5)/3600; break;
+	    default: return NaN;
+	  }
+	  if (/^-/.test(str) || /[WS]/i.test(str)) deg = -deg; // take '-', west and south as -ve
+	  return deg;
+	}
+	// note: whitespace at start/end will split() into empty elements (except in IE)
+	
+	
+	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+	
+	// extend Number object with methods for converting degrees/radians
+	
+	function toRad (deg) {  // convert degrees to radians
+	  return deg * Math.PI / 180;
+	}
+	
+	function toDeg (rad) {  // convert radians to degrees (signed)
+	  return rad * 180 / Math.PI;
+	}
+	
+	function toBrng (rad) {  // convert radians to degrees (as bearing: 0...360)
+	  return (toDeg(rad)+360) % 360;
+	}
+	
+	
+	/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
+	
+	// extend Number object with methods for presenting bearings & lat/longs
+	
+	function toDMS (num) {  // convert numeric degrees to deg/min/sec
+	  var d = Math.abs(num);  // (unsigned result ready for appending compass dir'n)
+	  d += 1/7200;  // add ½ second for rounding
+	  var deg = Math.floor(d);
+	  var min = Math.floor((d-deg)*60);
+	  var sec = Math.floor((d-deg-min/60)*3600);
+	  // add leading zeros if required
+	  if (deg<100) deg = '0' + deg; if (deg<10) deg = '0' + deg;
+	  if (min<10) min = '0' + min;
+	  if (sec<10) sec = '0' + sec;
+	  return deg + '\u00B0' + min + '\u2032' + sec + '\u2033';
+	}
+	
+	function toLat (deg) {  // convert numeric degrees to deg/min/sec latitude
+	  return toDMS(deg).slice(1) + (deg<0 ? 'S' : 'N');  // knock off initial '0' for lat!
+	}
+	
+	function toLon (deg) {  // convert numeric degrees to deg/min/sec longitude
+	  return toDMS(deg) + (deg>0 ? 'E' : 'W');
+	}
+	
+	function toPrecision (num,fig) {  // override toPrecision method with one which displays 
+	  if (num == 0) return 0;                      // trailing zeros in place of exponential notation
+	  var scale = Math.ceil(Math.log(num)*Math.LOG10E);
+	  var mult = Math.pow(10, fig-scale);
+	  return Math.round(num*mult)/mult;
+	}
+
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		msgCommandNotFound			: '%s : Command Not found',
+		msgGetLocationWrongCat		: '%s : %s : wrong category info should be BasicLocationInformation/GenericLocationInfo ',
+		msgGetLocationBadArg		: '%s : %s : BadArgument - Updateoptions',
+		msgGetLocationNegInt		: '%s : %s : Negative Time Interval',
+		msgGetLocationWrongType 	: '%s : %s : UpdateOptions Type mismatch',
+		msgTraceWrongCat			: '%s : %s : Invalid LocationInformationClass',
+		msgCalcMissingMathReq 		: '%s : %s : Missing argument - MathRequest',
+		msgCalcWrongTypeMathReq 	: '%s : %s : Wrong argument - MathRequest',
+		msgCalcMissingArgLocCord 	: '%s : %s : Missing argument - locationcoordinate',
+		msgCalcMissingArgMoveDist 	: '%s : %s : Missing argument - MoveByThisDistance',
+		msgCalcMissingArgMoveBear 	: '%s : %s : Missing argument - MoveByThisBearing',
+		msgCalcWrongTypeMoveDist  	: '%s : %s : TypeMismatch - MoveByThisDistance',
+		msgCalcWrongTypeMoveBear 	: '%s : %s : TypeMismatch - MoveByThisBearing',
+		msgCancelBadArg 			: '%s : %s : BadArgument – cancel type',
+		msgCancelMissingType 		: '%s : %s : Missing cancel type',
+		msgCancelWrongType 			: '%s : %s : Wrong cancel type'	,
+		msgNone						: ''	
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Logging.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,535 @@
+/**
+ * Logging.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.Logging',
+		Interface = 'IDataSource';
+
+	/**
+	 * Landmark service
+	 */
+	var LoggingService = function(){
+		this.Add 					= __Add;
+		this.GetList 				= __GetList;
+		this.Delete					= __Delete;
+		this.RequestNotification	= __RequestNotification;		
+		this.Cancel					= __Cancel;		
+
+	}
+
+	device.implementation.extend(provider, Interface, new LoggingService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+
+	var transactionIds = new Array();
+	var tTransactionId = -1;
+	var isTraceInProgress = false;
+	var criteriaReq;
+	var callbackReq;
+
+	/**
+	 * Logging: Add
+	 * @param {Object} criteria
+	 * @param (function) callback
+	 */
+	function __Add(criteria, callback, flag){
+		method = "Add";
+		//	Async call
+		flag = flag || false;
+
+		if (!flag) {
+			var result = ValidateAdd(criteria, callback);
+			if (result.ErrorCode != 0) 
+				return result;
+		}			
+		
+		
+		if(typeof callback == 'function')
+		{
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+		DBase = context.getData(provider);
+		var returnValue = DBase[criteria.Type];
+		criteria.Item.id = 	GenerateRandomNumber()+'';
+		criteria.Item["EventTime"] = GetCurrDate();
+		returnValue.push(criteria.Item);
+		return context.Result(criteria.Item.id,0);
+	}
+
+	/**
+	 * Logging: GetList
+	 * @param {Object} criteria
+	 * @param (function) callback
+	 */
+	function __GetList(criteria, callback, flag){	
+		method = "GetList";
+		//	Async call
+		flag = flag || false;
+
+		if (!flag) {
+			var result = ValidateGetList(criteria, callback);
+			if (result.ErrorCode != 0) 
+				return result;
+		}			
+		
+		
+		if(typeof callback == 'function')
+		{
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+		if(criteria.Filter){
+			context.notify(_t('%s:: GetList : filter not implemented in preview').arg(provider));
+		}
+				
+		DBase = context.getData(provider);
+		var returnValue;
+		// @todo: apply filter criteria
+		returnValue = context.Iterator( DBase[criteria.Type] || [] );
+		
+		return context.Result(returnValue,0);
+	}
+
+	/**
+	 * Logging: Delete
+	 * @param {Object} criteria
+	 * @param (function) callback
+	 */
+	function __Delete(criteria, callback, flag){
+		method = "Delete";
+		//	Async call
+		flag = flag || false;		
+		if (!flag) {
+			if (!criteria || !criteria.Type) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);
+
+			if (typeof criteria.Type != 'string') 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
+			
+			if (criteria.Type != 'Log') 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);
+			
+			if (!criteria.Data) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDataMissing);
+			
+			if(typeof criteria.Data != 'object')
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDataInvalid);
+
+			if(typeof criteria.Data.id == 'undefined')
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgid);
+			
+			if (typeof criteria.Data.id != "string") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgidInvalid);
+				
+			if(criteria.Data.id == '')
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgidInvalid);
+		}
+		DBase = context.getData(provider);
+		var returnValue,found = false;
+		returnValue = DBase[criteria.Type];
+		for(var i=0; i<returnValue.length; i++){
+			if(returnValue[i].id == criteria.Data.id)
+			{
+				found = true;
+				returnValue.splice(i,1);
+			}			
+		}
+		if(!found)
+			return error(device.implementation.ERR_NOT_FOUND, msg.msgidInvalid);
+		
+		return context.Result(undefined,0);
+	}
+
+	/**
+	 * Logging: RequestNotification
+	 * @param {Object} criteria
+	 * @param (function) callback
+	 */
+	function __RequestNotification(criteria, callback, flag){
+		method = "RequestNotification";
+		
+		//	Async call
+		flag = flag || false;		
+		if (!flag) {
+			if (!criteria || !criteria.Type) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTypeMissing);
+
+			if (typeof criteria.Type != 'string') 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
+			
+			if (criteria.Type != 'Log') 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTypeInvalid);
+			
+			if (!criteria.Filter)
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgFilterMissing);
+
+			if(typeof criteria.Filter != 'object') 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgFilterInvalid);
+			
+			if(typeof criteria.Filter.DelayTime == 'undefined') 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDelayTimeMissing);
+			
+			if(typeof criteria.Filter.DelayTime != 'number')
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDelayTimeInvalid);
+			if(criteria.Filter.DelayTime <= 0)
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDelayTimeInvalid);
+			
+			if(criteria.Filter.DelayTime < 1000000 )
+			{
+				criteria.Filter.DelayTime = 1000000;
+				context.notify(_t('%s:: RequestNotification : Using DelayTime = 1000000').arg(provider));
+			}
+		}
+		if(typeof callback != 'function')
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgMissingCallback);
+
+		criteriaReq = criteria;
+		callbackReq = callback;
+		isTraceInProgress = true;
+
+		return notificationCall(criteria,callback);
+	}
+
+	/**
+	 * Logging: Cancel
+	 * @param {Object} criteria
+	 * @param (function) callback
+	 */
+	function __Cancel(criteria){
+			method = "Cancel";
+			if (!criteria || typeof criteria.TransactionID == 'undefined') 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTransactionIdMissing);
+			
+			if (typeof criteria.TransactionID != 'number') 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgTransactionIdInvalid);
+			
+			clearTimeout(criteria.TransactionID);
+			if (criteria.TransactionID == tTransactionId) {
+				isTraceInProgress = false;
+				tTransactionId = -1;
+			}
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+
+	}
+	
+
+	/**
+	 * Location: error
+	 * @param {number,string} ErrorCode and ErrorString
+	 * Replaces Error String with method name
+	 */
+	function error(code, msg /*, args...*/){
+
+		var args = ['Logging',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+	
+	/**
+	 * Logging: notificationCall
+	 * @param {} 
+	 * This function Calls callback function after given delay
+	 */
+	function notificationCall(){
+		var tid = setTimeout(function(){
+		if(!isTraceInProgress)
+			return;
+			
+		DBase = context.getData(provider);
+		var returnValue;
+		returnValue = context.Iterator( DBase[criteriaReq.Type] || [] );
+
+		var result,
+			eventCode = {completed:2, error:4, progress:9},
+		code = eventCode.completed;
+
+		callbackReq(tTransactionId,code,context.Result(returnValue,0));
+		//notificationCall();
+		}, criteriaReq.Filter.DelayTime/1000);
+		if(tTransactionId == -1)
+			tTransactionId = tid;
+		return context.AsyncResult(tTransactionId);
+	}
+	
+	/**
+	 * Helper functions
+	 */
+
+	/**
+	 * GenerateRandomNumber
+	 * @param {}array of log data for getting unique ID 
+	 * 
+	 */
+	function GenerateRandomNumber(arr)
+	{
+		var randomnumber = Math.floor(Math.random() * 10001);
+		randomnumber +=200;
+		return randomnumber;
+	}
+
+	/**
+	 * GetCurrDate
+	 * @param {}Gets date in internet format
+	 * 
+	 */
+	function GetCurrDate()
+	{
+		var d_names = new Array("Sunday", "Monday", "Tuesday",
+		"Wednesday", "Thursday", "Friday", "Saturday");
+		
+		var m_names = new Array("January", "February", "March", 
+		"April", "May", "June", "July", "August", "September", 
+		"October", "November", "December");
+		
+		var ampm = "am";
+		
+		var d = new Date();
+		var curr_day = d.getDay();
+		var curr_date = d.getDate();
+		if(curr_date <10)
+			curr_date = "0"+curr_date;
+		var curr_month = d.getMonth();
+		var curr_year = d.getFullYear();
+		var curr_hour = d.getHours();
+		if(curr_hour > 11)
+		{
+			ampm = "pm";
+		}
+		else if(curr_hour <10)
+		{
+			curr_hour = "0"+curr_hour;
+		}	
+		var curr_min = d.getMinutes();
+		if(curr_min <10)
+			curr_min = "0"+curr_min;
+	
+		var curr_sec = d.getSeconds();
+		if(curr_sec <10)
+			curr_sec = "0"+curr_sec;
+		
+		var strDate = d_names[curr_day]+', '+curr_date+' '+m_names[curr_month]+', '+curr_year+' '+curr_hour+':'+curr_min+':'+curr_sec+' '+ampm;
+		return strDate;
+	}	
+
+	/**
+	 * ValidateAdd
+	 * @param {object,function}
+	 * Validates ADD arguments
+	 */	
+	function ValidateAdd(criteria,callback)
+	{
+		var type;
+		if(!criteria || !criteria.Type)
+			return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);
+
+		if (typeof criteria.Type != 'string') 
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
+		
+		if(criteria.Type != 'Log')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);
+		
+		if (!criteria.Item)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgItemMissing);
+
+		if(typeof criteria.Item != 'object') 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgItemInvalid);
+		
+		
+		if(typeof criteria.Item.EventType == "undefined")
+			return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgEventTypeMissing);
+
+		if(typeof criteria.Item.EventType != "number" )
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventTypeInvalid);
+		
+		if(typeof criteria.Item.EventType == "number" && !(criteria.Item.EventType >=0 && criteria.Item.EventType <=4))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgEventTypeInvalid);
+		
+		type = typeof criteria.Item.RemoteParty;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);
+		
+		type = typeof criteria.Item.Direction;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);
+			
+			if (type == "number" && (criteria.Item.Direction < 0 || criteria.Item.Direction > 6)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);
+		}
+
+		type = typeof criteria.Item.EventDuration;
+		if(type != 'undefined' &&  type != "number")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEventDurationInvalid);
+			
+		type = typeof criteria.Item.DeliveryStatus;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);
+			
+			if (type == "number" && (criteria.Item.DeliveryStatus < 0 || criteria.Item.DeliveryStatus > 6)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);
+		}
+		
+		type = typeof criteria.Item.Subject;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgSubjectInvalid);
+
+		type = typeof criteria.Item.PhoneNumber;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);
+
+		type = typeof criteria.Item.Link;
+		if(type != 'undefined' &&  type != "number")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLinkInvalid);
+
+		type = typeof criteria.Item.LogFlags;
+		if(type != 'undefined' && (type != "number" || (criteria.Item.LogFlags != 1 && criteria.Item.LogFlags != 0)))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgLogFlagsInvalid);
+
+		return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
+	}	
+
+	/**
+	 * ValidateGetList
+	 * @param {object,function}
+	 * Validates GetList function
+	 */	
+	function ValidateGetList(criteria,callback)
+	{
+		var type;
+		if(!criteria || !criteria.Type)
+			return error(device.implementation.ERR_MISSING_ARGUMENT,msg.msgTypeMissing);
+
+		if (typeof criteria.Type != 'string') 
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTypeInvalid);
+		
+		if(criteria.Type != 'Log')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT,msg.msgTypeInvalid);
+
+		type = typeof criteria.Filter;
+		if(type != 'undefined' &&  type != "object")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgFilterInvalid);
+		
+		if(type == 'undefined')
+			return context.ErrorResult(device.implementation.ERR_SUCCESS, "");		
+		
+		type = typeof criteria.Filter.id;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgid);
+		
+		if(type != 'undefined')
+			return context.ErrorResult(device.implementation.ERR_SUCCESS, "");  // if id is given all other filters will be ignored
+
+		type = typeof criteria.Filter.EventType;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgEventTypeInvalid);
+		
+			if (type != "number" || !(criteria.Filter.EventType >= 0 && criteria.Filter.EventType <= 4)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgEventTypeInvalid);
+		}		
+		type = typeof criteria.Filter.RecentList;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgRecentListInvalid);
+			if (type == "number" && (criteria.Filter.RecentList < -1 || criteria.Filter.RecentList > 3)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgRecentListInvalid);
+		}
+		
+		type = typeof criteria.Filter.RemoteParty;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgRemotePartyInvalid);
+		
+		type = typeof criteria.Filter.Direction;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDirectionInvalid);
+			if (type == "number" && (criteria.Filter.Direction < 0 || criteria.Filter.Direction > 6)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDirectionInvalid);
+		}
+		
+		type = typeof criteria.Filter.DeliveryStatus;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgDeliveryStatusInvalid);
+			if (type == "number" && (criteria.Filter.DeliveryStatus < 0 || criteria.Filter.DeliveryStatus > 6)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgDeliveryStatusInvalid);
+		}
+
+		type = typeof criteria.Filter.EndTime;
+		if(type != 'undefined' && (type != "object" ||  typeof criteria.Filter.EndTime.getTime != "function"))
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgEndTimeInvalid);
+
+		type = typeof criteria.Filter.PhoneNumber;
+		if(type != 'undefined' &&  type != "string")
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE,msg.msgPhoneNumberInvalid);
+
+
+		type = typeof criteria.Filter.LogFlags;
+		if (type != 'undefined') {
+			if (type != "number") 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgLogFlagsInvalid);
+			if (type == "number" && (criteria.Filter.LogFlags != 1 && criteria.Filter.LogFlags != 0)) 
+				return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgLogFlagsInvalid);
+		}
+		return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
+	}	
+
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		msgTypeInvalid 				: '%s:%s:TypeInvalid',
+		msgTypeMissing				: '%s:%s:Type Missing',
+		msgFilterInvalid			: '%s:%s:FilterInvalid',
+		msgidInvalid				: '%s:%s:idInvalid',
+		msgRecentListInvalid		: '%s:%s:RecentListInvalid',
+		msgPhoneNumberInvalid		: '%s:%s:PhoneNumberInvalid',
+		msgDirectionInvalid			: '%s:%s:DirectionInvalid',
+		msgDeliveryStatusInvalid	: '%s:%s:DeliveryStatusInvalid',
+		msgLogFlagsInvalid			: '%s:%s:LogFlagsInvalid',
+		msgEndTimeInvalid			: '%s:%s:EndTimeInvalid',
+		msgRemotePartyInvalid		: '%s:%s:RemotePartyInvalid',
+		msgEventTypeInvalid			: '%s:%s:EventTypeInvalid',
+		msgItemInvalid				: '%s:%s:ItemInvalid',
+		msgItemMissing				: '%s:%s:ItemMissing',
+		msgEventTypeInvalid			: '%s:%s:EventTypeInvalid',
+		msgEventTypeMissing			: '%s:%s:EventType Missing',
+		msgEventDurationInvalid		: '%s:%s:EventDurationInvalid',
+		msgSubjectInvalid			: '%s:%s:SubjectInvalid',
+		msgEventDataInvalid			: '%s:%s:EventDataInvalid',
+		msgLinkInvalid				: '%s:%s:LinkInvalid',
+		msgDataInvalid				: '%s:%s:DataInvalid',
+		msgDataMissing				: '%s:%s:Data Missing',
+		msgid						: '%s:%s:id',
+		msgFilterInvalid			: '%s:%s:FilterInvalid',
+		msgFilterMissing			: '%s:%s:Filter Missing',
+		msgDelayTimeInvalid			: '%s:%s:DelayTimeInvalid',
+		msgDelayTimerMissing		: '%s:%s:DelayTimerMissing',
+		msgTransactionIdInvalid		: '%s:%s:TransactionIdInvalid',
+		msgTransactionIdMissing		: '%s:%s:TransactionID Missing',
+		msgMissingCallback			: '%s:%s:Missing Callback',
+		msgNoMsg					: '%s:%s:'
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/MediaManagement.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,157 @@
+/**
+ * MediaManagement.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.MediaManagement' ,
+		Interface = 'IDataSource';
+
+	/**
+	 * MediaManagement service
+	 */
+	var MediaManagementService = function(){
+		this.GetList 	= __GetList;
+		this.Cancel 	= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new MediaManagementService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * MediaManagement: GetList
+	 * @param {Object} criteria
+	 * @param {Function} callback function for async call (mandatory)
+	 */
+	function __GetList(criteria, callback, _flag){
+
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+
+		// _flag=true indicates re-called state
+		_flag = _flag || false;
+		if (!_flag) {
+
+			// callback is mandatory
+			if (typeof callback != 'function')
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badAsync);
+			
+			// continue validation after callback check		
+			if (!criteria.Filter) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'Filter');
+			
+			if (!criteria.Filter.FileType) 
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'FileType');
+			
+			if (!/^(Music|Sound|Image|Video|StreamingURL)$/i.test(criteria.Filter.FileType)) 
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+			
+			// process callback
+			_flag = true;
+			return context.callAsync(this, arguments.callee, criteria, callback, _flag);
+		}
+		
+		var returnValue = [], 
+			match = null,
+			fileType = criteria.Filter.FileType,
+			filter = criteria.Filter;
+ 
+ 		// normalize filetype
+		fileType = fileType[0].toUpperCase() + fileType.substr(1).toLowerCase();
+		fileType = fileType.replace(/url/i, 'URL');
+		
+		DBase = context.getData(provider);
+
+		// unsupported filters 
+		if (filter 
+			&& (match = context.keys(filter).join().match(/Key|StartRange|EndRange/ig)) ) {
+			context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+		}
+		// unsupported sort			
+		if (criteria.Sort) { 
+			context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
+		}
+
+		returnValue = DBase[fileType];
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+			
+	/**
+	 * MediaManagement: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['MediaMgmt',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+			
+		if (!criteria || typeof criteria != 'object' || typeof criteria.Type == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'Type');
+		
+		if (!/^FileInfo$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.badType);
+
+		return failed;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		badType			: '%s : %s : Type not supported',
+		missingTID 		: '%s : %s : TransactionID is missing',
+		badAsync		: '%s : %s : Insufficient arguments for async request',
+		is_missing		: '%s : %s : %s is missing',
+		is_invalid		: '%s : %s : %s is invalid'
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Messaging.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,366 @@
+/**
+ * Messaging.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+  
+(function(){
+	
+	var provider = 'Service.Messaging' ,
+		Interface = 'IMessaging';
+		
+	/**
+	 * Messaging service
+	 */
+	var MessagingService = function(){
+		this.GetList			 	= __GetList;
+		this.Send 					= __Send;
+		this.RegisterNotification	= __RegisterNotification;
+		this.CancelNotification 	= __CancelNotification;
+		this.ChangeStatus 			= __ChangeStatus;
+		this.Delete					= __Delete;
+		this.Cancel 				= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new MessagingService() );
+
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+	
+	/**
+	 * Messaging: GetList
+	 * @param {Object} criteria
+	 */
+	function __GetList(criteria){
+
+		if ((result = validator.apply('GetList', arguments)) !== false)
+			return result; 
+	
+		if (!criteria.Type)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^Inbox$/i.test(criteria.Type))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+	
+		var returnValue = [], 
+			match = null,
+			filter = criteria.Filter || null;
+ 
+		DBase = context.getData(provider);
+
+		// filter by MessageId
+		if (filter && filter.MessageId) {
+			returnValue = findByKey(DBase.Inbox, filter.MessageId, 'MessageId'); 
+			if (returnValue.length == 0)
+				return error(device.implementation.ERR_NOT_FOUND);
+		}
+		// return all messages
+		else {
+			returnValue = DBase.Inbox;
+		}
+
+		// unsupported filters 
+		if (filter 
+			&& (match = context.keys(filter).join().match(/MessageTypeList|SenderList|Subject|StartDate|EndDate/ig)) ) {
+			context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+		}
+		// unsupported sort			
+		if (criteria.Sort) { 
+			context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
+		}
+		return context.Result(context.Iterator(returnValue));
+	}
+			
+	/**
+	 * Messaging: Send
+	 * @param {Object} criteria
+	 * @param {Function} [callback] function for async call (optional)
+	 */
+	function __Send(criteria, callback){
+
+		if ((result = validator.apply('Send', arguments)) !== false)
+			return result; 
+
+		if (!criteria.MessageType)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingMessageType);
+			
+		if (!/^(SMS|MMS)$/i.test(criteria.MessageType))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badMessageType);
+
+		if (!criteria.To)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTo);
+		
+		// async call?
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		context.notify(_t('%s:: Send : message sent!').arg(provider));
+
+		// return success
+		return error(device.implementation.ERR_SUCCESS);
+	}
+			
+
+	/**
+	 * Messaging: RegisterNotification
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (mandatory)
+	 */
+	function __RegisterNotification(criteria, callback){
+
+		if ((result = validator.apply('RegisterNotification', arguments)) !== false)
+			return result; 
+
+		// callback is mandatory
+		if (typeof callback != 'function')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badAsync);
+		
+		// continue validation after callback check		
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+		
+		if (!/^NewMessage$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var eventType =  'NewMessage';
+
+		// check for multiple registration
+		if (context.hasListener(provider, eventType))
+			return error(device.implementation.ERR_ENTRY_EXISTS);
+				
+		// process notify
+		return context.addListener(provider, eventType, criteria, callback, notifyHandler);
+	}
+			
+	function notifyHandler(transactionID, criteria, callback, data){
+		
+		var result,
+			eventCode = {completed:2, error:4, progress:9},
+			code = eventCode.progress;
+		try{
+			DBase = context.getData(provider);
+			
+			// make new message
+			var now = new Date();
+			var message = {
+			 	"MessageType": "SMS",
+				"Sender": "0435445454",
+				"Subject": "new message",
+				"Time": _t("%s, %s").arg(now.toString().substr(0,3), now.toLocaleString()),
+				"Priority": "Medium",
+				"Attachment": false,
+				"Unread": true,
+				"MessageId": context.getUniqueID(),
+				"BodyText": "My hovercraft is full of eels!"
+			};
+			
+			// extend with optional data
+			data = typeof data=='object' && !(data instanceof Array) ? data : {};
+			var returnValue = context.extend(message, data);
+
+			result = context.Result(returnValue);
+			
+			/// add to top of inbox
+			DBase.Inbox.unshift(message);
+		} 
+		catch(e){
+			code = eventCode.error;
+		}
+		callback(transactionID, code, result);
+	}
+	
+	/**
+	 * Messaging: CancelNotification
+	 * @param {Object} criteria
+	 */
+	function __CancelNotification(criteria){
+
+		if ((result = validator.apply('CancelNotification', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.Type == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType);
+
+		if (!/^NewMessage$/i.test(criteria.Type)) 
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badType);
+
+		var eventType = 'NewMessage';
+		context.removeListener(provider, eventType);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+			
+			
+	/**
+	 * Messaging: ChangeStatus
+	 * @param {Object} criteria
+	 */
+	function __ChangeStatus(criteria){
+
+		if ((result = validator.apply('ChangeStatus', arguments)) !== false)
+			return result; 
+
+		if (!criteria.MessageId)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing ,'MessageId');
+			
+		if (typeof criteria.MessageId != 'number')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badMessageIdType);
+			
+		if (!criteria.Status)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing ,'Status');
+
+		if (!/^(Read|Unread|Replied|Forwarded)$/i.test(criteria.Status))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badStatus);
+	
+		// check if a callback was provided
+		if (arguments.length > 1)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badAsync2);
+			
+		DBase = context.getData(provider);
+
+		var i,item, found = false;
+		for (i in DBase.Inbox) {
+			item = DBase.Inbox[i];
+			if (criteria.MessageId == item.MessageId) {
+				item.Unread = /Unread/i.test(criteria.Status);
+				found = true;
+			}
+		}
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+						
+	/**
+	 * Messaging: Delete
+	 * @param {Object} criteria
+	 */
+	function __Delete(criteria){
+		
+		if ((result = validator.apply('Delete', arguments)) !== false)
+			return result; 
+
+		if (typeof criteria.MessageId == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingMessageId);
+
+		if (typeof criteria.MessageId != 'number')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badMessageIdType);
+					
+		if (criteria.MessageId < 0)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.badMessageId);
+			
+		DBase = context.getData(provider);
+
+		var i,item, found = false;
+		for (i in DBase.Inbox) {
+			item = DBase.Inbox[i];
+			if (criteria.MessageId == item.MessageId) {
+				DBase.Inbox.splice(i, 1);
+				found = true;
+			}
+		}
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+			
+		// return success
+		return error(device.implementation.ERR_SUCCESS);				
+	}
+			
+
+	/**
+	 * Messaging: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.is_missing, 'TransactionID');
+		
+		clearTimeout(criteria.TransactionID);
+		return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['Messaging',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	/**
+	 * validate common input arguments
+	 * 'this' is string (object) name of calling function
+	 * 
+	 * @param {arguments} arguments of calling function
+	 * @return {Result} Result object if error, false if no error.
+	 */
+	function validator() {
+		method = ''+this;
+		var	failed = false,
+			criteria = arguments[0] || false;
+
+		if (!criteria || typeof criteria != 'object')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, 
+				method == 'Send' 
+				? msg.missingMessageType 
+				: (/ChangeStatus|Delete/.test(method) 
+					? msg.missingMessageId 
+					: msg.missingType) );
+			
+		return failed;
+	}
+
+
+	function findByKey(dbase, value, key){
+		var result = [];
+		for (var i in dbase) {
+			if (value == dbase[i][key]) {
+				result.push(dbase[i]);
+			}
+		}
+		return result;
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		missingType		: '%s:%s:Type Missing',
+		badType			: '%s:%s:Type Value Incorrect',
+		missingTo		: '%s:%s:To Missing',
+		badTo			: '%s:%s:To Value Incorrect',
+		missingMessageType	: '%s:%s:MessageType Missing',
+		badMessageType	: '%s:%s:MessageType Value Incorrect',
+		badAsync		: '%s:%s:Synchronous Operation not supported',
+		badAsync2		: '%s:%s:Asynchronous Operation not supported',
+		missingMessageId	: '%s:%s:MessageId Missing',
+		badMessageIdType: '%s:%s:MessageId Type Invalid',
+		badMessageId	: '%s:%s:MessageId Value Incorrect',
+		badStatus		: '%s:%s:Status Value Incorrect',
+
+		is_missing		: '%s:%s:%s Missing',
+		is_invalid		: '%s:%s:%s Value Incorrect'
+	};
+		
+
+}) ()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/Sensor.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,250 @@
+/**
+ * Sensor.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+(function(){
+
+	var provider = 'Service.Sensor',
+		Interface = 'ISensor';
+	var transID = new Array();
+	/**
+	 * Sensor service
+	 */
+	var SensorService = function(){
+		this.FindSensorChannel 			= __FindSensorChannel;
+		this.RegisterForNotification	= __RegisterForNotification;
+		this.Cancel						= __Cancel;
+		this.GetChannelProperty			= __GetChannelProperty;		
+	}
+
+	device.implementation.extend(provider, Interface, new SensorService() );
+
+	/******************************************************/	
+	/******************************************************/	
+	/******************************************************/	
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null;
+
+
+	/**
+	 * Sensor: FindSensorChannel
+	 * @param {Object} criteria
+	 */
+	function __FindSensorChannel(criteria){
+		method = 'FindSensorChannel';
+		if(!criteria)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgCriteriaMissing);
+			
+		if(typeof criteria != 'object')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);
+						
+		if(typeof criteria.SearchCriterion == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgDataMissing);
+
+		if(typeof criteria.SearchCriterion != 'string')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgidInvalid);
+
+		if(!(criteria.SearchCriterion== "All" || criteria.SearchCriterion== "AccelerometerAxis" || criteria.SearchCriterion=="AccelerometerDoubleTapping" || criteria.SearchCriterion=="Orientation" || criteria.SearchCriterion=="Rotation"))
+		 	return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgSearchParamInvalid);
+
+		if(arguments.length > 1)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);			
+
+		DBase = context.getData(provider);
+		var returnValue;
+		returnValue = DBase[criteria.SearchCriterion] || [] ;
+		
+		return context.Result(returnValue,0);			
+	}
+
+
+
+	/**
+	 * Sensor: RegisterForNotification
+	 * @param {Object} criteria, callback
+	 */
+	function __RegisterForNotification(criteria, callback, flag){
+		flag = flag || false;
+		method = 'RegisterForNotification';
+		context.notify(_t('%s:: RegisterForNotification not implemented in preview').arg(provider));
+		
+		if(arguments.length >2 && (typeof flag != "undefined" && typeof flag != "boolean"))
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);
+
+		if(typeof callback != 'function')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgInsufficentArgument);
+		
+		
+		if(!criteria)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);
+			
+		if(typeof criteria != 'object')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgIncompleteInput);
+						
+		if(typeof criteria.ListeningType == 'undefined' || typeof criteria.ChannelInfoMap == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);
+
+		if(typeof criteria.ListeningType != 'string')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgListenTypeInvalid);
+			
+		if(typeof criteria.ChannelInfoMap != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);
+		
+		if(!(criteria.ListeningType== "ChannelData" ))
+		 	return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgOutofRange);
+
+		if(typeof callback == 'function')
+		{
+			var result = context.callAsync(this, arguments.callee, criteria, callback);
+			transID.push(result.TransactionID);
+			return result;
+		}
+		if(flag)
+			transID.shift();
+				
+		return context.ErrorResult();
+	}
+
+
+	/**
+	 * Sensor: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+
+		if(arguments.length > 1 && typeof criteria != "object" && typeof criteria.TransactionID != "number" && arguments[1])
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);
+
+		if (!criteria || typeof criteria.TransactionID == 'undefined') 
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgTransIDMissing);
+
+		if (criteria.TransactionID == Infinity || criteria.TransactionID == -Infinity) 
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgTransIDMissing);
+		
+		if (typeof criteria.TransactionID != 'number') 
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgIncorrectTransID);		
+
+		for (var i=0; i<transID.length; i++) {
+			if (criteria.TransactionID == transID[i]){
+				clearTimeout(criteria.TransactionID);
+				return context.ErrorResult();
+			}
+		};
+		
+		return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgInvalidTransID);
+
+	}
+
+
+	/**
+	 * Sensor: GetChannelProperty
+	 * @param {Object} criteria
+	 */
+	function __GetChannelProperty(criteria){
+		method = 'GetChannelProperty';
+
+		if(!criteria)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);
+			
+		if(typeof criteria != 'object')
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgIncompleteInput);
+
+		if(typeof criteria.ChannelInfoMap == 'undefined' || typeof criteria.PropertyId == 'undefined')
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.msgIncompleteInput);
+		
+		if(typeof criteria.ChannelInfoMap != 'object')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);
+		
+		if(typeof criteria.PropertyId != 'string')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgInvalidPropertyID);
+		
+		if(criteria.PropertyId != 'Availability' && criteria.PropertyId != "ChannelAccuracy" && criteria.PropertyId != "ChannelDataFormat" && criteria.PropertyId != "ChannelScale" && criteria.PropertyId != "ChannelUnit" && criteria.PropertyId != "ConnectionType" && criteria.PropertyId != "DataRate" && criteria.PropertyId != "Description" && criteria.PropertyId != "MeasureRange" && criteria.PropertyId != "ScaledRange" && criteria.PropertyId != "SensorModel")
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgInvalidPropertyID);
+
+		if(arguments.length > 1)
+			return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.msgCriteriaMissing);			
+
+		DBase = context.getData(provider);
+		var property = DBase['SensorProperty'];
+		if(typeof criteria.ChannelInfoMap['ChannelId'] == 'undefined' || typeof criteria.ChannelInfoMap['ChannelId'] != 'number')
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);
+
+		var channel = null;
+		if(criteria.ChannelInfoMap['ChannelId'] == 7)
+		{
+			channel = 'AccelerometerAxis';
+		}
+		else if(criteria.ChannelInfoMap['ChannelId'] == 8)
+		{
+			channel = 'AccelerometerDoubleTapping';
+		}
+		else if(criteria.ChannelInfoMap['ChannelId'] == 10)
+		{
+			channel = 'Orientation';
+		}
+		else if(criteria.ChannelInfoMap['ChannelId'] == 11)
+		{
+			channel = 'Rotation';
+		}
+	
+		if(channel == null)
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.msgChannelInfoMapInvalid);
+		
+		var returnValue = property[channel][criteria.PropertyId];
+		if(typeof returnValue == 'undefined')
+			return context.ErrorResult(device.implementation.ERR_NOT_FOUND);
+		return context.Result(returnValue,0)
+	}
+
+	/**
+	 * Sensor: error
+	 * @param {number,string} ErrorCode and ErrorString
+	 * Replaces Error String with method name
+	 */
+	function error(code, msg /*, args...*/){
+
+		var args = ['Sensors',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {	
+		msgInterfaceNotSupported 	: '%s:Requested interface not supported by the provider',
+		msgInterfaceMissing 		: '%s:Interface name missing',
+		msgInsufficentArgument 		: '%s:%s:Insufficent argument for asynchronous request',
+		msgListenTypeMissing 		: '%s:%s:Listening type missing',
+		msgListenTypeInvalid		: '%s:%s:Listening type is invalid',
+		msgChannelInfoMissing		: '%s:%s:ChannelInfoMap missing',
+		msgIncompleteInput			: '%s:%s:Incomplete input param list',
+		msgOutofRange				: '%s:%s:Listening type is out of allowed range',
+		msgCallbackMissing			: '%s:%s:Callback missing',
+		msgAlreadyRegistered		: '%s:%s:Notification is already registered on this channel',
+		msgCriteriaMissing			: '%s:%s:Search criterion is missing',
+		msgInvalidSearchCriteria	: '%s:%s:Invalid Search Criterion',
+		msgChannelSearchInvalid		: '%s:%s:Channel search param type invalid',
+		msgSearchParamInvalid		: '%s:%s:Invalid channel search param',
+		msgTransIDMissing			: '%s:%s:Transaction id is missing',
+		msgIncorrectTransID			: '%s:%s:Incorrect TransactionID',
+		msgInvalidTransID			: '%s:%s:Invalid TransactionID',
+		msgPropertyIDMissing		: '%s:%s:Property id missing',
+		msgInvalidPropertyID		: '%s:%s:Property id is invalid',
+		msgChannelNotSupported		: '%s:%s:Channel property not supported',
+		msgChannelInfoMapInvalid	: '%s:%s:ChannelInfoMap Type Invalid'
+	};
+
+}) ()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/sapi/SysInfo.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,398 @@
+/**
+ * SysInfo.js
+ * 
+ * Nokia Web Runtime Service API emulation 
+ * WRT v1.1
+ * 
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+ 
+(function(){
+	
+	var provider = 'Service.SysInfo' ,
+		Interface = 'ISysInfo';
+
+	var supportedEntitiesAndKeys = {
+		"battery":{
+			"batterystrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"chargingstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
+		},
+		"connectivity":{
+			"bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"activeconnections":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":false},
+			"connectionstatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"wlanmacaddress":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"device":{
+			"firmwareversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"platformversion":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"producttype":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"manufacturer":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"machineid":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"phonemodel":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"imei":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"display":{
+			"brightness":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"screensavertimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"userinactivity":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"keyguardtime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"autolocktime":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"autolockstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"wallpaper":{"GetInfo":false,"SetInfo":true,"GetNotification":false,"GetInfoModeSync":false,"InputDataType":"string"},
+			"lighttimeout":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"displayresolution":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"displayorientation":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"features":{
+			"bluetooth":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"infrared":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"camera":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"fmradio":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"qwerty":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"wlan":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"usb":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"pen":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"led":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"coverui":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"sidevolumekeys":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"vibra":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true}
+		},
+      	"general":{
+			"accessorystatus":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"connectedaccessories":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"inputlanguage":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"supportedlanguages":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"predictivetext":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"vibraactive":{"GetInfo":true,"SetInfo":true,"GetNotification":true,"GetInfoModeSync":true},
+			"availableusbmodes":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"activeusbmode":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"flipstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"gripstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			
+		},
+      	"memory":{
+			"driveinfo":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"listdrives":{"GetInfo":true,"SetInfo":false,"GetNotification":false,"GetInfoModeSync":true},
+			"criticalmemory":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"memorycard":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true}
+		},
+      	"network":{
+			"signalstrength":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"registrationstatus":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"networkmode":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":true},
+			"currentnetwork":{"GetInfo":true,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"locationarea":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false},
+			"cellid":{"GetInfo":false,"SetInfo":false,"GetNotification":true,"GetInfoModeSync":false}
+		}
+	  };
+	  
+	/**
+	 * SysInfo service
+	 */
+	var SysInfoService = function(){
+		this.GetInfo 			= __GetInfo;
+		this.SetInfo 			= __SetInfo;
+		this.GetNotification 	= __GetNotification;
+		this.Cancel 			= __Cancel;
+	}
+
+	device.implementation.extend(provider, Interface, new SysInfoService() );
+
+	var	context = device.implementation.context,
+		_t = context._t,
+		method = '',
+		result = false,
+		DBase = null,
+		default_device = 'default';
+		
+	/**
+	 * SysInfo: GetInfo
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __GetInfo(criteria, callback){
+		var retVal = ValidateArguments("GetInfo",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+		//	Async call
+		if (typeof callback == 'function') {
+			return context.callAsync(this, arguments.callee, criteria, callback);
+		}
+
+		DBase = context.getData(provider);
+		var returnValue = DBase;
+		returnValue = returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()];
+		returnValue.Key = criteria.Key;
+		returnValue.Entity = criteria.Entity;
+
+		if(/^Connectivity$/i.test(criteria.Entity)&& /^ActiveConnections$/i.test(criteria.Key))
+		{
+			var temp = returnValue.ConnectionList;
+			returnValue.ConnectionList = context.Iterator(temp);
+		}
+		else if(/^General$/i.test(criteria.Entity)&& /^ConnectedAccessories$/i.test(criteria.Key))
+		{
+			var temp = returnValue.AccessoryList;
+			returnValue.AccessoryList = context.Iterator(temp);			
+		}
+		else if(/^Memory$/i.test(criteria.Entity)&& /^DriveInfo$/i.test(criteria.Key))
+		{
+			try {
+				var temp = criteria.SystemData.Drive;
+				if(temp.length > 3)
+				{
+					temp = temp.substring(0,3);
+				}
+				temp= returnValue.Drive[temp.toUpperCase()];
+				if (!temp) {
+					return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
+				}
+				var driveInfo = new Object();
+				driveInfo.Key = returnValue.Key;
+				driveInfo.Entity = returnValue.Entity;
+				driveInfo.DriveInfo = temp;
+				return context.Result(driveInfo);
+			}
+			catch(err)
+			{
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.no_msg);
+			}
+			
+		}
+		return context.Result(returnValue);
+	}
+			
+
+	/**
+	 * SysInfo: SetInfo
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call (optional)
+	 */
+	function __SetInfo(criteria, callback){
+		var retVal = ValidateArguments("SetInfo",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+
+		//	Current implementation support only for 'General' -> 'InputLanguage' || 'PredictiveText'
+		if (/^General$/i.test(criteria.Entity) && ( /^InputLanguage$/i.test(criteria.Key) || /^PredictiveText/i.test(criteria.Key) || /^VibraActive/i.test(criteria.Key))) {
+			//	get the DBase data
+			DBase = context.getData(provider);
+			var returnValue = DBase;
+			
+			//	Check the 'SupportedLanguages' entries for Setting the new Status
+			if (/^InputLanguage$/i.test(criteria.Key)) {
+				var found = false;
+				var languageList = returnValue['general']['supportedlanguages']['LanguageList'];
+				for (var key in languageList) {
+					if (languageList[key] == criteria.SystemData.Status) {
+						found = true;
+					}
+				}
+				//	Update the 'InputLanguage' if the value value found in the ['SupportedLanguages']
+				if (found) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+				else 
+					return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
+			}
+			else if (/^PredictiveText$/i.test(criteria.Key)) {
+				if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+				else 
+					return error(device.implementation.ERR_NOT_FOUND, msg.badType);
+			}
+			else if (/^VibraActive$/i.test(criteria.Key)) {
+				if (criteria.SystemData.Status == 0 || criteria.SystemData.Status == 1) 
+					returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['Status'] = criteria.SystemData.Status;
+			}
+			else {
+				return error(device.implementation.ERR_SERVICE_NOT_SUPPORTED, msg.not_supported);
+			}
+		}
+		else if(/^Display/i.test(criteria.Entity) && /^Wallpaper/i.test(criteria.Key)) {
+			if(typeof criteria.SystemData.StringData == 'undefined')
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+			returnValue[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]['StringData'] = criteria.SystemData.StringData;
+			return context.ErrorResult(device.implementation.ERR_SUCCESS);
+		}
+		return context.Result(result);
+	}
+			
+
+	/**
+	 * SysInfo: GetNotification
+	 * @param {Object} criteria
+	 * @param {function} callback function for async call
+	 */
+	function __GetNotification(criteria, callback){
+		var retVal = ValidateArguments("GetNotification",criteria,callback);
+		if(retVal.ErrorCode != 0)
+		{
+			return retVal;
+		}
+		
+		// unsupported
+		if (!/^(Battery|Memory)$/i.test(criteria.Entity) ||
+			!/^(BatteryStrength|ChargingStatus|MemoryCard)$/i.test(criteria.Key)) {
+			context.notify(_t('%s:: GetNotification : entity %s, key %s not implemented in preview.').arg(provider, criteria.Entity, criteria.Key));
+			// register callback anyway so Cancel works. 
+		}
+
+		// evenType = 'entity.key'
+		var eventType = criteria.Entity+'.'+criteria.Key;
+						
+		// process notify
+		return context.addListener(provider, eventType, criteria, callback, notifyHandler);
+	}
+			
+	function notifyHandler(transactionID, criteria, callback, data){
+		
+		var result,
+			eventCode = {completed:2, error:4, progress:9},
+			code = eventCode.progress;
+		try{
+			DBase = context.getData(provider);
+			var entity = criteria.Entity.toLowerCase(),
+				key = criteria.Key.toLowerCase();
+						
+			// make a copy of return value
+			var returnValue = context.extend({},DBase[entity][key]);
+			
+			// augment with data
+			context.extend(returnValue, data);
+
+			result = context.Result(returnValue);
+		} 
+		catch(e){
+			code = eventCode.error;
+		}
+		callback(transactionID, code, result);
+	}
+		
+			
+
+	/**
+	 * SysInfo: Cancel
+	 * @param {Object} criteria
+	 */
+	function __Cancel(criteria){
+		method = 'Cancel';
+
+		if (!criteria || !criteria.TransactionID)
+			return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingTID);
+
+		var found = context.removeListener(provider, null, criteria.TransactionID);
+		if (!found)
+			return error(device.implementation.ERR_NOT_FOUND);
+		else
+			return context.ErrorResult(device.implementation.ERR_SUCCESS);
+	}
+
+
+	
+	/*******************************
+	 * helper functions
+	 *******************************/
+	
+	function error(code, msg /*, args...*/){
+
+		var args = ['SysInfo',method].concat([].slice.call(arguments,2));
+		msg = msg ? _t().arg.apply(msg,args) : undefined;
+		return context.ErrorResult(code, msg);
+	}
+
+	function cancelRegisteredNotify(result)
+	{
+		__Cancel({'TransactionID':result.TransactionID});
+		method = 'GetNotification';
+	}
+
+	/** 
+	 * error messages
+	 * order of %s args: Service name, method name, parameter name 
+	 */
+	var msg = {
+		badType				: '%s: %s: Type is invalid',
+		badSysInfo			: '%s: %s: SysInfoName is invalid',
+		missingSysInfo		: '%s: %s: SysInfoName is missing',
+		missingTID 			: '%s: %s: Transaction ID missing',
+		not_supported 		: '%s: %s: Not Supported',
+		is_invalid			: '%s: %s: Is invalid',
+		missingArgs			: '%s: %s: SystemData Argument Missing',
+		inSufficientArgs	: '%s: %s: Insufficient Arguments to process',
+		missingInputParam	: '%s: %s: Input Parameter Missing',
+		not_supportedSyncVer: '%s: %s: Sync Version Not Supported',
+		noEntity			: '%s: %s: Entity: Input Parameter Missing',
+		noKey				: '%s: %s: Key: Input Parameter Missing',
+		IncorrectSytemData	: '%s: %s: Incorrect SystemData Type, SystemData Must be a Map',
+		callbackNotFound	: '%s: %s: Callback object not found',
+		commandNotFound		: '%s: %s: Command Not Supported',
+		unsupInterface		: 'SysInfo:Requested interface not supported by the provider',
+		no_msg				: '%s: %s: '
+	};
+
+	/**
+	 * Common validator for all functions
+	 * 	 
+	 *  
+	 * @param {arguments} function name and arguments of calling function
+	 * @return {Result} Error object
+	 */		
+	  function ValidateArguments(funName,criteria,callback)
+	  {
+	  	method = funName;
+
+		try {
+			if (/^GetNotification$/i.test(funName) && typeof callback != "function") {
+				return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.not_supportedSyncVer);
+			}
+			
+			if (typeof criteria == "undefined" || typeof criteria.Entity == "undefined" || typeof criteria.Key == "undefined") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.inSufficientArgs);
+			}
+			
+			if (criteria.Entity == "") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noEntity);
+			}
+			
+			if (criteria.Key == "") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.noKey);
+			}
+			
+			if (/^SetInfo$/i.test(funName)) {
+				if (typeof criteria.SystemData == "undefined" || criteria.SystemData == '') {
+					return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+				}
+				if (typeof criteria.SystemData.StringData == "undefined" && typeof criteria.SystemData.Status == "undefined") {
+					return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingArgs);
+				}
+			}
+			
+			if (typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()] == 'undefined' || typeof supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()] == 'undefined') {
+				return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
+			}
+			
+			if (!supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()][funName]) {
+				return error(device.implementation.ERR_NOT_FOUND, msg.no_msg);
+			}
+			
+			if (funName == "GetInfo" && !supportedEntitiesAndKeys[criteria.Entity.toLowerCase()][criteria.Key.toLowerCase()]["GetInfoModeSync"] && typeof callback != "function") {
+				return error(device.implementation.ERR_MISSING_ARGUMENT, msg.not_supportedSyncVer);
+			}
+			
+			return context.ErrorResult(device.implementation.ERR_SUCCESS, "");
+		}
+		catch(err){
+			return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+		}
+		
+	  }
+
+}) ()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/systeminfo.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,107 @@
+/**
+	This API is used to provide system related data.
+	It takes the sysObject as an argument that is the embeded API in the main HTML file.
+	While using this API outside mobile environment, User or developer need not to take any extara action in oprder to support SYSAPI.
+*/
+
+function systemAPI(sysObject)
+{
+	/*
+	 * 	System Language information services
+	 */
+	sysObject.language = 'EN';
+
+
+
+
+	/*
+	 * 	Power information services
+	 */
+	
+	//	Properties
+	sysObject.chargelevel = 5;
+	sysObject.chargerconnected = 0;
+
+	//	Event triggers
+	sysObject.onchargelevel = null;
+	sysObject.onchargerconnected = null;
+
+
+
+	/*
+	 * 	Beep tone control services
+	 */	
+	sysObject.beep = function(frequency, duration){	}
+
+
+
+	/*
+	 * 	Network Information services
+	 */
+	
+	//	value range between: {0-7}
+	sysObject.signalbars = 7;
+
+	sysObject.networkname = 'No network';
+
+	//	value range between: {0-7}
+	sysObject.networkregistrationstatus = 0;
+	
+
+
+	/*
+	 * 	Display and keypad illumination information and control services
+	 */
+
+	//	Properties
+	sysObject.lightminintensity = 1;
+	sysObject.lightmaxintensity = 100;
+	sysObject.lightdefaultintensity = 0;
+	
+	sysObject.lightinfiniteduration = 0;
+	sysObject.lightmaxduration = 1;
+	sysObject.lightdefaultcycletime = 0;
+
+	sysObject.lighttargetprimarydisplayandkeyboard = 0x3;
+	sysObject.lighttargetsystem = 1;
+
+	//	functions
+	sysObject.lighton	= function(lighttarget, duration, intensity, fadein){ 	}
+	sysObject.lightblink	= function(lighttarget, duration, onduration, offduration, intensity){ 	}
+	sysObject.lightoff	= function(lighttarget, duration, fadeout){ 	}
+
+
+
+	/*
+	 * 	Vibration information and control services
+	 */
+	sysObject.vibraminintensity = 1;
+	sysObject.vibramaxintensity = 10;
+	sysObject.vibramaxduration = 100;
+	
+	//	Vibration setting in the user profile is off.
+	sysObject.vibrasettings = 2; 
+
+	sysObject.startvibra	= function(duration, intensity){	}
+
+	sysObject.stopvibra	= function(){	}
+
+
+
+
+	/*
+	 * 	Memory and file system information services
+	 */
+	sysObject.totalram = 32;	
+	sysObject.freeram = 10;	
+	sysObject.drivelist = 'C';	
+
+	sysObject.drivesize	= function(drive){	return 64;	}
+	
+	sysObject.drivefree	= function(drive){	return 32;	}
+
+}
+
+
+//	make TRUE systeminfo.js script loaded
+window.parent.NOKIA.scriptsLoaded.systeminfo = true;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/lib/widget.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,286 @@
+/**
+ * widget object constructor
+ * @param {void}
+ *     widget()
+ * @return {void}
+ */ 
+
+if (typeof window.widget == "undefined" || !window.widget) {
+	window.widget = {
+		author : 'Nokia WRT Emulation Library',
+		//	widget identifier, dummy value
+		identifier: 14021981,
+		isrotationsupported: true,
+		
+		//	widget event triggers
+		onshow: null,
+		onhide: null,
+		
+		sysInfo: [],
+		onload: null,
+		opacity: 50,
+		interval: 20,
+		isFront: false,
+		preferenceArray: [],
+		preferenceKey: 0
+	};
+	
+	
+	/**
+	 * Launches the browser with the specified url
+	 * @param {String} url
+	 *     openURL()
+	 * @return {Void}
+	 */
+	widget.openURL = function(url){
+		if (url) {
+			window.open(url, "New Widget Window", 'height=200 width=250');
+		}
+	}
+	
+	
+	/**
+	 * Returns previously stored preference associated with the specified key
+	 * @param {String} Key preference value to be fetch
+	 *     preferenceForKey()
+	 * @return {String} Value
+	 */
+	widget.preferenceForKey = function(name){
+		return _BRIDGE_REF.nokia.helper.readCookie(name);
+	}
+	
+	
+	/**
+	 * Stores the key associated with the specified preference
+	 * @param {String} Preference value to be stored
+	 * @param {String} Key Preference value associated to
+	 *     setPreferenceForKey()
+	 * @return {Void}
+	 */
+	widget.setPreferenceForKey = function(preference, key){
+		_BRIDGE_REF.nokia.helper.createCookie(key, preference);
+	}
+	
+	
+	
+	/**
+	 * Toggle between Tabbed navigation mode or Cursor mode
+	 * @param {Boolean} Value
+	 *     setNavigationEnabled()
+	 * @return {Void}
+	 */
+	widget.setNavigationEnabled = function(bool){
+		//This function can not be used on preview browser
+	}
+	
+	
+	
+	/**
+	 * Open S0-Application identified by UID along with the specified params
+	 * @param {Integer} Uid hexadecimal value to a specified application
+	 * @param {String} Value
+	 *     openApplication()
+	 * @return {Void}
+	 */
+	widget.openApplication = function(Uid, param){
+		alert("openApplication function won't be simulated in this application");
+	}
+	
+	
+	
+	/**
+	 * Prepares the Widget.to do transition to specified transitionState
+	 * @param {String} Value Transition state
+	 *     prepareForTransition()
+	 * @return {Void}
+	 */
+	widget.prepareForTransition = function(transitionState){
+		this.isFront = ("" + transitionState).toLowerCase() != "toback";
+		window.document.getElementsByTagName("body")[0].style.opacity = "0.3";
+	}
+	
+	
+	
+	
+	/**
+	 * Does the animation to make the transition between the specified transitionState
+	 * @param {Void}
+	 *     performTransition()
+	 * @return {Void}
+	 */
+	widget.performTransition = function(){
+		var _self = this;
+		this.opacity = 0;
+		this.interval = window.setInterval(function(){
+			_self.opacity += 0.2;
+			if (_self.opacity > 1) {
+				_self.opacity = 1;
+			}
+			window.document.getElementsByTagName("body")[0].style.opacity = _self.opacity + "";
+			if (_self.opacity >= 1) {
+				window.clearInterval(_self.interval);
+				window.document.getElementsByTagName("body")[0].style.opacity = "1";
+			}
+			//do nothing
+		}, 50);
+		//do nothing
+	}
+	
+	
+	
+	
+	
+	/**
+	 * Set the preferred screen orientation to landscape.
+	 * The display will flip if the phone display orientation
+	 * is portrait and the phone supports landscape mode.
+	 * @param {Void}
+	 *     setDisplayLandscape()
+	 * @return {Void}
+	 */
+	widget.setDisplayLandscape = function(){
+		try {
+			if (this.isrotationsupported && _BRIDGE_REF.nokia.emulator.orientationSupports()) {
+				_BRIDGE_REF.nokia.emulator.setMode('landscape');
+			}
+		} 
+		catch (e) {
+		}
+	}
+	
+	
+	
+	
+	/**
+	 * Set the preferred screen orientation to portrait.
+	 * The display will flip if the phone display orientation
+	 * is landscape and the phone supports portrait mode.
+	 * @param {Void}
+	 *     setDisplayPortrait()
+	 * @return {Void}
+	 */
+	widget.setDisplayPortrait = function(){
+		try {
+			if (this.isrotationsupported && _BRIDGE_REF.nokia.emulator.orientationSupports()) {
+				_BRIDGE_REF.nokia.emulator.setMode('portrait');
+			}
+		} 
+		catch (e) {
+		}
+	}
+	
+	/**
+	 * Allows the definition of a function to be called
+	 * when a Widget.is displayed
+	 * @param {Void}
+	 *     onshow()
+	 * @return {Void}
+	 */
+	widget.onshow = function(){
+		// to be implemented
+	}
+	
+	
+	
+	
+	/**
+	 * Allows the definition of a function to be called
+	 * when a Widget.sent into the background (hidden)
+	 * @param {Void}
+	 *     onhide()
+	 * @return {Void}
+	 */
+	widget.onhide = function(){
+		// to be implemented
+	}
+	
+	
+	
+	/**
+	 * This function returns the System API if sysinfo is included in document embed
+	 */
+	widget.enableSystemApi = function(){
+	
+		//	Identify, and Attach System-Info-Object properties
+		try {
+			var parentIframeRef = window.parent.frames[0];
+			if (typeof parentIframeRef == 'object') {
+				if (parentIframeRef.document.embeds.length > 0) {
+					for (var i = 0; i < parentIframeRef.document.embeds.length; i++) {
+						//match the system Info API embed tag
+						if (parentIframeRef.document.embeds[i].type == 'application/x-systeminfo-widget') {
+							new systemAPI(parentIframeRef.document.embeds[i]);
+//							widget.sysInfo = parentIframeRef.document.embeds[i];
+							
+							// hide the <embed> object
+							parentIframeRef.document.embeds[i].style.display='none';
+							
+							// push the reference object into widget
+							widget.sysInfo.push(parentIframeRef.document.embeds[i]);
+						}
+					}
+				}
+			}
+		} 
+		catch (e) {
+			alert('Error in attachSysInfo: ' + e);
+		}
+	}
+	
+	/**
+	 * 
+	 */
+	
+	widget.triggerListener = function(provider, eventType, data){
+		if(widget.sysInfo.length){
+			for(var i=0; i<widget.sysInfo.length; i++){
+				if(provider == "power"){
+					switch(eventType){
+						case "chargerconnected" : 
+												  widget.sysInfo[i].chargerconnected = data;
+												  if(widget.sysInfo[i].onchargerconnected != null){
+													setTimeout(widget.sysInfo[i].onchargerconnected, 0);
+												  }else{
+														console.info("System API-1.0 Notice -- no listeners defined for eventType:"+eventType);
+												  }
+												  break;
+
+						case "chargelevel" 		:
+												  widget.sysInfo[i].chargelevel = data;
+												  if(widget.sysInfo[i].onchargelevel != null){
+													setTimeout(widget.sysInfo[i].onchargelevel, 0);
+												  }else{
+														console.info("System API-1.0 Notice -- no listeners defined for eventType:"+eventType);
+												  }
+												 break;
+					}
+				}
+			}
+		}else{
+			console.info("System API-1.0 Notice -- no listeners defined for eventType:"+eventType);
+		}
+	}
+	
+	//	make TRUE widget.js script loaded
+	window.parent.NOKIA.scriptsLoaded.widget = true;
+}
+
+(function(){
+
+	//	attach the System-Info api specific functionality
+	_BRIDGE_REF.helper.addEvent(window, 'load', function(){
+		widget.enableSystemApi();
+		
+	});
+
+	if (_BRIDGE_REF.nokia) {
+		_BRIDGE_REF.nokia.menu.lsk_event = function(){
+			_BRIDGE_REF.nokia.emulator.child.menu.show();
+		};
+		
+		//	Add THIS window Reference on FRAME WINDOW
+		//	NOKIA.emulator.child object reference
+		_BRIDGE_REF.nokia.emulator.child = window;
+		_BRIDGE_REF.nokia.menu.init();
+	}	
+})()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/nokia.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,1495 @@
+/*
+	@chinnapp
+*/
+
+if(typeof NOKIA == "undefined" || !NOKIA) 
+{
+	var NOKIA = {
+		version : 'WRT 1.1',
+		currentDevice : '240x320',
+		mode : 'portrait',
+		resolution : ['240x320', '320x240', '360x640', '800x352'],
+		scriptsLoaded : {
+			loader : false,
+			widget : false,
+			systeminfo : false,
+			menu   : false,
+			menuItem : false,
+			console : false
+		}
+	};
+	NOKIA.namespace = function(name)
+	{
+		var parts = name.split('.');
+		var current = NOKIA;
+		for(var key in parts){
+			if(!current[parts[key]]){
+				current[parts[key]] = {};
+			}
+			current = current[parts[key]];
+		}  
+	};
+	
+	NOKIA.init = function()
+	{
+		// Not-Supported Browser check
+		NOKIA.emulator.is_browserReady = (/MSIE/i.test(navigator.userAgent));
+		if(NOKIA.emulator.is_browserReady)
+		{
+			var notSupportedBrowser = NOKIA.helper.readCookie('NOKIA_NOT_SUPPORTED_BROWSER');
+			if (notSupportedBrowser != 1) {
+				$("#NotificationDiv")[0].className = 'show';
+				$("#NotificationDiv").dialog({
+					width: 550,
+					minWidth: 550,
+					minHeight: 350,
+					height: 150,
+					autoOpen: true,
+					position: top,
+					title: 'Notification window',
+					buttons: {
+						Cancel: function(){
+							$("#NotificationDiv").dialog('close');
+						},
+						Continue: function(){
+							$("#NotificationDiv").dialog('close');
+							NOKIA.helper.createCookie('NOKIA_NOT_SUPPORTED_BROWSER', 1);
+							NOKIA.init();
+						}
+					}
+				});
+				return false;
+			}else{
+				$("#BrowserNotificationBar").css({display:'block'});
+				$("#BrowserNotificationBar > p > a").click(function(){ $("#BrowserNotificationBar").hide(); });
+			}
+		}
+	
+		$('iframe')[0].src = "wrt_preview_main.html";
+
+		NOKIA.data.load(deviceResolutionList);
+		
+		var url = window.location.toString();			
+		url = url.split('/');
+		
+		var pointer = 3;
+		if(url[0] == 'http:')
+			pointer = 2;
+
+		var t = ''; 
+		for(var i=pointer; i<url.length-1; i++){ 	t = t + url[i] + '/'; 	}
+		if(url[0] == 'file:')
+			NOKIA.emulator.url = 'file:///' + t;
+		else
+			NOKIA.emulator.url = 'http://' + t;
+
+		//	Common Error/Notification Dialog
+		NOKIA.helper.errorDailog = $("#Dialog").dialog({
+			bgiframe: true, minHeight: 150, width: 450, modal: true, autoOpen: false,
+			buttons: {	
+					Cancel: function(){ $(this).dialog('close');	},			
+					Reload: function(){ 
+						$(this).dialog('close');
+						$("#loaderDiv").html("Widget is reloading. Please wait...");
+						$("#loaderDiv")[0].className = 'green';
+						$("#loaderDiv").show();
+						window.setTimeout(function(){
+							document.location = document.location;
+						}, 3000);
+					}			
+				}
+		});
+
+		//	validating Info.plist
+		this.helper.getInfo('Info.plist', NOKIA.helper.getInfoCallback);	
+
+		//	For getting Icon.png
+		this.helper.getInfo('Icon.png', NOKIA.helper.getIconCallback);	
+	};
+
+	/*
+	 * NOKIA.data
+	 */
+	NOKIA.namespace('data.load');
+
+	NOKIA.data.load = function(data){
+		NOKIA.deviceList = data;
+	}
+
+
+
+	/*
+	 * NOKIA.emulator
+	 */
+	NOKIA.namespace('menu');
+	NOKIA.menu = {
+		is_menu_visible : false,		// true/false
+		is_softkeys_visible : false,	// true : only when MenuItem's are displayed
+		softkeys_visibility : true,		// true/false : for hide/show SFK's
+		is_dimmed : false,
+		is_rsk_overridden : false,
+		log_counter : 1,
+		enable_log : false,
+		rsk_label : '',
+		rsk_event : false,
+		highlighted_item : null,
+		
+		hide : function()
+		{
+			$("#MenuItemsArea").fadeIn("slow");
+
+			//	Hide the SFK's If user hidden them from his code
+			if(NOKIA.menu.softkeys_visibility)
+				$("#SoftKeysArea").fadeIn("slow");
+			
+			NOKIA.menu.is_softkeys_visible = false;
+		},
+
+		log : function(str)
+		{
+			if(!this.enable_log)
+				return false;
+			NOKIA.layout.log("log", NOKIA.menu.log_counter + ' ' +str);
+			NOKIA.layout.log("log", 'is_rsk_overridden: '+NOKIA.menu.is_rsk_overridden);
+			NOKIA.layout.log("log", 'rsk_label: '+NOKIA.menu.rsk_label);
+			NOKIA.layout.log("log", 'rsk_event: '+NOKIA.menu.rsk_event);
+			
+			NOKIA.menu.log_counter++;
+		},
+
+		show : function()
+		{
+			if(NOKIA.menu.is_dimmed)
+				return false;
+				
+			NOKIA.menu.showSoftKeys();
+			
+			NOKIA.menu.is_menu_visible = true;
+			$("#MenuItemsArea").show();
+			
+			NOKIA.menu.highlighted_item = $("#MenuItemsArea > ul > li")[0];
+			NOKIA.menu.highlighted_item.className = 'active';
+
+
+			$("#MenuItemsArea > ul > li").mouseover(function(){
+				if(NOKIA.menu.highlighted_item != null)
+				{
+					NOKIA.menu.highlighted_item.className = '';
+					NOKIA.menu.highlighted_item = null;
+				}
+
+				NOKIA.menu.highlighted_item = this;
+				NOKIA.menu.highlighted_item.className = 'active';
+			});
+
+			$("#SoftKeysArea").mouseout(function(){
+				if (!NOKIA.menu.is_menu_visible) {
+					return false;
+				}
+				
+				if (NOKIA.helper.intervalId) {
+					clearInterval(NOKIA.helper.intervalId);
+				}
+				NOKIA.helper.intervalId = setTimeout(function(){
+					NOKIA.menu.cancel()
+				}, 500);
+			});
+
+
+			//	Change the label "Options" to "Select" to LSK
+			$("#LskLabel > a")[0].innerHTML = "Select";
+			NOKIA.menu.setLsk(NOKIA.menu.selectMenu);
+			
+			//	Change the label "Exit" to "Cancel" to RSK
+			$("#RskLabel > a")[0].innerHTML = 'Cancel';
+			NOKIA.menu.setRsk(NOKIA.menu.cancel);
+			
+
+			NOKIA.emulator.setMenuItemsStyle();
+			
+		},
+		
+		selectMenu : function(){
+			try {
+				if(typeof NOKIA.menu.highlighted_item.onclick != 'undefined'){
+					eval(NOKIA.menu.highlighted_item.onclick)();
+				}
+			} catch (e) {
+				
+			}
+//			NOKIA.menu.cancel();
+		},
+
+		
+		cancel : function()
+		{
+			if(NOKIA.menu.is_dimmed)
+				return false;
+				
+			NOKIA.menu.hideSoftKeys();
+
+			NOKIA.menu.is_menu_visible = false;
+			$("#MenuItemsArea").hide();
+
+			//	Reset the "OPTION" label to LSK
+			$("#LskLabel > a")[0].innerHTML = 'Options';
+			NOKIA.menu.setLsk(NOKIA.emulator.child.menu.show);
+
+			//	Change the label "CANCEL" to "EXIT" to RSK
+			if(!NOKIA.menu.is_rsk_overridden)
+			{
+				$("#RskLabel > a")[0].innerHTML = 'Exit';
+				NOKIA.menu.setRsk(NOKIA.menu.exit);	
+			}
+			else
+			{
+				$("#RskLabel > a")[0].innerHTML = NOKIA.menu.rsk_label;
+				NOKIA.menu.setRsk(NOKIA.menu.rsk_event);	
+			}
+			
+		},
+
+		exit : function()
+		{
+			if(NOKIA.menu.is_dimmed)
+				return false;
+				
+			if(NOKIA.helper.setHomeScreen())
+				return false;
+
+			//	clear the Menu Settings
+			NOKIA.menu.cancel();
+			NOKIA.emulator.child.menu.setRightSoftkeyLabel('', null);
+			NOKIA.emulator.child.menu.items = [];
+			NOKIA.menu.softkeys_visibility = false;
+			
+			// Hide Widget DIV
+			NOKIA.menu.hideSoftKeys();
+			NOKIA.menu.setLsk(function(){});
+			NOKIA.menu.setRsk(function(){});
+			
+			$("#WidgetArea").hide();
+
+			//	Show Icon
+			var style = NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode]['style'];
+			$('#IconArea').css({
+				'width' 	:	'100%',
+				'height'	:	style['widget']['height']+'px',
+				'float' 	:	style['widget']['float']
+			});
+			
+			$('#IconArea')[0].className = NOKIA.mode+NOKIA.currentDevice;
+			
+			var img = document.createElement('img');
+			img.src = NOKIA.emulator.iconFile;
+			img.border = 0;
+			
+			var div = document.createElement('div');
+			var p = document.createElement('p');
+			
+			if(NOKIA.emulator.plist.DisplayName.length <= 12)
+				p.innerHTML = NOKIA.emulator.plist.DisplayName; 
+			else
+				p.innerHTML = NOKIA.emulator.plist.DisplayName.substr(0, 11) + '...' 
+
+			div.className = 'IconFile';
+			div.style.marginTop = parseInt(parseInt(style['widget']['height']/2)-80) + 'px';
+			div.appendChild(img);
+			img.onclick = function(){
+				
+				//	close the console DIV
+				NOKIA.layout._console_enabled = false;
+				NOKIA.layout.render();
+				
+				$("#loaderDiv").html("Widget is loading. Please wait...");
+				$("#loaderDiv")[0].className = 'green';
+				$("#loaderDiv").show();
+				window.setTimeout(function(){
+					document.location = document.location;
+				}, 3000);
+				
+			};
+			
+			div.appendChild(p);
+
+			$("#loaderDiv").html("Click on Icon to Launch Widget");
+			$("#loaderDiv").show();
+			$("#loaderDiv")[0].className = 'yellow';
+
+			$('#IconArea').append(div);
+			$('#IconArea').show();
+
+			NOKIA.menu.is_dimmed = true;
+			
+			$("#PreferencesBtn").hide();
+			$("#PreferencesTab").dialog('close');
+			
+		},
+		
+		setLsk : function(func)
+		{
+			//	for RSK
+			$('#LskArea')[0].onclick = function(){
+				if(!NOKIA.menu.is_dimmed)
+					func();
+			};
+		
+			$('#LskLabel > a')[0].onclick = function(){
+				if(!NOKIA.menu.is_dimmed)
+					func();
+			};
+
+			return true;
+		},
+		
+		setRsk : function(func)
+		{
+			//	for RSK
+			$('#RskArea')[0].onclick = function(){
+				if(!NOKIA.menu.is_dimmed)
+					func();
+			};
+			
+			$('#RskLabel > a')[0].onclick = function(){
+				if(!NOKIA.menu.is_dimmed)
+					func();
+			};
+			
+			return true;
+		},
+
+
+		triggerLsk : function(event)
+		{
+			var callback;
+			if(NOKIA.mode == 'portrait')
+				callback = NOKIA.menu.lsk_event;
+			else if( (NOKIA.mode == 'landscape') && (event.id =='LskLabel') )
+				callback = NOKIA.menu.lsk_event;
+			else
+				callback = NOKIA.menu.rsk_event;
+			
+			if(typeof callback == 'function' && !NOKIA.menu.is_dimmed)
+			{
+				callback();
+			}
+		},
+
+		triggerRsk : function(event)
+		{
+			var callback;
+			if(NOKIA.mode == 'portrait')
+				callback = NOKIA.menu.rsk_event;
+			else if( (NOKIA.mode == 'landscape') && (event.id =='RskLabel') )
+				callback = NOKIA.menu.rsk_event;
+			else
+				callback = NOKIA.menu.lsk_event;
+			
+			if(typeof callback == 'function')
+			{
+				if(!NOKIA.menu.is_dimmed)
+				{
+					callback();
+					NOKIA.menu.cancel();
+				}
+			}
+		},
+		
+		render : function()
+		{
+			if(!NOKIA.menu.softkeys_visibility)
+				NOKIA.menu.hideSoftKeys();
+			else
+				NOKIA.menu.showSoftKeys();
+			
+			NOKIA.emulator.setWidgetStyle();
+		},
+		
+
+		init : function()
+		{
+			NOKIA.menu.render();
+		},
+		
+		createSFKArea : function()
+		{
+			var a = $('#SoftKeys > a');
+			a.html('');
+			
+			var preferences = NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode];
+			
+			var lsk = document.createElement('img');
+			lsk.border="0";
+			lsk.id = "LskArea";
+			lsk.name ="LskArea";
+			lsk.src = "preview/images/TransperantImage.png";
+			lsk.style.width = preferences.style.softkeysImg.width; 
+			lsk.style.height = preferences.style.softkeysImg.height;
+			
+			var rsk = document.createElement('img');
+			rsk.border = 0;
+			rsk.id = "RskArea";
+			rsk.name = "RskArea";
+			rsk.src = "preview/images/TransperantImage.png";
+			rsk.style.width = preferences.style.softkeysImg.width; 
+			rsk.style.height = preferences.style.softkeysImg.height;
+
+			if(NOKIA.mode == 'portrait')
+			{	
+				lsk.onclick = function(){
+					$("#LskLabel > a").trigger('click');
+				}
+				a[0].appendChild(lsk);
+
+				rsk.onclick = function(){
+					$("#RskLabel > a").trigger('click');
+				}
+				a[1].appendChild(rsk);
+
+			}else{
+
+				rsk.onclick = function(){
+					$("#RskLabel > a").trigger('click');
+				}
+				a[0].appendChild(rsk);
+
+				lsk.onclick = function(){
+					$("#LskLabel > a").trigger('click');
+				}
+				a[1].appendChild(lsk);
+			}
+			
+			
+		},
+
+		showSoftKeys : function()
+		{
+			NOKIA.menu.is_softkeys_visible = true;
+
+			NOKIA.emulator.setWidgetStyle();
+			$("#SoftKeysArea").show();
+		},
+		
+		hideSoftKeys : function()
+		{
+			//	Hide the SFK's If user hidden them from his code
+			if(!NOKIA.menu.softkeys_visibility)
+				$("#SoftKeysArea").hide();
+			
+			NOKIA.menu.is_softkeys_visible = false;
+
+			NOKIA.emulator.setWidgetStyle();
+		}
+	};
+
+
+
+	/*
+	 * NOKIA.emulator
+	 */
+	NOKIA.namespace('emulator');
+	NOKIA.emulator = {
+		child : false,
+		iconFile : 'preview/images/default-Icon.png',
+		loaded : false,
+		plist : {
+			DisplayName	:	'',
+			Identifier	:	'',
+			MainHTML	:	'',
+			AllowNetworkAccess	:	"false",
+			Version		:	'',
+			MiniViewEnabled		:	"false",
+			is_browserReady : false
+		},
+		
+		load : function()
+		{
+			if(this.loaded)
+				return false;
+				
+			//	load the saved device Info
+			var device = NOKIA.helper.readCookie('NOKIA_EMULATOR_DEVICE');
+			NOKIA.currentDevice = device || NOKIA.currentDevice;
+
+
+			//	load the saved device mode
+			var mode = NOKIA.helper.readCookie('NOKIA_EMULATOR_DEVICE_MODE');
+			if(mode != null)
+				NOKIA.mode = mode;
+
+			//	SAVE the device DATA
+			NOKIA.helper.createCookie('NOKIA_EMULATOR_DEVICE', NOKIA.currentDevice);
+			NOKIA.helper.createCookie('NOKIA_EMULATOR_DEVICE_MODE', NOKIA.mode);
+			
+			this.loaded = true;
+			
+		},
+	
+		render : function()
+		{
+			this.load();
+			
+			if(!NOKIA.emulator.orientationSupports())
+				NOKIA.mode = NOKIA.deviceList[NOKIA.currentDevice]['default'];
+			
+			if(typeof NOKIA.deviceList == 'undefined' || typeof NOKIA.deviceList[NOKIA.currentDevice] == 'undefined' || typeof NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode] == 'undefined')
+			{
+				alert('Deive resolution: '+NOKIA.currentDevice+' or the mode: '+NOKIA.mode+' not found');
+				return false;
+			}
+			
+			this.setStyle();
+		},
+		
+		setMode : function(mode)
+		{
+			NOKIA.mode = mode;
+
+			//	SAVE the device DATA
+			NOKIA.helper.createCookie('NOKIA_EMULATOR_DEVICE_MODE', NOKIA.mode);
+
+			NOKIA.emulator.render();
+		},
+		
+		orientationSupports : function()
+		{
+			return NOKIA.deviceList[NOKIA.currentDevice]['orientation'];
+		},
+		
+		setStyle:function()
+		{
+			if(!NOKIA.helper.checkDependencies())
+			{
+				setTimeout(NOKIA.emulator.setStyle, 1000);
+			}
+			
+			var deviceProperties = NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode];
+			var style = deviceProperties['style'];
+
+			//	Apply Style and propertis to Device layers
+			$("#DeviceDisplayLayout").css(style['layout']);
+			$('#DisplayArea').css(style['display']);
+			
+			NOKIA.emulator.setWidgetStyle();
+			
+			$('#SoftKeysArea').css({
+				'width'	:	style['menu']['width']+'px',
+				'height'	:	style['menu']['height']+'px',
+				'float' 	:	style['menu']['float']
+			});
+			
+			$('#SoftKeysArea > ul > li').css('width', parseInt(style['menu']['width']/2)-10);
+
+			
+			NOKIA.emulator.setMenuItemsStyle();
+			
+			$('#SoftKeys').css(style['softkeys']);
+//			$('#SoftKeys > a > img').css(style['softkeysImg']);
+
+			NOKIA.menu.createSFKArea();
+			
+			$("#DeviceDisplayLayout").show();
+			$("#PreferencesTab").show();
+			
+			if(!NOKIA.menu.is_dimmed)
+				$("#PreferencesBtn").show();
+		},
+		
+		setWidgetStyle : function()
+		{
+			var style = NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode]['style'];
+			var height;
+			if(NOKIA.menu.softkeys_visibility || NOKIA.menu.is_softkeys_visible)
+				height = parseInt(style['widget']['height'] - style['menu']['height']);
+			else
+				height = style['widget']['height'];
+
+			$('#WidgetArea').css({
+				'width' 	:	style['widget']['width']+'px',
+				'height'	:	height+'px',
+				'float' 	:	style['widget']['float']
+			});
+		},
+		
+		setMenuItemsStyle : function()
+		{
+			var style 	= NOKIA.deviceList[NOKIA.currentDevice][NOKIA.mode]['style'];
+			var count = 1;
+			try {
+				if (NOKIA.emulator.child.menu) {
+					count = parseInt(NOKIA.helper.getElementsLengthInObject(NOKIA.emulator.child.menu.items)) + 1;
+				}
+			} catch (e) {
+				count = 1;
+			}
+			var height 	= parseInt(count*style['menu']['optionKeysheight']) + 10;
+			var top 	= parseInt(style['widget']['height'] - height); 
+
+			$('#MenuItemsArea').css({
+				'width'		:	style['widget']['width']+'px',
+				'height'	:	height+'px',
+				'marginTop'	:	'-2px',
+				'top'		:	(style['widget']['height']-height-style['menu']['height']+2)+'px',
+				'position'	: 	'relative'
+			});
+		}
+	};
+
+	/*
+	 * NOKIA.helper functions
+	 */
+	NOKIA.namespace('helper.loadScript');
+	NOKIA.helper = {
+		path : document.location.pathname,
+		errorDailog	: null,
+		prefDailog : null,
+		intervalId : null,
+		infoPlistCounter : false,
+		IconFileCounter  : false,
+		loadScript : function(path)
+		{
+			var head = document.getElementsByTagName("head")[0] || document.documentElement;
+			var script = document.createElement("script");
+	
+			script.type = "text/javascript";
+			script.src = src;
+			head.appendChild( script );
+		},
+
+		loadPreferences : function()
+		{
+			if(/dreamweaver/i.test(navigator.userAgent))
+			{
+				$("#dwDeviceHelp")[0].className = '';
+				$("#resSupportLink")[0].className = 'hide';
+			}
+			//	Selecting Resoltion
+			var resOptions = $("#resOptions")[0];
+			for(var i=0; i<NOKIA.resolution.length; i++)
+			{
+				if(NOKIA.resolution[i] == NOKIA.currentDevice)
+				{
+					resOptions.options[i].selected = true;
+					$("#resSupportLink")[0].href = resOptions.options[i].value;
+					break;
+				}				
+			}
+			
+			//	Selecting Orientation
+			if(NOKIA.mode == 'portrait')
+				$('#input_portrait')[0].checked = true;
+			else
+				$('#input_landscape')[0].checked = true;
+
+			if (!NOKIA.emulator.orientationSupports()) {
+				if (NOKIA.mode == 'portrait') 
+					$("#input_landscape")[0].disabled = true;
+				else 
+					$("#input_portrait")[0].disabled = true;
+					
+				$("#Orientation_Info").html("Not supported");
+				$("#Orientation_Info").show();
+				$("#Orientation_Controls").hide();
+			}
+			else {
+				$("#input_landscape")[0].disabled = false;
+				$("#input_portrait")[0].disabled = false;
+
+				$("#Orientation_Info").hide();
+				$("#Orientation_Controls").show();
+			}
+			
+			//	Selecting Version
+			if(NOKIA.version == 'WRT 1.0')
+				$('#wrt_version_1_0')[0].checked = true;
+			else
+				$('#wrt_version_1_1')[0].checked = true;
+				
+			//	HomeScreen Support
+			if(NOKIA.deviceList[NOKIA.currentDevice].homeScreenSupport)
+			{
+				if (typeof NOKIA.emulator.plist.MiniViewEnabled != 'undefined') {
+					if (NOKIA.emulator.plist.MiniViewEnabled == 'false') 
+						$('#HS_Control_Info').html("<span id='wrt-help' onclick='javascipt:NOKIA.helper.showMiniviewHelp();'></span><strong>Not Enabled</strong><br/><small>Click on help to read more about enabling Mini view support</small>");
+					else 
+						$('#HS_Control_Info').html("Supported");
+				}
+				else
+					$('#HS_Control_Info').html("<span id='wrt-help'></span>Not Supported");
+
+				$('#HS_Control_Info').show();
+
+			}
+			else
+			{
+				$('#HS_Control_Info').html("Not Supported for the selected Device resolution");
+				$('#HS_Control_Info').show();
+			}
+		},
+
+		getInfo : function(url, callback)
+		{
+			try {
+				var xhr = this.ajax();
+				
+				if ((/AppleWebKit/i.test(navigator.userAgent)))
+					xhr.open("GET", url, false);
+				else
+					xhr.open("GET", url, true);
+				
+				
+				xhr.onreadystatechange = function() 
+				{
+						// readyState = 4 ; "complete"
+						if (xhr.readyState==4)
+						{
+							// status = 200 ; "ok"
+							if( (xhr.status == 200) || (!xhr.status) )
+							{
+								callback(true, xhr);
+							}
+							else
+							{ 
+								callback(false, xhr);
+							}
+						}
+	
+				}
+				xhr.send(null);
+			} catch (e) {
+				if (e.name == 'NS_ERROR_FILE_NOT_FOUND') {
+					callback(false, xhr);
+				}			
+			}
+		},
+
+		getInfoCallback : function(flag, xhr)
+		{
+			//	If Info.plis NOT FOUND / FAILED LOAD
+			//	an ERROR!, unable to proceed further
+			// 	STOP there
+			if(!flag)
+			{
+				if(!NOKIA.helper.infoPlistCounter)
+				{
+					NOKIA.helper.infoPlistCounter = true;
+					NOKIA.helper.getInfo('info.plist', NOKIA.helper.getInfoCallback);
+					return false;
+				}
+
+				NOKIA.helper.error('Unable to intialize the widget, failed to process Info.plist file. <br/>Please ensure <strong style="color:#efe352;">Info.plist</strong> file exists on the widget root folder <br/>or check the filename of <strong style="color:#efe352;">Info.plist</strong> It is case-sensitive');
+				return false;
+			}
+			else{
+				
+				var xmlString = xhr.responseText;
+				
+				// do some cheating here
+				xmlString = xmlString.replace(/<\s*true\s*\/>/gi, "<string>true</string>");
+				xmlString = xmlString.replace(/<\s*false\s*\/>/gi, "<string>false</string>");
+	
+			/*
+			 * 	DomParser Logic
+				var appXml = new DOMParser();
+				var xmlobject = appXml.parseFromString(xmlString, "text/xml");
+			 */
+			
+				//	return the JSON Object
+				NOKIA.helper.validate(xml2json.parser(xmlString));
+			}
+			
+		},
+		
+		getIconCallback : function(flag, xhr)
+		{
+			
+			if(!flag)
+			{
+				if(!NOKIA.helper.IconFileCounter)
+				{
+					NOKIA.helper.IconFileCounter = true;
+					NOKIA.helper.getInfo('icon.png', NOKIA.helper.getIconCallback);
+					return false;	
+				}
+			}
+			else
+				NOKIA.emulator.iconFile =  (NOKIA.helper.IconFileCounter) ? "icon.png" : "Icon.png";
+		},
+		
+
+		validate : function(xmlObject)
+		{
+			window.xmlObject = xmlObject;
+			
+			//	<plist>
+			if(typeof xmlObject.plist != 'object' || xmlObject.plist == 'undefined')
+			{
+				NOKIA.helper.error('Corrupted Info.plist file');
+				return false;
+			}
+			//	<dict>
+			xmlObject = xmlObject.plist;
+			if(typeof xmlObject.dict != 'object' || xmlObject.dict == 'undefined')
+			{
+				NOKIA.helper.error('Corrupted Info.plist file');
+				return false;
+			}
+
+			//	<key>
+			xmlObject = xmlObject.dict;
+			if(typeof xmlObject.key != 'object' || xmlObject.key == 'undefined')
+			{
+				NOKIA.helper.error('Corrupted Info.plist file');
+				return false;
+			}
+
+			//	<string>
+			if(typeof xmlObject.string != 'object' || xmlObject.string == 'undefined')
+			{
+				NOKIA.helper.error('Corrupted Info.plist file');
+				return false;
+			}
+
+			//	num of <key> = num of <string>
+			if(xmlObject.key.length != xmlObject.string.length)
+			{
+				NOKIA.helper.error('Corrupted Info.plist file');
+				return false;
+			}
+
+			for(var val in xmlObject.key)
+			{
+				if(NOKIA.emulator.plist[xmlObject.key[val]] != 'undefined'){
+					NOKIA.emulator.plist[xmlObject.key[val]] = xmlObject.string[val].toString(); 
+				}
+			}
+
+			try {
+				if(typeof NOKIA.emulator.plist.DisplayName != 'undefined'){
+					document.title = NOKIA.emulator.plist.DisplayName + ' - ' + document.title;
+				}
+			} catch (e) {}
+
+			//	Add UI-Event listeners
+			NOKIA.helper.addListeners();
+			NOKIA.layout.init();
+			NOKIA.emulator.render();
+		},
+
+
+		ajax : function() 
+		{
+			//	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);
+		},
+
+		error : function(msg)
+		{
+			if(NOKIA.menu.enable_log)
+				NOKIA.layout.log("log", msg);
+			
+			$("#Dialog").html(msg);
+			$("#Dialog").dialog('open');
+		},
+
+		createCookie : function(name,value) 
+		{
+			var days = 240000;
+		    if (days) {
+				var date = new Date();
+				date.setTime(date.getTime()+(days*24*60*60*1000));
+				var expires = "; expires="+date.toGMTString();
+			}
+			else var expires = "";
+			document.cookie = "Nokia_WRT#" + NOKIA.helper.path + "#" + name + "=" + value + expires + "; path=/";
+		},
+		
+		readCookie : function(name) 
+		{
+			var nameEQ = "Nokia_WRT#" + NOKIA.helper.path + "#" + name + "=";
+			var ca = document.cookie.split(';');
+			for(var i=0;i < ca.length;i++) {
+				var c = ca[i];
+				while (c.charAt(0)==' ') c = c.substring(1,c.length);
+				if (c.indexOf(nameEQ) == 0) {
+					return c.substring(nameEQ.length,c.length);
+				}
+			}
+			return undefined;
+		},
+
+		toggle : function(ele)
+		{
+			if (NOKIA.emulator.orientationSupports()) {
+//				var mode = (NOKIA.mode == 'portrait') ? 'landscape' : 'portrait';
+				NOKIA.emulator.setMode(ele.value);
+			}
+			else
+			{	
+				ele.checked = false;
+				if(ele.value == 'portrait')
+					$("#input_landscape")[0].checked = true;
+				else
+					$("#input_portrait")[0].checked = true;
+			}
+		},
+
+		version : function(ele)
+		{
+			if (confirm('Would you like to reload the widget to apply the changes on the Version settings?')) 
+			{
+				NOKIA.helper.createCookie('_WRT_VERSION', ele.value);
+				$("#loaderDiv").html("Applying the " + ele.value + ", please wait...");
+				$("#loaderDiv").show();
+				$("#loaderDiv")[0].className = 'green';
+				
+				$("#PreferencesTab").dialog('close');
+				
+				window.setTimeout(function(){
+					document.location = document.location;
+				}, 3000);
+			}
+			else
+			{
+				ele.checked = false;
+				if(ele.value != 'WRT 1.0')
+					$("#wrt_version_1_0")[0].checked = true;
+				else
+					$("#wrt_version_1_1")[0].checked = true;
+			}
+		},
+
+		addListeners : function()
+		{
+			/*
+			 * Render Emulator for Interaction
+			 */
+			NOKIA.helper.prefDailog = $("#PreferencesTab").dialog({
+					width: 550,	minWidth: 550, minHeight: 350, height: 350, autoOpen: false, position : top, title : '&nbsp;',
+					buttons : {
+						Close : function(){
+							$("#PreferencesTab").dialog('close');
+
+							//	Hack for Mac firefox
+							if(/Mac/i.test(navigator.userAgent))
+							{
+								$("#WidgetArea iframe").css({overflow:'auto'});
+							}
+							
+							//	select index : 0 tab selected
+							$('#tabs').tabs( 'select' , 0);
+						}
+					}
+				});
+				
+			$('#PreferencesBtn').click(function(){
+				//	Load preferences
+				NOKIA.helper.loadPreferences();
+				$('#PreferencesTab').dialog('open');
+
+				//	Hack for Mac firefox
+				if(/Mac/i.test(navigator.userAgent))
+				{
+					$("#WidgetArea iframe").css({overflow:'hidden'});
+				}
+			});
+			
+			$('#input_portrait').change(function(){
+				NOKIA.helper.toggle(this);
+			});
+
+			$('#input_landscape').change(function(){
+				NOKIA.helper.toggle(this);
+			});
+
+			$('#resOptions').change(function(ele){
+				ele = ele.target || this;
+				
+				NOKIA.currentDevice = ele.options[ele.selectedIndex].text;
+				$("#resSupportLink")[0].href = ele.value;
+		
+				//	SAVE the device DATA
+				NOKIA.helper.createCookie('NOKIA_EMULATOR_DEVICE', NOKIA.currentDevice);
+		
+				NOKIA.emulator.render();
+				NOKIA.helper.loadPreferences();
+			});
+
+			//	Hack for Mac firefox
+			if (/Mac/i.test(navigator.userAgent)) {
+				if (!(/AppleWebKit/i.test(navigator.userAgent))) {
+					$("#resOptions")[0].size = '4';
+				}
+			}
+
+
+			//	WRT Version controls
+			$('#wrt_version_1_0').change(function(){
+				NOKIA.helper.version(this);
+			});
+			
+			$('#wrt_version_1_1').change(function(){
+				NOKIA.helper.version(this);
+			});
+
+
+			$("#orientationIcon").click(function(){
+				var mode = (NOKIA.mode == 'portrait') ? 'landscape' : 'portrait';
+				NOKIA.emulator.setMode(mode);
+				$("#WidgetArea")[0].className = 'hs_'+NOKIA.mode;
+			});
+
+
+			$("#iframeMask").click(function(){
+
+				$("#PreferencesBtn").show();
+				$("#orientationIcon").hide();
+				$("#iframeMask").hide();
+				$("#loaderDiv").hide();
+
+				NOKIA.menu.is_dimmed = false;
+				
+				$("#WidgetArea")[0].className = '';
+				
+				NOKIA.menu.softkeys_visibility = true;
+				NOKIA.menu.showSoftKeys();
+
+			});
+
+
+			//	MenuItems DIV events
+			$("#MenuItemsArea").mouseover(function(){
+				if(NOKIA.helper.intervalId)
+					clearInterval(NOKIA.helper.intervalId);
+
+				$("#MenuItemsArea").show();
+			});
+
+			$("#MenuItemsArea").mouseout(function(){
+				if(NOKIA.helper.intervalId)
+					clearInterval(NOKIA.helper.intervalId);
+
+				NOKIA.helper.intervalId = setTimeout(function(){
+					NOKIA.menu.cancel()
+				}, 500);
+			});
+
+
+			// Tabs
+			$('#tabs').tabs({
+				select : function(event, ui){
+					if(parseInt(ui.index) == 1)
+					{
+						$("#event-icons").show();
+						$("#event-battery-info").hide();
+						$("#event-messaging-info").hide();
+						$("#event-memory-info").hide();
+						
+						//	WRT versionn check
+						if(NOKIA.version == 'WRT 1.1')
+						{
+							$("#event-messaging")[0].className = 'active';
+							$("#event-memory")[0].className = 'active';
+						}else
+						{
+							$("#event-messaging")[0].className = 'inactive';
+							$("#event-memory")[0].className = 'inactive';
+						}
+						$("#event-battery")[0].className = 'active';
+					}else if(parseInt(ui.index) == 0)
+					{
+						$("#settings-view").show();
+						$("#mini-view-info").hide();
+					}
+				}
+			});
+
+			
+			/*	
+			 * 	Event triggering
+			 */
+			
+			//	for battery
+			$("#event-battery").click(function(event){
+				if(event.target.className == 'active')
+				{
+					$("#event-icons").hide();
+					$("#event-battery-info").show();
+
+/*
+				$('#slider').slider('option', 'value', NOKIA.emulator.child._BRIDGE_REF.helper.getBatteryStrength());
+				NOKIA.emulator.child._BRIDGE_REF.helper.getBatteryStrength()
+				$('#slider').slider('option', 'value', 10);
+				$('#slider').slider();
+*/
+				}
+			});
+
+			$("#event-battery-back").click(function(event){
+				$("#event-icons").show();
+				$("#event-battery-info").hide();
+			});
+
+
+			//	for messaging
+			$("#event-messaging").click(function(event){
+				if(event.target.className == 'active')
+				{
+					$("#event-icons").hide();
+					$("#event-messaging-info").show();
+				}
+			});
+
+			$("#event-messaging-back").click(function(event){
+				$("#event-icons").show();
+				$("#event-messaging-info").hide();
+			});
+
+
+			//	for memory
+			$("#event-memory").click(function(event){
+				if(event.target.className == 'active')
+				{
+					$("#event-icons").hide();
+					$("#event-memory-info").show();
+				}
+			});
+
+			$("#event-memory-back").click(function(event){
+				$("#event-icons").show();
+				$("#event-memory-info").hide();
+			});
+
+
+			//	for minView more info
+			$("#mini-view-back").click(function(event){
+				$("#settings-view").show();
+				$("#mini-view-info").hide();
+			});
+
+
+			// Slider
+			$('#slider').slider({
+				range: true,
+				min : 0,
+				max : 100,
+				step : 1,
+				value : 10,
+				animate: true,
+				slide: function(event, ui) {
+					$("#slider-value-panel > span").html(ui.value.toString());
+				}
+				});
+
+			//	Bind Buttons to trigger values to WRT 1.0 / 1.1 bindings
+			
+			$("#connect-charger").click(NOKIA.helper.triggerEvents);
+			$("#disconnect-charger").click(NOKIA.helper.triggerEvents);
+			$("#update-batter-strength").click(NOKIA.helper.triggerEvents);
+
+			$("#send-sms").click(NOKIA.helper.triggerEvents);
+			$("#send-mms").click(NOKIA.helper.triggerEvents);
+
+			$("#connect-memory-card").click(NOKIA.helper.triggerEvents);
+			$("#disconnect-memory-card").click(NOKIA.helper.triggerEvents);
+			
+		},
+		
+		setHomeScreen : function()
+		{
+			//	HomeScreen Support
+			if (NOKIA.deviceList[NOKIA.currentDevice].homeScreenSupport) {
+
+				if (typeof NOKIA.emulator.plist.MiniViewEnabled != 'undefined') {
+					if (NOKIA.emulator.plist.MiniViewEnabled != 'false') 
+					{
+						$("#WidgetArea")[0].className = 'hs_' + NOKIA.mode;
+						
+						//	menu handlining
+						NOKIA.menu.softkeys_visibility = false;
+						NOKIA.menu.cancel();
+						NOKIA.menu.is_dimmed = true;
+						
+
+						$("#loaderDiv").html("Click on widget for Return to Full view");
+						$("#loaderDiv")[0].className = 'green';
+						$("#loaderDiv").show();
+
+						$("#iframeMask").show();
+						$("#orientationIcon").show();
+						$("#PreferencesBtn").hide();
+
+						$("#PreferencesTab").dialog('close');
+						return true;
+					}
+				}
+			}
+			return false;			
+		},
+		
+		getElementsLengthInObject : function(items){
+			var count = 0;
+			for (var i in items) 
+			{
+				if(!items[i].isDimmed)
+					count++;
+			}
+			
+			return count;
+		},
+		
+		triggerEvents : function(event)
+		{
+			if(typeof event.target.id == 'undefined')
+			return false;
+			
+			switch(event.target.id)
+			{
+				//	for battery
+				case 'connect-charger': 
+										NOKIA.helper.trigger("power", "chargerconnected", 1);
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.SysInfo", "Battery.ChargingStatus", {Status: 1});
+										break;
+
+				case 'disconnect-charger': 
+										NOKIA.helper.trigger("power", "chargerconnected", 0);
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.SysInfo", "Battery.ChargingStatus", {Status: 0});
+										break;
+
+				case 'update-batter-strength': 
+										var chargeValue = parseInt($('#slider').slider('value'));
+										NOKIA.helper.trigger("power", "chargelevel", chargeValue);
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.SysInfo", "Battery.BatteryStrength", {Status: chargeValue});
+										break;
+
+				//	for messaging
+				case 'send-sms': 
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.Messaging", "NewMessage", {MessageType: 'SMS'});
+										break;
+				case 'send-mms': 
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.Messaging", "NewMessage", {MessageType: 'MMS'});
+										break;
+
+				//	for memory
+				case 'connect-memory-card': 
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.SysInfo", "Memory.MemoryCard", {Status: 1});
+										break;
+				case 'disconnect-memory-card': 
+										if(NOKIA.version == 'WRT 1.1')
+											NOKIA.helper.triggerSapi("Service.SysInfo", "Memory.MemoryCard", {Status: 0});
+										break;
+			}
+		},	
+
+		triggerSapi : function(provider, eventType, data){
+			NOKIA.emulator.child.device.implementation.triggerListener(provider, eventType, data);
+		},	
+
+		trigger : function(provider, eventType, data){
+			NOKIA.emulator.child.widget.triggerListener(provider, eventType, data);
+		},
+		
+		showMiniviewHelp : function(){
+			$("#settings-view").hide();
+			$("#mini-view-info").show();
+		},
+		
+		checkDependencies : function(){
+			
+			for(var key in NOKIA.scriptsLoaded)
+			{
+				if(!NOKIA.scriptsLoaded[key])
+					return false;
+			}
+
+			//	for LSK
+			NOKIA.menu.setLsk(NOKIA.emulator.child.menu.show);
+		
+			//	for RSK
+			NOKIA.menu.setRsk(NOKIA.menu.exit);
+
+			return true;
+		}
+	};
+	
+
+	/*
+	 * NOKIA.layout functions
+	 */
+	NOKIA.namespace('layout');
+	NOKIA.layout = {
+		_console_minimized : true,
+		_console_enabled : false,
+		_consoleWindowHeight : 200,
+		_consoleHeaderHeight : 31,
+
+		init : function(){
+			
+			//	Toggle console window
+			$('#Console-Toggle-Button').click(function(){
+				
+				NOKIA.layout._console_minimized = (NOKIA.layout._console_minimized) ? false : true;
+				NOKIA.layout.render();
+			});
+			
+			// clear Log
+			$("#Console-Clear-Button").click(function(){
+				$("#preview-ui-bottom-body")[0].innerHTML = '';
+			});
+
+
+			$('#preview-ui-bottom').show();
+			NOKIA.layout.render();
+		},
+		
+		log : function(type, msg){
+			var p = document.createElement('p');
+			p.className = type;
+			p.innerHTML = msg;
+			var divBody = $('#preview-ui-bottom-body')
+			divBody.append(p);
+			divBody[0].scrollTop = divBody[0].scrollHeight;
+		},
+		
+		
+		render : function(){
+			var _width = parseInt(window.innerWidth);
+			var _height = parseInt(window.innerHeight);
+			
+			if(!NOKIA.layout._console_enabled)
+			{
+				$('#preview-ui-bottom').css({
+					display: 'none'
+				});
+				
+				$('#preview-ui-top').css({
+					height: _height+'px'
+				});
+
+				return false;
+			}
+			
+			
+			if(!NOKIA.layout._console_minimized)
+			{
+				$('#Console-Toggle-Button')[0].className = 'open';
+				
+				//	set STYLE details for TOP window
+				$('#preview-ui-top').css({
+					height: parseInt(_height - NOKIA.layout._consoleWindowHeight) + 'px'
+				});
+				
+				//	set STYLE details for Bottom window
+				$('#preview-ui-bottom').css({
+					height: NOKIA.layout._consoleWindowHeight + 'px',
+					display : 'block'
+				});
+
+				$('#preview-ui-bottom-header').css({
+					height: NOKIA.layout._consoleHeaderHeight + 'px'
+				});
+
+				$('#preview-ui-bottom-body').css({
+					height: parseInt(NOKIA.layout._consoleWindowHeight - NOKIA.layout._consoleHeaderHeight) + 'px',
+					display : 'block'
+				});
+				
+				// Auto scroll when console window opened from MINIMIZED => MAXIMIZED state
+				window.setTimeout(function(){
+					$('#preview-ui-bottom-body')[0].scrollTop = $('#preview-ui-bottom-body')[0].scrollHeight;
+				}, 100);
+				
+			}else{
+				$('#Console-Toggle-Button')[0].className = 'close';
+
+				//	set STYLE details for TOP window
+				$('#preview-ui-top').css({
+					height: parseInt(_height - NOKIA.layout._consoleHeaderHeight) + 'px'
+				});
+				
+				//	set STYLE details for Bottom window
+				$('#preview-ui-bottom').css({
+					height: NOKIA.layout._consoleHeaderHeight + 'px',
+					display : 'block'
+				});
+
+				$('#preview-ui-bottom-header').css({
+					height: NOKIA.layout._consoleHeaderHeight + 'px',
+					display : 'block'
+				});
+
+				$('#preview-ui-bottom-body').css({
+					display : 'none'
+				});
+			}
+		}
+		
+	};
+}
+
+$(document).ready(function () {
+	NOKIA.init();	
+});
+
+window.onresize = NOKIA.layout.render;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/resolution.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,303 @@
+/*
+ * Device Resolution details
+ */
+var deviceResolutionList = {
+	'240x320'	: 	{
+		'default'			:	'portrait',
+		'orientation'		:	true,
+		'homeScreenSupport'	:	false,
+		'fontSize'			:	'12px',
+		'portrait'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/240x320/Portrait.png)',
+					'width'				: '600px',
+					'height'			: '536px'
+					},
+				'display':	{
+					'width'		:	'240px',
+					'height'	:	'320px',
+					'paddingTop':	'108px',
+					'marginLeft': 	'auto'				
+					},
+				'widget':	{
+					'width'		:	240,
+					'height'	:	320,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	240,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'240px',
+					'height':	'50px',
+					'left'	:	'0px',
+					'top'	:	'0px',
+					'position':	'relative'
+				},
+				'softkeysImg' : {
+					'width'	:	"50%",
+					'height':	"100%"
+				}
+			}
+		},
+		'landscape'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/240x320/Landscape.png)',
+					'width'				: '848px',
+					'height'			: '408px'
+					},
+				'display':	{
+					'width'		:	'320px',
+					'height'	:	'240px',
+					'paddingTop':	'84px',
+					'marginLeft': 	'auto'				
+					},
+				'widget':	{
+					'width'		:	320,
+					'height'	:	240,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	320,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'50px',
+					'height':	'240px',
+					'left'	:	'200px',
+					'top'	:	'-250px',
+					'position':	'relative'
+				},	
+				'softkeysImg' : {
+					'width'	:	"100%",
+					'height':	"50%"
+				}
+			}
+		}
+	},
+
+	'320x240'	: 	{
+		'default'			:	'portrait',
+		'orientation'		:	true,
+		'homeScreenSupport'	:	false,
+		'fontSize'			:	'12px',
+		'portrait'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/320x240/Portrait.png)',
+					'width'				: '640px',
+					'height'			: '472px'
+					},
+				'display':	{
+					'width'		:	'320px',
+					'height'	:	'240px',
+					'paddingTop':	'113px',
+					'marginLeft': 	'163px'				
+					},
+				'widget':	{
+					'width'		:	320,
+					'height'	:	240,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	320,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'320px',
+					'height':	'38px',
+					'left'	:	'0px',
+					'top'	:	'0px',
+					'position':	'relative'
+				},
+				'softkeysImg' : {
+					'width'	:	"50%",
+					'height':	"100%"
+				}
+			}
+		},
+		'landscape'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/320x240/Landscape.png)',
+					'width'				: '680px',
+					'height'			: '472px'
+					},
+				'display':	{
+					'width'		:	'240px',
+					'height'	:	'320px',
+					'paddingTop':	'76px',
+					'marginLeft': 	'223px'				
+					},
+				'widget':	{
+					'width'		:	240,
+					'height'	:	320,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	240,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'30px',
+					'height':	'320px',
+					'left'	:	'150px',
+					'top'	:	'-330px',
+					'position':	'relative'
+				},	
+				'softkeysImg' : {
+					'width'	:	"100%",
+					'height':	"50%"
+				}
+			}
+		}
+	},
+
+	'360x640'	: 	{
+		'default'			:	'portrait',
+		'orientation'		:	true,
+		'homeScreenSupport'	:	true,
+		'fontSize'			:	'12px',
+		'portrait'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/360x640/Portrait.png)',
+					'width'				: '678px',
+					'height'			: '838px'
+					},
+				'display':	{
+					'width'		:	'360px',
+					'height'	:	'640px',
+					'paddingTop':	'89px',
+					'marginLeft': 	'158px'				
+					},
+				'widget':	{
+					'width'		:	360,
+					'height'	:	640,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	360,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'360px',
+					'height':	'50px',
+					'left'	:	'0px',
+					'top'	:	'0px',
+					'position':	'relative',
+					'marginLeft' : '159px'
+				},
+				'softkeysImg' : {
+					'width'	:	"50%",
+					'height':	"100%"
+				},
+				'homeScreenDisplay':	{
+					'width'		:	'306px',
+					'height'	:	'76px'
+				}
+			}
+		},
+		'landscape'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/360x640/Landscape.png)',
+					'width'				: '1054px',
+					'height'			: '572px'
+					},
+				'display':	{
+					'width'		:	'640px',
+					'height'	:	'360px',
+					'paddingTop':	'104px',
+					'marginLeft': 	'206px'				
+					},
+				'widget':	{
+					'width'		:	640,
+					'height'	:	360,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	640,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'50px',
+					'height':	'360px',
+					'left'	:	'350px',
+					'top'	:	'-370px',
+					'position':	'relative',
+					'marginLeft': 	'auto'	
+				},	
+				'softkeysImg' : {
+					'width'	:	"100%",
+					'height':	"50%"
+				},
+				'homeScreenDisplay':	{
+					'width'		:	'306px',
+					'height'	:	'76px'
+				}
+			}
+		}
+	},
+
+	'800x352'	: 	{
+		'default'			:	'landscape',
+		'orientation'		:	false,
+		'homeScreenSupport'	:	false,
+		'fontSize'			:	'12px',
+		'landscape'	:	{
+			'style'	:	{
+				'layout'	:	{
+					'backgroundImage'	: 'url(preview/images/device/800x352/Landscape.png)',
+					'width'				: '1180px',
+					'height'			: '572px'
+					},
+				'display':	{
+					'width'		:	'800px',
+					'height'	:	'352px',
+					'paddingTop':	'108px',
+					'marginLeft': 	'190px'				
+					},
+				'widget':	{
+					'width'		:	800,
+					'height'	:	352,
+					'float'		: 	'left'
+					},
+				'menu'	:	{
+					'width'		:	800,
+					'height'	:	30,
+					'float'		: 	'right',
+					'optionKeysheight'	:	24
+					},
+				'softkeys'	:	{
+					'width'	:	'50px',
+					'height':	'352px',
+					'left'	:	'432px',
+					'top'	:	'-364px',
+					'position':	'relative',
+					'marginLeft': 	'auto'	
+				},	
+				'softkeysImg' : {
+					'width'	:	"100%",
+					'height':	"50%"
+				}
+			}
+		}
+	}
+
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/script/xml2json.js	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,172 @@
+/*
+xml2json v 1.1
+copyright 2005-2007 Thomas Frank
+
+This program is free software under the terms of the 
+GNU General Public License version 2 as published by the Free 
+Software Foundation. It is distributed without any warranty.
+*/
+
+var xml2json={ 
+	parser:function(xmlcode,ignoretags,debug){
+		if(!ignoretags){ignoretags=""};
+		xmlcode=xmlcode.replace(/\s*\/>/g,'/>');
+		xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,"");
+		if (!ignoretags.sort){ignoretags=ignoretags.split(",")};
+		var x=this.no_fast_endings(xmlcode);
+		x=this.attris_to_tags(x);
+		x=escape(x);
+		x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");
+		for (var i=0;i<ignoretags.length;i++){
+			x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*");
+			x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*")
+		};
+		x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>';
+		this.xmlobject={};
+		var y=this.xml_to_object(x).jsontagwrapper;
+		if(debug){y=this.show_json_structure(y,debug)};
+		return y
+	},
+	xml_to_object:function(xmlcode){
+		var x=xmlcode.replace(/<\//g,"§");
+		x=x.split("<");
+		var y=[];
+		var level=0;
+		var opentags=[];
+		for (var i=1;i<x.length;i++){
+			var tagname=x[i].split(">")[0];
+			opentags.push(tagname);
+			level++
+			y.push(level+"<"+x[i].split("§")[0]);
+			while(x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0){level--;opentags.pop()}
+		};
+		var oldniva=-1;
+		var objname="this.xmlobject";
+		for (var i=0;i<y.length;i++){
+			var preeval="";
+			var niva=y[i].split("<")[0];
+			var tagnamn=y[i].split("<")[1].split(">")[0];
+			tagnamn=tagnamn.toLowerCase();
+			var rest=y[i].split(">")[1];
+			if(niva<=oldniva){
+				var tabort=oldniva-niva+1;
+				for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."))}
+			};
+			objname+="."+tagnamn;
+			var pobject=objname.substring(0,objname.lastIndexOf("."));
+			if (eval("typeof "+pobject) != "object"){preeval+=pobject+"={value:"+pobject+"};\n"};
+			var objlast=objname.substring(objname.lastIndexOf(".")+1);
+			var already=false;
+			for (k in eval(pobject)){if(k==objlast){already=true}};
+			var onlywhites=true;
+			for(var s=0;s<rest.length;s+=3){
+				if(rest.charAt(s)!="%"){onlywhites=false}
+			};
+			if (rest!="" && !onlywhites){
+				if(rest/1!=rest){
+					rest="'"+rest.replace(/\'/g,"\\'")+"'";
+					rest=rest.replace(/\*\$\*\*\*/g,"</");
+					rest=rest.replace(/\*\$\*\*/g,"<");
+					rest=rest.replace(/\*\*\$\*/g,">")
+				}
+			} 
+			else {rest="{}"};
+			if(rest.charAt(0)=="'"){rest='unescape('+rest+')'};
+			if (already && !eval(objname+".sort")){preeval+=objname+"=["+objname+"];\n"};
+			var before="=";after="";
+			if (already){before=".push(";after=")"};
+			var toeval=preeval+objname+before+rest+after;
+			eval(toeval);
+			if(eval(objname+".sort")){objname+="["+eval(objname+".length-1")+"]"};
+			oldniva=niva
+		};
+		return this.xmlobject
+	},
+	show_json_structure:function(obj,debug,l){
+		var x='';
+		if (obj.sort){x+="[\n"} else {x+="{\n"};
+		for (var i in obj){
+			if (!obj.sort){x+=i+":"};
+			if (typeof obj[i] == "object"){
+				x+=this.show_json_structure(obj[i],false,1)
+			}
+			else {
+				if(typeof obj[i]=="function"){
+					var v=obj[i]+"";
+					//v=v.replace(/\t/g,"");
+					x+=v
+				}
+				else if(typeof obj[i]!="string"){x+=obj[i]+",\n"}
+				else {x+="'"+obj[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n"}
+			}
+		};
+		if (obj.sort){x+="],\n"} else {x+="},\n"};
+		if (!l){
+			x=x.substring(0,x.lastIndexOf(","));
+			x=x.replace(new RegExp(",\n}","g"),"\n}");
+			x=x.replace(new RegExp(",\n]","g"),"\n]");
+			var y=x.split("\n");x="";
+			var lvl=0;
+			for (var i=0;i<y.length;i++){
+				if(y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0){lvl--};
+				tabs="";for(var j=0;j<lvl;j++){tabs+="\t"};
+				x+=tabs+y[i]+"\n";
+				if(y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0){lvl++}
+			};
+			if(debug=="html"){
+				x=x.replace(/</g,"&lt;").replace(/>/g,"&gt;");
+				x=x.replace(/\n/g,"<BR>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;")
+			};
+			if (debug=="compact"){x=x.replace(/\n/g,"").replace(/\t/g,"")}
+		};
+		return x
+	},
+	no_fast_endings:function(x){
+		x=x.split("/>");
+		for (var i=1;i<x.length;i++){
+			var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0];
+			x[i]="></"+t+">"+x[i]
+		}	;
+		x=x.join("");
+		return x
+	},
+	attris_to_tags: function(x){
+		var d=' ="\''.split("");
+		x=x.split(">");
+		for (var i=0;i<x.length;i++){
+			var temp=x[i].split("<");
+			for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")};
+			if(temp[1]){
+				temp[1]=temp[1].replace(/'/g,'"');
+				temp[1]=temp[1].split('"');
+				for (var j=1;j<temp[1].length;j+=2){
+					for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")}
+				};
+				temp[1]=temp[1].join('"')
+			};
+			x[i]=temp.join("<")
+		};
+		x=x.join(">");
+		x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1");
+		x=x.replace(/>"/g,">").replace(/"</g,"<");
+		for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r])}	;
+		return x
+	}
+};
+
+
+if(!Array.prototype.push){
+	Array.prototype.push=function(x){
+		this[this.length]=x;
+		return true
+	}
+};
+
+if (!Array.prototype.pop){
+	Array.prototype.pop=function(){
+  		var response = this[this.length-1];
+  		this.length--;
+  		return response
+	}
+};
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/preview/wrt_preview.html	Wed Jan 20 16:51:26 2010 -0800
@@ -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/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/Activator.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.symbian.tools.wrttools.previewer.utils.Logging;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.symbian.tools.wrttools.previewer";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+	
+	public static void log(int severity, String message, Throwable x) {
+		IStatus status = new Status(severity, PLUGIN_ID, 0, message, x);
+		Logging.log(getDefault(), status);
+	}
+	
+	public static IProxyService getProxyService() {
+        ServiceTracker tracker = null;
+		return (IProxyService) tracker.getService();
+}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/WrtRootPreferences.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+
+package org.symbian.tools.wrttools.previewer;
+
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+public class WrtRootPreferences
+	extends FieldEditorPreferencePage
+	implements IWorkbenchPreferencePage {
+
+	public WrtRootPreferences() {
+		super(GRID);
+	}
+	
+	public void createFieldEditors() {
+	
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/PreviewSupport.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+
+package org.symbian.tools.wrttools.previewer.preview;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.QualifiedName;
+
+import org.symbian.tools.wrttools.previewer.utils.Check;
+import org.symbian.tools.wrttools.previewer.utils.TrackedResource;
+
+	/**
+	 * This class encapsulates the creation and naming 
+	 * of the preview folder and support files
+	 * @author dpodwall
+	 *
+	 */
+public class PreviewSupport {
+	
+	public static final String PREVIEW_FOLDER = "preview";
+	public static final String PREVIEW_MAIN_HTML = "wrt_preview_main.html";
+	public static final String PREVIEW_FRAME_HTML = "wrt_preview_frame.html";
+	public static final String PREVIEW_HTML_TEMPLATE = "wrt_preview.html";
+	public static final QualifiedName MAIN_HTML_PROPERTY = new QualifiedName("org.symbian.tools.wrttools", "mainHTML");
+	//public static final String PREVIEW_BROWSER_NAME1 = "WRT Widget (S60)";
+	public static final String PREVIEW_BROWSER_NAME =  "Web Runtime (WRT)";
+	
+	private TrackedResource projectTracker;
+	
+	public PreviewSupport(IProject project) {
+		Check.checkArg(project);
+		this.projectTracker = new TrackedResource(project);
+	}
+	
+	public void dispose() {
+		if (projectTracker != null) {
+			projectTracker.dispose();
+		}
+	}
+	
+	public IProject getProject() {
+		return projectTracker.getProject();
+	}
+	
+	/**
+	 * Returns the folder containing preview support files, creating it
+	 * if needed.
+	 * @throws CoreException
+	 */
+	public IFolder getPreviewFolder() throws CoreException {
+		IFolder result = getProject().getFolder(PREVIEW_FOLDER);
+		if (!result.exists()) {
+			result.create(true, true, new NullProgressMonitor());
+		}
+		return result;
+	}
+	
+	/**
+	 * Returns the main file, which is a copy of the user's main html
+	 * file. The copy is modified to include the widget preview environment
+	 * JavaScript files.
+	 * The returned IFile may not exist yet
+	 * @throws CoreException
+	 */
+	public IFile getPreviewMainHtml() throws CoreException {
+		IFile result = getProject().getFile(PREVIEW_MAIN_HTML);
+		return result;
+	}
+	
+	/**
+	 * Returns the preview file, which is the outermost html
+	 * file of the preview environment. It includes the main
+	 * file in an iframe.
+	 * The returned IFile may not exist yet
+	 * @throws CoreException
+	 */
+	public IFile getPreviewFrameHtml() throws CoreException {
+		IFile result = getProject().getFile(PREVIEW_FRAME_HTML);
+		return result;
+	}
+	public IFile getMainHtml() throws CoreException {
+		IFile result = null;
+		String mainFilePath = getProject().getPersistentProperty(MAIN_HTML_PROPERTY);
+		if (mainFilePath != null) {
+			IResource resource = getProject().findMember(mainFilePath);
+			if (resource instanceof IFile) {
+				result = (IFile) resource;
+			}
+		}
+		return result;
+	}
+	
+	/**
+	 * Returns the base path for preview support files
+	 * in the plugin
+	 * @return
+	 */
+	public IPath getPreviewPluginBase() {
+		return new Path("preview");
+	}
+	
+	public IPath getPreviewFrameTemplate() {
+		return getPreviewPluginBase().append(PREVIEW_HTML_TEMPLATE);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewBrowser.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,463 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+
+package org.symbian.tools.wrttools.previewer.preview;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.eclipse.core.net.proxy.IProxyData;
+import org.eclipse.core.net.proxy.IProxyService;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.ProgressAdapter;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+
+import org.mozilla.interfaces.nsIPrefBranch;
+import org.mozilla.interfaces.nsIServiceManager;
+import org.mozilla.xpcom.Mozilla;
+import org.osgi.framework.Bundle;
+import org.eclipse.ui.part.IPageBookViewPage;
+import org.eclipse.ui.part.IPageSite;
+import org.eclipse.ui.part.Page;
+
+//import com.aptana.ide.editor.html.BrowserExtensionLoader;
+//import com.aptana.ide.editors.UnifiedEditorsPlugin;
+//import com.aptana.ide.editors.unified.ContributedBrowser;
+//import com.aptana.ide.editors.unified.ContributedOutline;
+//import com.aptana.ide.editors.unified.DefaultBrowser;
+import org.symbian.tools.wrttools.previewer.utils.FileUtils;
+import org.symbian.tools.wrttools.previewer.Activator;
+
+public class WidgetPreviewBrowser extends Page implements IPageBookViewPage {
+	
+	private static final String XUL_RUNNER_PATH_PARAMETER = "org.eclipse.swt.browser.XULRunnerPath";
+
+	private ScrolledComposite outerComposite;
+
+	private Composite innerComposite;
+
+	private Browser browser;
+	
+	private String url;
+	
+	private PreviewSupport previewSupport;
+	
+	private boolean displayingPreview; // true if we're displaying the widget preview in the browser
+	
+	private nsIPrefBranch mozillaPrefs;
+	
+	private final IProject project;
+	
+	public WidgetPreviewBrowser(IProject project) {
+		this.project = project;
+	}
+	
+	private synchronized void initMozilla() {
+		if (System.getProperty(XUL_RUNNER_PATH_PARAMETER) == null) {
+			Bundle bundle = Platform.getBundle("org.mozilla.xulrunner"); //$NON-NLS-1$
+			if (bundle != null) {
+				URL resourceUrl = bundle.getResource("xulrunner"); //$NON-NLS-1$
+				if (resourceUrl != null) {
+					try {
+						URL fileUrl = FileLocator.toFileURL(resourceUrl);
+						File file = new File(fileUrl.toURI());
+						System.setProperty(XUL_RUNNER_PATH_PARAMETER, file
+								.getAbsolutePath()); //$NON-NLS-1$
+					} catch (IOException e) {
+						// log the exception
+					} catch (URISyntaxException e) {
+						// log the exception
+					}
+				}
+			}
+		}
+	}
+
+	private String getURL() {
+		return project.getFile("wrt_preview_frame.html").getLocationURI().toASCIIString();
+	}
+
+
+	@Override
+	public Control getControl() {
+		return browser;
+	}
+
+
+	public void createControl(Composite parent) {	
+		
+		// initialize mozilla browser
+		initMozilla();
+		browser = new Browser(parent, SWT.MOZILLA);
+		browser.setUrl(getURL());
+
+		outerComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+		outerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		innerComposite = new Composite(outerComposite, SWT.NONE);
+		innerComposite.setLayout(new GridLayout(1, true));
+		innerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		String browserLabel = Activator.getDefault().getPreferenceStore().getString(
+						WidgetPreviewPreferencePage.WIDGET_BROWSER_PREVIEW_PREFERENCE);
+		IConfigurationElement element = null;
+		
+//TODO - remove Aptana specific Browser implementation
+/*
+		List<IConfigurationElement> browserList = WidgetPreviewPreferencePage.getBrowsers();
+		for (int i = 0; i < browserList.size(); i++) {
+			IConfigurationElement curr = (IConfigurationElement) browserList.get(i);
+			String label = BrowserExtensionLoader.getBrowserLabel(curr);
+			if (browserLabel.equals(label)) {
+				element = curr;
+				break;
+			}
+		}
+		if (element != null) {
+			try {
+				browser = (ContributedBrowser) element.createExecutableExtension(UnifiedEditorsPlugin.CLASS_ATTR);
+				browser.createControl(innerComposite);
+			} catch (Exception e1) {
+				Activator.log(IStatus.ERROR, "Error creating browser control", e1);
+				browser = new DefaultBrowser();
+				browser.createControl(innerComposite);
+			}
+		} else {
+			browser = new DefaultBrowser();
+			browser.createControl(innerComposite);
+		}
+		
+		Object browserObject = browser.getUnderlyingBrowserObject();
+*/
+		
+		//if (browserObject instanceof MozillaBrowser) {
+			bypassSameOriginPolicy();
+		//}
+
+		outerComposite.setContent(innerComposite);
+
+		outerComposite.setExpandHorizontal(true);
+		outerComposite.setExpandVertical(true);
+	}
+
+	private void initializePreview(String url) {
+		if (previewSupport == null) {
+			IProject project = getCurrentProject(url);
+			if (project != null) {
+				previewSupport = new PreviewSupport(project);
+			}
+		}
+	}
+
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see com.aptana.ide.editors.unified.ContributedBrowser#refresh()
+	 */
+	public void refresh() {
+		if (browser != null) {
+			if (displayingPreview) {
+				// setting the browser URL is potentially asynchronous.
+				// do our other actions after that completes.
+				browser.addProgressListener(new ProgressAdapter() {
+					public void completed(ProgressEvent arg0) {
+						browser.removeProgressListener(this);
+						browser.refresh();
+					}
+				});
+				try {
+					IFile mainHtml = previewSupport.getMainHtml();
+					if(mainHtml != null) {
+						browser.setUrl(getPreviewHtmlURL());	
+			
+					} 
+					else {
+						IFile nopreview = previewSupport.getPreviewFolder().getFile("nopreview.html");
+						if (nopreview != null) {
+							browser.setUrl(nopreview.getLocation().toFile().toURI().toString());
+						}
+					}					
+				} catch (CoreException e) {
+					Activator.log(IStatus.ERROR, "Error setting preview URL", e);
+				}
+			}
+		}
+	}
+
+	public void dispose() {
+		if (previewSupport != null) {
+			previewSupport.dispose();
+		}
+		if (outerComposite != null && !outerComposite.isDisposed()) {
+			outerComposite.dispose();
+		}
+	}
+
+//TODO
+/*
+    public Control getControl() {
+ 
+		return outerComposite;
+	}
+*/
+	
+	@Override
+	public void setFocus() {
+		browser.setFocus();
+	}
+	
+	private String getPreviewHtmlURL() {
+		String result = null;
+		try {
+			IFile previewHtml = previewSupport.getPreviewFrameHtml();
+			URL fileURL = previewHtml.getLocation().toFile().toURL();
+			result = fileURL.toString();
+		} catch (CoreException e) {
+			Activator.log(IStatus.ERROR, "Error setting preview URL", e);
+		} catch (IOException e) {
+			Activator.log(IStatus.ERROR, "Error setting preview URL", e);
+		}
+		return result;
+	}
+	
+	public void setURL(String url) {
+		if (browser != null &&  
+				!"about:blank".equalsIgnoreCase(url)) {
+			
+			initializePreview(url);
+			applyAptanaProxySettingsToMozilla();
+
+			try {
+				URL tmp = new URL(url);
+				String urlFile = tmp.getFile();
+				IFile mainHtml = previewSupport.getMainHtml();
+				
+				String mainHtmlLocation = null;
+				
+				if(mainHtml != null) {
+					mainHtmlLocation = mainHtml.getLocation().toString();
+					
+					if (urlFile != null && 
+						(urlFile.contains(".tmp") ||
+						 urlFile.equals(mainHtmlLocation))) {
+						 
+						this.url = getPreviewHtmlURL();
+						browser.setUrl(this.url);
+						displayingPreview = true;
+					} 
+				}else {
+					IFile nopreview = previewSupport.getPreviewFolder().getFile("nopreview.html");
+					if (nopreview != null) {
+			
+						browser.setUrl(nopreview.getLocation().toFile().toURI().toString());
+					}
+				}
+			} catch (CoreException e) {
+				Activator.log(IStatus.ERROR, "Error setting preview URL", e);
+			} catch (IOException e) {
+				Activator.log(IStatus.ERROR, "Error setting preview URL", e);
+			}
+		}
+	}
+
+	private void bypassSameOriginPolicy() {
+
+		try{
+			nsIServiceManager servMgr = null;
+			try {
+				servMgr = Mozilla.getInstance().getServiceManager();
+				if (servMgr == null) return;
+			} catch (Exception x) {
+				// known to throw NullPointException on Mac OS when you're not using 
+				// Mozilla. We don't want to pollute the error log with this
+				return;
+			}
+			
+			mozillaPrefs = (nsIPrefBranch) servMgr.getServiceByContractID(
+											"@mozilla.org/preferences-service;1", 
+											nsIPrefBranch.NS_IPREFBRANCH_IID );		
+
+			mozillaPrefs.setBoolPref("signed.applets.codebase_principal_support", 1);
+
+			mozillaPrefs.setCharPref("capability.policy.default.XMLDocument.getElementsByTagName", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.CDATASection.nodeValue", "allAccess");
+
+			mozillaPrefs.setCharPref("capability.policy.default.HTMLCollection.length", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.HTMLCollection.item", "allAccess");
+
+			mozillaPrefs.setCharPref("capability.policy.default.*.nodeValue", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.nodeType", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.nodeName", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.nextSibling", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.previousSibling", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.attributes", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.childNodes", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.firstChild", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.getAttribute", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.getElementsByTagName", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.lastChild", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.parentNode", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.*.tagName", "allAccess");
+
+			mozillaPrefs.setCharPref("capability.policy.default.XMLDocument.documentElement", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLDocument.getElementsByTagName", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.channel", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.open", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.responseText", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.responseXML", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.send", "allAccess");
+			mozillaPrefs.setCharPref("capability.policy.default.XMLHttpRequest.setRequestHeader", "allAccess");
+			/* to over-ride the internet security dialog when preview browser tries to access local hard drive */
+			mozillaPrefs.setCharPref("capability.principal.codebase.p0.granted", "UniversalXPConnect  UniversalBrowserRead");
+			mozillaPrefs.setCharPref("capability.principal.codebase.p0.id", "file://");
+			mozillaPrefs.setBoolPref("security.fileuri.strict_origin_policy", 0);
+			
+			
+			
+
+		} catch (Exception e) {
+			Activator.log(IStatus.ERROR, "Error getting preferences", e);
+		}
+	}
+	
+	private void applyAptanaProxySettingsToMozilla() {
+		
+		IProxyService px = Activator.getProxyService();
+		if(px != null){			 
+			boolean proxyEnabled = px.isProxiesEnabled();
+
+			boolean systemProxy = px.isSystemProxiesEnabled();
+			if( proxyEnabled && !systemProxy){
+				IProxyData pd = px.getProxyData(IProxyData.HTTP_PROXY_TYPE);
+				if (pd !=null &&mozillaPrefs != null) {				
+					String host= pd.getHost();
+					int port = pd.getPort();
+					if(host !=null && port != -1){
+						mozillaPrefs.setIntPref("network.proxy.type", 1);
+						mozillaPrefs.setCharPref("network.proxy.http", host);
+						mozillaPrefs.setIntPref("network.proxy.http_port", port);
+					}
+				}
+			 }
+		}
+		else{
+			 Exception e= new Exception();
+			 Activator.log(IStatus.ERROR, "Proxy service returned null", e);
+		 }
+	}
+	
+	private IProject getCurrentProject(String url) {
+		if (url != null) {
+			File f =  null;
+			try {
+				f = new File(new URI(url));
+				IPath path = FileUtils.convertToWorkspacePath(new Path(f.getCanonicalPath()), true, false);
+				if (path != null) {
+					IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
+					IProject project = root.getProject(path.segment(0));
+					if (project != null) {
+						return project;
+					}
+				}
+			} catch (Exception e) {
+			}
+		}
+		ISelection selection = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection();
+		IEditorPart activeEditor = null;
+		IProject project = null;
+		IWorkbenchPage activePage = Activator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		if (activePage != null) {
+			activeEditor = activePage.getActiveEditor();
+		}
+		
+		if(activeEditor != null){			
+			IEditorInput editorInput = activeEditor.getEditorInput();
+			IResource adapter = (IResource) editorInput.getAdapter(IResource.class);
+			project = adapter.getProject();
+		} else if (selection instanceof TreeSelection) {
+			TreeSelection seTreeSelection = (TreeSelection)selection;
+			Object obj = seTreeSelection.getFirstElement();
+			if (obj instanceof IResource) {
+				IResource r = (IResource) obj;
+				project = r.getProject();
+			}
+		}
+		return project;
+	}
+
+	public void back() {
+		if(browser != null){
+			browser.back();
+		}
+	}
+
+	public void forward() {
+		if(browser != null){
+			browser.forward();
+		}
+	}
+
+//TODO - remove Aptana specific browser implementation
+/*
+	public Object getUnderlyingBrowserObject()
+	{
+		Object result = null;
+		if (browser != null) {
+			result = browser.getUnderlyingBrowserObject();
+		}
+		return result;
+	}
+	
+
+	@Override
+	public void setOutline(ContributedOutline outline) {
+		if (browser != null) {
+			browser.setOutline(outline);
+		}
+	}
+*/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewPreferenceInitializer.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+
+package org.symbian.tools.wrttools.previewer.preview;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import org.symbian.tools.wrttools.previewer.Activator;
+
+
+public class WidgetPreviewPreferenceInitializer extends
+		AbstractPreferenceInitializer {
+
+	@Override
+	public void initializeDefaultPreferences() {
+		IPreferenceStore store = Activator.getDefault().getPreferenceStore();
+		if (Platform.getOS().equals(Platform.OS_WIN32)) {
+			store.setDefault(WidgetPreviewPreferencePage.WIDGET_BROWSER_PREVIEW_PREFERENCE, "Firefox"); //$NON-NLS-1$
+		} else if (Platform.getOS().equals(Platform.OS_LINUX)) {
+			store.setDefault(WidgetPreviewPreferencePage.WIDGET_BROWSER_PREVIEW_PREFERENCE, "Default"); //$NON-NLS-1$
+		} else if (Platform.getOS().equals(Platform.OS_MACOSX)) {
+			store.setDefault(WidgetPreviewPreferencePage.WIDGET_BROWSER_PREVIEW_PREFERENCE, "Safari"); //$NON-NLS-1$
+		}
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/preview/WidgetPreviewPreferencePage.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+
+package org.symbian.tools.wrttools.previewer.preview;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.RadioGroupFieldEditor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+//import com.aptana.ide.editor.html.BrowserExtensionLoader;
+//import com.aptana.ide.editors.UnifiedEditorsPlugin;
+import org.symbian.tools.wrttools.previewer.Activator;
+
+public class WidgetPreviewPreferencePage extends FieldEditorPreferencePage implements 
+ IWorkbenchPreferencePage {
+
+	public static final String WIDGET_BROWSER_PREVIEW_PREFERENCE = "org.symbian.tools.wrttools.previewer.preview.WIDGET_BROWSER_PREVIEW_PREFERENCE";
+
+	public WidgetPreviewPreferencePage() {
+		super(GRID);
+		setPreferenceStore(Activator.getDefault().getPreferenceStore());
+		setDescription("Preferences for the Widget preview");
+	}
+
+	/**
+	 * Gets the list of  embeddable browsers
+	 * @return - list of browsers
+	 */
+//TODO - remove Aptana Browser specific code
+/*
+	public static List<IConfigurationElement> getBrowsers() {
+		List<IConfigurationElement> browserList = new ArrayList<IConfigurationElement>();
+		IExtensionRegistry reg = Platform.getExtensionRegistry();
+		IExtensionPoint ep = reg.getExtensionPoint(UnifiedEditorsPlugin.BROWSER_EXTENSION_POINT);
+		IExtension[] extensions = ep.getExtensions();
+		for (int i = 0; i < extensions.length; i++) {
+			IConfigurationElement[] ce = extensions[i].getConfigurationElements();
+			for (int j = 0; j < ce.length; j++) {
+				String browserClass = ce[j].getAttribute(UnifiedEditorsPlugin.CLASS_ATTR);
+				String name = BrowserExtensionLoader.getBrowserLabel(ce[j]);
+				if (browserClass != null && name != null) {
+					browserList.add(ce[j]);
+				}
+			}
+		}
+		Collections.sort(browserList, new Comparator<Object>() {
+			public int compare(Object o1, Object o2) {
+				String name1 = BrowserExtensionLoader.getBrowserLabel((IConfigurationElement) o1);
+				String name2 = BrowserExtensionLoader.getBrowserLabel((IConfigurationElement) o2);
+				if (name1 != null && name2 != null) {
+					return name1.compareTo(name2);
+				}
+				return 0;
+			}
+		});
+		return browserList;
+	}
+	*/
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
+	 */
+
+	protected void createFieldEditors() {
+//TODO - remove Aptana browser specific implementation
+/*
+		List<IConfigurationElement> browserList = getBrowsers();
+		List<String> browserNames = new ArrayList<String>();
+		for (int i = 0; i < browserList.size(); i++) {
+			IConfigurationElement element = (IConfigurationElement) browserList.get(i);
+			if (!element.getContributor().getName().equals(Activator.PLUGIN_ID)) {
+				browserNames.add(BrowserExtensionLoader.getBrowserLabel((IConfigurationElement)
+						browserList.get(i)));
+			}
+		}
+
+		String[][] options = new String[browserNames.size()][2];
+		for (int i = 0; i < options.length; i++) {
+			options[i][0] = (String) browserNames.get(i);
+			options[i][1] = (String) browserNames.get(i);
+		}
+
+		addField(new RadioGroupFieldEditor(WIDGET_BROWSER_PREVIEW_PREFERENCE,
+				"Browser Options", 1, options, getFieldEditorParent(), true));
+*/
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+	 */
+	public void init(IWorkbench workbench) {
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/Check.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import org.symbian.tools.wrttools.previewer.utils.noexport.Messages;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+
+
+/**
+ * Utilities for runtime checking of correctness.
+ * 
+ * @author eswartz
+ *
+ */
+public class Check {
+    /**
+     * Report a failure.  This logs the failure and reports a dialog in debug mode.
+     * 
+     * @param message human-readable message
+     * @param thr the exception to report 
+     */
+    public static void reportFailure(String message, Throwable thr) {
+        try {
+            IStatus status = Logging.newSimpleStatus(1 /* our caller */, 
+                    IStatus.ERROR, 
+                    message,
+                    thr);
+            Logging.log(UtilsPlugin.getDefault(), status);
+            if (Platform.isRunning() && Platform.inDebugMode())
+                Logging.showErrorDialog(Messages.getString("Check.RuntimeError"), null, status); //$NON-NLS-1$
+        } catch (Throwable e) {
+            // ignore: don't recursively fail
+        }
+    }
+    
+    /**
+     * Verify an argument is not null else throw a runtime exception
+     * 
+     * It's not necessary to use this unless you're storing the object 
+     * away for later use -- otherwise just deference it and let the runtime
+     * throw for you!
+     * 
+     * @param obj
+     * @throws NullPointerException
+     */
+    static public void checkArg(Object obj) {
+        if (obj == null) {
+            RuntimeException thr = new NullPointerException();
+            reportFailure(Messages.getString("Check.ArgumentIsNull"), thr); //$NON-NLS-1$
+            throw thr;
+        }
+    }
+
+
+    /**
+     * Verify an argument satisfies a condition else throw a runtime exception
+     * 
+     * @param condition test which must return true
+     * @throws IllegalArgumentException
+     */
+    static public void checkArg(boolean condition) {
+        if (!condition) {
+            RuntimeException thr = new IllegalArgumentException();
+            reportFailure(Messages.getString("Check.ArgumentIsInvalid"), thr); //$NON-NLS-1$
+            throw thr;
+        }
+    }
+    
+    /**
+     * Verify an invariant of object state holds else throw a runtime exception.
+     * This is typically used to verify an object is internally consistent.
+     * 
+     * @param condition test which must return true
+     * @throws IllegalStateException
+     */
+    static public void checkState(boolean condition) {
+        if (!condition) {
+            RuntimeException thr = new IllegalStateException();
+            reportFailure(Messages.getString("Check.ObjectIsInconsistent"), thr); //$NON-NLS-1$
+            throw thr;
+        }
+    }
+
+    /**
+     * Verify an invariant related to promised behavior holds else throw a runtime exception
+     * This is typically used to ensure a client API works as expected.
+     *  
+     * @param condition test which must return true
+     * @throws AssertionError
+     */
+    static public void checkContract(boolean condition) {
+        if (!condition) {
+            AssertionError thr = new AssertionError();
+            reportFailure(Messages.getString("Check.ApiAssertionFailed"), thr); //$NON-NLS-1$
+            throw thr;
+        }
+    }
+
+    /**
+     * Throw a runtime exception to indicate a test on an argument
+     * failed due to another exception.
+     * 
+     * @param thr the throwable that resulted from an argument test
+     * @throws IllegalArgumentException
+     */
+    public static void failedArg(Throwable thr) {
+        IllegalArgumentException exc = new IllegalArgumentException();
+        exc.initCause(thr);
+        throw exc;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/FileUtils.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,851 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.swt.widgets.Shell;
+import org.osgi.framework.Bundle;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+/**
+ * @author eswartz
+ *
+ */
+public class FileUtils {
+	
+	// special IStatus code for file modified during validateEdit
+	public static final int MODIFIED_FILES_STATUS = 1000;
+	
+    /** Copy files or directories from 'from' to 'to'.  
+     * 
+     * Recursively descends if 'from' is a directory.  
+     * Creates 'from' tail directory in 'to', e.g.:
+     * from = c:/foo/bar
+     * to = c:/temp
+     * 
+     * -->
+     * 
+     * c:/temp/bar
+     * 
+     * @param from
+     * @param to
+     * @param filter the filename filter, or null
+     */
+    public static void copyTree(File from, File to, FileFilter filter) throws IOException {
+        File[] children;
+        
+    	if (!from.exists()) {
+    		throw new IOException ("Source of copy \'" + from.getName() + "\' doesn't exist");
+    	}
+    	
+    	if (to.getCanonicalPath().equals(from.getCanonicalPath())) {
+    		throw new IOException ("\'" + from.getName() + "\' cannot copy to itself");
+    	}
+
+        if (from.isDirectory()) {
+            children = from.listFiles(filter);
+            // just like cp command, if target exist, make a new folder into
+            // the target, copy content into the target folder
+            if (to.exists()) {
+            	if (to.isFile()) {
+            		throw new IOException("Cannot overwrite non-directory \'" + to.getName() + "\' with directory " + from.getName());
+            	}
+            	// copy into new directory name grafted after the existing one
+            	to = new File(to, from.getName());
+            	copyTree(from, to, filter);
+            	return;
+            } else {
+            	// copy into new directory name
+            	to.mkdir();            	
+                for (int i = 0; i < children.length; i++) {
+                    File curto = new File(to, children[i].getName());
+         
+                    copyTree(children[i], curto, filter);
+                }
+                return;
+            }
+        }
+        else {
+        	if (to.isDirectory()) {
+        		to = new File (to, from.getName());
+        	}
+            copyFile(from, to);
+            return;
+        }
+        
+    }
+
+    /** Copy files or directories from 'from' to 'to'.  
+     * 
+     * Recursively descends if 'from' is a directory.  
+     * Does not create 'from' tail directory in 'to', e.g.:
+     * from = c:/foo/bar contains a,b,c
+     * to = c:/temp
+     * 
+     * -->
+     * 
+     * c:/temp/a
+     * c:/temp/b
+     * c:/temp/c
+     * 
+     * @param from
+     * @param to
+     * @param filter the filename filter, or null
+     */
+    public static void copyTreeNoParent(File from, File to, FileFilter filter) throws IOException {
+        File[] files;
+        
+        Check.checkArg(from.isDirectory());
+        
+        files = from.listFiles(filter);
+        to.mkdirs();
+        
+        for (int i = 0; i < files.length; i++) {
+            if (files[i].isDirectory()) {
+                //File curto = new File(to, files[i].getName());
+                //curto.mkdirs();
+                copyTree(files[i], to, filter);
+            }
+            else {
+                File curto = new File(to, files[i].getName());
+                copyFile(files[i], curto);
+            }
+        }
+        
+    }
+    
+    /**
+     * Copy from an input stream to a file
+     * 
+     * @param in
+     * @param to
+     * @throws IOException
+     */
+    public static void copyFile(InputStream in, File to) throws IOException {
+        FileOutputStream out = new FileOutputStream(to);
+        int len;
+        byte[] buffer = new byte[4096];
+        while ((len = in.read(buffer)) != -1) {
+            out.write(buffer, 0, len);
+        }
+        out.close();
+        in.close();
+    }
+
+    /** Copy a single file from 'from' to 'to'
+     * 
+     * @param from
+     * @param to
+     * @throws IOException
+     */
+    public static void copyFile(File from, File to) throws IOException {
+        FileInputStream in = new FileInputStream(from);
+        copyFile(in, to);
+    }
+
+    /** Delete a directory tree recursively.
+     * <p> 
+     * Does not delete file.
+     * @param file start point for deletion -- not itself deleted
+     */
+    public static void delTree(File file) {
+        File[] files = file.listFiles();
+        if (files != null) { 
+            for (int i = 0; i < files.length; i++) {
+                if (files[i].isDirectory()) {
+                    delTree(files[i]);
+                }
+            }
+        }
+        files = file.listFiles();
+        if (files != null) {
+            for (int i = 0; i < files.length; i++) {
+                files[i].delete();
+            }
+        }
+    }
+
+	public static File pluginRelativeFile(Plugin plugin, String file) throws IOException {
+        Check.checkArg(plugin);
+        Bundle bundle = plugin.getBundle();
+        if (bundle == null)
+            return null;
+        URL url = FileLocator.find(bundle, new Path("."), null); //$NON-NLS-1$
+        if (url == null)
+            return null;
+        url = FileLocator.resolve(url);
+        return new File(url.getPath(), file);
+    }
+
+    /** 
+     * Convert the path to a path relative to the base, if possible.
+     * @param rootPath full path to base
+     * @param cpath full path to resource
+     * @return new path (base-relative) or null if not resolvable to base
+     */
+    static public IPath removePrefixFromPath(IPath rootPath, IPath cpath) {
+        if (matchingFirstSegments(rootPath, cpath) == rootPath.segmentCount()) {
+        	IPath suffix = cpath.removeFirstSegments(rootPath.segmentCount());
+        	return suffix.setDevice(null);
+        }
+        return null;
+    }
+
+    /** 
+     * Convert the path to a path in the workspace, if possible.
+     * Either the path comes in as a path pointing inside the
+     * workspace, or we can find a linked resource which aliases
+     * to the same location.
+     * @param cpath full filesystem path to resource
+     * @return new path (workspace-relative) or null if not resolvable to workspace
+     */
+    static public IPath convertToWorkspacePath(IPath cpath) {
+    	return convertToWorkspacePath(cpath, false);
+    }
+    
+    /** 
+     * Convert the path to a path in the workspace, if possible.
+     * Either the path comes in as a path pointing inside the
+     * workspace, or we can find a linked resource which aliases
+     * to the same location.
+     * @param cpath full filesystem path to resource
+     * @param makeCanonical if true, work from the canonical path if possible
+     * (recommended)
+     * @return new path (workspace-relative) or null if not resolvable to workspace
+     */
+    static public IPath convertToWorkspacePath(IPath cpath, boolean makeCanonical) {
+    	return convertToWorkspacePath(cpath, makeCanonical, true);
+    }
+    /** 
+     * Convert the path to a path in the workspace, if possible.
+     * Either the path comes in as a path pointing inside the
+     * workspace, or we can find a linked resource which aliases
+     * to the same location.
+     * @param cpath full filesystem path to resource
+     * @param makeCanonical if true, work from the canonical path if possible
+     * (recommended)
+     * @param resolveLinks if true, look for project paths which reference files outside
+     * the workspace via links (very slow)
+     * @return new path (workspace-relative) or null if not resolvable to workspace
+     */
+    static public IPath convertToWorkspacePath(IPath cpath, boolean makeCanonical, boolean resolveLinks) {
+        if (!Platform.isRunning() || cpath == null)
+            return null;
+        
+        if (makeCanonical) {
+			try {
+				// Since we have a filesystem path, try using the filesystem
+				// and Java's smarter APIs to fix the caps early. 
+				// Watch out for the device being set incorrectly, though.
+				String device = cpath.getDevice();
+				cpath = new Path(cpath.toFile().getCanonicalPath()).setDevice(device);
+			} catch (IOException e) {
+				// Something's wrong with the path; just use it as-is
+			}
+        }
+        
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
+        IFile file = root.getFileForLocation(cpath);
+        if (file != null) {
+        	return file.getFullPath().setDevice(null);
+        }
+        
+        if (resolveLinks) {
+	        // try to see if a linked resource points to this
+	        IFile[] files = root.findFilesForLocation(cpath);
+	        IPath newPath = null;
+	        if (files.length > 0)
+	            newPath = files[0].getFullPath().setDevice(null);
+	        else {
+	            IContainer[] folders = root.findContainersForLocation(cpath);
+	            if (folders.length > 0)
+	                newPath = folders[0].getFullPath().setDevice(null);
+	        }
+	        return newPath;
+        }
+        
+        return null;
+    }
+
+    /** 
+     * Convert the full path to a full path inside the workspace, if possible.
+     * (E.g. change a linked resource to the real full path.)
+     * <p>
+     * Either the path comes in as a path pointing inside the
+     * workspace, or we can find a linked resource which aliases
+     * to the same location.
+     * @param cpath full filesystem path
+     * @return same cpath, new path, or null if not resolvable to workspace
+     */
+    static public IPath convertToWorkspaceLocation(IPath cpath) {
+        if (!Platform.isRunning())
+            return null;
+        
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); 
+        IPath rootPath = root.getLocation();
+        IPath newPath = convertToWorkspacePath(cpath);
+        if (newPath == null)
+            return null;
+        
+        // convert to full path
+        return rootPath.append(newPath);
+    }
+
+    /** 
+     * Variant of routine that works with case-insensitive matching.
+     * @see IPath#matchingFirstSegments(IPath) 
+     */
+    public static int matchingFirstSegments(IPath my, IPath anotherPath) {
+    	if (my == null || anotherPath == null)
+    		return 0;
+        int anotherPathLen = anotherPath.segmentCount();
+        int max = Math.min(my.segmentCount(), anotherPathLen);
+        int count = 0;
+        for (int i = 0; i < max; i++) {
+            if (!my.segment(i).equalsIgnoreCase(anotherPath.segment(i))) {
+                return count;
+            }
+            count++;
+        }
+        return count;
+    }
+
+    /**
+     * Map the given file to a path in the current workspace.
+     * @param file
+     * @return the IFile for the file
+     * @deprecated this function is broken since it doesn't resolve linked resources.
+     */
+    public static IFile convertFileToIFile(IContainer container, File file) {
+        IPath path = new Path(file.getAbsolutePath());
+        IPath rootPath = container.getLocation();
+        
+        // this is BUGGY!  Case sensitive for some dumb reason
+        //int match = path.matchingFirstSegments(rootPath);
+        int match = matchingFirstSegments(path, rootPath);
+        Check.checkState(match >= rootPath.segmentCount()); 
+            
+        path = path.removeFirstSegments(match);
+        IFile wsFile = container.getFile(path);
+        return wsFile;
+    }
+    
+    /**
+     * Map the given file to a path in the current workspace.
+     * @param file
+     * @return the IFile for the file, or null if the file is not in the workspace
+     */
+    public static IFile convertFileToIFile(File file) {
+       IPath path = new Path(file.getAbsolutePath());
+        
+        IPath wsPath = convertToWorkspacePath(path, true);
+        if (wsPath != null)
+        	return ResourcesPlugin.getWorkspace().getRoot().getFile(wsPath);
+        
+        return null;
+        
+        /*
+        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IPath rootPath = root.getRawLocation();
+        
+        // this is BUGGY!  Case sensitive for some dumb reason
+        //int match = path.matchingFirstSegments(rootPath);
+        int match = matchingFirstSegments(path, rootPath);
+        if (match < rootPath.segmentCount())
+        	return null;
+            
+        path = path.removeFirstSegments(match);
+        IFile wsFile = root.getFile(path);
+        
+        return wsFile;
+        */
+    }
+    
+    /**
+     * Map the given file to a resource in the current workspace.  This only handles
+     * files that map to known workspace resources.
+     * @param file
+     * @return the IResource for the file, or null if the file is not in the workspace or doesn't
+     * exist.
+     */
+    public static IResource convertFileToExistingResource(File file) {
+       IPath path = new Path(file.getAbsolutePath());
+        
+       IPath wsPath = convertToWorkspacePath(path, true);
+       if (wsPath != null)
+    	   return ResourcesPlugin.getWorkspace().getRoot().findMember(wsPath);
+        
+       return null;
+    }
+    
+    /**
+     * Return the project for the given workspace-relative path.
+     */
+    public static IProject projectForPath(IPath path) {
+    	IProject result = null;
+    	if (path != null) {
+    		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+    		result = root.getProject(path.segment(0));
+    	}
+    	return result;
+    }
+
+	/**
+	 * Read contents of a file into an array
+	 * @param file
+	 * @param encoding (null = system default)
+	 * @return array of text
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static char[] readFileContents(File file, String encoding) throws CoreException {
+		Check.checkArg(file);
+		FileInputStream fis;
+        try {
+        	fis = new FileInputStream(file);
+        	return readInputStreamContents(fis, encoding);
+        } catch (IOException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+
+	/**
+	 * Read contents of a file into an array
+	 * @param is input stream
+	 * @param encoding (null is system default)
+	 * @return array of text
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static char[] readInputStreamContents(InputStream is, String encoding) throws CoreException {
+		Check.checkArg(is);
+
+		Reader reader;
+		try {
+	    	if (encoding != null)
+	    		reader = new InputStreamReader(is, encoding);
+	    	else
+	    		reader = new InputStreamReader(is);
+	
+	        return readReaderContents(reader);
+		} catch (UnsupportedEncodingException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+	
+	/**
+	 * Read contents of a file into an array
+	 * @param file
+	 * @param encoding (null = system default)
+	 * @return array of text
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static char[] readReaderContents(Reader reader) throws CoreException {
+		Check.checkArg(reader);
+        try {
+            char[] buf = new char[1024];
+            StringBuffer sb = new StringBuffer();
+            int len;
+            while ((len = reader.read(buf)) > 0) {
+                sb.append(buf, 0, len);
+            }
+            reader.close();
+            return sb.toString().toCharArray();
+        } catch (UnsupportedEncodingException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        } catch (IOException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+
+	/**
+	 * Write contents of a file from an array
+	 * @param file
+	 * @param encoding (null = system default)
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static void writeFileContents(File file, char[] text, String encoding) throws CoreException {
+		Check.checkArg(file);
+		FileOutputStream fos;
+        try {
+        	fos = new FileOutputStream(file);
+        	writeOutputStreamContents(fos, text, encoding);
+        } catch (IOException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+
+	/**
+	 * Write contents on array to an output stream
+	 * @param os output stream
+	 * @param encoding (null is system default)
+	 * @return array of text
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static void writeOutputStreamContents(OutputStream os, char[] text, String encoding) throws CoreException {
+		Check.checkArg(os);
+
+		Writer writer;
+		try {
+	    	if (encoding != null)
+	    		writer = new OutputStreamWriter(os, encoding);
+	    	else
+	    		writer = new OutputStreamWriter(os);
+	
+	        writeWriterContents(writer, text);
+		} catch (UnsupportedEncodingException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+
+	/**
+	 * Write contents of an array to a file
+	 * @param file
+	 * @param encoding (null = system default)
+	 * @throws CoreException wrapping java.io.FileException
+	 */
+	public static void writeWriterContents(Writer writer, char[] text) throws CoreException {
+		Check.checkArg(writer);
+        try {
+        	try {
+        		writer.write(text, 0, text.length);
+        	} finally {
+        		writer.close();
+        	}
+        } catch (UnsupportedEncodingException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        } catch (IOException e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+        }
+	}
+
+
+	/**
+	 * Returns whether pathSegment is a valid part of a path in a Carbide project.
+	 * This checks for file name validity and 
+	 * name only contains alpha-numeric -or- hyphen -or- underscrore -or- dot characters
+	 * 
+	 * @param pathSegment the segment (file or folder name)
+	 * @return true if valid
+	 */
+	public static boolean isValidCarbideProjectPathSegment(String pathSegment) {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		int typeMask = IResource.FILE | IResource.FOLDER;
+		boolean valid = pathSegment.length() == 0 || 
+			workspace.validateName(pathSegment, typeMask).isOK();
+		if (valid) {
+			for (int i = 0; i < pathSegment.length(); i++) {
+				char c = pathSegment.charAt(i);
+				valid = Character.isLetterOrDigit(c) || (c == '-') || (c == '_');
+				if (!valid)
+					break;
+			}
+		}
+		
+		return valid;
+	}
+	
+	/**
+	 * Resolve a workspace-relative path to correct any problems in
+	 * capitalization.
+	 * @param projectName
+	 * @param wsPath workspace-relative path
+	 * @return resolved path, as far as actual resources exist (the suffix
+	 * may be unchanged if an intervening folder is missing) 
+	 */
+	public static IPath getCanonicalWorkspacePath(IPath wsPath) {
+		IPath resolvedPath = new Path(""); //$NON-NLS-1$
+		IContainer container = ResourcesPlugin.getWorkspace().getRoot();
+		// flag to consume the rest of the path without lookup
+		boolean failed = false;
+		for (String segment : wsPath.segments()) {
+			if (failed || container == null) {
+				resolvedPath = resolvedPath.append(segment);
+				continue;
+			}
+			
+			IResource child = container.findMember(segment);
+			if (child != null) {
+				// found, so correct caps
+				resolvedPath = resolvedPath.append(segment);
+				if (child instanceof IContainer) {
+					container = (IContainer) child;
+				} else {
+					container = null;
+				}
+			} else {
+				// not found: manually search
+				boolean found = false;
+				try {
+					for (IResource member : container.members()) {
+						if (member.getName().equalsIgnoreCase(segment)) {
+							resolvedPath = resolvedPath.append(member.getName());
+							found = true;
+							if (member instanceof IContainer) {
+								container = (IContainer) member;
+							} else {
+								container = null;
+							}
+							break;
+						}
+					}
+				} catch (CoreException e) {
+					// just fail
+				}
+				if (!found) {
+					failed = true;
+					resolvedPath = resolvedPath.append(segment);
+				}
+			}
+		}
+		return resolvedPath;
+	}
+	
+	/**
+	 * This is an analogue to new Path(String) but avoids some bugs in
+	 * the implementation when pathString is a relative path.
+	 * @param pathString
+	 * @return new Path
+	 */
+	public static IPath createPossiblyRelativePath(String pathString) {
+		// canonicalize slashes
+		char[] pathChars = pathString.toCharArray();
+		int offset = 0;
+		for (int i = 0; i < pathChars.length; i++) {
+			if (pathChars[i] == '\\')
+				pathChars[i] = '/';
+		}
+		
+		// The bug is, if "./" appears, then "../"'s after it are dropped,
+		// so get rid of "./" early.  The result will still be relative.
+		while (offset + 2 <= pathChars.length) { 
+			if (pathChars[offset] == '.' && pathChars[offset+1] == '/') {
+				offset += 2;
+			} else {
+				break;
+			}
+		}
+		
+		return new Path(new String(pathChars, offset, pathChars.length - offset));
+	}
+
+	/**
+	 * Tell if the given path refers to a parent directory (e.g.
+	 * contains ".." entries)
+	 * @param path
+	 * @return true if resolved path contains ".."
+	 */
+	public static boolean isPathInParent(IPath path) {
+		// first see if any segments are ".." at all
+		for (int i = 0; i < path.segmentCount(); i++) {
+			if (path.segment(i).equals("..")) { //$NON-NLS-1$
+				// comprehensive check, canonicalizing
+				path = new Path(path.toString());
+				if (path.segmentCount() > 0 && path.segment(0).equals("..")) { //$NON-NLS-1$
+					return true;
+				} else {
+					return false;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Recurse the directory, returning files that match the given filter.
+	 * The directories "." and ".." are filtered out before the filter sees them.
+	 * The filter is passed files and directories, and a directory must
+	 * pass the filter to be recursed.
+	 * @param dir
+	 * @param filter
+	 * @param recordDirectories if true, accepted directories are added to the returned list;
+	 * otherwise, directories are not added to the file list.
+	 * @return array of matching files , never null
+	 */
+	public static File[] listFilesInTree(File dir, FileFilter filter, boolean recordDirectories) {
+		List<File> files = new ArrayList<File>();
+		listFilesInTreeHelper(files, dir, filter, recordDirectories);
+		return (File[]) files.toArray(new File[files.size()]);
+	}
+
+	private static void listFilesInTreeHelper(List<File> files, File dir, FileFilter filter, boolean recordDirectories) {
+		if (recordDirectories)
+			files.add(dir);
+		
+		File[] allEntries = dir.listFiles();
+		if (allEntries == null)
+			return;
+		
+		for (File fileOrDir : allEntries) {
+			if (fileOrDir.getName().equals(".") || fileOrDir.getName().equals("..")) { //$NON-NLS-1$ //$NON-NLS-2$
+				// ignore
+			} else if (fileOrDir.isDirectory()) {
+				if (filter.accept(fileOrDir)) {
+					listFilesInTreeHelper(files, fileOrDir, filter, recordDirectories);
+				}
+			} else if (filter.accept(fileOrDir)) {
+				files.add(fileOrDir);
+			}
+		}
+	}
+	
+	public static URL getParentPathURL(URL url) throws CoreException {
+		URL result;
+		try {
+			String string = url.toString();
+			int loc = string.lastIndexOf('/');
+			result = new URL(string.substring(0, loc + 1));
+		} catch (Exception e) {
+            throw new CoreException(Logging.newStatus(UtilsPlugin.getDefault(), e));
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * Wrapper around {@link FileUtils#validateEdit(IFile[], Shell)} 
+	 * taking a single file. If a modified files multistatus is generated
+	 * the single entry for the single file is retrieved and returned.
+	 */
+	public static IStatus validateEdit(IFile file, Shell context) {
+		IStatus status = validateEdit(new IFile[] {file}, context);
+		if (!status.isOK()) {
+			if (status.isMultiStatus()) {
+				IStatus[] children = status.getChildren();
+				if (children != null && children.length == 1 &&
+					children[0].getSeverity() == IStatus.WARNING &&
+					children[0].getCode() == MODIFIED_FILES_STATUS) {
+					status = children[0];
+				}
+			}
+		}
+		return status;
+	}
+	
+	/**
+	 * Wrapper around {@link IWorkspace#validateEdit(IFile[], Object)}
+	 * Checks if any of the files have been modified by the validate
+	 * operations. If so a MultiStatus is returned with WARNING severity. 
+	 * The code for the multistatus and each child is MODIFIED_FILES_STATUS
+	 * and for each child the message fields is the full workspace
+	 * path to the modified file.
+	 * @param files
+	 * @param context a Shell if UI interaction is allowed
+	 * @return OK status, non-OK status from validateEdit, or a
+	 * MultiStatus with one child for each modified file.
+	 */
+	public static IStatus validateEdit(IFile[] files, Shell context) {
+		List<IFile> readOnly = new ArrayList<IFile>();
+		Map<IFile, Long> timeStamps = new HashMap<IFile, Long>();
+		for (IFile file : files) {
+			if (file.isReadOnly()) {
+				readOnly.add(file);
+				timeStamps.put(file, file.getModificationStamp());
+			}
+		}
+	
+		if (readOnly.isEmpty()) {
+			return Status.OK_STATUS;
+		}
+			
+		IStatus status = ResourcesPlugin.getWorkspace().validateEdit(
+				readOnly.toArray(new IFile[readOnly.size()]), context);
+		if (!status.isOK())
+			return status;
+			
+		List<IFile> modified = new ArrayList<IFile>();
+		for (Map.Entry<IFile, Long> entry : timeStamps.entrySet()) {
+			Long newTimeStamp = entry.getKey().getModificationStamp();
+			if (!newTimeStamp.equals(entry.getValue())) {
+				modified.add(entry.getKey());
+			}
+		}
+		
+		if (modified.size() > 0) {
+			String pluginID = UtilsPlugin.getDefault().getBundle().getSymbolicName();
+			MultiStatus ms = new MultiStatus(pluginID, MODIFIED_FILES_STATUS, "modified files", null);
+			for (IFile file : modified) {
+				String path = file.getFullPath().toString();
+				ms.add(new Status(IStatus.WARNING, pluginID, MODIFIED_FILES_STATUS, path, null));
+			}
+			status = ms;
+		}
+		
+		return status;
+	}
+	
+	/**
+	 * Get the directory used for temporary files.
+	 * @return absolute directory for temporary files, which may be the current directory
+	 */
+	public static File getTemporaryDirectory() {
+		File dir = new File(System.getProperty("java.io.tmpdir", //$NON-NLS-1$
+				System.getProperty("user.dir", "."))); //$NON-NLS-1$ //$NON-NLS-2$
+		try {
+			return dir.getCanonicalFile();
+		} catch (IOException e) {
+			return dir;
+		}
+	}
+	
+	/**
+	 * Get the path in a form amenable to comparing with another path.
+	 * On Win32 hosts, this lowercases the path.  On other hosts, the path is unmodified.
+	 * @param path incoming path or <code>null</code>
+	 * @return path converted to comparison-friendly format, or <code>null</code>
+	 */
+	public static IPath getComparablePath(IPath path) {
+		if (path == null)
+			return null;
+		
+		if (Platform.getOS().equals(Platform.OS_WIN32)) {
+			return new Path(path.toOSString().toLowerCase());
+		}
+		
+		return path;
+	}
+
+	/**
+	 * Get the file extension from path, guaranteed not to return null
+	 * @param path IPath
+	 * @return String non-null
+	 */
+	public static String getSafeFileExtension(IPath path) {
+		String fileExtension = ""; //$NON-NLS-1$
+		if (path != null) {
+			String temp = path.getFileExtension();
+			if (temp != null)
+				fileExtension = temp;
+		}
+		
+		return fileExtension;
+	}
+	
+	/**
+	 * Uses java.io semantics to test existence, because eclipse resources are always case-sensitive, 
+	 * regardless of the file system.
+	 * @param resource {@link IResource}
+	 * @return <code>boolean</code>
+	 */
+	public static boolean exists(IResource resource) {
+		return resource.getLocation().toFile().exists();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/IDisposable.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+	/**
+	 * Generic interface for disposable objects
+	 *
+	 */
+public interface IDisposable {
+
+	/**
+	 * Disposes of any resources held by the object.
+	 * The object should not be used after dispose has been called.
+	 */
+	void dispose();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/ITimedTask.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+/**
+ * Interface for use with Logging.timeTask()
+ * @author eswartz
+ *
+ */
+public interface ITimedTask {
+    /** Get label for logging task */
+    public String getLabel();
+    
+    /** Run the task */
+    public void run();
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/ListenerList.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import java.util.*;
+
+/**
+ * Utility class for listeners. Implemented with the assumption that
+ * iteration is much more common than adding or removing listeners.
+ *
+ * @param <E> a listener interface
+ */
+public class ListenerList<E>  implements Iterable<E> {
+
+	private ArrayList<E> listeners;
+	
+	public void add(E listener) {
+		if (listeners == null || !listeners.contains(listener)) {
+			ArrayList<E> newList = new ArrayList();
+			if (listeners != null)
+				newList.addAll(listeners);
+			newList.add(listener);
+			listeners = newList;
+		}
+	}
+	
+	public void remove(E listener) {
+		if (listeners == null)
+			return;
+		ArrayList<E> newList = new ArrayList(listeners);
+		newList.remove(listener);
+		listeners = newList;
+	}
+
+	public Iterator<E> iterator() {
+		Iterator<E> result;
+		if (listeners != null) {
+			result = listeners.iterator();
+		}
+		else {
+			// would be nice if this could be a static, but it can't
+			result = new EmptyIterator<E>();
+		}
+		return result;
+	}
+	
+	public int size() {
+		return listeners != null? listeners.size() : 0;
+	}
+	
+	static class EmptyIterator<E> implements Iterator<E> {
+
+		public boolean hasNext() {
+			return false;
+		}
+
+		public E next() {
+			throw new NoSuchElementException();
+		}
+
+		public void remove() {
+			throw new IllegalStateException();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/Logging.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,456 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import org.symbian.tools.wrttools.previewer.utils.noexport.Messages;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.osgi.framework.Bundle;
+
+import java.io.PrintStream;
+import java.util.*;
+
+/**
+ * Utilities for plugins.
+ * 
+ * All of these take a Plugin parameter, which usually requires a call in the
+ * form:
+ * <p>
+ * <code>
+ * Logging.<i>method</i>(MyPlugin.getDefault(), ...);
+ * </code>
+ * </p>
+ * 
+ * If this becomes unwieldly, implement a wrapper method in your plugin class to
+ * access these methods natively:
+ * <p>
+ * 
+ * <pre>
+ * 
+ *  class MyPlugin extends Plugin {
+ *  ...
+ *    void &lt;i&gt;method&lt;/i&gt;(...) {
+ *       Logging.&lt;i&gt;method&lt;/i&gt;(getDefault(), ...);
+ *    }
+ *  ...
+ *  }
+ *  
+ * </pre>
+ * 
+ * </p>
+ * <p>
+ * Then call as:
+ * 
+ * <pre>
+ * 
+ *  MyPlugin.&lt;i&gt;method&lt;/i&gt;(...); 
+ *  
+ * </pre>
+ * 
+ * </p>
+ * 
+ * @author eswartz
+ * 
+ */
+public class Logging {
+
+    /** Tell whether Logging.timeStart() / Logging.timeEnd() / Logging.timeTask() show results
+     *  Can't be final because it's modified from unit tests. */
+    static public boolean SHOW_TIMINGS = false;
+    
+    /** List of ILogListener */
+    static private List listeners = new ArrayList(0);
+    
+    /** Target for log messages when platform is not running
+        This can't be final, it's set from tests */
+    static public PrintStream consoleLog = System.err;
+    /** Always dump log messages to console?  If false, only log when platform not running.
+     * Can't be final because it's modified from unit tests. */
+    static public boolean alwaysLogToConsole = false;
+    
+    static public void addListener(ILogListener listener) {
+        listeners.add(listener);
+    }
+    
+    static public void removeListener(ILogListener listener) {
+        listeners.remove(listener);
+    }
+    
+    /**
+     * Create an IStatus instance eminating from the given plugin
+     * which includes detailed info about the plugin vendor, version, etc.
+     * Every IStatus generated by this class includes this information.
+     * 
+     * Adapted from Java Developer's Guide to Eclipse, Ch. 28
+     * 
+     * @param plugin
+     *            the offending plugin
+     * @param severity
+     *            the severity (IStatus.ERROR, IStatus.WARNING, IStatus.INFO)
+     * @param message
+     *            the localized error string, or null to use
+     *            thr.getLocalizedMessage()
+     * @param thr
+     *            the throwable, or null
+     * @return new IStatus object
+     */
+    static public IStatus newStatus(Plugin plugin, int severity,
+            String message, Throwable thr) {
+        if (message == null) {
+			if (thr != null) {
+				message = thr.getLocalizedMessage();
+			}
+			if (message == null) {
+				message = thr.getClass().getName();
+			}
+        }
+            
+        MultiStatus vitalInfoStatus;
+        
+        if (plugin == null || plugin.getBundle() == null) {
+            return new Status(severity, "???", 0,
+                    message, thr);
+        }
+        
+        Bundle bundle = plugin.getBundle();
+        String symbolicName = bundle.getSymbolicName();
+        String bundleName = "" + bundle.getHeaders().get("Bundle-Name"); //$NON-NLS-1$
+        String bundleVendor = "" + bundle.getHeaders().get("Bundle-Vendor"); //$NON-NLS-1$
+        String bundleVersion = "" + bundle.getHeaders().get("Bundle-Version"); //$NON-NLS-1$
+
+        vitalInfoStatus = new MultiStatus(symbolicName, severity,
+                message, thr);
+
+        // Put new info in separate status containers to force newlines in
+        // dialog
+        vitalInfoStatus.add(new Status(severity, symbolicName, 0, 
+                "Plug-in Vendor: " + bundleVendor, null)); //$NON-NLS-1$
+        vitalInfoStatus.add(new Status(severity, symbolicName, 0,
+                "Plug-in Name: " + bundleName, null)); //$NON-NLS-1$
+        vitalInfoStatus.add(new Status(severity, symbolicName, 0,
+                "Plug-in ID: "  + symbolicName, null)); //$NON-NLS-1$
+        vitalInfoStatus.add(new Status(severity, symbolicName, 0,
+                "Plug-in Version: " + bundleVersion, null)); //$NON-NLS-1$
+
+        return vitalInfoStatus;
+    }
+
+    /**
+     * Create an IStatus instance eminating from the given plugin.
+     * 
+     * @param plugin
+     *            the offending plugin
+     * @param severity
+     *            the severity (IStatus.ERROR,WARNING,INFO)
+     * @param message
+     *            the localized error string
+     * @return new IStatus object
+     */
+    static public IStatus newStatus(Plugin plugin, int severity, String message) {
+        if (message == null)
+            message = ""; //$NON-NLS-1$
+
+        return newStatus(plugin, severity, message, null);
+    }
+
+    
+    /**
+     * Create an IStatus instance wrapping an unwanted exception eminating from
+     * the given plugin.
+     * 
+     * @param plugin
+     *            the offending plugin
+     * @param thr
+     *            the throwable, or null
+     * @return new IStatus object
+     */
+    static public IStatus newStatus(Plugin plugin, Throwable thr) {
+        return newStatus(plugin, IStatus.ERROR, thr.getLocalizedMessage(), thr);
+    }
+
+    /**
+     * Create an IStatus instance without plugin context information
+     * (e.g. for logging) 
+     * 
+     * @param plugin
+     *            the plugin
+     * @param severity
+     *            the severity (IStatus.ERROR,WARNING,INFO)
+     * @param message
+     *            the localized error string
+     * @param thr
+     *            the throwable, or null
+     * 
+     * @return new IStatus object
+     */
+    static public IStatus newSimpleStatus(Plugin plugin, int severity, String message, Throwable thr) {
+        return new Status(severity, plugin.getBundle().getSymbolicName(), 
+                0, message, thr);
+    }
+
+    /**
+     * Create an IStatus instance occurring presumably a number of steps up the
+     * call chain (e.g. library code, for which the current plugin is not
+     * known). We report the class name from the stack trace stored in the
+     * exception.  (Eclipse doesn't have a mechanism for looking up the plugin
+     * from a class (multiple plugins can have the same class).)
+     * 
+     * @param depth
+     *            stack depth relative to thr(0 = caller that created thr, 1 =
+     *            caller's caller...)
+     * @param severity
+     *            the severity (IStatus.ERROR,WARNING,INFO)
+     * @param message
+     *            the localized error string
+     * @param thr
+     *            the throwable (if null, assume depth refers to caller)
+     * 
+     * @return new IStatus object
+     */
+    static public IStatus newSimpleStatus(int depth, int severity, String message, Throwable thr) {
+        StackTraceElement els[];
+        if (thr != null)
+            els = thr.getStackTrace();
+        else {
+            els = new Exception().getStackTrace();
+            depth++;
+        }
+        
+        if (depth >= els.length)
+            depth = els.length - 1;
+
+        String klass = els[depth].getClassName();
+        return new Status(severity, klass, 0, message, thr);
+    }
+
+    /**
+     * Create an IStatus instance occurring presumably a number of steps up the
+     * call chain (e.g. library code, for which the current plugin is not
+     * known). We report the class name from the stack trace stored in the
+     * exception.  (Eclipse doesn't have a mechanism for looking up the plugin
+     * from a class (multiple plugins can have the same class).)
+     * 
+     * @param depth
+     *            stack depth relative to thr(0 = caller that created thr, 1 =
+     *            caller's caller...)
+     * @param thr
+     *            the throwable, or null
+     * 
+     * @return new IStatus object
+     */
+    static public IStatus newSimpleStatus(int depth, Throwable thr) {
+        return newSimpleStatus(depth, IStatus.ERROR, thr.getLocalizedMessage(), thr);
+    }
+
+    /**
+     * Tell if plugin configured for debugging and a debug option is enabled
+     * 
+     * @param plugin
+     *            the offending plugin
+     * @param option
+     *            The debug option to test. The plugin's symbolic name is
+     *            prepended to the option name, e.g.
+     *            "com.nokia.myplugin"+"/"+option
+     * @return true if debugging enabled and option enabled (e.g. defined and
+     *         set to "true")
+     */
+    static public boolean isDebugOptionEnabled(Plugin plugin, String option) {
+        if (plugin == null || !plugin.isDebugging())
+            return false;
+        String filter = Platform.getDebugOption(plugin.getBundle()
+                .getSymbolicName()
+                + "/" + option); //$NON-NLS-1$
+        return (filter != null && "true".equalsIgnoreCase(filter)); //$NON-NLS-1$
+    }
+
+    /**
+     * Send a message to the Error Log or stdout if plugin
+     * not defined or not loaded.
+     * 
+     * @param plugin
+     *            the calling plugin
+     * @param status
+     *            the status object
+     *            
+     */
+    static public void log(Plugin plugin, IStatus status) {
+
+        for (Iterator iter = listeners.iterator(); iter.hasNext();) {
+            ILogListener listener = (ILogListener) iter.next();
+            listener.logging(status, plugin != null ? plugin.getBundle().getSymbolicName() : null);
+        } 
+        
+        boolean logToConsole = alwaysLogToConsole;
+        if (plugin != null && plugin.getLog() != null) {
+            plugin.getLog().log(status);
+        } else {
+            logToConsole = true;
+        }
+        
+        if (consoleLog != null && logToConsole) {
+            consoleLog.println(status.getMessage());
+            if (status.getPlugin() != null)
+                consoleLog.println(Messages.getString("Logging.FromPlugin")+status.getPlugin()); //$NON-NLS-1$
+            if (status.getException() != null) {
+                consoleLog.println(Messages.getString("Logging.DueToException")); //$NON-NLS-1$
+                status.getException().printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * Send a message to the Error Log or stdout 
+     * if a given debug option is enabled.
+     * 
+     * @param plugin
+     *            the calling plugin, or null
+     * @param option
+     *            the debug option to test. The plugin name is prepended to the
+     *            option name, e.g. "com.nokia.myplugin"+"/"+option
+     * @param status
+     *            the status object
+     * @see Logging#isDebugOptionEnabled(Plugin, String)
+     */
+    static public void logIf(Plugin plugin, String option, IStatus status) {
+        if (!isDebugOptionEnabled(plugin, option))
+            return;
+        log(plugin, status);
+    }
+
+    /**
+     * Utility to display an error dialog reporting an IStatus.
+     * 
+     * @param title
+     *          title of dialog (if null, use "Error")
+     * @param message
+     *            concise error message (if null, use status message or status'
+     *            wrapped exception message)
+     * @param status
+     *            the offending status
+     */
+    static public void showErrorDialog(String title, String message, final IStatus status) {
+    	showErrorDialog(null, title, message, status);
+    }
+    
+    /**
+     * Utility to display an error dialog reporting an IStatus.
+     * 
+     * @param shell the parent shell
+     * @param title
+     *          title of dialog (if null, use "Error")
+     * @param message
+     *            concise error message (if null, use status message or status'
+     *            wrapped exception message)
+     * @param status
+     *            the offending status
+     */
+    static public void showErrorDialog(final Shell shell, String title, String message, final IStatus status) {
+    	if (!Platform.isRunning())
+    		return;
+    	
+        if (title == null)
+            title = Messages.getString("Logging.ErrorTitle"); //$NON-NLS-1$
+        
+        if (message == null) {
+            // this leads to a lot of redundant text
+            /*if (status != null) {
+                message = status.getMessage();
+                if (message == null) {
+                    if (status.getException() != null) {
+                        message = status.getException().getLocalizedMessage();
+                        if (message == null)
+                            message = Messages.getString("Logging.NoMessage"); //$NON-NLS-1$
+                    }
+                }
+            }*/
+            message = Messages.getString("Logging.GenericErrorMessage"); //$NON-NLS-1$
+        }
+
+        final String title_ = title;
+        final String message_ = message;
+        
+        // yes, syncExec(): this is presumably an important error
+        // that shouldn't wait for cascading failures to complete
+        Display.getDefault().syncExec(new Runnable() {
+            public void run() {
+                ErrorDialog.openError(shell, title_, message_, status);
+            }
+        });
+    }
+    // stack of start times (n.b.: Stack is a Vector and is synchronized)
+    private static Stack<Long> timeStack = new Stack<Long>();
+    // stack of end times (n.b.: Stack is a Vector and is synchronized)
+    private static Stack<String> timeLabelStack = new Stack<String>();
+    
+    private static long lastTime;
+    
+    /**
+     * Start timing a task, reported to console if Logging#SHOW_TIMINGS is set.
+     * Up to 16 timed tasks can be nested at time.
+     * @param label
+     */
+    public synchronized static void timeStart(String label) {
+    	long currentTime = System.currentTimeMillis(); 
+        if (SHOW_TIMINGS) {
+        	if (currentTime > lastTime + 333 && lastTime != 0) {
+                IStatus status = newSimpleStatus(1, IStatus.INFO, "missing time: " + (currentTime - lastTime) + " ms", null); //$NON-NLS-1$
+                log(UtilsPlugin.getDefault(), status);
+        	}
+            IStatus status = newSimpleStatus(1, IStatus.INFO, label + " start...", null); //$NON-NLS-1$
+            log(UtilsPlugin.getDefault(), status);
+        }
+        timeLabelStack.push(label);
+        timeStack.push(currentTime);
+    	lastTime = currentTime;
+    }
+
+    /**
+     * Stop timing a task, reporting results to console if Logging#SHOW_TIMINGS is set
+     * @return time elapsed in ms
+     */
+    public synchronized static long timeEnd() {
+    	lastTime = System.currentTimeMillis();
+        long elapsed = lastTime - timeStack.pop();
+        String label = timeLabelStack.pop();
+        if (SHOW_TIMINGS) {
+            IStatus status = newSimpleStatus(1, IStatus.INFO, label + " end: " + elapsed + " ms", null); //$NON-NLS-1$ //$NON-NLS-2$
+            log(UtilsPlugin.getDefault(), status);
+        }
+        return elapsed;
+    }
+    
+    /**
+     * Time a task and report results if Logging#SHOW_TIMINGS is set.
+     * @param task
+     * @return elapsed time in milliseconds
+     */
+    public synchronized static long timeTask(ITimedTask task) {
+        timeStart(task.getLabel());
+        long elapsed = 0;
+        try {
+            task.run();
+        } finally {
+            elapsed = timeEnd();
+        }
+        return elapsed;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/TrackedResource.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,261 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Helper class to track changes to a resource handle. To the extent
+ * that Eclipse provides the necessary notification, moves and
+ * renames will be tracked and getResource() will return a
+ * reference to the resource.
+ * A listener interface is provided to give notifications of
+ * moves, content changes, and deletions.
+ * Upon deletion, since this object can no longer provide any
+ * useful servce, the dispose method is automatically called
+ * @author dpodwall
+ *
+ */
+public class TrackedResource implements IDisposable {
+	
+	private IResource resource;
+	private long modificationStamp;
+	private IPath resourcePath;
+	private Class resourceClass;
+	private ListenerList<IListener> listeners = new ListenerList<IListener>();
+	private ResourceHandler handler;
+	
+	public interface IListener {
+		void resourceChanged(TrackedResource resource);
+		/**
+		 * Called after a resource has been moved and the
+		 * TrackedResource has been updated.
+		 * @param oldPath the previous location of the resource
+		 */
+		void resourceMoved(TrackedResource resource, IPath oldPath);
+		void resourceDeleted(TrackedResource resource);
+	}
+		
+	/**
+	 * Initialize with the desired resource and being
+	 * listening for changes. Once initialized the initial
+	 * IResource shouldn't be kept, call getResource as
+	 * needed to get the valid resource handle.
+	 */
+	public TrackedResource(IResource resource) {
+		Check.checkArg(resource);
+		this.resource = resource;
+		this.resourceClass = resource.getClass();
+		this.resourcePath = resource.getFullPath();
+		Check.checkState(resourcePath != null);
+		enableTracking(true);
+	}
+
+	/**
+	 * Dispose must be called in order to unregister the workspace listener.
+	 * It is automatically called if the resource is deleted.
+	 */
+	public void dispose() {
+		if (handler != null) {
+			enableTracking(false);
+			resourcePath = null;
+		}
+	}
+	
+	/**
+	 * Set the tracking status to the desired status and return the
+	 * previous state.
+	 */
+	public synchronized boolean enableTracking(boolean enable) {
+		boolean wasEnabled = handler != null;
+		if (enable == wasEnabled) {
+			return wasEnabled;
+		}
+		
+		if (enable) {
+			if (handler == null) {
+				handler = new ResourceHandler();
+				ResourcesPlugin.getWorkspace().addResourceChangeListener(handler);
+				modificationStamp = resource.getModificationStamp();
+			}
+			
+		} else if (handler != null){
+			ResourcesPlugin.getWorkspace().removeResourceChangeListener(handler);
+			handler = null;
+		}
+		return wasEnabled;
+	}
+
+	/**
+	 * Get the current resource handle. It will differ from 
+	 * the constructor argument if the resource moved.
+	 * Can return null if the resource was deleted
+	 * 
+	 * If non-null, the value will be compatible with
+	 * the original resource. In other words if an IFile
+	 * was originally used, this will return an IFile (or subclass)
+	 * or null.
+	 */
+	public IResource getResource() {
+		return resource;
+	}
+	
+	/**
+	 * Returns the last seen modification stamp.
+	 */
+	public long getLastModificationStamp() {
+		return modificationStamp;
+	}
+	
+	/**
+	 * Force an update of the cached modification stamp to
+	 * the lastest value. This will inhibit notifications for
+	 * the same modification stamp value.
+	 */
+	public void updateModificationStamp() {
+		try {
+			resource.refreshLocal(0, null);
+		} catch (CoreException x) {
+			UtilsPlugin.log(x);
+		}
+		modificationStamp = resource.getModificationStamp();
+	}
+	
+	/**
+	 * Convenience routine to return as IFile
+	 */
+	public IFile getFile() {
+		IFile result = null;
+		if (resource instanceof IFile) {
+			result = (IFile) resource;
+		}
+		return result;
+	}
+	
+	/**
+	 * Convenience routine to return resource's project.
+	 * If the resource is a project it will return that resource,
+	 * otherwise the containing project.
+	 */
+	public IProject getProject() {
+		IProject result = null;
+		if (resource != null) {
+			result = resource.getProject();
+		}
+		return result;
+	}
+	
+	/**
+	 * Listener for change events on the tracked resource.
+	 * Note that these events may be delivered on
+	 * threads other than the UI thread.
+	 */
+	public void addListener(IListener listener) {
+		listeners.add(listener);
+	}
+	
+	public void removeListener(IListener listener) {
+		listeners.remove(listener);
+	}
+	
+	private void fireResourceChanged() {
+		for (IListener l : listeners) {
+			l.resourceChanged(this);
+		}
+	}
+	
+	private void fireResourceMoved(IPath oldPath) {
+		for (IListener l : listeners) {
+			l.resourceMoved(this, oldPath);
+		}
+	}
+	
+	private void fireResourceDeleted() {
+		for (IListener l : listeners) {
+			l.resourceDeleted(this);
+		}
+	}
+	
+	private void handleDeletion() {
+		fireResourceDeleted();
+		dispose();
+	}
+	
+	private void handleMove(IResourceDelta delta) {
+		IPath movedToPath = delta.getMovedToPath();
+		if (movedToPath != null) {
+			IResource newResource = ResourcesPlugin.getWorkspace().getRoot().findMember(movedToPath);
+			if (newResource != null) {
+				// the new resource should be compatible with the previous, e.g.
+				// if we started with an IFile the new one should be an IFile
+				Check.checkState(resourceClass.isInstance(newResource));
+				resource = newResource;
+				modificationStamp = resource.getModificationStamp();
+				IPath oldPath = resourcePath;
+				resourcePath = movedToPath;
+				fireResourceMoved(oldPath);
+			}
+		}
+	}
+	
+	private void resourceChanged(IResourceChangeEvent event) {
+		IResourceDelta delta = event.getDelta();
+		if (delta != null && resourcePath != null) {
+			delta = delta.findMember(resourcePath);
+			if (delta != null) {
+				int kind = delta.getKind();
+				switch (kind) {
+				case IResourceDelta.CHANGED:
+					if ((IResourceDelta.CONTENT & delta.getFlags()) != 0) {
+						long currStamp = delta.getResource().getModificationStamp();
+						if (currStamp != modificationStamp) {
+							modificationStamp = currStamp;
+							fireResourceChanged();
+						}
+					}
+					break;
+					
+				case IResourceDelta.REMOVED:
+					if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
+						handleMove(delta);
+					}
+					else {
+						handleDeletion();
+					}
+					break;
+				}
+			}
+		}
+	}
+	
+	private class ResourceHandler implements IResourceChangeListener {
+
+		public void resourceChanged(IResourceChangeEvent event) {
+			TrackedResource.this.resourceChanged(event);			
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/UtilsPlugin.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class UtilsPlugin extends Plugin {
+	//The shared instance.
+	private static UtilsPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	
+	/**
+	 * The constructor.
+	 */
+	public UtilsPlugin() {
+		super();
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception {
+		super.stop(context);
+		plugin = null;
+		resourceBundle = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static UtilsPlugin getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the string from the plugin's resource bundle,
+	 * or 'key' if not found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = UtilsPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null) ? bundle.getString(key) : key;
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		try {
+			if (resourceBundle == null)
+				resourceBundle = ResourceBundle.getBundle("com.nokia.sdt.utils.UtilsPluginResources"); //$NON-NLS-1$
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+		return resourceBundle;
+	}
+
+	static public void log(IStatus status) {
+		Logging.log(plugin, status);
+	}
+	
+	static public void log(Throwable thr) {
+		Logging.log(plugin, Logging.newStatus(plugin, thr));
+	}
+	
+	static public void log(Throwable thr, String msg) {
+		Logging.log(plugin, Logging.newStatus(plugin, IStatus.ERROR, msg, thr));
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/noexport/Messages.java	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2009 Symbian Foundation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Symbian Foundation - initial contribution.
+ * Contributors:
+ * Description:
+ * Overview:
+ * Details:
+ * Platforms/Drives/Compatibility:
+ * Assumptions/Requirement/Pre-requisites:
+ * Failures and causes:
+ */
+package org.symbian.tools.wrttools.previewer.utils.noexport;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+/**
+ * @author eswartz
+ *
+ */
+public class Messages {
+    private static final String BUNDLE_NAME = "com.nokia.sdt.utils.noexport.messages";//$NON-NLS-1$
+
+    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+            .getBundle(BUNDLE_NAME);
+
+    private Messages() {
+    }
+
+    public static String getString(String key) {
+        try {
+            return RESOURCE_BUNDLE.getString(key);
+        } catch (MissingResourceException e) {
+            return '!' + key + '!';
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/src/org/symbian/tools/wrttools/previewer/utils/noexport/messages.properties	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,23 @@
+Check.RuntimeError=Runtime Error
+Check.ArgumentIsNull=argument is null
+Check.ArgumentIsInvalid=argument is invalid
+Check.ObjectIsInconsistent=object state is inconsistent
+Check.ApiAssertionFailed=assertion on API contract failed
+Logging.ErrorTitle=Error
+Logging.FromPlugin=plugin: 
+Logging.DueToException=exception: 
+Logging.NoMessage=???
+Logging.GenericErrorMessage=An error has occurred.\nPlease see the Error Log for more details.
+Message.Error=error: 
+Message.Warning=warning: 
+QueryWithBooleanPrefDialog.1=Don't ask again
+TextUtils.Conjunctions=(in|to|of|and|or|but|if|as)
+SimpleSubstitutionEngine.UnknownVariable=unknown variable ''{0}''
+SimpleSubstitutionEngine.InvalidSubstitution=invalid substitution of variable ''{0}'' with value ''{1}''
+NotifyWithBooleanPrefDialog.DoNotNotifyAgain=Do not &notify me again
+FormEditorEditingContext.cantShowUndo=Unable to show undo location.
+EditingContextOperation.cantShowCommandLocation=Unable to display the location for the '{0}' command.
+EditingContextOperation.errorDialogTitle=Error
+ProjectFolderSelectionDialog.SelectFolderDescriptionLabel=Select a folder:
+ProjectFolderSelectionDialog.SelectFolderTitle=Select a folder
+DirectorySelectorWithHistory.BrowseLabel=Browse...
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools.previewer/wrt.xml	Wed Jan 20 16:51:26 2010 -0800
@@ -0,0 +1,2847 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?mso-infoPathSolution PIVersion="1.0.0.0" href="http://www.aptana.com/forms/types.xsn" language="en-us" name="urn:schemas-microsoft-com:office:infopath:types:" productVersion="11.0.6357" solutionVersion="1.0.0.46" ?><?mso-application progid="InfoPath.Document"?>
+<javascript xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
+
+  <class type="widget" superclass="Object" visibility="basic">
+	<description>The widget engine provides a set of system information (SystemInfo) API services. The SystemInfo Service API allows a widget to access a device's properties and to control certain device features. The API is implemented in a plug-in module and it is integrated into the WRT environment.
+					To use the SystemInfo APIs, each widget must load the plug-in module explicitly by defining the following HTML code in its main HTML document</description>
+	<browsers>
+			<browser platform="Nokia WRT" version="1.0+"/>
+	</browsers>
+	<constructors>
+		<constructor scope="instance">
+			<description>The widget object is a built-in JavaScript object in the widget engine. 
+			</description>
+			<browsers>
+				<browser platform="Nokia WRT" version="1.0+"/>
+			</browsers>
+				<parameters/>
+				<return-types>
+	          <return-type type="widget"/>
+	        </return-types>
+			</constructor>
+		</constructors>
+		 
+			<properties>
+				<property name="identifier" type="String" scope="" access="read" visibility="basic">
+				<description>This is a read-only property that returns an integer indicating the current battery level.
+							 The returned value is in the range of 0 to 100 as a percentage of the maximum battery level.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="onshow" type="void" scope="" access="read-write" visibility="basic">
+				<description>The onshow property is an event handler for the event of when a widget is switching from the background to the foreground. In other words, when an opened widget gains focus, the assigned callback function will be called.
+              </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+				<availability>
+					<specification name="Nokia WRT" version="1.0+"/>
+				</availability>
+			</property>
+			<property name="onhide" type="void" scope="" access="read-write" visibility="basic">
+				<description>The onhide property is an event handler for the event of when a widget is switching from the foreground to the background. In other words, when a running widget loses focus, the assigned callback function will be called.
+			</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+				<availability>
+					<specification name="Nokia WRT" version="1.0+"/>
+				</availability>
+			</property>
+			
+			<property name="isrotationsupported" type="Boolean" scope="" access="read-write" visibility="basic">
+				<description>isrotationsupported is a read-only property that returns a Boolean value determining if the device supports landscape and portrait screen orientations.
+					If the value is true, the device supports both landscape and portrait screen orientations.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+				<availability>
+					<specification name="Nokia WRT" version="ert 1.0+"/>
+				</availability>
+			</property>
+		</properties>
+		
+		<methods>
+		
+		<method name="openURL" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The openURL method opens a specified link in the Web Browser for S60 in the stand-alone mode. The widget remains open but is sent to the background. </description>
+				<parameters>
+					<parameter name="url" type="String" usage="required">
+						<description>A compact string specifying a link to a resource to be opened. The URL string format is compliant with the RFC-1738 specification and must be encoded if it contains non-ASCII characters.</description>
+				</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT Webruntime" version="1.0+" />
+				</browsers>
+			</method>
+				<method name="setPreferenceForKey" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The setPreferenceForKey method allows a key to be stored along with its associated preference. The arguments are like name and value pairs. The preference value for the key is stored persistently, so if the widget or device is restarted, the value is retained. However, the values stored by a widget are removed when a widget is uninstalled from the device. This includes the case when a widget is reinstalled; where the old widget is uninstalled, the new widget is installed.
+							An existing preference can be overwritten with a new value by simply calling the method with the same key and new value.
+				 </description>
+				 		 <parameters>
+					<parameter name="preference" type="String" usage="required">
+						<description>A short text string defined as the name of the preference to be stored.</description>
+					</parameter>
+					<parameter name="key" type="String" usage="required">
+						<description>A compact string specifying a link to a resource to be opened. The URL string format is compliant with the RFC-1738 specification and must be encoded if it contains non-ASCII characters.</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT Webruntime" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="preferenceForKey" scope="" visibility="basic">
+			<return-types>
+					<return-type type="String"/>
+				</return-types>
+				<description>The preferenceForKey method allows a previously stored preference to be restored.
+				 </description>
+				<parameters>
+					<parameter name="key" type="String" usage="required">
+						<description>A text string specifying the name that represents the preference to be restored.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="prepareForTransition" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The widget's view is composed by HTML elements such as text display area, buttons, edit fields, and so on. The appearance of these HTML elements can be dynamically changed. For example, they can be shown or hidden dynamically using the HTML DOM style object to set the display property to "block" or "none" respectively. </description>
+				<parameters>
+					<parameter name="transitionMode" type="String" usage="required">
+						<description>A text string defining a desired transition mode. Currently the only supported transition mode is "fade", which causes the widget's view changing in fading mode.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="performTransition" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The performTransition method operates as a screen update command, which tells the widget UI framework to update the widget screen. It performs the animation while the widget's view is being changed. Currently, only fading animation mode is supported. </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="setNavigationEnabled" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The navigation mode in a widget can be toggled between a cursor and a tabbed navigation mode. By default, the browsing mode of a widget is set to use a cursor (pointer). The setNavigationEnabled method is used for changing the widget's navigation mode.
+							The argument navigationType is of Boolean type and can be set to true or false to toggle the navigation mode between the cursor mode and the tab mode respectively.
+				 </description>
+				 <parameters>
+					<parameter name="navigationMode" type="Boolean" usage="required">
+						<description>Set to true to enable the cursor navigation mode, and set to false to enable the tabbed navigation mode.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="setDisplayLandscape" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The setDisplayLandscape method changes the orientation of a widget's screen to the landscape mode.
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="openApplication" scope="" visibility="basic">
+				<description>The openApplication method enables a widget to launch an S60 mobile application in the stand-alone mode.
+				 </description>
+				 <parameters>
+				 
+					<parameter name="Uid" type="Number" usage="required">
+						<description>A hexadecimal number that specifies the UID of the S60 application to be activated. See the table below for example application UIDs.</description>
+					</parameter> 
+				
+					<parameter name="param" type="String" usage="required">
+						<description>A text string defining a possible argument string that is accepted by the S60 application to be activated.</description>
+					</parameter>
+					
+				</parameters>
+
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+		
+			<method name="setDisplayPortrait" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The setDisplayPortrait method changes the orientation of a widget's screen to the portrait mode.
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+		</methods>
+	</class>
+	
+	<class type="menu" superclass="Object" visibility="basic">
+		<description>
+					The menu object is supported since WRT version 1.0.
+		</description>
+		
+		<browsers>
+				<browser platform="Nokia WRT" version="1.0+" />
+		</browsers>
+		
+	      <constructors>
+	      <constructor scope="instance">
+	       		 <description>The menu object is a built-in object in the widget engine. It is extended from the window object to 
+					provide widget-specific APIs for manipulating widget's options menu and softkeys.
+					The menu object can be accessed via the window object window.menu or just simply menu. Thus, in the 
+					WRT environment, the term menu is a reserved keyword and should not be used as a user-defined global 
+					variable name for other type of objects.
+					A widget's options menu can be constructed using the menu object. The options menu is automatically 
+					associated with the device's left softkey and it cannot be reassigned to associate with another 
+					softkey (for example, the right softkey). The label of the options menu (the left softkey) is the 
+					system-defined term in the current used system language (for example, Options for English). 
+					Thus, the left softkey label cannot be changed.</description>
+			<browsers>
+				<browser platform="Nokia WRT" version="1.0+"/>
+			</browsers>		
+	        <parameters/>
+	        <exceptions/>
+	      </constructor>
+	    </constructors>  
+	    
+	     <properties>
+			<property name="onShow" type="Void" scope="" access="read-write" visibility="basic">
+				<description> The onShow property of the menu object is an event handler for the event of when the options menu is open. In other words, when the end user presses the left softkey, the system will fire an event and a widget can catch the event by providing a callback function.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+				
+			</property>
+	    
+	    </properties>
+	    <methods>
+	       
+	    		<method name="append" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the append method to add a menu item to the top level of the options menu list.
+				Menu items are shown on the options menu list in the order in which they are appended.
+				For more general information on constructing an options menu.
+				 </description>
+				 <parameters>
+					<parameter name="MenuItem" type="menuItem" usage="required">
+						<description>This is an instance of the MenuItem object which is being added to the top level of the options menu
+						</description>
+					</parameter>
+				</parameters>
+			<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			
+				<method name="remove" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the remove method to remove a menu item from the top level of the options menu list. If the removed menu item has a cascading submenu in it, the submenu will also be removed.
+				 </description>
+				  <parameters>
+					<parameter name="MenuItem" type="menuItem" usage="required">
+						<description>This is an instance of the MenuItem object which is being removed from the top level of the options menu list.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="getMenuItemById" scope="" visibility="basic">
+				<return-types>
+					<return-type type="MenuItem"/>
+				</return-types>
+				<description>Call the getMenuItemById method with a specified menu item's identifier to retrieve the handle of the menu item instance.
+				 </description>
+				 <parameters>
+					<parameter name="id" type="Number" usage="required">
+						<description>This is the identifier of an existing menu item whose handle is being retrieved.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="getMenuItemByName" scope="" visibility="basic">
+				<return-types>
+					<return-type type="MenuItem"/>
+				</return-types>
+				<description>Call the getMenuItemByName method with a specified menu item's label to retrieve the handle of the menu item instance.
+				 </description>
+				  <parameters>
+					<parameter name="menuItemLabel" type="String" usage="required">
+						<description>This is the identifier of an existing menu item whose handle is being retrieved.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="setRightSoftkeyLabel" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the setRightSoftkeyLabel method to customize the label and the operation associated with the right softkey.
+					By default, the right softkey of a device is assigned to the "Exit" function, which terminates a running widget. The default label depends on the current used system language (Exit for English).
+				 </description>
+				 <parameters>
+					<parameter name="label" type="String" usage="required">
+						<description>A text string specifies the label to be shown on the right softkey.
+						</description>
+					</parameter>
+					<parameter name="callbackfunc" type="Function" usage="required">
+						<description>A reference to the callback function, which will be called by the system when the right softkey is pressed.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+		
+				<method name="showSoftkeys" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the showSoftkeys method to display the softkey pane at all times.
+				By default, the device's softkey pane is hidden. The softkey pane is shown either by programmatically calling the showSoftkeys method or when the end user presses one of the softkeys.
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+
+				<method name="hideSoftkeys" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the hideSoftkeys method to hide the softkey pane.
+						By default, the device's softkey pane is hidden. The softkey pane is shown automatically when the end user presses one of the softkeys.
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="clear" scope="" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the clear method to delete all the menu items in the options menu pane. This operation will also clear all submenus if such exist
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+	    </methods>	
+	   </class>  
+	   
+  <!-- MenuItem Object -->
+  <class type="MenuItem" superclass="Object" visibility="basic">
+		<description>
+					The MenuItem object is supported since WRT version 1.0.
+		</description>
+		
+		<browsers>
+				<browser platform="Nokia WRT" version="1.0+" />
+		</browsers>
+		
+	  <constructors>
+		<constructor scope="instance">
+			<description>Creates a new instance of an Enumerator object.</description>
+			<browsers>
+				<browser platform="Nokia WRT" version="1.0+"/>
+			</browsers>
+			
+				<parameters>
+					<parameter name="label" type="String" usage="required">
+						<description>A text string that defines the label for the menu item.</description>
+					</parameter>
+					<parameter name="id" type="Integer" usage="required">
+						<description>A unique integer that identifies the menu item.</description>
+					</parameter>
+				</parameters>
+
+				<return-types>
+					<return-type type="MenuItem"/>
+				</return-types>
+			</constructor>
+		</constructors>
+	    
+	    <properties>
+			<property name="onSelect" type="void" scope="instance" access="read-write" visibility="basic">
+				<description> The onSelect property of the MenuItem object is an event handler for the event of when the menu item is selected. In other words, when the end user opens the options menu and selects a menu item either from the top-level menu list or from a submenu list, the system will fire an event and a widget can catch the event by providing a callback function.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+	    </properties>
+
+	     <methods>
+	       <method name="append" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the append method to add a child menu item to the parent menu item in the options menu list. This results in the creation of a submenu list in the menu tree. Use this method to create a cascading submenu when needed.
+							Menu items are shown on the options menu list in the order in which they are appended.
+				 </description>
+				 <parameters>
+					<parameter name="childMenuItem" type="MenuItem" usage="required">
+						<description>This is an instance of the MenuItem object which is being added to the parent menu item. See also the menu.append method description for instructions on how to append a menu item to the top level of the options menu list.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="remove" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the remove method to remove a child menu item and its children (if any) from the parent menu item.
+				 </description>
+				  <parameters>
+					<parameter name="childMenuItem" type="MenuItem" usage="required">
+						<description>This is an instance of the MenuItem object which is being removed from the parent menu item. See also the menu.remove method description for instructions on how to remove a menu item from the top level of the options menu list.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+				<method name="setDimmed" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>Call the setDimmed method to show or hide an existing menu item. By default, a menu item is shown when it is appended to the options menu.
+				 </description>
+				 <parameters>
+					<parameter name="flag" type="Boolean" usage="required">
+						<description>true to show the menu item, and false to hide the menu item.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			<!-- End Menu  Item object functions -->
+	    </methods>	
+	   </class>  
+  <!-- end of MenuItem Object -->
+  
+  <!-- System API document.embeds[0]; -->
+	 	  
+  <!-- <class type="SystemInfo" superclass="Object" visibility="basic"> -->
+
+  <!--
+  
+<class type="systemInfo" superclass="Object" visibility="basic">
+	<description>The widget engine provides a set of system information (SystemInfo) API services. The SystemInfo Service API allows a widget to access a device's properties and to control certain device features. The API is implemented in a plug-in module and it is integrated into the WRT environment.
+					To use the SystemInfo APIs, each widget must load the plug-in module explicitly by defining the following HTML code in its main HTML document:
+	</description>
+	<browsers>
+		<browser platform="Nokia WRT" version="1.0+"/>
+	</browsers>
+	
+	<constructors>
+		<constructor scope="instance">
+			<description>Creates a new instance of an Enumerator object.</description>
+				<parameters>
+					<parameter name="group" type="Object" usage="required">
+						<description>Group of items to be iterated over.</description>
+					</parameter>
+				</parameters>
+				<return-types>
+					<return-type type="Enumerator"/>
+				</return-types>
+			</constructor>
+		</constructors>
+
+		<properties>
+			<property name="chargelevel" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns an integer indicating the current battery level.
+							 The returned value is in the range of 0 to 100 as a percentage of the maximum battery level.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+
+			<property name="onchargelevel" type="" scope="instance" access="read-write" visibility="basic">
+				<description>The onchargelevel property is an event handler for the event of when the battery level is changed. The callback function is assigned by providing the function's name wrapped in a string.</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="chargerconnected" type="Boolean" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a Boolean value indicating the status of the changer.
+							 If the charger is connected, the returned value is 1; otherwise it is 0. </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="onchargerconnected" type="void" scope="instance" access="read-write" visibility="basic">
+				<description>The onchargerconnected property is an event handler for the event of when the charger is plugged to or unplugged from the device.
+							Since the event is fired off much faster than the value is updated, it is recommended to read the value after a small delay.</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			
+			<property name="signalbars" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns an integer indicating the network signal strength.
+							 The returned value is in the range of 0 to 7, where 0 represents no signal and 7 represents the maximum signal strength.
+							 For more information on network connection related aspects that you should take into account in your widget.
+				</description>
+				
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="networkname" type="String" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a string containing the current registered mobile network name defined by the network provider.
+							 This information is only available on GSM/WCDMA networks.
+							For more information on network connection related aspects that you should take into account in your widget.</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="lightminintensity" type="void" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the minimum light intensity (lowest brightness) supported by a device.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			
+			<property name="networkregistrationstatus" type="Integer" scope="" access="read-write" visibility="basic">
+				<description>The networkregistrationstatus property is an integer indicating the current network registration status.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="lightdefaultintensity" type="" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the default light intensity (default brightness) preset for a device.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="lightinfiniteduration" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the infinite time duration.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="lightmaxduration" type="Integer" scope="instance" access="read-write" visibility="basic">
+				<description>This is a read-only property that returns an integer value determining the maximum allowed time duration that a device supports. The time duration unit is measured in milliseconds.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			
+			<property name="lightdefaultcycletime" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value indicating the default cycle time of when the light is blinking.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="lighttargetprimarydisplayandkeyboard" type="Integer" scope="instance" access="read-write" visibility="basic">
+				<description>This is a read-only property that returns a constant value defining the target light to be both the primary display and the keyboard illuminator.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="lighttargetsystem" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value defining the target light to be all displays (primary and secondary if exists) and the keyboard illuminator.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			
+			<property name="vibraminintensity" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the minimum vibration intensity (lowest vibration frequency).
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			<property name="vibramaxintensity" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the maximum vibration intensity (highest vibration frequency).
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="vibramaxduration" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a constant value determining the maximum allowed time duration of vibration.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="vibrasettings" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns the current settings of the vibration mode set in the active user profile.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			
+			
+			<property name="totalram" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns an integer value indicating the total amount of RAM of a device, measured in bytes.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="freeram" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns an integer value indicating the amount of free RAM of a device, measured in bytes.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+			<property name="drivelist" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a text string containing all the user's existing drive names separated by a space.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+				<property name="language" type="Integer" scope="instance" access="read" visibility="basic">
+				<description>This is a read-only property that returns a text string containing the two-letter ISO 639-1 code that represents an international language. For a list of ISO 639-1 language codes, see the Language code table in the Symbian OS Library.
+				</description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+"/>
+				</browsers>
+			</property>
+		</properties>
+		
+		
+		<methods>
+		
+		<method name="lighton" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The lighton method switches the specified target light on for a specified duration with the brightness defined by a specified light intensity.
+				 </description>
+				  <parameters>
+					<parameter name="lighttarget" type="Integer" usage="required">
+						<description>Defines which target light should be turned on. Use one of the supported target light properties to specify a target light.
+						</description>
+					</parameter>
+					<parameter name="duration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+					<parameter name="intensity" type="Integer" usage="required">
+						<description>Defines the intensity (brightness) of the light. If intensity is lightdefaultintensity, the device default intensity will be used. 
+						</description>
+					</parameter>
+					<parameter name="fadein" type="Boolean" usage="required">
+						<description>If true, target lights will not turn on instantly but fade-in smoothly instead. if false, target lights will be turned on without the fading effect.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+
+
+<method name="lightoff" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The lightoff method switches the specified target light off for the specified duration.
+				 </description>
+				  <parameters>
+					<parameter name="lighttarget" type="String" usage="required">
+						<description>Defines which target light should be turned on. Use one of the supported target light properties to specify a target light.
+						</description>
+					</parameter>
+					<parameter name="duration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+					<parameter name="fadeout" type="Integer" usage="required">
+						<description>If true, target lights will not turn on instantly but fade-in smoothly instead. if false, target lights will be turned on without the fading effect.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>			
+		
+		
+		<method name="lightblink" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The lightblink method switches the specified target light on and off (blinking) for the specified duration with the brightness defined by a specified light intensity.
+
+				 </description>
+				  <parameters>
+					<parameter name="lighttarget" type="String" usage="required">
+						<description>Defines which target light should be turned on. Use one of the supported target light properties to specify a target light.
+						</description>
+					</parameter>
+					<parameter name="duration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+						<parameter name="onduration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+						<parameter name="offduration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+					<parameter name="intensity" type="Integer" usage="required">
+						<description>If true, target lights will not turn on instantly but fade-in smoothly instead. if false, target lights will be turned on without the fading effect.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>			
+		
+		
+			<method name="startvibra" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The startvibra method turns the device vibration on for the specified duration with the specified intensity (frequency).
+				 </description>
+				  <parameters>
+					<parameter name="duration" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+					<parameter name="intensity" type="Integer" usage="required">
+						<description>Defines the intensity (brightness) of the light. If intensity is lightdefaultintensity, the device default intensity will be used. 
+						</description>
+					</parameter>
+					
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			
+			<method name="stopvibra" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The stopvibra method immediately interrupts the device vibration.
+				 </description>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="beep" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The beep method produces a beep tone in a specified frequency for a specified duration.
+				 </description>
+				  <parameters>
+					<parameter name="frequency" type="Integer" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+					<parameter name="duration" type="Integer" usage="required">
+						<description>Defines the intensity (brightness) of the light. If intensity is lightdefaultintensity, the device default intensity will be used. 
+						</description>
+					</parameter>
+					
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+		
+		<method name="drivesize" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The drivesize method can be used to detect the total size of an existing memory storage in a device.
+				 </description>
+				  <parameters>
+					<parameter name="drivename" type="String" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+			
+			<method name="drivefree" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="void"/>
+				</return-types>
+				<description>The drivesize method can be used to detect the total size of an existing memory storage in a device.
+				 </description>
+				  <parameters>
+					<parameter name="drivename" type="String" usage="required">
+						<description>Defines the period during which the target light is switched on. The period is measured in milliseconds.
+						</description>
+					</parameter>
+				</parameters>
+				<browsers>
+					<browser platform="Nokia WRT" version="1.0+" />
+				</browsers>
+			</method>
+	
+		
+		
+		</methods>
+
+
+	</class>
+-->
+
+
+  <!-- key -->
+  <class type="key" >
+    <description>
+      Each key represents one piece of contact information, such as first name, last name, home phone number, or email address. For each contact, GetList returns as many keys as has been defined for that contact.
+    </description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+<!--
+    <constructors>
+      <constructor scope="instance">
+        <description></description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+        <parameters/>
+        <return-types>
+          <return-type type="key"/>
+        </return-types>
+      </constructor>
+    </constructors>
+-->
+    <properties>
+
+      <property name="Label" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Label
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Value" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Value
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="FirstName" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          FirstName
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="LastName" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          LastName
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+
+    </properties>
+
+  </class>
+  <!-- end of key -->
+  
+  <!-- Item -->
+  <class type="Item" >
+    <description>
+      Item
+    </description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+<!--
+    <constructors>
+      <constructor scope="instance">
+        <description></description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+        <parameters/>
+        <return-types>
+          <return-type type="Item"/>
+        </return-types>
+      </constructor>
+    </constructors>
+-->
+    <properties>
+      
+      <property name="CalendarName" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          CalendarName
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+      
+      <property name="LocalId" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          LocalId
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="InstanceStartTime" type="Date" scope="instance" access="read-write" visibility="basic">
+        <description>
+          InstanceStartTime
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <!-- Contacts specific -->
+
+      <property name="id" type="Staring" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Unique identifier of the contact.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="key" type="key" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Each key represents one piece of contact information, such as first name, last name, home phone number, or email address. For each contact, GetList returns as many keys as has been defined for that contact.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="GroupLabel" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Name of the group.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Contents" type="Array" scope="instance" access="read-write" visibility="basic">
+        <description>
+          Contains the IDs of the contacts that belong to the group.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="DBUri" type="String" scope="instance" access="read-write" visibility="basic">
+        <description>
+          URI of the database.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+	 <!-- AppManager specific -->
+		
+      <property name="Uid" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+        	AppManager:
+        	Contains a unique ID for the application binary (EXE or DLL).
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Path" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+        	AppManager:
+          	Contains the path of the application. For example, c:\sys\bin\calculator.exe.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Caption" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+          AppManager:
+          Contains the title of the application.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="ShortCaption" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+          AppManager:
+          Contains the short title of the application. For example, the short caption may be displayed beneath an icon on the mobile device.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="PackageName" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+          AppManager:
+          Contains the name of the application. For example, the package name may be displayed in a menu on the mobile device.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Version" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+        	AppManager:
+			Contains the version of the application. The version consists of two parts: Major, Minor.
+			For example, 1.01, where 1 is the major part and .02 is the minor part.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Vendor" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+          AppManager:
+          Contains the vendor of the application.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="Drive" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+        	AppManager:
+          Contains the drive where the application is installed.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+	  		
+    </properties>
+
+  </class>
+  <!-- end of Item -->
+  
+  <!-- Iterator -->
+  <class type="Iterator" >
+    <description>
+      Iterator
+    </description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+<!--
+    <constructors>
+      <constructor scope="instance">
+        <description></description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+        <parameters/>
+        <return-types>
+          <return-type type="Iterator"/>
+        </return-types>
+      </constructor>
+    </constructors>
+-->
+    <methods>
+
+      <method name="reset" scope="instance" visibility="basic">
+
+        <return-types>
+          <return-type type="void"/>
+        </return-types>
+
+        <description>
+          reset
+        </description>
+
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+
+      </method>
+
+      <method name="getNext" scope="instance" visibility="basic">
+
+        <return-types>
+          <return-type type="Item"/>
+        </return-types>
+
+        <description>
+          getNext
+        </description>
+
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+
+      </method>
+    </methods>
+
+  </class>
+  <!-- end of Iterator -->
+    
+  <!-- result -->
+  <class type="result" >
+    <description>
+      result
+    </description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+
+    <properties>
+      <!--
+		<property name="ReturnValue" type="Iterator" scope="instance" access="read" visibility="basic">
+			<description>
+        	AppManager
+			
+				GetList:
+					This is an iterator that contains the requested application information.
+					
+				LaunchApp/LaunchDoc:
+					This is a string that contains the name of the newly created document, if any.
+					This property is optional. 
+					
+					A new document is created only when both of the following are true:
+						criteria.MIMEType is specified as input.
+						The launched application creates a new document. 
+					A document name is never returned when criteria.Document is specified as input.
+					
+			Calendar
+				GetList:
+					This is an iterator that contains the requested calendar information.
+					
+				Add:
+					This is a text string that contains the id of the entry that was added or updated.
+					If a new calendar was created, this property is not included in the result object.
+
+				Import:
+					This is an iterator that contains an ordered list of objects. The objects contain the ids (strings) of the entries that were successfully imported to the calendar. The same id may be repeated multiple times in case of child entries.
+					
+				Export:
+					This is a text string that contains the exported entries in the specified format.
+					This property is only included if Data.FileName was not specified in the input. This property serves as a buffer that contains the same data as the target file would have had it been specified.
+
+			Contact:
+				GetList:
+					This is an iterator that contains the requested contact information
+			</description>
+			<browsers>
+				<browser platform="Nokia WRT" version="1.1+"/>
+			</browsers>
+		</property>
+		-->
+
+      <property name="ReturnValue" type="Object" scope="instance" access="read" visibility="basic">
+        <description>
+        	Return value
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+		
+      <property name="ErrorCode" type="Integer" scope="instance" access="read" visibility="basic">
+        <description>
+        	This is a number that specifies a predefined error code.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="ErrorMessage" type="String" scope="instance" access="read" visibility="basic">
+        <description>
+        	This is a text string that describes the error.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="TransactionID" type="Integer" scope="instance" access="read" visibility="basic">
+        <description>
+        	This is a number used as an identification to match transactions started with an asynchronous call to one or more calls it generates to callback. This is only valid for Asynchronous invocations.
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+    </properties>
+
+  </class>
+  <!-- end of result -->
+
+  <!-- IDataSource -->
+  <class type="IDataSource">
+
+    <description>
+    	This Service API allows widgets to:
+		&lt;p&gt;
+		&lt;ul&gt;
+		 	&lt;li&gt;access, create, and manage calendars/calendar entries,&lt;/li&gt;
+			&lt;li&gt;access and manage information about contacts,&lt;/li&gt;
+			&lt;li&gt;access and manage information about landmarks and landmark categories,&lt;/li&gt;
+			&lt;li&gt;add, read, and delete logging events such as call logs, messaging logs, and so forth,&lt;/li&gt;
+			&lt;li&gt;retrieve information (metadata) about the media files stored in the Media Gallery of a device.&lt;/li&gt;
+		&lt;/ul&gt;
+		&lt;/p&gt;
+		&lt;p&gt;
+		To use the &lt;code&gt;IDataSource&lt;/code&gt; Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.
+		&lt;/p&gt;
+		&lt;p&gt; 
+		Use &lt;code&gt;Service.Calendar&lt;/code&gt; or &lt;code&gt;Service.Contact&lt;/code&gt; or &lt;code&gt;Service.Landmarks&lt;/code&gt; or &lt;code&gt;Service.Logging&lt;/code&gt; or &lt;code&gt;Service.MediaManagement&lt;/code&gt; to identify the service provider and &lt;code&gt;IDataSource&lt;/code&gt; to identify the supported interface:
+		&lt;/p&gt;
+		
+		&lt;pre&gt;var so = device.getServiceObject("Service.Calendar", "IDataSource");&lt;/pre&gt;		
+	</description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+
+    <methods>
+      
+      <!-- GetList(criteria) -->
+      <method name="GetList" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+        
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;GetList&lt;/code&gt; method retrieves a list of available calendars or calendar entries. Calendar entries are retrieved from the specified calendar or, if no calendar is specified, from the default one.
+				This is a synchronous method.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;Contacts:&lt;/b&gt;				
+				The &lt;code&gt;GetList&lt;/code&gt; method retrieves a list of contacts, contact groups, or contacts databases. Contacts and contact groups are retrieved from the specified contacts database or, if no database is specified, from the default one.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+
+				&lt;p&gt;Note: Calls that retrieve a list of databases must always be synchronous.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;Landmarks:&lt;/b&gt;				
+				The &lt;code&gt;GetList&lt;/code&gt; method retrieves information about landmarks, landmark categories, or landmark databases. Landmarks and landmark categories are retrieved from the specified landmark database or, if no database is specified, from the default one.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+
+				&lt;p&gt;Note: For retrieving information about databases, only synchronous GetList is supported.&lt;p/&gt;
+				
+			&lt;p&gt;&lt;b&gt;Logging:&lt;/b&gt;				
+				The &lt;code&gt;GetList&lt;/code&gt; method retrieves an iterable list of entries from the log event database. The database contains two types of entries, log entries (all entries) and recent log entries (a subset of all log entries).
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;Media Management:&lt;/b&gt;				
+				The &lt;code&gt;GetList&lt;/code&gt; method retrieves a list of media information objects from the Media Gallery of the S60 device. Each object contains information about a single media file.
+				This is an asynchronous method.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="Object" usage="required">
+            <description>
+            	This is an object that specifies what type of calendar/location/landmark/log event information is returned and how the returned information is sorted.
+            </description>
+          </parameter>
+		  
+          <parameter name="callback" type="Function" usage="optional">
+            <description>
+            	The callback argument is the name of the method that is executed when an asynchronous GetList call has results or status information to return. You must define this method separately. 
+            </description>
+          </parameter>
+
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- Add(criteria) -->
+      <method name="Add" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;Add&lt;/code&gt; method creates a new calendar on the device or adds an entry to a calendar. In the latter case, if an entry with the same LocalId already exists in the calendar, it is modified accordingly. You can thus use this method to both add and update calendar entries. The entry is added to the specified calendar or, if no calendar is specified, to the default one. If the default calendar does not exist, it is created.
+				This is a synchronous method.&lt;/p&gt;
+
+			&lt;p&gt;&lt;b&gt;Contact:&lt;/b&gt;
+				The &lt;code&gt;Add&lt;/code&gt; method adds a contact or contact group to a contacts database. If the contact or contact group already exists in the database, it is replaced with the new entry. You can thus use this method to both add and edit contacts and contact groups. The information is added to the specified database or, if no database is specified, to the default one. If the default database does not exist, it is created.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+
+			&lt;p&gt;&lt;b&gt;Landmarks:&lt;/b&gt;
+				The &lt;code&gt;Add&lt;/code&gt; method adds a new landmark or landmark category to a landmark database. You can also use this method to edit an existing landmark or landmark category.
+				This is a synchronous method.&lt;/p&gt;
+
+			&lt;p&gt;&lt;b&gt;Logging:&lt;/b&gt;
+				The &lt;code&gt;Add&lt;/code&gt; method adds an event (entry) to the event log database.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies the calendar/contact/landmark/log to create or to add or update.
+            </description>
+          </parameter>
+		  
+          <parameter name="callback" type="Function" usage="optional">
+            <description>
+            	The callback argument is the name of the method that is executed when an asynchronous Add call has results or status information to return. You must define this method separately. 
+            </description>
+          </parameter>
+		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- Delete(criteria) -->
+      <method name="Delete" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;Delete&lt;/code&gt; method deletes a calendar from the device or one or more entries from a calendar. Entries are deleted from the specified calendar or, if no calendar is specified, from the default one.
+				For deleting a calendar, this method is called synchronously. For deleting calendar entries, this method can be called both synchronously and asynchronously.&lt;/p&gt;
+				
+        	&lt;p&gt;&lt;b&gt;Contacts:&lt;/b&gt;
+				The &lt;code&gt;Delete&lt;/code&gt; method deletes one or more contacts or contact groups from a contacts database. The information is deleted from the specified database or, if no database is specified, from the default one.
+				This method can be called both synchronously and asynchronously&lt;/p&gt;
+				
+        	&lt;p&gt;&lt;b&gt;Landmark:&lt;/b&gt;
+				The &lt;code&gt;Delete&lt;/code&gt; method deletes a landmark or landmark category from a landmark database.
+				Note: You cannot delete landmark databases.
+				This is a synchronous method.&lt;/p&gt;
+				
+        	&lt;p&gt;&lt;b&gt;Logging:&lt;/b&gt;
+				The &lt;code&gt;Delete&lt;/code&gt; method deletes an event (entry) from the event log database. 
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies which calendar/calendar entries/contacts/contact groups/landmark/landmark category/event to delete from the database.
+            </description>
+          </parameter>
+		  
+          <parameter name="callback" type="Function" usage="optional">
+            <description>
+            	The callback argument is the name of the method that is executed when an asynchronous Delete call has results or status information to return. You must define this method separately.
+            </description>
+          </parameter>
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- Import(criteria) -->
+      <method name="Import" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+        		The &lt;code&gt;Import&lt;/code&gt; method imports entries into a calendar. The information must be imported from an iCal or vCal file. For more information about these two formats, see the Calendar Service overview page.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;Contact:&lt;/b&gt;
+				The &lt;code&gt;Import&lt;/code&gt; method imports a contact to a contacts database. The information must be imported from a vCard file.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+			
+			&lt;p&gt;&lt;b&gt;Landmark:&lt;/b&gt;
+				The &lt;code&gt;Import&lt;/code&gt; method imports a set of landmarks to a landmark database.
+				This is a synchronous method.&lt;/p&gt;
+
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+				This is an object that specifies the calendar entries/contacts/landmarks to import.			 
+            </description>
+          </parameter>
+		  
+          <parameter name="callback" type="Function" usage="optional">
+            <description>
+            	The callback argument is the name of the method that is executed when an asynchronous Import call has results or status information to return. You must define this method separately.
+            </description>
+          </parameter>
+		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+	    <!-- Export(criteria) -->
+      <method name="Export" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;Export&lt;/code&gt; method exports entries from a calendar. The information is exported to an iCal or vCal file. For more information about these two formats, see the Calendar Service overview page.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+
+			&lt;p&gt;&lt;b&gt;Contact:&lt;/b&gt;
+				The &lt;code&gt;Export&lt;/code&gt; method exports a contact from a contacts database. The information is exported to a vCard file.
+				This method can be called both synchronously and asynchronously&lt;/p&gt;
+			
+			&lt;p&gt;&lt;b&gt;Landmark:&lt;/b&gt;
+				The &lt;code&gt;Export&lt;/code&gt; method exports a set of landmarks from a landmark database.
+				This is a synchronous method.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies the calendar/contacts/landmarks entries to export.
+            </description>
+          </parameter>
+		  
+          <parameter name="callback" type="Function" usage="optional">
+            <description>
+            	The callback argument is the name of the method that is executed when an asynchronous Export call has results or status information to return. You must define this method separately.
+            </description>
+          </parameter>
+		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+	    <!-- RequestNotification(criteria, callback); -->
+      <method name="RequestNotification" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;RequestNotification&lt;/code&gt; method notifies the client when entries are created, updated, or deleted in the specified calendar. If no calendar is specified, the default calendar is used.
+				This is an asynchronous method.&lt;/p&gt;
+
+			&lt;p&gt;&lt;b&gt;Logging:&lt;/b&gt;
+				The &lt;code&gt;RequestNotification&lt;/code&gt; method registers the widget to receive notifications of changes to the event log.
+				This is an asynchronous method.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies which calendar, calendar entries and event log to monitor for changes and when.
+            </description>
+          </parameter>
+		  
+          <parameter name="Callback" type="Function" usage="required">
+            <description>
+				The callback argument is the name of the method that is executed when an asynchronous 'RequestNotification' call has results or status information to return. You must define this method separately.            	
+            </description>
+          </parameter>
+		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+	  
+	    <!-- Cancel(criteria); -->
+      <method name="Cancel" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;Cancel&lt;/code&gt; method cancels an ongoing asynchronous call made with a Calendar Service API method.
+				This is a synchronous method.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;Contact:&lt;/b&gt;
+				The &lt;code&gt;Cancel&lt;/code&gt; method cancels an outstanding asynchronous call made with a Contacts Service API method.
+				This is a synchronous method.&lt;/p&gt;
+				
+			&lt;p&gt;&lt;b&gt;LandMark:&lt;/b&gt;
+				The &lt;code&gt;Cancel&lt;/code&gt; method cancels an ongoing asynchronous call made with a Landmarks Service API method.
+				This is a synchronous method.&lt;/p&gt;
+	
+			&lt;p&gt;&lt;b&gt;Logging:&lt;/b&gt;
+				The &lt;code&gt;Cancel&lt;/code&gt; method cancels an ongoing asynchronous call made with a Landmarks Service API method.
+				This is a synchronous method.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object with the TransactionID property (number). criteria.TransactionID specifies the transaction ID of the asynchronous call to cancel. The transaction ID is the result.TransactionID value that was returned as part of the result of the initial call.
+            </description>
+          </parameter>
+		  		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>		
+      
+      <!-- Organise(criteria); -->
+      <method name="Organise" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+        	&lt;p&gt;&lt;b&gt;Calendar:&lt;/b&gt;
+				The &lt;code&gt;Organise&lt;/code&gt; method adds contacts to a contact group (association) or removes contacts from a contact group (disassociation). The operation is performed on the specified database or, if no database is specified, on the default one.
+				This method can be called both synchronously and asynchronously.&lt;/p&gt;
+
+        	&lt;p&gt;&lt;b&gt;Landmark:&lt;/b&gt;
+				The &lt;code&gt;Organise&lt;/code&gt; method adds landmarks to a landmark category (association) or removes landmarks from a landmark category (disassociation). The same landmark can belong to multiple categories or to no category.
+				This is a synchronous method.&lt;/p&gt;
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies which contact group/landmarks to organize and how. 
+            </description>
+          </parameter>
+		  
+          <parameter name="Callback" type="Function" usage="optional">
+            <description>
+				The callback argument is the name of the method that is executed when an asynchronous Organise call has results or status information to return. You must define this method separately.            	
+            </description>
+          </parameter>
+		  
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- New(criteria); -->
+      <method name="New" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			The &lt;code&gt;New&lt;/code&gt; method creates an empty landmark or landmark category item. You can use the new item as a template.
+			This is a synchronous method.
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies the type of item to create
+            </description>
+          </parameter>
+        </parameters>
+        
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+        
+      </method>
+      
+    </methods>        
+
+  </class>  
+  <!-- end of IDataSoure -->
+
+  <!-- IAppManager -->
+  <class type="IAppManager">
+
+    <description>
+    	&lt;p&gt;The AppManager Service API allows widgets to access and launch applications on a mobile device.&lt;/p&gt;
+		&lt;p&gt;The API is integrated with WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+		&lt;p&gt;To use the AppManager Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+		&lt;p&gt;Use &lt;code&gt;Service.AppManager&lt;/code&gt; to identify the service provider and &lt;code&gt;IAppManager&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.AppManager", "IAppManager");&lt;/pre&gt;
+	</description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+
+    <methods>
+
+      <!-- GetList(criteria) -->
+      <method name="GetList" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			The &lt;code&gt;GetList&lt;/code&gt; method retrieves an iterable list of either user-installed applications or all applications on the mobile device, regardless of whether they were preinstalled or installed by the user. 
+			This is a synchronous method.
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+				This is an object that specifies what information is returned about the applications on the device.
+            </description>
+          </parameter>
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- Cancel(criteria); -->
+      <method name="Cancel" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			The &lt;code&gt;Cancel&lt;/code&gt; method cancels an outstanding asynchronous call. 
+			If a cancel is sent, but the asynchronous call has already been completed, then &lt;code&gt;result.Errorcode&lt;/code&gt; is set to 0 (success).
+			This is a synchronous method.
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+				This is an object with the &lt;code&gt;TransactionID&lt;/code&gt; property (number). 
+				&lt;code&gt;criteria.TransactionID&lt;/code&gt; specifies the transaction ID of the asynchronous call to cancel. 
+				The transaction ID is the result.TransactionID value that was returned as part of the result of the initial call. 
+            </description>
+          </parameter>
+
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+      <!-- LaunchApp(criteria); -->
+      <method name="LaunchApp" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			The &lt;code&gt;LaunchApp&lt;/code&gt; method launches an application based on a unique ID for the application (UID). 
+			It also provides a way to open a specific document (by specifying a document path), even if it is not the default file type for the application being launched. 
+			For example, you can specify a path to a document with a .txt extension to open in WordPad, even though Notepad is the default application for .txt files.
+			The application can be launched as chained (embedded) or stand-alone. 
+
+			This method can be called both synchronously and asynchronously.
+        </description>
+
+        <parameters>
+        	
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+				The criteria object specifies the application to launch.
+				The criteria object has three main properties: ApplicationID, CmdLine, and Options
+            </description>
+          </parameter>
+
+		  <parameter name="callback" type="Function" usage="optional">
+            <description>
+				The callback argument is the name of the method that is executed when an asynchronous LaunchApp call has status information to return. You must define this method separately. 
+				This argument is used only with an asynchronous LaunchApp call.
+            </description>
+		  </parameter>
+
+
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+      
+      <!-- LaunchDoc(criteria);-->
+      <method name="LaunchDoc" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+			The &lt;code&gt;LaunchDoc&lt;/code&gt; method launches an application based on a given document. 
+			This method automatically determines which application to launch for the specified document. 
+			The application can be launched as chained (embedded) or stand-alone.
+			
+			This method can be called both synchronously and asynchronously.
+        </description>
+
+        <parameters>
+        	
+          <parameter name="criteria" type="criteria" usage="required">
+            <description>
+            	This is an object that specifies which application to launch. 
+            </description>
+          </parameter>
+
+		  <parameter name="callback" type="Function" usage="optional">
+            <description>
+			The callback argument is the name of the method that is executed when an asynchronous LaunchDoc call has status information to return. You must define this method separately.				
+			This argument is used only with an asynchronous LaunchDoc call.
+            </description>
+		  </parameter>
+
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+      
+    </methods>
+
+  </class>
+  <!-- end of IAppManager -->
+  
+	<!-- IMessaging interface  -->
+	<class type="IMessaging">
+
+    	<description>
+	&lt;p&gt;The Messaging Service API allows widgets to send, retrieve, and manage messages using the Messaging Center of a device.&lt;/p&gt; 
+	&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+
+	&lt;p&gt;To use the Messaging Service API, your widget must first createa service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+	&lt;p&gt;Use &lt;code&gt;Service.Messaging&lt;/code&gt; to identify the service provider and &lt;code&gt;IMessaging&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.Messaging", "IMessaging");&lt;/pre&gt;
+		</description>
+
+    	<browsers>
+      		<browser platform="Nokia WRT" version="1.1+" />
+    	</browsers>
+
+    	<constructors/>
+
+		<methods>
+			<!-- GetList(criteria)-->
+			<method name="GetList" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="result"/>
+				</return-types>
+				
+				<description>
+					The &lt;code&gt;GetList&lt;/code&gt; method retrieves a list of messaging objects from the Messaging Center of the S60 device. 
+					Each object contains messaging information, that is, header and content data for a single message. 
+					This is a synchronous method. 
+					The criteria object specifies what messaging information is returned and how the returned information is sorted. 
+					The GetList method returns an object that contains the requested messaging information, an error code, and an error message. 
+					To access information about individual messages, iterate through the list of objects contained in ReturnValue attribute of the returned object.
+				</description>
+
+				<parameters>
+					<parameter name="criteria" type="object" usage="required">
+						<description>
+							This is an object that specifies the search criteria. 
+						</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+
+	  		<!-- RegisterNotification(criteria, callback)-->
+      		<method name="RegisterNotification" scope="instance" visibility="basic">
+        		<return-types>
+          			<return-type type="result"/>
+        		</return-types>
+        
+        		<description>
+					&lt;p&gt;
+					The &lt;code&gt;RegisterNotification&lt;/code&gt; method registers the widget to receive notifications of new incoming messages. 
+					For each new message, the method returns the header information of that message. 
+					This is an asynchronous method.
+					&lt;/p&gt;
+					
+					&lt;pre&gt;result = so.IMessaging.RegisterNotification(criteria, callback);&lt;/pre&gt;
+			
+					&lt;p&gt;
+					Criteria object that specifies the request for notification of new messages. 
+					The object must contain the Type property (string), and this property must contain the value &lt;code&gt;NewMessage&lt;/code&gt;. 
+					The callback argument is the name of the method that is executed when &lt;code&gt;RegisterNotification&lt;/code&gt; has results or status information to return. 
+					You must define this method separately. 
+					The &lt;code&gt;RegisterNotification&lt;/code&gt; method returns an object that contains the initial return value for the asynchronous call it started. 
+					The actual notification information is returned by the callback method in the ReturnValue property of its result object.
+					&lt;code&gt;RegisterNotification&lt;/code&gt; retrieves new message updates until cancelled with &lt;code&gt;CancelNotification&lt;/code&gt; (or &lt;code&gt;Cancel&lt;/code&gt;). 
+					You can therefore have only one &lt;code&gt;RegisterNotification&lt;/code&gt; call (one instance) pending or in use at any given time.
+					&lt;/p&gt;
+        		</description>
+
+        		<parameters>
+          			<parameter name="criteria" type="object" usage="required">
+            			<description>
+							Criteria object specifies the type and details of the message to send. 
+						</description>
+          			</parameter>
+          			<parameter name="callback" type="function" usage="required">
+            			<description>
+							The callback argument is the name of the method that is executed when an asynchronous Send call has status information to return. You must define this method separately.
+            			</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+			
+	  		<!-- CancelNotification(criteria) -->
+      		<method name="CancelNotification" scope="instance" visibility="basic">
+        		<return-types>
+          			<return-type type="result"/>
+        		</return-types>
+
+        		<description>
+					&lt;p&gt;
+					The &lt;code&gt;CancelNotification&lt;/code&gt; method cancels notification of new incoming messages. 
+					This is a synchronous method.
+					&lt;/p&gt;
+					
+					&lt;pre&gt;result = so.IMessaging.CancelNotification(criteria);&lt;/pre&gt;
+
+					&lt;p&gt;
+					The criteria object specifies the request for cancelling notification of new messages. 
+					The object must contain the Type property (string), and this property must contain the value &lt;code&gt;NewMessage&lt;/code&gt;. 
+					The &lt;code&gt;CancelNotification&lt;/code&gt; method returns an object that contains an error code and an error message.
+					&lt;/p&gt;
+        		</description>
+
+        		<parameters>
+          			<parameter name="criteria" type="object" usage="required">
+            			<description>
+			The criteria object specifies the request for cancelling notification of new messages. The object must contain the Type property (string), and this property must contain the value "NewMessage". 
+            			</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+
+	  		<!-- Send(criteria, callback)-->
+      		<method name="Send" scope="instance" visibility="basic">
+        		<return-types>
+          			<return-type type="result"/>
+        		</return-types>
+        
+        		<description>
+		&lt;p&gt;
+		The &lt;code&gt;Send&lt;/code&gt; method sends an SMS or MMS message. 
+		This method can be called both synchronously and asynchronously. 
+		&lt;/p&gt;
+		
+		&lt;p&gt;
+		For synchronous calls: 
+		&lt;/p&gt;
+		
+		&lt;pre&gt;result = so.IMessaging.Send(criteria);&lt;/pre&gt;
+		
+		&lt;p&gt;	
+		For asynchronous calls:
+		&lt;/p&gt;
+		
+		&lt;pre&gt;result = so.IMessaging.Send(criteria, callback);&lt;/pre&gt;
+		
+		&lt;p&gt;	
+		Criteria object specifies the type and details of the message to send. 
+		The callback argument is the name of the method that is executed when an asynchronous &lt;code&gt;Send&lt;/code&gt; call has status information to return. 
+		You must define this method separately.
+		If synchronous, the method returns an object that contains an error code and an error message. 
+		If asynchronous, the method returns an object that contains a transaction ID for the callback instance, an error code, and an error message. 
+		When the asynchronous call has completed, callback returns an object that contains an error code and an error message.
+		&lt;/p&gt;
+        		</description>
+
+        		<parameters>
+          			<parameter name="criteria" type="object" usage="required">
+            			<description>
+							Criteria object specifies the type and details of the message to send. 
+						</description>
+          			</parameter>
+          			<parameter name="callback" type="function" usage="optional">
+            			<description>
+							The callback argument is the name of the method that is executed when an asynchronous Send call has status information to return. You must define this method separately.
+            			</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+
+      		<!-- Cancel(criteria) -->
+      		<method name="Cancel" scope="instance" visibility="basic">
+        <return-types>
+          <return-type type="result"/>
+        </return-types>
+
+        <description>
+		The &lt;code&gt;Cancel&lt;/code&gt; method cancels an outstanding asynchronous &lt;code&gt;Send&lt;/code&gt; or &lt;code&gt;RegisterNotification&lt;/code&gt; call. 
+		To cancel a &lt;code&gt;RegisterNotification&lt;/code&gt; call, use &lt;code&gt;CancelNotification&lt;/code&gt; instead, as it provides a more convenient way of doing this. 
+		This is a synchronous method. 
+		The criteria object has &lt;code&gt;TransactionID&lt;/code&gt; property which specifies the transaction ID of the &lt;code&gt;Send&lt;/code&gt; or &lt;code&gt;RegisterNotification&lt;/code&gt; call to cancel. 
+		The transaction ID is the same &lt;code&gt;TransactionID&lt;/code&gt; value that was returned as part of the result of the initial call. 
+		The &lt;code&gt;Cancel&lt;/code&gt; method returns an object that contains an error code and an error message.
+        </description>
+
+        <parameters>
+          <parameter name="criteria" type="object" usage="required">
+            <description>
+			The criteria object has TransactionID property which specifies the transaction ID of the Send or RegisterNotification call to cancel. The transaction ID is the same TransactionID value that was returned as part of the result of the initial call.
+            </description>
+          </parameter>
+        </parameters>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+      </method>
+
+		<!-- ChangeStatus(criteria) -->
+		<method name="ChangeStatus" scope="instance" visibility="basic">
+		
+			<return-types>
+				<return-type type="result"/>
+			</return-types>
+
+    	    <description>
+		&lt;p&gt;
+			The &lt;code&gt;ChangeStatus&lt;/code&gt; method changes the read status of a message. 
+			The status can be "Read", "Unread", "Replied", or "Forwarded".
+			This is a synchronous method.
+		&lt;/p&gt;
+		
+		&lt;pre&gt;result = so.IMessaging.ChangeStatus(criteria);&lt;/pre&gt;
+		
+		&lt;p&gt;	
+		Criteria object specifies the message whose status to change and the new status. 
+		The &lt;code&gt;ChangeStatus&lt;/code&gt; method returns an object that contains an error code and an error message.
+		&lt;/p&gt;
+        	</description>
+
+				<parameters>
+					<parameter name="criteria" type="object" usage="required">
+						<description>
+						Criteria object specifies the message whose status to change and the new status. The ChangeStatus method returns an object that contains an error code and an error message.
+						</description>
+					</parameter>
+				</parameters>
+		
+				<browsers>
+					<browser platform="Nokia WRT" version="1.1+" />
+				</browsers>
+		
+			</method>
+
+			<!-- Delete (criteria)-->
+			<method name="Delete" scope="instance" visibility="basic">
+
+				<return-types>
+					<return-type type="result"/>
+				</return-types>
+        
+				<description>
+		&lt;p&gt;
+			The &lt;code&gt;Delete&lt;/code&gt; method deletes a message.
+			This is a synchronous method.
+		&lt;/p&gt;	
+		
+		&lt;pre&gt;result = so.IMessaging.Delete(criteria);&lt;/pre&gt;
+		
+		&lt;p&gt;
+			The criteria object has &lt;code&gt;messageId&lt;/code&gt; attribute that specifies the message to delete. 
+			The &lt;code&gt;Delete&lt;/code&gt; method returns an object that contains an error code and an error message.
+		&lt;/p&gt;
+				</description>
+
+				<parameters>
+					<parameter name="criteria" type="object" usage="required">
+						<description>
+						The criteria object has messageId attribute that specifies the message to delete.  
+						</description>
+					</parameter>
+				</parameters>
+				
+				<browsers>
+					<browser platform="Nokia WRT" version="1.1+" />
+				</browsers>
+			</method>
+		</methods>        
+
+	</class>  
+	<!-- end of IMessaging -->
+
+	<!-- ISysInfo interface  -->
+	<class type="ISysInfo">
+
+    	<description>
+			&lt;p&gt;The SystemInfo Service API allows widgets to access and modify system information on a device.&lt;/p&gt; 
+			&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+			&lt;p&gt;To use the SystemInfo Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+			&lt;p&gt;Use &lt;code&gt;Service.SysInfo&lt;/code&gt; to identify the service provider and &lt;code&gt;ISysInfo&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+			&lt;pre&gt;var so = device.getServiceObject("Service.SysInfo", "ISysInfo");&lt;/pre&gt;
+		</description>
+
+    	<browsers>
+      		<browser platform="Nokia WRT" version="1.1+" />
+    	</browsers>
+
+    	<constructors/>
+
+		<methods>
+			<!-- GetInfo(criteria, callback); -->
+			<method name="GetInfo" scope="instance" visibility="basic">
+				<return-types>
+					<return-type type="result"/>
+				</return-types>
+
+				<description>
+					The &lt;code&gt;GetInfo&lt;/code&gt; method retrieves information about a system attribute.
+					This method can be called both synchronously and asynchronously.
+				</description>
+
+				<parameters>
+					<parameter name="criteria" type="object" usage="required">
+						<description>
+							This is an object that specifies the search criteria. 
+						</description>
+          			</parameter>
+					
+          			<parameter name="callback" type="function" usage="optional">
+            			<description>
+							The callback argument is the name of the method that is executed when an asynchronous Send call has status information to return. You must define this method separately.
+            			</description>
+          			</parameter>
+
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+
+	  		<!-- SetInfo(criteria); -->
+      		<method name="SetInfo" scope="instance" visibility="basic">
+        		<return-types>
+          			<return-type type="result"/>
+        		</return-types>
+        
+        		<description>
+					The &lt;code&gt;SetInfo&lt;/code&gt; method modifies the value of a system attribute.
+					This is a synchronous method.
+        		</description>
+
+        		<parameters>
+          			<parameter name="criteria" type="object" usage="required">
+            			<description>
+							This is an object that specifies the new value for the system attribute. 
+						</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+			
+	  		<!-- GetNotification(criteria, callback); -->
+      		<method name="GetNotification" scope="instance" visibility="basic">
+        		<return-types>
+          			<return-type type="result"/>
+        		</return-types>
+
+        		<description>
+					The &lt;code&gt;GetNotification&lt;/code&gt; method notifies the client when the value of a system attribute is changed.
+					This is an asynchronous method.
+        		</description>
+
+        		<parameters>
+          			<parameter name="criteria" type="object" usage="required">
+            			<description>
+							This is an object that specifies the system attribute to monitor for changes.  
+            			</description>
+          			</parameter>
+					
+          			<parameter name="callback" type="function" usage="required">
+            			<description>
+							The callback argument is the name of the method that is executed when a GetNotification call has results or status information to return.
+            			</description>
+          			</parameter>
+        		</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+
+      		<!-- Cancel(criteria) -->
+			<method name="Cancel" scope="instance" visibility="basic">
+				
+				<return-types>
+					<return-type type="result"/>
+				</return-types>
+
+				<description>
+					The &lt;code&gt;Cancel&lt;/code&gt; method cancels an ongoing asynchronous call made with a SystemInfo Service API method.
+					This is a synchronous method.
+		        </description>
+
+				<parameters>
+					<parameter name="criteria" type="object" usage="required">
+						<description>
+							This is an object with the TransactionID property (number). criteria.TransactionID specifies the transaction ID of the asynchronous call to cancel. The transaction ID is the result.TransactionID value that was returned as part of the result of the initial call.
+						</description>
+					</parameter>
+				</parameters>
+        		<browsers>
+          			<browser platform="Nokia WRT" version="1.1+" />
+        		</browsers>
+      		</method>
+		</methods>        
+	</class>  
+	<!-- end of ISysInfo -->
+
+	<!-- ILocation API -->
+	<class type="ILocation">
+	
+	    <description>
+	&lt;p&gt;The Location Service API allows widgets to retrieve information about the physical location of a device and to perform calculations based on location information.&lt;/p&gt; 
+	&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+
+	&lt;p&gt;To use the Location Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+	&lt;p&gt;Use &lt;code&gt;Service.Location&lt;/code&gt; to identify the service provider and &lt;code&gt;ILocation&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.Location", "ILocation");&lt;/pre&gt;
+		</description>
+	
+	    <browsers>
+	      <browser platform="Nokia WRT" version="1.1+" />
+	    </browsers>
+	
+	    <constructors/>
+	
+	    <methods>
+	      
+	      <!--  GetLocation(criteria, callback) -->
+	      <method name="GetLocation" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	        
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;GetLocation&lt;/code&gt; method retrieves the current location of the device. 
+			This method can be called both synchronously and asynchronously. 
+			&lt;/p&gt;
+			
+			&lt;p&gt;
+			For synchronous calls:
+			&lt;/p&gt;
+			&lt;pre&gt;result = so.ILocation.GetLocation(criteria);&lt;/pre&gt;
+			
+			&lt;p&gt;	
+			For asynchronous calls:
+			&lt;/p&gt;
+			&lt;pre&gt;result = so.ILocation.GetLocation(criteria, callback);&lt;/pre&gt;
+	
+			&lt;p&gt;
+			If synchronous, the &lt;code&gt;GetLocation&lt;/code&gt; method returns an object that contains the requested location information, an error code, and an error message. 
+			If asynchronous, the &lt;code&gt;GetLocation&lt;/code&gt; method returns an object that contains the initial return value for the asynchronous call it started. 
+			The actual location information is returned by the callback method in the ReturnValue property of its result object. 
+			The availability of specific location information depends on the underlying GPS technology. 
+			Other factors, such as the number of satellites available for a location fix, also affect what information can be returned. 
+			You can change the positioning system used by an S60 device from the Settings > General > Positioning > Positioning methods menu. 
+			It takes time to retrieve the initial position fix. Subsequent requests are faster.
+			This criteria object specifies what type of device location information is returned and how.
+			The callback argument is the name of the method that is executed when an asynchronous GetLocation call has results or status information to return. 
+			You must define this method separately. 
+			This argument is used only with an asynchronous &lt;code&gt;GetLocation&lt;/code&gt; call. 
+			For more information about the criteria and returned object properties and how to define them refer to WDL Help documentation.
+			&lt;/p&gt;
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="object" usage="required">
+	            <description>
+				This is an object that specifies what type of device location information is returned and how.
+	            </description>
+	          </parameter>
+	          <parameter name="callback" type="function" usage="optional">
+	            <description>
+				The callback argument is the name of the method that is executed when an asynchronous GetLocation call has results or status information to return. You must define this method separately. This argument is used only with an asynchronous GetLocation call.
+	            </description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+	
+		  <!--Trace(criteria, callback)-->
+	      <method name="Trace" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	        
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;Trace&lt;/code&gt; method retrieves periodic updates about the current location of the device based on a predefined update interval. 
+			This is an asynchronous method. 
+			&lt;/p&gt;
+			
+			&lt;pre&gt;result = so.ILocation.Trace(criteria, callback);&lt;/pre&gt;
+			
+			&lt;p&gt;
+			The &lt;code&gt;Trace&lt;/code&gt; method returns an object that contains the initial return value for the asynchronous call it started. 
+			The actual location information is returned by the callback method in the ReturnValue property of its result object.
+			&lt;/p&gt;
+			
+			&lt;p&gt;
+			&lt;code&gt;Trace&lt;/code&gt; retrieves location updates until cancelled with &lt;code&gt;CancelNotification&lt;/code&gt;. 
+			You can therefore have only one &lt;code&gt;Trace&lt;/code&gt; call (one instance) pending or in use at any given time. 
+			The availability of specific location information depends on the underlying GPS technology. 
+			Other factors, such as the number of satellites available for a location fix, also affect what information can be returned. 
+			You can change the positioning system used by an S60 device from the Settings > General > Positioning > Positioning methods menu. 
+			It takes time to retrieve the initial position fix. Subsequent requests are faster.
+			The criteria object specifies what type of device location information is returned and how. Note that these input properties are similar to what the GetLocation method uses. 
+			The callback argument is the name of the method that is executed when Trace has results or status information to return. You must define this method separately.
+			For more information about the criteria and returned object properties and how to define them refer to WDL Help documentation.
+			&lt;/p&gt;
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="object" usage="required">
+	            <description>
+				This is an object that specifies what type of device location information is returned and how. Note that these input properties are similar to what the GetLocation method uses.</description>
+	          </parameter>
+	          <parameter name="callback" type="function" usage="required">
+	            <description>
+				The callback argument is the name of the method that is executed when Trace has results or status information to return. You must define this method separately.
+	            </description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+	
+	      <!-- Calculate(criteria) -->
+	      <method name="Calculate" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;Calculate&lt;/code&gt; method performs mathematical calculations based on a source location and a target location. 
+			This is a synchronous method.
+			&lt;/p&gt;
+			
+			&lt;pre&gt;result = so.ILocation.Calculate(criteria);&lt;/pre&gt;
+			
+			&lt;p&gt;
+			The &lt;code&gt;Calculate&lt;/code&gt; method returns an object that contains the calculation results, an error code, and an error message. 
+			The criteria object specifies the mathematical operation to perform and the input values to use in the operation. 
+			For more information about the criteria and returned object properties and how to define them refer to WDL Help documentation.
+			&lt;/p&gt;
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="Object" usage="required">
+	            <description>
+				This is an object that specifies the mathematical operation to perform and the input values to use in the operation.
+				</description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+	
+	      <!-- CancelNotification(criteria) -->
+	      <method name="CancelNotification" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;CancelNotification&lt;/code&gt; method cancels an outstanding asynchronous call. 
+			This is a synchronous method.
+			&lt;/p&gt; 
+			
+			&lt;pre&gt;result = so.ILocation.CancelNotification(criteria);&lt;/pre&gt;
+			
+			&lt;p&gt;
+			The criteria object specifies whether to cancel a GetLocation call or a Trace call. 
+			The object must contain the &lt;code&gt;CancelRequestType&lt;/code&gt; property (string) that is used to specify the type of call to cancel.
+			&lt;/p&gt;
+			
+			&lt;p&gt; 
+			The possible values for &lt;code&gt;criteria.CancelRequestType&lt;/code&gt; are:
+			&lt;ul&gt; 
+				&lt;li&gt;&lt;code&gt;GetLocCancel&lt;/code&gt; cancels an asynchronous &lt;code&gt;GetLocation&lt;/code&gt; call.&lt;/li&gt; 
+				&lt;li&gt;&lt;code&gt;TraceCancel&lt;/code&gt; cancels a &lt;code&gt;Trace&lt;/code&gt; call.&lt;/li&gt; 
+			&lt;/ul&gt;
+			&lt;/p&gt;
+			
+			&lt;p&gt;	
+			The &lt;code&gt;CancelNotification&lt;/code&gt; method returns an object that contains an error code and an error message. 
+			For more information about the criteria and returned object properties and how to define them refer to WDL Help documentation.
+			&lt;/p&gt; 
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="object" usage="required">
+	            <description>
+				This is an object that specifies whether to cancel a GetLocation call or a Trace call. The object must contain the CancelRequestType property (string) that is used to specify the type of call to cancel. The possible values for criteria.CancelRequestType are: "GetLocCancel" cancels an asynchronous GetLocation call. "TraceCancel" cancels a Trace call.
+	            </description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+	
+	    </methods>        
+	
+	  </class>  
+	<!-- end of ILocation API -->
+
+	<!-- ISensor interface  -->
+	<class type="ISensor">
+
+    	<description>
+	&lt;p&gt;
+	The Sensor Service API allows widgets to access data provided by the physical sensors of a device.
+	&lt;/p&gt; 
+	&lt;p&gt;
+	The data from a given sensor is mapped to one or more sensor channels, which the API can listen to. 
+	The available sensors depend on the device.
+	&lt;/p&gt; 
+	&lt;p&gt;
+	The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.
+	&lt;/p&gt; 
+	&lt;p&gt;
+	To use the Sensor Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.
+	&lt;/p&gt; 
+	&lt;p&gt;
+	Use &lt;code&gt;Service.Sensor&lt;/code&gt; to identify the service provider and &lt;code&gt;ISensor&lt;/code&gt; to identify the supported interface:
+	&lt;/p&gt;
+	 
+	&lt;pre&gt;so = device.getServiceObject("Service.Sensor", "ISensor");&lt;/pre&gt;	
+		</description>
+
+    	<browsers>
+      		<browser platform="Nokia WRT" version="1.1+" />
+    	</browsers>
+
+    	<constructors/>
+
+    	<methods>
+      
+	  	<!-- FindSensorChannel (criteria)-->
+      	<method name="FindSensorChannel" scope="instance" visibility="basic">
+        	<return-types>
+          		<return-type type="result"/>
+        	</return-types>
+        
+        	<description>
+		&lt;p&gt;
+		The &lt;code&gt;FindSensorChannel&lt;/code&gt; method searches for sensor channels available on the device. 
+		This is a synchronous method.
+		&lt;/p&gt;
+		 
+		&lt;pre&gt;result = so.ISensor.FindSensorChannel(criteria);&lt;/pre&gt;
+		
+		&lt;p&gt;
+		The criteria object specifies the search criteria. 
+		The &lt;code&gt;FindSensorChannel&lt;/code&gt; method returns an object that contains the requested sensor channel information, an error code, and an error message.
+		&lt;/p&gt;
+        	</description>
+
+        	<parameters>
+          		<parameter name="criteria" type="object" usage="required">
+            		<description>
+						This is an object that specifies the search criteria. 
+					</description>
+          		</parameter>
+        	</parameters>
+			
+        	<browsers>
+          		<browser platform="Nokia WRT" version="1.1+" />
+        	</browsers>
+			
+      	</method>
+
+	  	<!-- RegisterForNotification(criteria, callback)-->
+      	<method name="RegisterForNotification" scope="instance" visibility="basic">
+        	<return-types>
+          		<return-type type="result"/>
+        	</return-types>
+        
+        	<description>
+		&lt;p&gt;
+		The &lt;code&gt;RegisterForNotification&lt;/code&gt; method registers the client to receive data from one sensor channel. 
+		This is an asynchronous method.
+		&lt;/p&gt;
+		
+		&lt;pre&gt;result = so.ISensor.RegisterForNotification(criteria, callback);&lt;/pre&gt;
+		
+		&lt;p&gt;
+		The &lt;code&gt;RegisterForNotification&lt;/code&gt; method returns an object that contains the initial return value for the asynchronous call it started. 
+		The actual sensor data is returned by the callback method in the ReturnValue property of its result object.
+		&lt;/p&gt;
+        	</description>
+
+        	<parameters>
+          		<parameter name="criteria" type="object" usage="required">
+            		<description>
+			This is an object that specifies the sensor channel to listen for data. 
+					</description>
+          		</parameter>
+          		<parameter name="callback" type="function" usage="required">
+            		<description>
+						The callback argument is the name of the method that is executed when a RegisterForNotification call has results or status information to return. You must define this method separately.
+            		</description>
+          		</parameter>
+        	</parameters>
+        	<browsers>
+          		<browser platform="Nokia WRT" version="1.1+" />
+        	</browsers>
+      </method>
+
+	      <!-- Cancel(criteria) -->
+	      <method name="Cancel" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;Cancel&lt;/code&gt; method stops an ongoing &lt;code&gt;RegisterForNotification&lt;/code&gt; call. 
+			This is a synchronous method.
+			&lt;/p&gt;
+			
+			&lt;pre&gt;result = so.ISensor.Cancel(criteria);&lt;/pre&gt;
+			
+			&lt;p&gt;
+			The criteria object has the &lt;code&gt;TransactionID&lt;/code&gt; property which specifies the transaction ID of the &lt;code&gt;RegisterForNotification&lt;/code&gt; call to cancel. 
+			The transaction ID is the value that was returned as part of the result of the initial call. 
+			The &lt;code&gt;Cancel&lt;/code&gt; method returns an object that contains an error code and an error message.
+			&lt;/p&gt;
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="object" usage="required">
+	            <description>
+				This is an object with the TransactionID property (number). criteria.TransactionID specifies the transaction ID of the RegisterForNotification call to cancel. The transaction ID is the result.TransactionID value that was returned as part of the result of the initial call.
+	            </description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+	
+		  <!-- GetChannelProperty (criteria)-->
+	      <method name="GetChannelProperty" scope="instance" visibility="basic">
+	        <return-types>
+	          <return-type type="result"/>
+	        </return-types>
+	        
+	        <description>
+			&lt;p&gt;
+			The &lt;code&gt;GetChannelProperty&lt;/code&gt; method retrieves information about a sensor channel property. 
+			This is a synchronous method.
+			&lt;/p&gt;
+			 
+			&lt;pre&gt;result = so.ISensor.GetChannelProperty(criteria);&lt;/pre&gt;
+			
+			&lt;p&gt;
+			This is an object that specifies which sensor channel property to retrieve information about. 
+			The &lt;code&gt;GetChannelProperty&lt;/code&gt; method returns an object that contains the requested channel property information, an error code, and an error message.
+			&lt;/p&gt;
+			
+	        </description>
+	
+	        <parameters>
+	          <parameter name="criteria" type="object" usage="required">
+	            <description>
+				This is an object that specifies which sensor channel property to retrieve information about. 
+				</description>
+	          </parameter>
+	        </parameters>
+	        <browsers>
+	          <browser platform="Nokia WRT" version="1.1+" />
+	        </browsers>
+	      </method>
+		  
+		</methods>        
+
+ 	</class>  
+	<!-- end of ISensor  -->
+
+  <!-- serviceObject  -->
+  <class type="serviceObject">
+    <description>
+      Service Object
+    </description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+
+    <constructors>
+      <constructor scope="instance">
+        <description>Service Object</description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+        <parameters/>
+        <return-types>
+          <return-type type="serviceObject"/>
+        </return-types>
+      </constructor>
+    </constructors>
+
+    <properties>
+
+      <property name="IDataSource" type="IDataSource" scope="instance" access="read-write" visibility="basic">
+        <description>
+    	This Service API allows widgets to:
+		&lt;p&gt;
+		&lt;ul&gt;
+		 	&lt;li&gt;access, create, and manage calendars/calendar entries,&lt;/li&gt;
+			&lt;li&gt;access and manage information about contacts,&lt;/li&gt;
+			&lt;li&gt;access and manage information about landmarks and landmark categories,&lt;/li&gt;
+			&lt;li&gt;add, read, and delete logging events such as call logs, messaging logs, and so forth,&lt;/li&gt;
+			&lt;li&gt;retrieve information (metadata) about the media files stored in the Media Gallery of a device.&lt;/li&gt;
+		&lt;/ul&gt;
+		&lt;/p&gt;
+		&lt;p&gt;
+		To use the &lt;code&gt;IDataSource&lt;/code&gt; Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.
+		&lt;/p&gt;
+		&lt;p&gt; 
+		Use &lt;code&gt;Service.Calendar&lt;/code&gt; or &lt;code&gt;Service.Contact&lt;/code&gt; or &lt;code&gt;Service.Landmarks&lt;/code&gt; or &lt;code&gt;Service.Logging&lt;/code&gt; or &lt;code&gt;Service.MediaManagement&lt;/code&gt; to identify the service provider and &lt;code&gt;IDataSource&lt;/code&gt; to identify the supported interface:
+		&lt;/p&gt;
+		
+		&lt;pre&gt;var so = device.getServiceObject("Service.Calendar", "IDataSource");&lt;/pre&gt;		
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="IAppManager" type="IAppManager" scope="instance" access="read-write" visibility="basic">
+        <description>
+    	&lt;p&gt;The AppManager Service API allows widgets to access and launch applications on a mobile device.&lt;/p&gt;
+		&lt;p&gt;The API is integrated with WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+		&lt;p&gt;To use the AppManager Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+		&lt;p&gt;Use &lt;code&gt;Service.AppManager&lt;/code&gt; to identify the service provider and &lt;code&gt;IAppManager&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.AppManager", "IAppManager");&lt;/pre&gt;
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="IMessaging" type="IMessaging" scope="instance" access="read-write" visibility="basic">
+        <description>
+	&lt;p&gt;The Messaging Service API allows widgets to send, retrieve, and manage messages using the Messaging Center of a device.&lt;/p&gt; 
+	&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+
+	&lt;p&gt;To use the Messaging Service API, your widget must first createa service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+	&lt;p&gt;Use &lt;code&gt;Service.Messaging&lt;/code&gt; to identify the service provider and &lt;code&gt;IMessaging&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.Messaging", "IMessaging");&lt;/pre&gt;
+
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="ISysInfo" type="ISysInfo" scope="instance" access="read-write" visibility="basic">
+        <description>
+			&lt;p&gt;The SystemInfo Service API allows widgets to access and modify system information on a device.&lt;/p&gt; 
+			&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+			&lt;p&gt;To use the SystemInfo Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+			&lt;p&gt;Use &lt;code&gt;Service.SysInfo&lt;/code&gt; to identify the service provider and &lt;code&gt;ISysInfo&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+			&lt;pre&gt;var so = device.getServiceObject("Service.SysInfo", "ISysInfo");&lt;/pre&gt;
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+      <property name="ILocation" type="ILocation" scope="instance" access="read-write" visibility="basic">
+        <description>
+	&lt;p&gt;The Location Service API allows widgets to retrieve information about the physical location of a device and to perform calculations based on location information.&lt;/p&gt; 
+	&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt;
+
+	&lt;p&gt;To use the Location Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+	&lt;p&gt;Use &lt;code&gt;Service.Location&lt;/code&gt; to identify the service provider and &lt;code&gt;ILocation&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+
+		&lt;pre&gt;var so = device.getServiceObject("Service.Location", "ILocation");&lt;/pre&gt;
+ 
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+	  
+	  <property name="ISensor" type="ISensor" scope="instance" access="read-write" visibility="basic">
+        <description>
+	&lt;p&gt;The Sensor Service API allows widgets to access data provided by the physical sensors of a device.&lt;/p&gt; 
+	&lt;p&gt;The data from a given sensor is mapped to one or more sensor channels, which the API can listen to. 
+	The available sensors depend on the device.&lt;/p&gt; 
+	&lt;p&gt;The API is integrated into WRT through the &lt;code&gt;device&lt;/code&gt; object.&lt;/p&gt; 
+	&lt;p&gt;To use the Sensor Service API, your widget must first create a service object for it using the &lt;code&gt;device.getServiceObject()&lt;/code&gt; method.&lt;/p&gt; 
+	&lt;p&gt;Use &lt;code&gt;Service.Sensor&lt;/code&gt; to identify the service provider and &lt;code&gt;ISensor&lt;/code&gt; to identify the supported interface:&lt;/p&gt;
+	 
+	&lt;pre&gt;so = device.getServiceObject("Service.Sensor", "ISensor");&lt;/pre&gt;	  
+        </description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+      </property>
+
+    </properties>
+  </class>
+  <!-- end of serviceObject  -->
+  
+  <!-- Device -->
+  <class type="device">
+
+    <description>
+		The &lt;code&gt;device&lt;/code&gt; object is a built-in JavaScript object in the widget engine. 
+		It was introduced in WRT 1.1 to allow widgets access to S60 Platform Services through Service APIs. 
+		The &lt;code&gt;device&lt;/code&gt; object is used to create service objects for specific Service APIs. 
+		These service objects can then be used to access the services made available through the Service APIs.	
+	</description>
+
+    <browsers>
+      <browser platform="Nokia WRT" version="1.1+" />
+    </browsers>
+
+
+    <constructors>
+      <constructor scope="instance">
+		<description>
+			The &lt;code&gt;device&lt;/code&gt; object is a built-in JavaScript object in the widget engine. 
+			It was introduced in WRT 1.1 to allow widgets access to S60 Platform Services through Service APIs. 
+			The &lt;code&gt;device&lt;/code&gt; object is used to create service objects for specific Service APIs. 
+			These service objects can then be used to access the services made available through the Service APIs.
+		</description>
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+"/>
+        </browsers>
+        <parameters/>
+        <return-types>
+          <return-type type="device"/>
+        </return-types>
+      </constructor>
+    </constructors>
+
+    <methods>
+
+      <method name="getServiceObject" scope="" visibility="basic">
+
+        <return-types>
+          <return-type type="serviceObject"/>
+        </return-types>
+
+        <description>
+          The &lt;code&gt;getServiceObject&lt;/code&gt; method creates an object that is used to access the services made available through a Service API. 
+		  This object is referred to as a &lt;b&gt;service object&lt;/b&gt;.
+        </description>
+
+        <parameters>
+
+          <parameter name="provider" type="String" usage="required">
+
+            <values>
+              <value name="Service.AppManager" description="Application Manager." />
+              <value name="Service.SysInfo" description="System Information." />
+              <value name="Service.Sensor" description="Sensor." />
+              <value name="Service.Messaging" description="Messaging." />
+              <value name="Service.MediaManagement" description="Media Management." />
+              <value name="Service.Logging" description="Logging." />
+              <value name="Service.Location" description="Location." />
+              <value name="Service.Calendar" description="Calendar." />
+              <value name="Service.Contact" description="Contact." />
+            </values>
+			
+            <description>
+              This is a text string that defines the service provider name, that is, the name of the type of service object to create.
+			  Possible values : "Service.AppManager", 
+			  					"Service.SysInfo", 
+								"Service.Sensor",
+								"Service.Messaging",
+								"Service.MediaManagement",
+								"Service.Logging",
+								"Service.Location",
+								"Service.Calendar",
+								"Service.Contact"
+            </description>
+
+          </parameter>
+
+          <parameter name="interface" type="String" usage="required">
+            <description>
+              This is a text string that defines the supported interface for the specified service provider.
+			  Possible values : "IAppManager",
+			  					"ISysInfo",
+								"ISensor",
+								"IMessaging",
+								"IDataSource",
+								"ILocation"
+            </description>
+            <values>
+              <value name = "IAppManager" description = "Application Manager."/>
+              <value name = "ISysInfo" description = "System Information."/>
+              <value name = "ISensor" description = "Sensor."/>
+              <value name = "IMessaging" description = "Messaging."/>
+              <value name = "IDataSource" description = "Media Management, Logging, Calendar, Contact"/>
+              <value name = "ILocation" description = "Location."/>
+            </values>
+          </parameter>
+        </parameters>
+
+        <browsers>
+          <browser platform="Nokia WRT" version="1.1+" />
+        </browsers>
+
+		<example>
+			&lt;p&gt;
+				The following example creates a service object for the Media Management Service API:
+			&lt;/p&gt;
+
+			&lt;pre&gt;var so = device.getServiceObject("Service.MediaManagement", "IDataSource");&lt;/pre&gt;
+		</example>
+		
+      </method>
+    </methods>
+
+  </class>
+  <!-- end of Device  -->
+
+</javascript>