From 912dc30b43330a3e99a3e1f947ff14de108a3701 Mon Sep 17 00:00:00 2001
From: wei <>
Date: Wed, 17 Jan 2007 11:55:40 +0000
Subject: Add address-book flex demo

---
 demos/address-book/index.php                       |  27 +++
 demos/address-book/protected/application.xml       |  26 ++
 .../protected/pages/AddressProvider.php            |  52 ++++
 .../address-book/protected/pages/AddressRecord.php |  40 +++
 demos/address-book/protected/pages/FlexApp.php     | 114 +++++++++
 demos/address-book/protected/pages/FlexApp.tpl     |  93 +++++++
 demos/address-book/protected/pages/Home.page       |  25 ++
 .../protected/pages/flex/.actionScriptProperties   |  21 ++
 .../protected/pages/flex/.flexProperties           |   2 +
 demos/address-book/protected/pages/flex/.project   |  18 ++
 .../.settings/org.eclipse.core.resources.prefs     |   3 +
 .../protected/pages/flex/bin/AC_OETags.js          | 269 +++++++++++++++++++++
 .../pages/flex/bin/flex_address_book-debug.html    | 107 ++++++++
 .../pages/flex/bin/flex_address_book.html          | 107 ++++++++
 .../protected/pages/flex/bin/flex_address_book.swf | Bin 0 -> 300237 bytes
 .../protected/pages/flex/bin/history.htm           |  21 ++
 .../protected/pages/flex/bin/history.js            |  48 ++++
 .../protected/pages/flex/bin/history.swf           | Bin 0 -> 2656 bytes
 .../pages/flex/bin/playerProductInstall.swf        | Bin 0 -> 657 bytes
 .../protected/pages/flex/flex_address_book.mxml    | 106 ++++++++
 .../pages/flex/html-template/AC_OETags.js          | 269 +++++++++++++++++++++
 .../protected/pages/flex/html-template/history.htm |  21 ++
 .../protected/pages/flex/html-template/history.js  |  48 ++++
 .../protected/pages/flex/html-template/history.swf | Bin 0 -> 2656 bytes
 .../pages/flex/html-template/index.template.html   | 107 ++++++++
 .../flex/html-template/playerProductInstall.swf    | Bin 0 -> 657 bytes
 demos/address-book/protected/pages/sqlite.db       | Bin 0 -> 2048 bytes
 27 files changed, 1524 insertions(+)
 create mode 100644 demos/address-book/index.php
 create mode 100644 demos/address-book/protected/application.xml
 create mode 100644 demos/address-book/protected/pages/AddressProvider.php
 create mode 100644 demos/address-book/protected/pages/AddressRecord.php
 create mode 100644 demos/address-book/protected/pages/FlexApp.php
 create mode 100644 demos/address-book/protected/pages/FlexApp.tpl
 create mode 100644 demos/address-book/protected/pages/Home.page
 create mode 100644 demos/address-book/protected/pages/flex/.actionScriptProperties
 create mode 100644 demos/address-book/protected/pages/flex/.flexProperties
 create mode 100644 demos/address-book/protected/pages/flex/.project
 create mode 100644 demos/address-book/protected/pages/flex/.settings/org.eclipse.core.resources.prefs
 create mode 100644 demos/address-book/protected/pages/flex/bin/AC_OETags.js
 create mode 100644 demos/address-book/protected/pages/flex/bin/flex_address_book-debug.html
 create mode 100644 demos/address-book/protected/pages/flex/bin/flex_address_book.html
 create mode 100644 demos/address-book/protected/pages/flex/bin/flex_address_book.swf
 create mode 100644 demos/address-book/protected/pages/flex/bin/history.htm
 create mode 100644 demos/address-book/protected/pages/flex/bin/history.js
 create mode 100644 demos/address-book/protected/pages/flex/bin/history.swf
 create mode 100644 demos/address-book/protected/pages/flex/bin/playerProductInstall.swf
 create mode 100644 demos/address-book/protected/pages/flex/flex_address_book.mxml
 create mode 100644 demos/address-book/protected/pages/flex/html-template/AC_OETags.js
 create mode 100644 demos/address-book/protected/pages/flex/html-template/history.htm
 create mode 100644 demos/address-book/protected/pages/flex/html-template/history.js
 create mode 100644 demos/address-book/protected/pages/flex/html-template/history.swf
 create mode 100644 demos/address-book/protected/pages/flex/html-template/index.template.html
 create mode 100644 demos/address-book/protected/pages/flex/html-template/playerProductInstall.swf
 create mode 100644 demos/address-book/protected/pages/sqlite.db

(limited to 'demos')

diff --git a/demos/address-book/index.php b/demos/address-book/index.php
new file mode 100644
index 00000000..90149c02
--- /dev/null
+++ b/demos/address-book/index.php
@@ -0,0 +1,27 @@
+<?php
+$frameworkPath='../../framework/prado.php';
+
+/** The directory checks may be removed if performance is required **/
+$basePath=dirname(__FILE__);
+$assetsPath=$basePath."/assets";
+$runtimePath=$basePath."/protected/runtime";
+$sqliteDbDir=$basePath."/protected/pages/";
+$sqliteDb=$sqliteDbDir.'sqlite.db';
+
+if(!is_file($frameworkPath))
+	die("Unable to find prado framework path $frameworkPath.");
+if(!is_writable($assetsPath))
+	die("Please make sure that the directory $assetsPath is writable by Web server process.");
+if(!is_writable($runtimePath))
+	die("Please make sure that the directory $runtimePath is writable by Web server process.");
+if(!is_writable($sqliteDbDir))
+	die("Please make sure that the directory $sqliteDbDir is writable by Web server process.");
+if(!is_writable($sqliteDb))
+	die("Please make sure that the file $sqliteDbDir is writable by Web server process.");
+
+require_once($frameworkPath);
+
+$application=new TApplication;
+$application->run();
+
+?>
\ No newline at end of file
diff --git a/demos/address-book/protected/application.xml b/demos/address-book/protected/application.xml
new file mode 100644
index 00000000..8e87be8c
--- /dev/null
+++ b/demos/address-book/protected/application.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application id="address-book" mode="Debug">
+
+<paths>
+	<using namespace="System.Data.*" />
+	<using namespace="System.Data.ActiveRecord.*" />
+	<using namespace="System.Web.Services.TSoapService" />
+</paths>
+
+<modules>
+	<!-- database configuration for Active Record -->
+	<module id="sqlite-db" class="TActiveRecordConfig">
+		<database ConnectionString="sqlite:./protected/pages/sqlite.db" />
+	</module>
+</modules>
+
+<services>
+	<!-- soap entry point definition for address book service -->
+	<service id="soap" class="TSoapService">
+		<soap id="address-book"
+			provider="Application.pages.AddressProvider"
+			ClassMaps="AddressRecord" />
+	</service>
+</services>
+
+</application>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/AddressProvider.php b/demos/address-book/protected/pages/AddressProvider.php
new file mode 100644
index 00000000..bbfedd1b
--- /dev/null
+++ b/demos/address-book/protected/pages/AddressProvider.php
@@ -0,0 +1,52 @@
+<?php
+
+Prado::using('Application.pages.AddressRecord');
+/**
+ * @author Wei Zhuo <weizho[at]gmail[dot]com>
+ * @version $Id$
+ * @since 3.1
+ */
+class AddressProvider
+{
+	/**
+	 * @return AddressRecord[]
+	 * @soapmethod
+	 */
+	public function getAllAddress()
+	{
+		return AddressRecord::finder()->findAll();
+	}
+
+
+	/**
+	 * Update address if $data->id > 0, otherwise add new address.
+	 * @param AddressRecord $data
+	 * @return boolean
+	 * @soapmethod
+	 */
+	public function saveAddress($data)
+	{
+		$finder = AddressRecord::finder();
+		if($data->id > 0 && $address=$finder->findByPk($data->id))
+		{
+			return $address->copyFrom($data)->save();
+		}
+		else
+		{
+			$data->id = null; //nullify the id
+			return $data->save();
+		}
+	}
+
+	/**
+	 * @param integer $id
+	 * @return integer number of records deleted
+	 * @soapmethod
+	 */
+	public function deleteAddress($id)
+	{
+		return AddressRecord::finder()->deleteByPk($id);
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/AddressRecord.php b/demos/address-book/protected/pages/AddressRecord.php
new file mode 100644
index 00000000..e61ed233
--- /dev/null
+++ b/demos/address-book/protected/pages/AddressRecord.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Auto generated by prado-cli.php on 2007-01-16 06:44:16.
+ */
+class AddressRecord extends TActiveRecord
+{
+	public static $_tablename='addresses';
+
+	/**
+	 * @var integer $id
+	 * @soapproperty
+	 */
+	public $id;
+
+	
+	
+	/**
+	 * @var string $username
+	 * @soapproperty
+	 */
+	public $username;
+
+	
+	
+	/**
+	 * @var string $phone
+	 * @soapproperty
+	 */
+	public $phone;
+
+	
+	/**
+	 * @return AddressRecord
+	 */
+	public static function finder()
+	{
+		return self::getRecordFinder('AddressRecord');
+	}
+}
+?>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/FlexApp.php b/demos/address-book/protected/pages/FlexApp.php
new file mode 100644
index 00000000..e7a5bf2a
--- /dev/null
+++ b/demos/address-book/protected/pages/FlexApp.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * @author Wei Zhuo <weizho[at]gmail[dot]com>
+ * @version $Id$
+ * @since 3.1
+ */
+class FlexApp extends TTemplateControl
+{
+	private $_parameters;
+
+	/**
+	 * FlashVar parameter name value pairs.
+	 *
+	 * NOTE: parameter names must be accessed in lowercase in Flex Applications!
+	 *
+	 * @return TAttributeCollection
+	 */
+	public function getParameters()
+	{
+		if($this->_parameters===null)
+			$this->_parameters = new TAttributeCollection();
+		return $this->_parameters;
+	}
+
+	public function getFlashVars()
+	{
+		$params = array();
+		foreach($this->getParameters() as $name=>$value)
+			$params[] = $name.'='.$value;
+		return implode('&', $params);
+	}
+
+	public function getWidth()
+	{
+		return $this->getViewState('Width', '450');
+	}
+
+	public function setWidth($value)
+	{
+		$this->setViewState('Width', $value, '450');
+	}
+
+	public function getHeight()
+	{
+		return $this->getViewState('Height', '300');
+	}
+
+	public function setHeight($value)
+	{
+		$this->setViewState('Height', $value, '300');
+	}
+
+	public function getBinDirectory()
+	{
+		return $this->getViewState('Bin');
+	}
+
+	public function setBinDirectory($value)
+	{
+		$this->setViewState('Bin', $value);
+	}
+
+	public function getAppName()
+	{
+		return $this->getViewState('AppName');
+	}
+
+	public function setAppName($value)
+	{
+		$this->setViewState('AppName', $value);
+	}
+
+	public function getQuality()
+	{
+		return $this->getViewState('Quality', 'high');
+	}
+
+	public function setQuality($value)
+	{
+		$this->setViewState('Quality', $value, 'high');
+	}
+
+	public function getBgcolor()
+	{
+		return $this->getViewState('bgcolor', '#ffffff');
+	}
+
+	public function setBgColor($value)
+	{
+		$this->setViewState('bgcolor', $value, '#ffffff');
+	}
+
+	public function getAlign()
+	{
+		return $this->getViewState('align', 'middle');
+	}
+
+	public function setAlign($value)
+	{
+		$this->setViewState('align', $value, 'middle');
+	}
+
+	public function getAllowScriptAccess()
+	{
+		return $this->getViewState('allowScriptAccess', 'sameDomain');
+	}
+
+	public function setAllowScriptAccess($value)
+	{
+		$this->setViewState('allowScriptAccess', $value, 'sameDomain');
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/FlexApp.tpl b/demos/address-book/protected/pages/FlexApp.tpl
new file mode 100644
index 00000000..f3abe1cc
--- /dev/null
+++ b/demos/address-book/protected/pages/FlexApp.tpl
@@ -0,0 +1,93 @@
+<script src="<%= $this->BinDirectory %>/AC_OETags.js" language="javascript"></script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// -----------------------------------------------------------------------------
+// Globals
+// Major version of Flash required
+var requiredMajorVersion = 9;
+// Minor version of Flash required
+var requiredMinorVersion = 0;
+// Minor version of Flash required
+var requiredRevision = 0;
+// -----------------------------------------------------------------------------
+// -->
+</script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
+var hasProductInstall = DetectFlashVer(6, 0, 65);
+
+// Version check based upon the values defined in globals
+var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
+
+
+// Check to see if a player with Flash Product Install is available and the version does not meet the requirements for playback
+if ( hasProductInstall && !hasRequestedVersion ) {
+	// MMdoctitle is the stored document.title value used by the installation process to close the window that started the process
+	// This is necessary in order to close browser windows that are still utilizing the older version of the player after installation has completed
+	// DO NOT MODIFY THE FOLLOWING FOUR LINES
+	// Location visited after installation is complete if installation is required
+	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
+	var MMredirectURL = window.location;
+    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+    var MMdoctitle = document.title;
+
+	AC_FL_RunContent(
+		"src", "<%= $this->BinDirectory %>/playerProductInstall",
+		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
+		"width", "<%= $this->Width %>",
+		"height", "<%= $this->Height %>",
+		"align", "<%= $this->Align %>",
+		"id", "<%= $this->AppName %>",
+		"quality", "<%= $this->Quality %>",
+		"bgcolor", "<%= $this->BgColor %>",
+		"name", "<%= $this->AppName %>",
+		"allowScriptAccess","<%= $this->AllowScriptAccess %>",
+		"type", "application/x-shockwave-flash",
+		"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+} else if (hasRequestedVersion) {
+	// if we've detected an acceptable version
+	// embed the Flash Content SWF when all tests are passed
+	AC_FL_RunContent(
+			"src", "<%= $this->BinDirectory %>/<%= $this->AppName %>",
+			"width", "<%= $this->Width %>",
+			"height", "<%= $this->Height %>",
+			"align", "<%= $this->Align %>",
+			"id", "<%= $this->AppName %>",
+			"quality", "<%= $this->Quality %>",
+			"bgcolor", "<%= $this->BgColor %>",
+			"name", "<%= $this->AppName %>",
+			"flashvars",'<%= $this->FlashVars %>',
+			"allowScriptAccess","<%= $this->AllowScriptAccess %>",
+			"type", "application/x-shockwave-flash",
+			"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+  } else {  // flash is too old or we can't detect the plugin
+    var alternateContent = 'Alternate HTML content should be placed here. '
+  	+ 'This content requires the Adobe Flash Player. '
+   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
+    document.write(alternateContent);  // insert non-flash content
+  }
+// -->
+</script>
+<noscript>
+  	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+			id="<%= $this->AppName %>" width="<%= $this->Width %>" height="<%= $this->Height %>"
+			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
+			<param name="flashvars" value="<%= $this->FlashVars %>" />
+			<param name="movie" value="<%= $this->BinDirectory %>/<%= $this->AppName %>.swf" />
+			<param name="quality" value="<%= $this->Quality %>" />
+			<param name="bgcolor" value="<%= $this->BgColor %>" />
+			<param name="allowScriptAccess" value="<%= $this->AllowScriptAccess %>" />
+			<embed src="<%= $this->BinDirectory %>/<%= $this->AppName %>.swf?<%= $this->FlashVars %>" quality="<%= $this->Quality %>" bgcolor="<%= $this->BgColor %>"
+				width="<%= $this->Width %>" height="<%= $this->Height %>" name="<%= $this->AppName %>" align="<%= $this->Align %>"
+				play="true"
+				loop="false"
+				quality="<%= $this->Quality %>"
+				allowScriptAccess="<%= $this->AllowScriptAccess %>"
+				type="application/x-shockwave-flash"
+				pluginspage="http://www.adobe.com/go/getflashplayer">
+			</embed>
+	</object>
+</noscript>
diff --git a/demos/address-book/protected/pages/Home.page b/demos/address-book/protected/pages/Home.page
new file mode 100644
index 00000000..801267e7
--- /dev/null
+++ b/demos/address-book/protected/pages/Home.page
@@ -0,0 +1,25 @@
+<!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" xml:lang="en" lang="en">
+<head>
+	<title>Prado Address Book</title>
+	<style type="text/css">
+	/*<![CDATA[*/
+		body
+		{
+			margin:0; padding: 0;
+		}
+	/*]]>*/
+	</style>
+</head>
+<body>
+
+<div style="margin: 5em auto">
+<com:Application.pages.FlexApp
+	BinDirectory=<%~ flex/bin %>
+	AppName="flex_address_book"
+	Parameters.wsdl="<%= $this->Request->constructUrl('soap', 'address-book.wsdl') %>"
+	Width="100%" Height="300"/>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/flex/.actionScriptProperties b/demos/address-book/protected/pages/flex/.actionScriptProperties
new file mode 100644
index 00000000..43e782c3
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/.actionScriptProperties
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<actionScriptProperties mainApplicationPath="flex_address_book.mxml" version="1">
+<compiler additionalCompilerArguments="-locale en_US" copyDependentFiles="true" generateAccessible="false" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersion="9.0.0" htmlPlayerVersionCheck="true" outputFolderPath="bin" strict="true" warn="true">
+<compilerSourcePath/>
+<libraryPath>
+<libraryPathEntry kind="3" linkType="2" path="${FRAMEWORKS}/libs/playerglobal.swc"/>
+<libraryPathEntry kind="3" linkType="1" path="${FRAMEWORKS}/libs/utilities.swc"/>
+<libraryPathEntry kind="3" linkType="1" path="${FRAMEWORKS}/libs/flex.swc" sourcepath="${FRAMEWORKS}/source"/>
+<libraryPathEntry kind="3" linkType="1" path="${FRAMEWORKS}/libs/framework.swc" sourcepath="${FRAMEWORKS}/source"/>
+<libraryPathEntry kind="3" linkType="1" path="${FRAMEWORKS}/libs/rpc.swc"/>
+<libraryPathEntry kind="1" linkType="1" path="${FRAMEWORKS}/locale/{locale}"/>
+</libraryPath>
+<sourceAttachmentPath>
+<sourceAttachmentPathEntry kind="3" path="${FRAMEWORKS}/libs/flex.swc" sourcepath="${FRAMEWORKS}/source"/>
+<sourceAttachmentPathEntry kind="3" path="${FRAMEWORKS}/libs/framework.swc" sourcepath="${FRAMEWORKS}/source"/>
+</sourceAttachmentPath>
+</compiler>
+<applications>
+<application path="flex_address_book.mxml"/>
+</applications>
+</actionScriptProperties>
diff --git a/demos/address-book/protected/pages/flex/.flexProperties b/demos/address-book/protected/pages/flex/.flexProperties
new file mode 100644
index 00000000..9e63031c
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/.flexProperties
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flexProperties flexServerType="0" toolCompile="true" version="1"/>
diff --git a/demos/address-book/protected/pages/flex/.project b/demos/address-book/protected/pages/flex/.project
new file mode 100644
index 00000000..b9d6c02b
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>flex_address_book</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.adobe.flexbuilder.project.flexbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.adobe.flexbuilder.project.flexnature</nature>
+		<nature>com.adobe.flexbuilder.project.actionscriptnature</nature>
+	</natures>
+</projectDescription>
diff --git a/demos/address-book/protected/pages/flex/.settings/org.eclipse.core.resources.prefs b/demos/address-book/protected/pages/flex/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000..246a6e57
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Tue Jan 16 18:14:52 EST 2007
+eclipse.preferences.version=1
+encoding/<project>=utf-8
diff --git a/demos/address-book/protected/pages/flex/bin/AC_OETags.js b/demos/address-book/protected/pages/flex/bin/AC_OETags.js
new file mode 100644
index 00000000..157eb218
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/bin/AC_OETags.js
@@ -0,0 +1,269 @@
+// Flash Player Version Detection - Rev 1.5
+// Detect Client Browser type
+// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
+var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
+var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
+var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
+
+function ControlVersion()
+{
+	var version;
+	var axo;
+	var e;
+
+	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
+
+	try {
+		// version will be set for 7.X or greater players
+		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+		version = axo.GetVariable("$version");
+	} catch (e) {
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 6.X players only
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+			
+			// installed player is some revision of 6.0
+			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
+			// so we have to be careful. 
+			
+			// default to the first public version
+			version = "WIN 6,0,21,0";
+
+			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
+			axo.AllowScriptAccess = "always";
+
+			// safe to call for 6.0r47 or greater
+			version = axo.GetVariable("$version");
+
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 4.X or 5.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = axo.GetVariable("$version");
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 3.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = "WIN 3,0,18,0";
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 2.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+			version = "WIN 2,0,0,11";
+		} catch (e) {
+			version = -1;
+		}
+	}
+	
+	return version;
+}
+
+// JavaScript helper required to detect Flash Player PlugIn version information
+function GetSwfVer(){
+	// NS/Opera version >= 3 check for Flash plugin in plugin array
+	var flashVer = -1;
+	
+	if (navigator.plugins != null && navigator.plugins.length > 0) {
+		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
+			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;			
+			var descArray = flashDescription.split(" ");
+			var tempArrayMajor = descArray[2].split(".");
+			var versionMajor = tempArrayMajor[0];
+			var versionMinor = tempArrayMajor[1];
+			if ( descArray[3] != "" ) {
+				tempArrayMinor = descArray[3].split("r");
+			} else {
+				tempArrayMinor = descArray[4].split("r");
+			}
+			var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
+			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
+		}
+	}
+	// MSN/WebTV 2.6 supports Flash 4
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
+	// WebTV 2.5 supports Flash 3
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
+	// older WebTV supports Flash 2
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
+	else if ( isIE && isWin && !isOpera ) {
+		flashVer = ControlVersion();
+	}	
+	return flashVer;
+}
+
+// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
+function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
+{
+	versionStr = GetSwfVer();
+	if (versionStr == -1 ) {
+		return false;
+	} else if (versionStr != 0) {
+		if(isIE && isWin && !isOpera) {
+			// Given "WIN 2,0,0,11"
+			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
+			tempString        = tempArray[1];			// "2,0,0,11"
+			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
+		} else {
+			versionArray      = versionStr.split(".");
+		}
+		var versionMajor      = versionArray[0];
+		var versionMinor      = versionArray[1];
+		var versionRevision   = versionArray[2];
+
+        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
+		if (versionMajor > parseFloat(reqMajorVer)) {
+			return true;
+		} else if (versionMajor == parseFloat(reqMajorVer)) {
+			if (versionMinor > parseFloat(reqMinorVer))
+				return true;
+			else if (versionMinor == parseFloat(reqMinorVer)) {
+				if (versionRevision >= parseFloat(reqRevision))
+					return true;
+			}
+		}
+		return false;
+	}
+}
+
+function AC_AddExtension(src, ext)
+{
+  if (src.indexOf('?') != -1)
+    return src.replace(/\?/, ext+'?'); 
+  else
+    return src + ext;
+}
+
+function AC_Generateobj(objAttrs, params, embedAttrs) 
+{ 
+    var str = '';
+    if (isIE && isWin && !isOpera)
+    {
+  		str += '<object ';
+  		for (var i in objAttrs)
+  			str += i + '="' + objAttrs[i] + '" ';
+  		for (var i in params)
+  			str += '><param name="' + i + '" value="' + params[i] + '" /> ';
+  		str += '></object>';
+    } else {
+  		str += '<embed ';
+  		for (var i in embedAttrs)
+  			str += i + '="' + embedAttrs[i] + '" ';
+  		str += '> </embed>';
+    }
+
+    document.write(str);
+}
+
+function AC_FL_RunContent(){
+  var ret = 
+    AC_GetArgs
+    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+     , "application/x-shockwave-flash"
+    );
+  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
+}
+
+function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
+  var ret = new Object();
+  ret.embedAttrs = new Object();
+  ret.params = new Object();
+  ret.objAttrs = new Object();
+  for (var i=0; i < args.length; i=i+2){
+    var currArg = args[i].toLowerCase();    
+
+    switch (currArg){	
+      case "classid":
+        break;
+      case "pluginspage":
+        ret.embedAttrs[args[i]] = args[i+1];
+        break;
+      case "src":
+      case "movie":	
+        args[i+1] = AC_AddExtension(args[i+1], ext);
+        ret.embedAttrs["src"] = args[i+1];
+        ret.params[srcParamName] = args[i+1];
+        break;
+      case "onafterupdate":
+      case "onbeforeupdate":
+      case "onblur":
+      case "oncellchange":
+      case "onclick":
+      case "ondblClick":
+      case "ondrag":
+      case "ondragend":
+      case "ondragenter":
+      case "ondragleave":
+      case "ondragover":
+      case "ondrop":
+      case "onfinish":
+      case "onfocus":
+      case "onhelp":
+      case "onmousedown":
+      case "onmouseup":
+      case "onmouseover":
+      case "onmousemove":
+      case "onmouseout":
+      case "onkeypress":
+      case "onkeydown":
+      case "onkeyup":
+      case "onload":
+      case "onlosecapture":
+      case "onpropertychange":
+      case "onreadystatechange":
+      case "onrowsdelete":
+      case "onrowenter":
+      case "onrowexit":
+      case "onrowsinserted":
+      case "onstart":
+      case "onscroll":
+      case "onbeforeeditfocus":
+      case "onactivate":
+      case "onbeforedeactivate":
+      case "ondeactivate":
+      case "type":
+      case "codebase":
+      case "id":
+        ret.objAttrs[args[i]] = args[i+1];
+        break;
+      case "width":
+      case "height":
+      case "align":
+      case "vspace": 
+      case "hspace":
+      case "class":
+      case "title":
+      case "accesskey":
+      case "name":
+      case "tabindex":
+        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
+        break;
+      default:
+        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
+    }
+  }
+  ret.objAttrs["classid"] = classid;
+  if (mimeType) ret.embedAttrs["type"] = mimeType;
+  return ret;
+}
+
+
diff --git a/demos/address-book/protected/pages/flex/bin/flex_address_book-debug.html b/demos/address-book/protected/pages/flex/bin/flex_address_book-debug.html
new file mode 100644
index 00000000..6da5de3b
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/bin/flex_address_book-debug.html
@@ -0,0 +1,107 @@
+<!-- saved from url=(0014)about:internet -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title></title>
+<script src="AC_OETags.js" language="javascript"></script>
+<style>
+body { margin: 0px; overflow:hidden }
+</style>
+<script language="JavaScript" type="text/javascript">
+<!--
+// -----------------------------------------------------------------------------
+// Globals
+// Major version of Flash required
+var requiredMajorVersion = 9;
+// Minor version of Flash required
+var requiredMinorVersion = 0;
+// Minor version of Flash required
+var requiredRevision = 0;
+// -----------------------------------------------------------------------------
+// -->
+</script>
+</head>
+
+<body scroll="no">
+<script language="JavaScript" type="text/javascript" src="history.js"></script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
+var hasProductInstall = DetectFlashVer(6, 0, 65);
+
+// Version check based upon the values defined in globals
+var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
+
+
+// Check to see if a player with Flash Product Install is available and the version does not meet the requirements for playback
+if ( hasProductInstall && !hasRequestedVersion ) {
+	// MMdoctitle is the stored document.title value used by the installation process to close the window that started the process
+	// This is necessary in order to close browser windows that are still utilizing the older version of the player after installation has completed
+	// DO NOT MODIFY THE FOLLOWING FOUR LINES
+	// Location visited after installation is complete if installation is required
+	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
+	var MMredirectURL = window.location;
+    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+    var MMdoctitle = document.title;
+
+	AC_FL_RunContent(
+		"src", "playerProductInstall",
+		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
+		"width", "100%",
+		"height", "100%",
+		"align", "middle",
+		"id", "flex_address_book",
+		"quality", "high",
+		"bgcolor", "#ffffff",
+		"name", "flex_address_book",
+		"allowScriptAccess","sameDomain",
+		"type", "application/x-shockwave-flash",
+		"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+} else if (hasRequestedVersion) {
+	// if we've detected an acceptable version
+	// embed the Flash Content SWF when all tests are passed
+	AC_FL_RunContent(
+			"src", "flex_address_book-debug",
+			"width", "100%",
+			"height", "100%",
+			"align", "middle",
+			"id", "flex_address_book",
+			"quality", "high",
+			"bgcolor", "#ffffff",
+			"name", "flex_address_book",
+			"flashvars",'historyUrl=history.htm%3F&lconid=' + lc_id + '',
+			"allowScriptAccess","sameDomain",
+			"type", "application/x-shockwave-flash",
+			"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+  } else {  // flash is too old or we can't detect the plugin
+    var alternateContent = 'Alternate HTML content should be placed here. '
+  	+ 'This content requires the Adobe Flash Player. '
+   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
+    document.write(alternateContent);  // insert non-flash content
+  }
+// -->
+</script>
+<noscript>
+  	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+			id="flex_address_book" width="100%" height="100%"
+			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
+			<param name="movie" value="flex_address_book-debug.swf" />
+			<param name="quality" value="high" />
+			<param name="bgcolor" value="#ffffff" />
+			<param name="allowScriptAccess" value="sameDomain" />
+			<embed src="flex_address_book-debug.swf" quality="high" bgcolor="#ffffff"
+				width="100%" height="100%" name="flex_address_book" align="middle"
+				play="true"
+				loop="false"
+				quality="high"
+				allowScriptAccess="sameDomain"
+				type="application/x-shockwave-flash"
+				pluginspage="http://www.adobe.com/go/getflashplayer">
+			</embed>
+	</object>
+</noscript>
+<iframe name="_history" src="history.htm" frameborder="0" scrolling="no" width="22" height="0"></iframe>
+</body>
+</html>
diff --git a/demos/address-book/protected/pages/flex/bin/flex_address_book.html b/demos/address-book/protected/pages/flex/bin/flex_address_book.html
new file mode 100644
index 00000000..7802a896
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/bin/flex_address_book.html
@@ -0,0 +1,107 @@
+<!-- saved from url=(0014)about:internet -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title></title>
+<script src="AC_OETags.js" language="javascript"></script>
+<style>
+body { margin: 0px; overflow:hidden }
+</style>
+<script language="JavaScript" type="text/javascript">
+<!--
+// -----------------------------------------------------------------------------
+// Globals
+// Major version of Flash required
+var requiredMajorVersion = 9;
+// Minor version of Flash required
+var requiredMinorVersion = 0;
+// Minor version of Flash required
+var requiredRevision = 0;
+// -----------------------------------------------------------------------------
+// -->
+</script>
+</head>
+
+<body scroll="no">
+<script language="JavaScript" type="text/javascript" src="history.js"></script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
+var hasProductInstall = DetectFlashVer(6, 0, 65);
+
+// Version check based upon the values defined in globals
+var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
+
+
+// Check to see if a player with Flash Product Install is available and the version does not meet the requirements for playback
+if ( hasProductInstall && !hasRequestedVersion ) {
+	// MMdoctitle is the stored document.title value used by the installation process to close the window that started the process
+	// This is necessary in order to close browser windows that are still utilizing the older version of the player after installation has completed
+	// DO NOT MODIFY THE FOLLOWING FOUR LINES
+	// Location visited after installation is complete if installation is required
+	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
+	var MMredirectURL = window.location;
+    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+    var MMdoctitle = document.title;
+
+	AC_FL_RunContent(
+		"src", "playerProductInstall",
+		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
+		"width", "100%",
+		"height", "100%",
+		"align", "middle",
+		"id", "flex_address_book",
+		"quality", "high",
+		"bgcolor", "#ffffff",
+		"name", "flex_address_book",
+		"allowScriptAccess","sameDomain",
+		"type", "application/x-shockwave-flash",
+		"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+} else if (hasRequestedVersion) {
+	// if we've detected an acceptable version
+	// embed the Flash Content SWF when all tests are passed
+	AC_FL_RunContent(
+			"src", "flex_address_book",
+			"width", "100%",
+			"height", "100%",
+			"align", "middle",
+			"id", "flex_address_book",
+			"quality", "high",
+			"bgcolor", "#ffffff",
+			"name", "flex_address_book",
+			"flashvars",'historyUrl=history.htm%3F&lconid=' + lc_id + '',
+			"allowScriptAccess","sameDomain",
+			"type", "application/x-shockwave-flash",
+			"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+  } else {  // flash is too old or we can't detect the plugin
+    var alternateContent = 'Alternate HTML content should be placed here. '
+  	+ 'This content requires the Adobe Flash Player. '
+   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
+    document.write(alternateContent);  // insert non-flash content
+  }
+// -->
+</script>
+<noscript>
+  	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+			id="flex_address_book" width="100%" height="100%"
+			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
+			<param name="movie" value="flex_address_book.swf" />
+			<param name="quality" value="high" />
+			<param name="bgcolor" value="#ffffff" />
+			<param name="allowScriptAccess" value="sameDomain" />
+			<embed src="flex_address_book.swf" quality="high" bgcolor="#ffffff"
+				width="100%" height="100%" name="flex_address_book" align="middle"
+				play="true"
+				loop="false"
+				quality="high"
+				allowScriptAccess="sameDomain"
+				type="application/x-shockwave-flash"
+				pluginspage="http://www.adobe.com/go/getflashplayer">
+			</embed>
+	</object>
+</noscript>
+<iframe name="_history" src="history.htm" frameborder="0" scrolling="no" width="22" height="0"></iframe>
+</body>
+</html>
diff --git a/demos/address-book/protected/pages/flex/bin/flex_address_book.swf b/demos/address-book/protected/pages/flex/bin/flex_address_book.swf
new file mode 100644
index 00000000..9c3e63ef
Binary files /dev/null and b/demos/address-book/protected/pages/flex/bin/flex_address_book.swf differ
diff --git a/demos/address-book/protected/pages/flex/bin/history.htm b/demos/address-book/protected/pages/flex/bin/history.htm
new file mode 100644
index 00000000..69e8c722
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/bin/history.htm
@@ -0,0 +1,21 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<script type='text/javascript' language='JavaScript1.2' charset='utf-8'>
+var v = new top.Vars(top.getSearch(window));
+var fv = v.toString('$_');
+</script>
+</head>
+<body >
+<script type='text/javascript' language='JavaScript1.2' charset='utf-8'>
+document.writeln('<object id=\"utility\" name=\" \" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"" + activexDownloadURL + "#version=7,0,14,0\" width=\"100\" height=\"50\">');
+document.writeln('<param name=\"movie\" value=\"history.swf\" />');
+document.writeln('<param name=\"FlashVars\" value=\"'+fv+'&$_lconid='+top.lc_id+'\"/>');
+document.writeln('<param name=\"quality\" value=\"high\" />');
+document.writeln('<param name=\"bgcolor\" value=\"#FFFFFF\" />');
+document.writeln('<param name=\"profile\" value=\"false\" />');
+document.writeln('<embed id=\"utilityEmbed\" name=\"history.swf\" src=\"history.swf\" type=\"application/x-shockwave-flash\" flashvars=\"'+fv+'&$_lconid='+top.lc_id+'\" profile=\"false\" quality=\"high\" bgcolor=\"#FFFFFF\" width=\"100\" height=\"50\" align=\"\" pluginspage=\"" + pluginDownloadURL + "\"></embed>');
+document.writeln('</object>');
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/flex/bin/history.js b/demos/address-book/protected/pages/flex/bin/history.js
new file mode 100644
index 00000000..b0537ef1
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/bin/history.js
@@ -0,0 +1,48 @@
+// $Revision: 1.49 $
+// Vars
+Vars = function(qStr) {
+	this.numVars = 0;
+	if(qStr != null) {
+		var nameValue, name;
+		var pairs = qStr.split('&');
+		var pairLen = pairs.length;
+		for(var i = 0; i < pairLen; i++) {
+			var pair = pairs[i];
+			if( (pair.indexOf('=')!= -1) && (pair.length > 3) ) {
+				var nameValue = pair.split('=');
+				var name = nameValue[0];
+				var value = nameValue[1];
+				if(this[name] == null && name.length > 0 && value.length > 0) { 
+					this[name] = value;
+					this.numVars++;
+				}
+			}
+		} 
+	}
+}
+Vars.prototype.toString = function(pre) {
+	var result = '';
+	if(pre == null) { pre = ''; }
+	for(var i in this) {
+		if(this[i] != null && typeof(this[i]) != 'object' && typeof(this[i]) != 'function' && i != 'numVars') {
+			result += pre + i + '=' + this[i] + '&';
+		}
+	}
+	if(result.length > 0) result = result.substr(0, result.length-1);
+	return result;
+}
+function getSearch(wRef) {
+	var searchStr = '';
+	if(wRef.location.search.length > 1) {
+		searchStr = new String(wRef.location.search);
+		searchStr = searchStr.substring(1, searchStr.length);
+	}
+	return searchStr;
+}
+var lc_id = Math.floor(Math.random() * 100000).toString(16);
+if (this != top)
+{
+	top.Vars = Vars;
+	top.getSearch = getSearch;
+	top.lc_id = lc_id;
+}
diff --git a/demos/address-book/protected/pages/flex/bin/history.swf b/demos/address-book/protected/pages/flex/bin/history.swf
new file mode 100644
index 00000000..e6e03ecb
Binary files /dev/null and b/demos/address-book/protected/pages/flex/bin/history.swf differ
diff --git a/demos/address-book/protected/pages/flex/bin/playerProductInstall.swf b/demos/address-book/protected/pages/flex/bin/playerProductInstall.swf
new file mode 100644
index 00000000..bdc34378
Binary files /dev/null and b/demos/address-book/protected/pages/flex/bin/playerProductInstall.swf differ
diff --git a/demos/address-book/protected/pages/flex/flex_address_book.mxml b/demos/address-book/protected/pages/flex/flex_address_book.mxml
new file mode 100644
index 00000000..d6db809a
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/flex_address_book.mxml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * @author Wei Zhuo <weizho[at]gmail[dot]com>
+ * @version $Id$
+ * @since 3.1
+-->
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
+	backgroundColor="white"
+	backgroundGradientAlphas="0"
+	backgroundGradientColors="0" 
+	layout="vertical" creationComplete="initApp()">
+	<mx:states>
+		<mx:State name="details">
+			<mx:AddChild relativeTo="{hbox1}" position="lastChild">
+				<mx:Form>
+					<mx:FormItem label="Username:">
+						<mx:TextInput id="_username" text="{list1.selectedItem.username}"/>
+					</mx:FormItem>
+					<mx:FormItem label="Phone:">
+						<mx:TextInput id="_phone" text="{list1.selectedItem.phone}" />
+						<mx:Button id="saveButton" label="Save" click="doSave()" />
+					</mx:FormItem>
+				</mx:Form>
+			</mx:AddChild>
+		</mx:State>
+	</mx:states>
+	
+	<mx:PhoneNumberValidator id="val1" source="{_phone}" property="text" />
+	<mx:StringValidator id="val2" source="{_username}" property="text"
+		minLength="3" maxLength="20" />
+
+	<mx:WebService id="addrSrv" fault="dataError(event)">
+		<mx:operation name="saveAddress" result="addrSrv.getAllAddress()" />
+		<mx:operation name="deleteAddress" result="addrSrv.getAllAddress()" />
+	</mx:WebService>
+
+	<mx:Script>
+		<![CDATA[
+			import mx.validators.Validator;
+			import mx.utils.ArrayUtil;
+			import mx.collections.ArrayCollection;
+			import mx.controls.Alert;
+			import mx.rpc.events.ResultEvent;
+			import mx.rpc.events.FaultEvent;
+			
+			[Bindable]
+			private var addressList:ArrayCollection;			
+						
+			private function initApp():void
+			{
+				addrSrv.loadWSDL(getAddressBookWsdl());
+				addrSrv.getAllAddress();
+			}
+			
+			private function getAddressBookWsdl():String
+			{
+				var appUrl:Object=application.parameters.wsdl;
+				if(appUrl!=null)  // running in PRADO page
+					return appUrl.toString();
+				else  // running in static html for debugging.
+					return "http://127.0.0.1/prado-trunk/demos/address-book/index.php?soap=address-book.wsdl";				
+			}
+			
+			private function dataError(event:FaultEvent):void
+			{
+				Alert.show(event.fault.faultString,"Data Communication Error");
+			}
+
+			private function doSave():void
+			{
+				if(Validator.validateAll([val1, val2]).length == 0)
+				{
+					var data:Object = new Object;
+					data.id = list1.selectedItem != null ? list1.selectedItem.id : -1;
+					data.username = _username.text;
+					data.phone = _phone.text;
+					addrSrv.saveAddress(data);
+					currentState='';
+				}
+			}
+			
+			private function doDelete():void
+			{
+				addrSrv.deleteAddress(list1.selectedItem.id);
+				currentState='';
+			}
+		]]>
+	</mx:Script>
+
+	
+	<mx:Panel layout="vertical" title="Prado Address Book" id="panel1" resizeEffect="Resize">
+		<mx:HBox id="hbox1">
+			<mx:DataGrid id="list1" dataProvider="{addrSrv.getAllAddress.lastResult}" width="350" click="currentState='details'">
+				<mx:columns>
+					<mx:DataGridColumn headerText="Name" width="150" dataField="username"/>
+					<mx:DataGridColumn headerText="Phone" dataField="phone"/>
+				</mx:columns>
+			</mx:DataGrid>
+		</mx:HBox>
+		<mx:ControlBar id="controlbar1">
+			<mx:Button label="New" click="list1.selectedIndex=-1; currentState='details'"/>
+			<mx:Button label="Delete" enabled="{list1.selectedIndex >= 0}" click="doDelete()"/>
+		</mx:ControlBar>
+	</mx:Panel>
+	
+</mx:Application>
diff --git a/demos/address-book/protected/pages/flex/html-template/AC_OETags.js b/demos/address-book/protected/pages/flex/html-template/AC_OETags.js
new file mode 100644
index 00000000..157eb218
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/html-template/AC_OETags.js
@@ -0,0 +1,269 @@
+// Flash Player Version Detection - Rev 1.5
+// Detect Client Browser type
+// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
+var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
+var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
+var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
+
+function ControlVersion()
+{
+	var version;
+	var axo;
+	var e;
+
+	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
+
+	try {
+		// version will be set for 7.X or greater players
+		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
+		version = axo.GetVariable("$version");
+	} catch (e) {
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 6.X players only
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
+			
+			// installed player is some revision of 6.0
+			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
+			// so we have to be careful. 
+			
+			// default to the first public version
+			version = "WIN 6,0,21,0";
+
+			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
+			axo.AllowScriptAccess = "always";
+
+			// safe to call for 6.0r47 or greater
+			version = axo.GetVariable("$version");
+
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 4.X or 5.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = axo.GetVariable("$version");
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 3.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
+			version = "WIN 3,0,18,0";
+		} catch (e) {
+		}
+	}
+
+	if (!version)
+	{
+		try {
+			// version will be set for 2.X player
+			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+			version = "WIN 2,0,0,11";
+		} catch (e) {
+			version = -1;
+		}
+	}
+	
+	return version;
+}
+
+// JavaScript helper required to detect Flash Player PlugIn version information
+function GetSwfVer(){
+	// NS/Opera version >= 3 check for Flash plugin in plugin array
+	var flashVer = -1;
+	
+	if (navigator.plugins != null && navigator.plugins.length > 0) {
+		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
+			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
+			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;			
+			var descArray = flashDescription.split(" ");
+			var tempArrayMajor = descArray[2].split(".");
+			var versionMajor = tempArrayMajor[0];
+			var versionMinor = tempArrayMajor[1];
+			if ( descArray[3] != "" ) {
+				tempArrayMinor = descArray[3].split("r");
+			} else {
+				tempArrayMinor = descArray[4].split("r");
+			}
+			var versionRevision = tempArrayMinor[1] > 0 ? tempArrayMinor[1] : 0;
+			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
+		}
+	}
+	// MSN/WebTV 2.6 supports Flash 4
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
+	// WebTV 2.5 supports Flash 3
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
+	// older WebTV supports Flash 2
+	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
+	else if ( isIE && isWin && !isOpera ) {
+		flashVer = ControlVersion();
+	}	
+	return flashVer;
+}
+
+// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
+function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
+{
+	versionStr = GetSwfVer();
+	if (versionStr == -1 ) {
+		return false;
+	} else if (versionStr != 0) {
+		if(isIE && isWin && !isOpera) {
+			// Given "WIN 2,0,0,11"
+			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
+			tempString        = tempArray[1];			// "2,0,0,11"
+			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
+		} else {
+			versionArray      = versionStr.split(".");
+		}
+		var versionMajor      = versionArray[0];
+		var versionMinor      = versionArray[1];
+		var versionRevision   = versionArray[2];
+
+        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
+		if (versionMajor > parseFloat(reqMajorVer)) {
+			return true;
+		} else if (versionMajor == parseFloat(reqMajorVer)) {
+			if (versionMinor > parseFloat(reqMinorVer))
+				return true;
+			else if (versionMinor == parseFloat(reqMinorVer)) {
+				if (versionRevision >= parseFloat(reqRevision))
+					return true;
+			}
+		}
+		return false;
+	}
+}
+
+function AC_AddExtension(src, ext)
+{
+  if (src.indexOf('?') != -1)
+    return src.replace(/\?/, ext+'?'); 
+  else
+    return src + ext;
+}
+
+function AC_Generateobj(objAttrs, params, embedAttrs) 
+{ 
+    var str = '';
+    if (isIE && isWin && !isOpera)
+    {
+  		str += '<object ';
+  		for (var i in objAttrs)
+  			str += i + '="' + objAttrs[i] + '" ';
+  		for (var i in params)
+  			str += '><param name="' + i + '" value="' + params[i] + '" /> ';
+  		str += '></object>';
+    } else {
+  		str += '<embed ';
+  		for (var i in embedAttrs)
+  			str += i + '="' + embedAttrs[i] + '" ';
+  		str += '> </embed>';
+    }
+
+    document.write(str);
+}
+
+function AC_FL_RunContent(){
+  var ret = 
+    AC_GetArgs
+    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
+     , "application/x-shockwave-flash"
+    );
+  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
+}
+
+function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
+  var ret = new Object();
+  ret.embedAttrs = new Object();
+  ret.params = new Object();
+  ret.objAttrs = new Object();
+  for (var i=0; i < args.length; i=i+2){
+    var currArg = args[i].toLowerCase();    
+
+    switch (currArg){	
+      case "classid":
+        break;
+      case "pluginspage":
+        ret.embedAttrs[args[i]] = args[i+1];
+        break;
+      case "src":
+      case "movie":	
+        args[i+1] = AC_AddExtension(args[i+1], ext);
+        ret.embedAttrs["src"] = args[i+1];
+        ret.params[srcParamName] = args[i+1];
+        break;
+      case "onafterupdate":
+      case "onbeforeupdate":
+      case "onblur":
+      case "oncellchange":
+      case "onclick":
+      case "ondblClick":
+      case "ondrag":
+      case "ondragend":
+      case "ondragenter":
+      case "ondragleave":
+      case "ondragover":
+      case "ondrop":
+      case "onfinish":
+      case "onfocus":
+      case "onhelp":
+      case "onmousedown":
+      case "onmouseup":
+      case "onmouseover":
+      case "onmousemove":
+      case "onmouseout":
+      case "onkeypress":
+      case "onkeydown":
+      case "onkeyup":
+      case "onload":
+      case "onlosecapture":
+      case "onpropertychange":
+      case "onreadystatechange":
+      case "onrowsdelete":
+      case "onrowenter":
+      case "onrowexit":
+      case "onrowsinserted":
+      case "onstart":
+      case "onscroll":
+      case "onbeforeeditfocus":
+      case "onactivate":
+      case "onbeforedeactivate":
+      case "ondeactivate":
+      case "type":
+      case "codebase":
+      case "id":
+        ret.objAttrs[args[i]] = args[i+1];
+        break;
+      case "width":
+      case "height":
+      case "align":
+      case "vspace": 
+      case "hspace":
+      case "class":
+      case "title":
+      case "accesskey":
+      case "name":
+      case "tabindex":
+        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
+        break;
+      default:
+        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
+    }
+  }
+  ret.objAttrs["classid"] = classid;
+  if (mimeType) ret.embedAttrs["type"] = mimeType;
+  return ret;
+}
+
+
diff --git a/demos/address-book/protected/pages/flex/html-template/history.htm b/demos/address-book/protected/pages/flex/html-template/history.htm
new file mode 100644
index 00000000..69e8c722
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/html-template/history.htm
@@ -0,0 +1,21 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<script type='text/javascript' language='JavaScript1.2' charset='utf-8'>
+var v = new top.Vars(top.getSearch(window));
+var fv = v.toString('$_');
+</script>
+</head>
+<body >
+<script type='text/javascript' language='JavaScript1.2' charset='utf-8'>
+document.writeln('<object id=\"utility\" name=\" \" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"" + activexDownloadURL + "#version=7,0,14,0\" width=\"100\" height=\"50\">');
+document.writeln('<param name=\"movie\" value=\"history.swf\" />');
+document.writeln('<param name=\"FlashVars\" value=\"'+fv+'&$_lconid='+top.lc_id+'\"/>');
+document.writeln('<param name=\"quality\" value=\"high\" />');
+document.writeln('<param name=\"bgcolor\" value=\"#FFFFFF\" />');
+document.writeln('<param name=\"profile\" value=\"false\" />');
+document.writeln('<embed id=\"utilityEmbed\" name=\"history.swf\" src=\"history.swf\" type=\"application/x-shockwave-flash\" flashvars=\"'+fv+'&$_lconid='+top.lc_id+'\" profile=\"false\" quality=\"high\" bgcolor=\"#FFFFFF\" width=\"100\" height=\"50\" align=\"\" pluginspage=\"" + pluginDownloadURL + "\"></embed>');
+document.writeln('</object>');
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/demos/address-book/protected/pages/flex/html-template/history.js b/demos/address-book/protected/pages/flex/html-template/history.js
new file mode 100644
index 00000000..b0537ef1
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/html-template/history.js
@@ -0,0 +1,48 @@
+// $Revision: 1.49 $
+// Vars
+Vars = function(qStr) {
+	this.numVars = 0;
+	if(qStr != null) {
+		var nameValue, name;
+		var pairs = qStr.split('&');
+		var pairLen = pairs.length;
+		for(var i = 0; i < pairLen; i++) {
+			var pair = pairs[i];
+			if( (pair.indexOf('=')!= -1) && (pair.length > 3) ) {
+				var nameValue = pair.split('=');
+				var name = nameValue[0];
+				var value = nameValue[1];
+				if(this[name] == null && name.length > 0 && value.length > 0) { 
+					this[name] = value;
+					this.numVars++;
+				}
+			}
+		} 
+	}
+}
+Vars.prototype.toString = function(pre) {
+	var result = '';
+	if(pre == null) { pre = ''; }
+	for(var i in this) {
+		if(this[i] != null && typeof(this[i]) != 'object' && typeof(this[i]) != 'function' && i != 'numVars') {
+			result += pre + i + '=' + this[i] + '&';
+		}
+	}
+	if(result.length > 0) result = result.substr(0, result.length-1);
+	return result;
+}
+function getSearch(wRef) {
+	var searchStr = '';
+	if(wRef.location.search.length > 1) {
+		searchStr = new String(wRef.location.search);
+		searchStr = searchStr.substring(1, searchStr.length);
+	}
+	return searchStr;
+}
+var lc_id = Math.floor(Math.random() * 100000).toString(16);
+if (this != top)
+{
+	top.Vars = Vars;
+	top.getSearch = getSearch;
+	top.lc_id = lc_id;
+}
diff --git a/demos/address-book/protected/pages/flex/html-template/history.swf b/demos/address-book/protected/pages/flex/html-template/history.swf
new file mode 100644
index 00000000..e6e03ecb
Binary files /dev/null and b/demos/address-book/protected/pages/flex/html-template/history.swf differ
diff --git a/demos/address-book/protected/pages/flex/html-template/index.template.html b/demos/address-book/protected/pages/flex/html-template/index.template.html
new file mode 100644
index 00000000..4aa4ffbc
--- /dev/null
+++ b/demos/address-book/protected/pages/flex/html-template/index.template.html
@@ -0,0 +1,107 @@
+<!-- saved from url=(0014)about:internet -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>${title}</title>
+<script src="AC_OETags.js" language="javascript"></script>
+<style>
+body { margin: 0px; overflow:hidden }
+</style>
+<script language="JavaScript" type="text/javascript">
+<!--
+// -----------------------------------------------------------------------------
+// Globals
+// Major version of Flash required
+var requiredMajorVersion = ${version_major};
+// Minor version of Flash required
+var requiredMinorVersion = ${version_minor};
+// Minor version of Flash required
+var requiredRevision = ${version_revision};
+// -----------------------------------------------------------------------------
+// -->
+</script>
+</head>
+
+<body scroll="no">
+<script language="JavaScript" type="text/javascript" src="history.js"></script>
+<script language="JavaScript" type="text/javascript">
+<!--
+// Version check for the Flash Player that has the ability to start Player Product Install (6.0r65)
+var hasProductInstall = DetectFlashVer(6, 0, 65);
+
+// Version check based upon the values defined in globals
+var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
+
+
+// Check to see if a player with Flash Product Install is available and the version does not meet the requirements for playback
+if ( hasProductInstall && !hasRequestedVersion ) {
+	// MMdoctitle is the stored document.title value used by the installation process to close the window that started the process
+	// This is necessary in order to close browser windows that are still utilizing the older version of the player after installation has completed
+	// DO NOT MODIFY THE FOLLOWING FOUR LINES
+	// Location visited after installation is complete if installation is required
+	var MMPlayerType = (isIE == true) ? "ActiveX" : "PlugIn";
+	var MMredirectURL = window.location;
+    document.title = document.title.slice(0, 47) + " - Flash Player Installation";
+    var MMdoctitle = document.title;
+
+	AC_FL_RunContent(
+		"src", "playerProductInstall",
+		"FlashVars", "MMredirectURL="+MMredirectURL+'&MMplayerType='+MMPlayerType+'&MMdoctitle='+MMdoctitle+"",
+		"width", "${width}",
+		"height", "${height}",
+		"align", "middle",
+		"id", "${application}",
+		"quality", "high",
+		"bgcolor", "${bgcolor}",
+		"name", "${application}",
+		"allowScriptAccess","sameDomain",
+		"type", "application/x-shockwave-flash",
+		"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+} else if (hasRequestedVersion) {
+	// if we've detected an acceptable version
+	// embed the Flash Content SWF when all tests are passed
+	AC_FL_RunContent(
+			"src", "${swf}",
+			"width", "${width}",
+			"height", "${height}",
+			"align", "middle",
+			"id", "${application}",
+			"quality", "high",
+			"bgcolor", "${bgcolor}",
+			"name", "${application}",
+			"flashvars",'historyUrl=history.htm%3F&lconid=' + lc_id + '',
+			"allowScriptAccess","sameDomain",
+			"type", "application/x-shockwave-flash",
+			"pluginspage", "http://www.adobe.com/go/getflashplayer"
+	);
+  } else {  // flash is too old or we can't detect the plugin
+    var alternateContent = 'Alternate HTML content should be placed here. '
+  	+ 'This content requires the Adobe Flash Player. '
+   	+ '<a href=http://www.adobe.com/go/getflash/>Get Flash</a>';
+    document.write(alternateContent);  // insert non-flash content
+  }
+// -->
+</script>
+<noscript>
+  	<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+			id="${application}" width="${width}" height="${height}"
+			codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
+			<param name="movie" value="${swf}.swf" />
+			<param name="quality" value="high" />
+			<param name="bgcolor" value="${bgcolor}" />
+			<param name="allowScriptAccess" value="sameDomain" />
+			<embed src="${swf}.swf" quality="high" bgcolor="${bgcolor}"
+				width="${width}" height="${height}" name="${application}" align="middle"
+				play="true"
+				loop="false"
+				quality="high"
+				allowScriptAccess="sameDomain"
+				type="application/x-shockwave-flash"
+				pluginspage="http://www.adobe.com/go/getflashplayer">
+			</embed>
+	</object>
+</noscript>
+<iframe name="_history" src="history.htm" frameborder="0" scrolling="no" width="22" height="0"></iframe>
+</body>
+</html>
diff --git a/demos/address-book/protected/pages/flex/html-template/playerProductInstall.swf b/demos/address-book/protected/pages/flex/html-template/playerProductInstall.swf
new file mode 100644
index 00000000..bdc34378
Binary files /dev/null and b/demos/address-book/protected/pages/flex/html-template/playerProductInstall.swf differ
diff --git a/demos/address-book/protected/pages/sqlite.db b/demos/address-book/protected/pages/sqlite.db
new file mode 100644
index 00000000..997be3ed
Binary files /dev/null and b/demos/address-book/protected/pages/sqlite.db differ
-- 
cgit v1.2.3