summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxue <>2006-04-30 12:51:23 +0000
committerxue <>2006-04-30 12:51:23 +0000
commitddfafaac2c1f18aca0fda3b4157acd935b9ac9a2 (patch)
treed131537413fa80aadf44feb8607eca6584e539f7
parent10b65d6d03ee0afc1ec1a50f320af42a79f5492b (diff)
merge from 3.0 branch till 995.
-rw-r--r--HISTORY4
-rw-r--r--UPGRADE6
-rw-r--r--build.xml35
-rw-r--r--buildscripts/jsbuilder/build.php14
-rw-r--r--buildscripts/phing/tasks/BuildPradoPEARPackageTask.php10
-rw-r--r--demos/quickstart/protected/pages/Configurations/Templates1.page7
-rw-r--r--framework/3rdParty/readme.html7
-rw-r--r--framework/Exceptions/TErrorHandler.php6
-rw-r--r--framework/I18N/core/TCache_Lite.php91
-rw-r--r--framework/I18N/core/util.php13
-rw-r--r--framework/Web/Javascripts/js/ajax.js706
-rw-r--r--framework/Web/Javascripts/js/colorpicker.js706
-rw-r--r--framework/Web/Javascripts/js/datepicker.js635
-rw-r--r--framework/Web/Javascripts/js/effects.js921
-rw-r--r--framework/Web/Javascripts/js/logger.js693
-rw-r--r--framework/Web/Javascripts/js/prado.js2584
-rw-r--r--framework/Web/Javascripts/js/rico.js1161
-rw-r--r--framework/Web/Javascripts/js/validator.js877
-rw-r--r--framework/Web/THttpResponse.php10
-rw-r--r--framework/Web/UI/TTemplateManager.php22
20 files changed, 1437 insertions, 7071 deletions
diff --git a/HISTORY b/HISTORY
index 4c9e96ee..b240e13e 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2,7 +2,6 @@ Version 3.1.0 To be released
============================
NEW: TOutputCache (Qiang)
NEW: TQueue (Qiang)
-NEW: TPageStateFormatter (Qiang)
NEW: TSessionPageStatePersister (Qiang)
NEW: SQLMap (Wei)
@@ -25,6 +24,7 @@ ENH: TButtonColumn can now be a column of image buttons (Qiang)
ENH: TLiteral will display body content if Text is empty (Qiang)
ENH: Format string in classes extending TDataGridColumn can now evaluate an expression (Qiang)
ENH: Format string in classes extending TListControl can now evaluate an expression (Qiang)
+ENH: Added THttpResponse::reload() (Qiang)
ENH: Custom visual effects can be added to client-side validators. (Wei)
ENH: TJavascript::encode() allows raw javascript code when string begins with "javascript:" (Wei)
ENH: Update TinyMCE to 2.0.5.1
@@ -33,6 +33,8 @@ CHG: Updated the javascript Prototype library, a few utilties functions REMOVED,
CHG: Build javascript without compression, only comments are removed. (Wei)
CHG: TDatePicker's date can be set using Date property, it value must be in same format as DateFormat, TimeStamp must be set as integer (wei)
CHG: TSimpleDateFormatter::parse() now return an integer or null on parse error (Wei)
+CHG: TControl::createControls() is changed to public. (Qiang)
+CHG: Template comment tag is changed from <! ... !> to <!-- ... --!> (Qiang)
NEW: TListControlValidator (Wei)
NEW: TClientScript (Wei)
diff --git a/UPGRADE b/UPGRADE
index dc6da5ac..edff5ca0 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -16,9 +16,9 @@ for both A and B.
Upgrading from v3.0.0 RC2
-------------------------
-There should be no PHP compatibility issues. Remember to clean up 'assets'
-directory of your PRADO application as Javascript libraries were updated
-and client-side validators rewritten.
+- Template comment tag is changed from <! ... !> to <!-- ... --!>
+- Remember to clean up 'assets' directory of your PRADO application
+ as Javascript libraries were updated and client-side validators rewritten.
Upgrading from v3.0.0 RC1
diff --git a/build.xml b/build.xml
index ef0dce67..9f2f52c2 100644
--- a/build.xml
+++ b/build.xml
@@ -20,7 +20,7 @@
<property name="doc.dir" value="docs"/>
<property name="build.base.dir" value="build"/>
<property name="build.src.dir" value="${build.base.dir}/standard/${pkgname}"/>
- <property name="build.pear.dir" value="${build.base.dir}/pear/${pkgname.pear}"/>
+ <property name="build.pear.dir" value="${build.base.dir}/pear"/>
<property name="doc.build.dir" value="${build.base.dir}/docs/manual"/>
<property name="dist.base.dir" value="dist"/>
<property name="dist.zipfile" value="${dist.base.dir}/${pkgname}.zip"/>
@@ -97,7 +97,7 @@
<echo message="the future you can add this to build.properties or"/>
<echo message="enter it on the command line: "/>
<echo message=" "/>
- <echo message="-Dversion=3.0"/>
+ <echo message="-Dversion=3.0.0"/>
<echo message="====================================================="/>
<input propertyname="version" promptChar=":">PRADO version for package</input>
@@ -137,15 +137,6 @@
</phplint>
</target>
- <target name="prepare" description="Prepare directory layout for build">
- <phingcall target="clean"/>
- <mkdir dir="${build.base.dir}"/>
- <mkdir dir="${dist.base.dir}"/>
- <mkdir dir="${reports.unit.dir}"/>
- <mkdir dir="${reports.codecoverage.dir}"/>
- <mkdir dir="${doc.build.dir}"/>
- </target>
-
<target name="doc" description="Generate API documentation">
<delete dir="${doc.build.dir}"/>
<mkdir dir="${doc.build.dir}"/>
@@ -161,6 +152,8 @@
<target name="test" description="Run unit tests">
<echo>Preparing directory structure</echo>
+ <delete dir="${reports.dir}"/>
+ <mkdir dir="${reports.dir}"/>
<delete dir="${reports.unit.dir}"/>
<delete dir="${reports.codecoverage.dir}"/>
@@ -235,7 +228,7 @@
<delete dir="${build.pear.dir}"/>
<mkdir dir="${build.pear.dir}"/>
<copy todir="${build.pear.dir}">
- <fileset refid="src"/>
+ <fileset refid="framework"/>
<fileset dir="${build.base.dir}">
<include name="${prado.lite}"/>
</fileset>
@@ -243,20 +236,22 @@
<echo>Creating package.xml...</echo>
<pear-package dir="${build.pear.dir}" destFile="${build.base.dir}/pear/package.xml" version="${version}" state="${pear.state}" notes="${notes}">
- <fileset refid="src"/>
+ <fileset refid="framework"/>
<fileset dir="${build.base.dir}">
<include name="${prado.lite}"/>
</fileset>
</pear-package>
</target>
- <target name="build" depends="versioncheck,prepare,doc,quickstart,pradolite,build-standard-package,build-pear-package" description="Creating the main PRADO build"/>
+ <target name="build" depends="versioncheck,doc,quickstart,pradolite,build-standard-package" description="Creating the main PRADO build"/>
<target name="dist-pear" depends="build-pear-package" description="Create PRADO PEAR package">
<delete file="${dist.pearfile}"/>
<mkdir dir="${dist.base.dir}"/>
- <tar compression="gzip" destFile="${dist.pearfile}" basedir="${build.base.dir}/pear"/>
- <exec command="pear package-validate ${dist.pearfile}" dir="." passthru="true"/>
+ <!--<tar compression="gzip" destFile="${dist.pearfile}" basedir="${build.pear.dir}"/>-->
+ <exec command="pear package" dir="${build.pear.dir}" passthru="true"/>
+ <!--<exec command="pear package-validate prado3-${version}.tgz" dir="${build.pear.dir}" passthru="true"/>-->
+ <move file="${build.pear.dir}/prado3-${version}.tgz" tofile="${dist.pearfile}"/>
</target>
<target name="dist" depends="build" description="Create PRADO distributions">
@@ -288,5 +283,13 @@
<fileset refid="src"/>
</analyze>
</target>
+
+ <target name="install" description="Install PEAR package locally">
+ <exec command="sudo pear install ${dist.pearfile}" dir="." passthru="true"/>
+ </target>
+ <target name="uninstall" description="Uninstall PEAR package locally">
+ <exec command="sudo pear uninstall pear.pradosoft.com/prado3" dir="." passthru="true"/>
+ </target>
+
</project>
diff --git a/buildscripts/jsbuilder/build.php b/buildscripts/jsbuilder/build.php
index 7070f67f..80e6b3ee 100644
--- a/buildscripts/jsbuilder/build.php
+++ b/buildscripts/jsbuilder/build.php
@@ -40,13 +40,13 @@ define('DOC_OUTPUT_DIR', realpath(dirname(__FILE__).'/../../docs/Javascript'));
*/
define('BUILD_DOC', sprintf('perl "%s" --no-sources -d "%s" ', JS_DOC, DOC_OUTPUT_DIR).'%s');
+include_once(dirname(__FILE__).'/jsmin.php');
+
if(SOURCE_DIR===false || TARGET_DIR===false)
die('Unable to determine the build path.');
if(!is_writable(TARGET_DIR))
die('Unable to create files under '.TARGET_DIR.'.');
-include(dirname(__FILE__).'/jsmin.php');
-
/**
* list of js library files to be compressed and built
*/
@@ -82,7 +82,7 @@ $libraries = array(
// 'extra/behaviour.js',
'extended/date.js',
-
+
//prado core
'prado/prado.js',
'prado/form.js',
@@ -159,9 +159,9 @@ foreach($libraries as $libFile => $sourceFiles)
$sourceFile=SOURCE_DIR.'/'.$sourceFile;
if(!is_file($sourceFile))
echo "Source file not found: $sourceFile\n";
-
+
echo "...adding $sourceFile\n";
- $contents.=file_get_contents($sourceFile)."\n\n";
+ $contents.=file_get_contents($sourceFile)."\n\n";
}
$tempFile=$libFile.'.tmp';
file_put_contents($tempFile,$contents);
@@ -169,7 +169,7 @@ foreach($libraries as $libFile => $sourceFiles)
$jsMin -> minify();
unset($jsMin);
@unlink($tempFile);
- echo "Saving file {$libFile}\n";
+ echo "Saving file {$libFile}\n";
$builds++;
}
if(isset($argv[1]) && preg_match('/doc*/', $argv[1]))
@@ -183,7 +183,7 @@ if(isset($argv[1]) && preg_match('/doc*/', $argv[1]))
$command = sprintf(BUILD_DOC, $files);
system($command);
}
-else if($builds > 0)
+else if($builds > 0)
echo "\nJavascript build complete, {$builds} file(s) compressed.";
else
echo "No files to build.";
diff --git a/buildscripts/phing/tasks/BuildPradoPEARPackageTask.php b/buildscripts/phing/tasks/BuildPradoPEARPackageTask.php
index 212c6f9c..0e764146 100644
--- a/buildscripts/phing/tasks/BuildPradoPEARPackageTask.php
+++ b/buildscripts/phing/tasks/BuildPradoPEARPackageTask.php
@@ -44,13 +44,14 @@ class BuildPradoPEARPackageTask extends MatchingTask {
* @param PEAR_PackageFileManager2 $pkg
*/
private function setOptions($pkg) {
- $options['baseinstalldir'] = 'prado';
+ $options['baseinstalldir'] = 'prado3';
$options['packagedirectory'] = $this->dir->getAbsolutePath();
if(empty($this->filesets)) {
throw new BuildException("You must use a <fileset> tag to specify the files to include in the package.xml");
}
+ // Use PEAR_PackageFileManager_Fileset from phing as file list generator
$options['filelistgenerator'] = 'Fileset';
// Some Phing-specific options needed by our Fileset reader
@@ -67,6 +68,7 @@ class BuildPradoPEARPackageTask extends MatchingTask {
} else {
$this->log("Creating [default] package.xml file in base directory.", PROJECT_MSG_INFO);
}
+ $options['dir_roles'] = array('framework' => 'php');
$pkg->setOptions($options);
}
@@ -88,7 +90,7 @@ class BuildPradoPEARPackageTask extends MatchingTask {
$this->setOptions($package);
// the hard-coded stuff
- $package->setPackage('prado');
+ $package->setPackage('prado3');
$package->setSummary('PRADO is a component-based and event-driven framework for rapid Web programming in PHP 5.');
$package->setDescription('PRADO reconceptualizes Web application development in terms of components, events and properties instead of procedures, URLs and query parameters.
@@ -117,7 +119,9 @@ o Team Integration - PRADO enables separation of content and presentation. Compo
$package->setLicense('BSD', 'http://www.opensource.org/licenses/bsd-license.php');
// Add package maintainers
- $package->addMaintainer('lead', 'xue', 'Qiang Xue', 'qiang.xue@gmail.com');
+ $package->addMaintainer('lead', 'qxue', 'Qiang Xue', 'qiang.xue@gmail.com');
+ $package->addMaintainer('lead', 'jrags', 'Jason Ragsdale', 'jrags@jasrags.net');
+ $package->addMaintainer('lead', 'knut', 'Knut Urdalen', 'knut.urdalen@gmail.com');
// "core" dependencies
$package->setPhpDep('5.0.0');
diff --git a/demos/quickstart/protected/pages/Configurations/Templates1.page b/demos/quickstart/protected/pages/Configurations/Templates1.page
index 39b2d75f..483ef1d1 100644
--- a/demos/quickstart/protected/pages/Configurations/Templates1.page
+++ b/demos/quickstart/protected/pages/Configurations/Templates1.page
@@ -71,15 +71,18 @@ Template control tag is optional in a template. Each template can contain at mos
<h2>Comment Tags</h2>
<p>
Comment tags are used to put comments in the template or the ultimate rendering result. There are two types of comment tags. One is like that in HTML and will be displayed to the end-users. The other only appear in a template and will be stripped out when the template is instantiated and displayed to the end-users. The format of these two comment tags is as follows,
+</p>
<com:TTextHighlighter Language="prado" CssClass="source">
&lt;!--
Comments VISIBLE to end-users
--&gt;
-&lt;!
+&lt;!--
Comments INVISIBLE to end-users
-!&gt;
+--!&gt;
</com:TTextHighlighter>
+<p>
+Note, template comments (by &lt;!-- ... --!&gt;) cannot appear in a property value.
</p>
</com:TContent> \ No newline at end of file
diff --git a/framework/3rdParty/readme.html b/framework/3rdParty/readme.html
index ea5b05db..c81d263e 100644
--- a/framework/3rdParty/readme.html
+++ b/framework/3rdParty/readme.html
@@ -42,6 +42,13 @@ projects.
<td>System.Web.UI.WebControls.THtmlArea</td>
<td>TinyMCE is a powerful WYSIWYG editor control for web browsers such as MSIE or Mozilla that enables the user to edit HTML contents in a more user friendly way.</td>
</tr>
+<tr>
+ <td>N.A.</td>
+ <td>Tar.php</td>
+ <td><a href="http://www.php.net/license/3_0.txt">Version 3.0 of the PHP license</a></td>
+ <td>System.IO.TTarFileExtractor</td>
+ <td>TTarFileExtractor is based on Tar.php whose author is Vincent Blavet.</td>
+</tr>
</table>
</p>
</body>
diff --git a/framework/Exceptions/TErrorHandler.php b/framework/Exceptions/TErrorHandler.php
index 4b42491e..25f421e3 100644
--- a/framework/Exceptions/TErrorHandler.php
+++ b/framework/Exceptions/TErrorHandler.php
@@ -214,10 +214,10 @@ class TErrorHandler extends TModule
// if PHP exception, we want to show the 2nd stack level context
// because the 1st stack level is of little use (it's in error handler)
$trace=$exception->getTrace();
- if(isset($trace[0]) && isset($trace[0]['file']) && isset($trace[0]['line']))
+ if(isset($trace[1]) && isset($trace[1]['file']) && isset($trace[1]['line']))
{
- $fileName=$trace[0]['file'];
- $errorLine=$trace[0]['line'];
+ $fileName=$trace[1]['file'];
+ $errorLine=$trace[1]['line'];
}
}
$lines=file($fileName);
diff --git a/framework/I18N/core/TCache_Lite.php b/framework/I18N/core/TCache_Lite.php
index 078b0fe2..b42afc10 100644
--- a/framework/I18N/core/TCache_Lite.php
+++ b/framework/I18N/core/TCache_Lite.php
@@ -16,7 +16,7 @@
* @version $Revision: 1.3 $ $Date: 2005/10/09 10:24:12 $
* @package System.I18N.core
*/
-
+
/**
* Fast, light and safe Cache Class
*
@@ -40,6 +40,9 @@
* @package System.I18N.core
* @version $Id: TCache_Lite.php,v 1.3 2005/10/09 10:24:12 weizhuo Exp $
* @author Fabien MARTY <fab@php.net>
+* @copyright 1997-2005 The PHP Group
+* @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
+* @link http://pear.php.net/package/Cache_Lite
*/
class TCache_Lite
{
@@ -94,11 +97,11 @@ class TCache_Lite
protected $_file;
/**
- * Enable / disable write control (the cache is read just after writing
+ * Enable / disable write control (the cache is read just after writing
* to detect corrupt entries)
*
- * Enable write control will lightly slow the cache writing but not the
- * cache reading. Write control can detect some corrupt cache files but
+ * Enable write control will lightly slow the cache writing but not the
+ * cache reading. Write control can detect some corrupt cache files but
* maybe it's not a perfect control
*
* @var boolean $_writeControl
@@ -108,7 +111,7 @@ class TCache_Lite
/**
* Enable / disable read control
*
- * If enabled, a control key is embeded in cache file and this key is
+ * If enabled, a control key is embeded in cache file and this key is
* compared with the one calculated after the reading.
*
* @var boolean $_writeControl
@@ -120,7 +123,7 @@ class TCache_Lite
*
* Available values are :
* 'md5' for a md5 hash control (best but slowest)
- * 'crc32' for a crc32 hash control (lightly less safe but faster,
+ * 'crc32' for a crc32 hash control (lightly less safe but faster,
* better choice)
* 'strlen' for a length only test (fastest)
*
@@ -145,7 +148,7 @@ class TCache_Lite
/**
* Enable / Disable "Memory Caching"
*
- * NB : There is no lifetime for memory caching !
+ * NB : There is no lifetime for memory caching !
*
* @var boolean $_memoryCaching
*/
@@ -179,7 +182,7 @@ class TCache_Lite
* @var int $memoryCachingLimit
*/
protected $_memoryCachingLimit = 1000;
-
+
/**
* File Name protection
*
@@ -191,17 +194,17 @@ class TCache_Lite
* @var boolean $fileNameProtection
*/
protected $_fileNameProtection = true;
-
+
/**
* Enable / disable automatic serialization
*
* it can be used to save directly datas which aren't strings
- * (but it's slower)
+ * (but it's slower)
*
* @var boolean $_serialize
*/
protected $_automaticSerialization = false;
-
+
// --- Public methods ---
/**
@@ -228,17 +231,17 @@ class TCache_Lite
*/
function TCache_Lite($options = array(null))
{
- $availableOptions = array( 'automaticSerialization',
- 'fileNameProtection',
- 'memoryCaching',
- 'onlyMemoryCaching',
- 'memoryCachingLimit',
- 'cacheDir',
- 'caching',
- 'lifeTime',
- 'fileLocking',
- 'writeControl',
- 'readControl',
+ $availableOptions = array( 'automaticSerialization',
+ 'fileNameProtection',
+ 'memoryCaching',
+ 'onlyMemoryCaching',
+ 'memoryCachingLimit',
+ 'cacheDir',
+ 'caching',
+ 'lifeTime',
+ 'fileLocking',
+ 'writeControl',
+ 'readControl',
'readControlType');
foreach($options as $key => $value) {
if(in_array($key, $availableOptions)) {
@@ -248,7 +251,7 @@ class TCache_Lite
}
$this->_refreshTime = time() - $this->_lifeTime;
}
-
+
/**
* Test if a cache is available and (if yes) return it
*
@@ -299,11 +302,11 @@ class TCache_Lite
}
return false;
}
-
+
/**
* Save some data in a cache file
*
- * @param string $data data to put in cache (can be another type than strings
+ * @param string $data data to put in cache (can be another type than strings
* if automaticSerialization is on)
* @param string $id cache id
* @param string $group name of the cache group
@@ -351,7 +354,7 @@ class TCache_Lite
{
$this->_setFileName($id, $group);
if (!@unlink($this->_file)) {
- $this->raiseError('TCache_Lite : Unable to remove cache !', -3);
+ $this->raiseError('TCache_Lite : Unable to remove cache !', -3);
return false;
}
return true;
@@ -367,7 +370,7 @@ class TCache_Lite
* @return boolean true if no problem
* @access public
*/
- function clean($group = false)
+ function clean($group = false)
{
if ($this->_fileNameProtection) {
$motif = ($group) ? 'cache_'.md5($group).'_' : 'cache_';
@@ -378,7 +381,7 @@ class TCache_Lite
while (list($key, $value) = each($this->_memoryCaching)) {
if (strpos($key, $motif, 0)) {
unset($this->_memoryCaching[$key]);
- $this->_memoryCachingCounter =
+ $this->_memoryCachingCounter =
$this->_memoryCachingCounter - 1;
}
}
@@ -405,7 +408,7 @@ class TCache_Lite
}
return true;
}
-
+
/**
* Set a new life time
*
@@ -438,11 +441,11 @@ class TCache_Lite
*
* @access public
*/
- function getMemoryCachingState($id, $group = 'default',
+ function getMemoryCachingState($id, $group = 'default',
$doNotTestCacheValidity = false)
{
if ($this->_caching) {
- if ($data = $this->get($id, $group, $doNotTestCacheValidity))
+ if ($data = $this->get($id, $group, $doNotTestCacheValidity))
{
$array = unserialize($data);
$this->_memoryCachingCounter = $array['counter'];
@@ -450,7 +453,7 @@ class TCache_Lite
}
}
}
-
+
/**
* Return the cache last modification time
*
@@ -461,7 +464,7 @@ class TCache_Lite
function lastModified() {
return filemtime($this->cache->_file);
}
-
+
/**
* Trigger a PEAR error
*
@@ -511,12 +514,12 @@ class TCache_Lite
$this->_file = $this->_cacheDir.'cache_'.$group.'_'.$id;
}
}
-
+
function getCacheFile()
{
return $this->_file;
}
-
+
/**
* Read the cache file and return the content
*
@@ -529,14 +532,14 @@ class TCache_Lite
if ($this->_fileLocking) @flock($fp, LOCK_SH);
if ($fp) {
// because the filesize can be cached by PHP itself...
- clearstatcache();
+ clearstatcache();
$length = @filesize($this->_file);
$mqr = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
if ($this->_readControl) {
$hashControl = @fread($fp, 32);
$length = $length - 32;
- }
+ }
$data = @fread($fp, $length);
set_magic_quotes_runtime($mqr);
if ($this->_fileLocking) @flock($fp, LOCK_UN);
@@ -544,16 +547,16 @@ class TCache_Lite
if ($this->_readControl) {
$hashData = $this->_hash($data, $this->_readControlType);
if ($hashData != $hashControl) {
- @touch($this->_file, time() - 2*abs($this->_lifeTime));
+ @touch($this->_file, time() - 2*abs($this->_lifeTime));
return false;
}
}
return $data;
}
- $this->raiseError('Cache_Lite : Unable to read cache !', -2);
+ $this->raiseError('Cache_Lite : Unable to read cache !', -2);
return false;
}
-
+
/**
* Write the given data in the cache file
*
@@ -578,7 +581,7 @@ class TCache_Lite
$this->raiseError('Cache_Lite : Unable to write cache !', -1);
return false;
}
-
+
/**
* Write the given data in the cache file and control it just after to avoid
* corrupted cache entries
@@ -593,7 +596,7 @@ class TCache_Lite
$dataRead = $this->_read($data);
return ($dataRead==$data);
}
-
+
/**
* Make a control key with the string containing datas
*
@@ -616,7 +619,7 @@ class TCache_Lite
'(available values are only \'md5\', \'crc32\', \'strlen\')', -5);
}
}
-
-}
+
+}
?>
diff --git a/framework/I18N/core/util.php b/framework/I18N/core/util.php
index 7b4f7864..c0092f19 100644
--- a/framework/I18N/core/util.php
+++ b/framework/I18N/core/util.php
@@ -21,8 +21,21 @@
/**
* For a given DSN (database connection string), return some information
* about the DSN. This function comes from PEAR's DB package.
+ *
+ * LICENSE: This source file is subject to version 3.0 of the PHP license
+ * that is available through the world-wide-web at the following URI:
+ * http://www.php.net/license/3_0.txt. If you did not receive a copy of
+ * the PHP License and are unable to obtain it through the web, please
+ * send a note to license@php.net so we can mail you a copy immediately.
+ *
* @param string DSN format, similar to PEAR's DB
* @return array DSN information.
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Daniel Convissor <danielc@php.net>
+ * @copyright 1997-2005 The PHP Group
+ * @license http://www.php.net/license/3_0.txt PHP License 3.0
+ * @link http://pear.php.net/package/DB
*/
function parseDSN($dsn)
{
diff --git a/framework/Web/Javascripts/js/ajax.js b/framework/Web/Javascripts/js/ajax.js
index 91542d45..2b509d61 100644
--- a/framework/Web/Javascripts/js/ajax.js
+++ b/framework/Web/Javascripts/js/ajax.js
@@ -1,625 +1,83 @@
-var Ajax = {
-getTransport: function() {
-return Try.these(
-function() {return new XMLHttpRequest()},
-function() {return new ActiveXObject('Msxml2.XMLHTTP')},
-function() {return new ActiveXObject('Microsoft.XMLHTTP')}
-) || false;
-},
-activeRequestCount: 0
-}
-Ajax.Responders = {
-responders: [],
-_each: function(iterator) {
-this.responders._each(iterator);
-},
-register: function(responderToAdd) {
-if (!this.include(responderToAdd))
-this.responders.push(responderToAdd);
-},
-unregister: function(responderToRemove) {
-this.responders = this.responders.without(responderToRemove);
-},
-dispatch: function(callback, request, transport, json) {
-this.each(function(responder) {
-if (responder[callback] && typeof responder[callback] == 'function') {
-try {
-responder[callback].apply(responder, [request, transport, json]);
-} catch (e) {}
-}
-});
-}
-};
-Object.extend(Ajax.Responders, Enumerable);
-Ajax.Responders.register({
-onCreate: function() {
-Ajax.activeRequestCount++;
-},
-onComplete: function() {
-Ajax.activeRequestCount--;
-}
-});
-Ajax.Base = function() {};
-Ajax.Base.prototype = {
-setOptions: function(options) {
-this.options = {
-method: 'post',
-asynchronous: true,
-contentType:'application/x-www-form-urlencoded',
-parameters: ''
-}
-Object.extend(this.options, options || {});
-},
-responseIsSuccess: function() {
-return this.transport.status == undefined
-|| this.transport.status == 0
-|| (this.transport.status >= 200 && this.transport.status < 300);
-},
-responseIsFailure: function() {
-return !this.responseIsSuccess();
-}
-}
-Ajax.Request = Class.create();
-Ajax.Request.Events =
-['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
-Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
-initialize: function(url, options) {
-this.transport = Ajax.getTransport();
-this.setOptions(options);
-this.request(url);
-},
-request: function(url) {
-var parameters = this.options.parameters || '';
-if (parameters.length > 0) parameters += '&_=';
-try {
-this.url = url;
-if (this.options.method == 'get' && parameters.length > 0)
-this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
-Ajax.Responders.dispatch('onCreate', this, this.transport);
-this.transport.open(this.options.method, this.url,
-this.options.asynchronous);
-if (this.options.asynchronous) {
-this.transport.onreadystatechange = this.onStateChange.bind(this);
-setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
-}
-this.setRequestHeaders();
-var body = this.options.postBody ? this.options.postBody : parameters;
-this.transport.send(this.options.method == 'post' ? body : null);
-} catch (e) {
-this.dispatchException(e);
-}
-},
-setRequestHeaders: function() {
-var requestHeaders =
-['X-Requested-With', 'XMLHttpRequest',
- 'X-Prototype-Version', Prototype.Version,
- 'Accept', 'text/javascript, text/html, application/xml, text/xml'];
-if (this.options.method == 'post') {
-requestHeaders.push('Content-type', this.options.contentType);
-if (this.transport.overrideMimeType)
-requestHeaders.push('Connection', 'close');
-}
-if (this.options.requestHeaders)
-requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
-for (var i = 0; i < requestHeaders.length; i += 2)
-this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
-},
-onStateChange: function() {
-var readyState = this.transport.readyState;
-if (readyState != 1)
-this.respondToReadyState(this.transport.readyState);
-},
-header: function(name) {
-try {
-return this.transport.getResponseHeader(name);
-} catch (e) {}
-},
-evalJSON: function() {
-try {
-return eval('(' + this.header('X-JSON') + ')');
-} catch (e) {}
-},
-evalResponse: function() {
-try {
-return eval(this.transport.responseText);
-} catch (e) {
-this.dispatchException(e);
-}
-},
-respondToReadyState: function(readyState) {
-var event = Ajax.Request.Events[readyState];
-var transport = this.transport, json = this.evalJSON();
-if (event == 'Complete') {
-try {
-(this.options['on' + this.transport.status]
- || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
- || Prototype.emptyFunction)(transport, json);
-} catch (e) {
-this.dispatchException(e);
-}
-if ((this.header('Content-type') || '').match(/^text\/javascript/i))
-this.evalResponse();
-}
-try {
-(this.options['on' + event] || Prototype.emptyFunction)(transport, json);
-Ajax.Responders.dispatch('on' + event, this, transport, json);
-} catch (e) {
-this.dispatchException(e);
-}
-if (event == 'Complete')
-this.transport.onreadystatechange = Prototype.emptyFunction;
-},
-dispatchException: function(exception) {
-(this.options.onException || Prototype.emptyFunction)(this, exception);
-Ajax.Responders.dispatch('onException', this, exception);
-}
-});
-Ajax.Updater = Class.create();
-Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
-initialize: function(container, url, options) {
-this.containers = {
-success: container.success ? $(container.success) : $(container),
-failure: container.failure ? $(container.failure) :
-(container.success ? null : $(container))
-}
-this.transport = Ajax.getTransport();
-this.setOptions(options);
-var onComplete = this.options.onComplete || Prototype.emptyFunction;
-this.options.onComplete = (function(transport, object) {
-this.updateContent();
-onComplete(transport, object);
-}).bind(this);
-this.request(url);
-},
-updateContent: function() {
-var receiver = this.responseIsSuccess() ?
-this.containers.success : this.containers.failure;
-var response = this.transport.responseText;
-if (!this.options.evalScripts)
-response = response.stripScripts();
-if (receiver) {
-if (this.options.insertion) {
-new this.options.insertion(receiver, response);
-} else {
-Element.update(receiver, response);
-}
-}
-if (this.responseIsSuccess()) {
-if (this.onComplete)
-setTimeout(this.onComplete.bind(this), 10);
-}
-}
-});
-Ajax.PeriodicalUpdater = Class.create();
-Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
-initialize: function(container, url, options) {
-this.setOptions(options);
-this.onComplete = this.options.onComplete;
-this.frequency = (this.options.frequency || 2);
-this.decay = (this.options.decay || 1);
-this.updater = {};
-this.container = container;
-this.url = url;
-this.start();
-},
-start: function() {
-this.options.onComplete = this.updateComplete.bind(this);
-this.onTimerEvent();
-},
-stop: function() {
-this.updater.onComplete = undefined;
-clearTimeout(this.timer);
-(this.onComplete || Prototype.emptyFunction).apply(this, arguments);
-},
-updateComplete: function(request) {
-if (this.options.decay) {
-this.decay = (request.responseText == this.lastText ?
-this.decay * this.options.decay : 1);
-this.lastText = request.responseText;
-}
-this.timer = setTimeout(this.onTimerEvent.bind(this),
-this.decay * this.frequency * 1000);
-},
-onTimerEvent: function() {
-this.updater = new Ajax.Updater(this.container, this.url, this.options);
-}
-});
-Prado.Callback = Class.create();
-Object.extend(Prado.Callback,
-{
-FIELD_CALLBACK_TARGET : 'PRADO_CALLBACK_TARGET',
-FIELD_CALLBACK_PARAMETER : 'PRADO_CALLBACK_PARAMETER',
-PostDataLoaders : ['PRADO_PAGESTATE'],
-Exception :
-{
-"on505" : function(request, transport, data)
-{
-var msg = 'HTTP '+transport.status+" with response";
-Logger.error(msg, transport.responseText);
-this.logException(data);
-},
-onComplete : function(request, transport, data)
-{
-if(transport.status != 505)
-{
-var msg = 'HTTP '+transport.status+" with response : \n";
-msg += transport.responseText + "\n";
-msg += "Data : \n"+inspect(data);
-Logger.warn(msg);
-}
-},
-formatException : function(e)
-{
-var msg = e.type + " with message \""+e.message+"\"";
-msg += " in "+e.file+"("+e.line+")\n";
-msg += "Stack trace:\n";
-var trace = e.trace;
-for(var i = 0; i<trace.length; i++)
-{
-msg += "#"+i+" "+trace[i].file;
-msg += "("+trace[i].line+"): ";
-msg += trace[i]["class"]+"->"+trace[i]["function"]+"()"+"\n";
-}
-return msg;
-},
-logException : function(e)
-{
-Logger.error("Callback Request Error "+e.code, this.formatException(e));
-}
-},
-encode : function(data)
-{
-Prado.JSON.stringify(data);
-},
-decode : function(data)
-{
-return Prado.JSON.parse(data);
-}
-})
+
+var Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest()},function(){return new ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')})||false;},activeRequestCount:0}
+Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responderToAdd){if(!this.include(responderToAdd))
+this.responders.push(responderToAdd);},unregister:function(responderToRemove){this.responders=this.responders.without(responderToRemove);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(responder[callback]&&typeof responder[callback]=='function'){try{responder[callback].apply(responder,[request,transport,json]);}catch(e){}}});}};Object.extend(Ajax.Responders,Enumerable);Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++;},onComplete:function(){Ajax.activeRequestCount--;}});Ajax.Base=function(){};Ajax.Base.prototype={setOptions:function(options){this.options={method:'post',asynchronous:true,contentType:'application/x-www-form-urlencoded',parameters:''}
+Object.extend(this.options,options||{});},responseIsSuccess:function(){return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);},responseIsFailure:function(){return!this.responseIsSuccess();}}
+Ajax.Request=Class.create();Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Request.prototype=Object.extend(new Ajax.Base(),{initialize:function(url,options){this.transport=Ajax.getTransport();this.setOptions(options);this.request(url);},request:function(url){var parameters=this.options.parameters||'';if(parameters.length>0)parameters+='&_=';try{this.url=url;if(this.options.method=='get'&&parameters.length>0)
+this.url+=(this.url.match(/\?/)?'&':'?')+parameters;Ajax.Responders.dispatch('onCreate',this,this.transport);this.transport.open(this.options.method,this.url,this.options.asynchronous);if(this.options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);setTimeout((function(){this.respondToReadyState(1)}).bind(this),10);}
+this.setRequestHeaders();var body=this.options.postBody?this.options.postBody:parameters;this.transport.send(this.options.method=='post'?body:null);}catch(e){this.dispatchException(e);}},setRequestHeaders:function(){var requestHeaders=['X-Requested-With','XMLHttpRequest','X-Prototype-Version',Prototype.Version,'Accept','text/javascript, text/html, application/xml, text/xml'];if(this.options.method=='post'){requestHeaders.push('Content-type',this.options.contentType);if(this.transport.overrideMimeType)
+requestHeaders.push('Connection','close');}
+if(this.options.requestHeaders)
+requestHeaders.push.apply(requestHeaders,this.options.requestHeaders);for(var i=0;i<requestHeaders.length;i+=2)
+this.transport.setRequestHeader(requestHeaders[i],requestHeaders[i+1]);},onStateChange:function(){var readyState=this.transport.readyState;if(readyState!=1)
+this.respondToReadyState(this.transport.readyState);},header:function(name){try{return this.transport.getResponseHeader(name);}catch(e){}},evalJSON:function(){try{return eval('('+this.header('X-JSON')+')');}catch(e){}},evalResponse:function(){try{return eval(this.transport.responseText);}catch(e){this.dispatchException(e);}},respondToReadyState:function(readyState){var event=Ajax.Request.Events[readyState];var transport=this.transport,json=this.evalJSON();if(event=='Complete'){try{(this.options['on'+this.transport.status]||this.options['on'+(this.responseIsSuccess()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){this.dispatchException(e);}
+if((this.header('Content-type')||'').match(/^text\/javascript/i))
+this.evalResponse();}
+try{(this.options['on'+event]||Prototype.emptyFunction)(transport,json);Ajax.Responders.dispatch('on'+event,this,transport,json);}catch(e){this.dispatchException(e);}
+if(event=='Complete')
+this.transport.onreadystatechange=Prototype.emptyFunction;},dispatchException:function(exception){(this.options.onException||Prototype.emptyFunction)(this,exception);Ajax.Responders.dispatch('onException',this,exception);}});Ajax.Updater=Class.create();Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{initialize:function(container,url,options){this.containers={success:container.success?$(container.success):$(container),failure:container.failure?$(container.failure):(container.success?null:$(container))}
+this.transport=Ajax.getTransport();this.setOptions(options);var onComplete=this.options.onComplete||Prototype.emptyFunction;this.options.onComplete=(function(transport,object){this.updateContent();onComplete(transport,object);}).bind(this);this.request(url);},updateContent:function(){var receiver=this.responseIsSuccess()?this.containers.success:this.containers.failure;var response=this.transport.responseText;if(!this.options.evalScripts)
+response=response.stripScripts();if(receiver){if(this.options.insertion){new this.options.insertion(receiver,response);}else{Element.update(receiver,response);}}
+if(this.responseIsSuccess()){if(this.onComplete)
+setTimeout(this.onComplete.bind(this),10);}}});Ajax.PeriodicalUpdater=Class.create();Ajax.PeriodicalUpdater.prototype=Object.extend(new Ajax.Base(),{initialize:function(container,url,options){this.setOptions(options);this.onComplete=this.options.onComplete;this.frequency=(this.options.frequency||2);this.decay=(this.options.decay||1);this.updater={};this.container=container;this.url=url;this.start();},start:function(){this.options.onComplete=this.updateComplete.bind(this);this.onTimerEvent();},stop:function(){this.updater.onComplete=undefined;clearTimeout(this.timer);(this.onComplete||Prototype.emptyFunction).apply(this,arguments);},updateComplete:function(request){if(this.options.decay){this.decay=(request.responseText==this.lastText?this.decay*this.options.decay:1);this.lastText=request.responseText;}
+this.timer=setTimeout(this.onTimerEvent.bind(this),this.decay*this.frequency*1000);},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options);}});Prado.Callback=Class.create();Object.extend(Prado.Callback,{FIELD_CALLBACK_TARGET:'PRADO_CALLBACK_TARGET',FIELD_CALLBACK_PARAMETER:'PRADO_CALLBACK_PARAMETER',PostDataLoaders:['PRADO_PAGESTATE'],Exception:{"on505":function(request,transport,data)
+{var msg='HTTP '+transport.status+" with response";Logger.error(msg,transport.responseText);this.logException(data);},onComplete:function(request,transport,data)
+{if(transport.status!=505)
+{var msg='HTTP '+transport.status+" with response : \n";msg+=transport.responseText+"\n";msg+="Data : \n"+inspect(data);Logger.warn(msg);}},formatException:function(e)
+{var msg=e.type+" with message \""+e.message+"\"";msg+=" in "+e.file+"("+e.line+")\n";msg+="Stack trace:\n";var trace=e.trace;for(var i=0;i<trace.length;i++)
+{msg+=" #"+i+" "+trace[i].file;msg+="("+trace[i].line+"): ";msg+=trace[i]["class"]+"->"+trace[i]["function"]+"()"+"\n";}
+return msg;},logException:function(e)
+{Logger.error("Callback Request Error "+e.code,this.formatException(e));}},encode:function(data)
+{Prado.JSON.stringify(data);},decode:function(data)
+{return Prado.JSON.parse(data);}})
Event.OnLoad(function()
-{
-if(typeof Logger != "undefined")
-Ajax.Responders.register(Prado.Callback.Exception);
-});
-Prado.Callback.prototype =
-{
-url : window.location.href,
-options : {},
-id : null,
-parameters : null,
-initialize : function(id, parameters, onSuccess, options)
-{
-this.options = options || {};
-this.id = id;
-this.parameters = parameters;
-var request =
-{
-postBody : this._getPostData(),
-onSuccess : this._onSuccess.bind(this)
-}
-Object.extend(this.options || {},request);
-new Ajax.Request(this.url, this.options);
-},
-_getPostData : function()
-{
-var data = {};
-Prado.Callback.PostDataLoaders.each(function(name)
-{
-$A(document.getElementsByName(name)).each(function(element)
-{
-var value = $F(element);
-if(typeof(value) != "undefined")
-data[name] = value;
-})
-})
-if(typeof(this.parameters) != "undefined")
-data[Prado.Callback.FIELD_CALLBACK_PARAMETER] = Prado.Callback.encode(this.parameters);
-data[Prado.Callback.FIELD_CALLBACK_TARGET] = this.id;
-return $H(data).toQueryString();
-},
-_onSuccess : function(response, transport, json)
-{
-}
-}
-Array.prototype.______array = '______array';
-Prado.JSON = {
-org: 'http:
-copyright: '(c)2005 JSON.org',
-license: 'http:
-stringify: function (arg) {
-var c, i, l, s = '', v;
-switch (typeof arg) {
-case 'object':
-if (arg) {
-if (arg.______array == '______array') {
-for (i = 0; i < arg.length; ++i) {
-v = this.stringify(arg[i]);
-if (s) {
-s += ',';
-}
-s += v;
-}
-return '[' + s + ']';
-} else if (typeof arg.toString != 'undefined') {
-for (i in arg) {
-v = arg[i];
-if (typeof v != 'undefined' && typeof v != 'function') {
-v = this.stringify(v);
-if (s) {
-s += ',';
-}
-s += this.stringify(i) + ':' + v;
-}
-}
-return '{' + s + '}';
-}
-}
-return 'null';
-case 'number':
-return isFinite(arg) ? String(arg) : 'null';
-case 'string':
-l = arg.length;
-s = '"';
-for (i = 0; i < l; i += 1) {
-c = arg.charAt(i);
-if (c >= ' ') {
-if (c == '\\' || c == '"') {
-s += '\\';
-}
-s += c;
-} else {
-switch (c) {
-case '\b':
-s += '\\b';
-break;
-case '\f':
-s += '\\f';
-break;
-case '\n':
-s += '\\n';
-break;
-case '\r':
-s += '\\r';
-break;
-case '\t':
-s += '\\t';
-break;
-default:
-c = c.charCodeAt();
-s += '\\u00' + Math.floor(c / 16).toString(16) +
-(c % 16).toString(16);
-}
-}
-}
-return s + '"';
-case 'boolean':
-return String(arg);
-default:
-return 'null';
-}
-},
-parse: function (text) {
-var at = 0;
-var ch = ' ';
-function error(m) {
-throw {
-name: 'JSONError',
-message: m,
-at: at - 1,
-text: text
-};
-}
-function next() {
-ch = text.charAt(at);
-at += 1;
-return ch;
-}
-function white() {
-while (ch) {
-if (ch <= ' ') {
-next();
-} else if (ch == '/') {
-switch (next()) {
-case '/':
-while (next() && ch != '\n' && ch != '\r') {}
-break;
-case '*':
-next();
-for (;;) {
-if (ch) {
-if (ch == '*') {
-if (next() == '/') {
-next();
-break;
-}
-} else {
-next();
-}
-} else {
-error("Unterminated comment");
-}
-}
-break;
-default:
-error("Syntax error");
-}
-} else {
-break;
-}
-}
-}
-function string() {
-var i, s = '', t, u;
-if (ch == '"') {
-outer:while (next()) {
-if (ch == '"') {
-next();
-return s;
-} else if (ch == '\\') {
-switch (next()) {
-case 'b':
-s += '\b';
-break;
-case 'f':
-s += '\f';
-break;
-case 'n':
-s += '\n';
-break;
-case 'r':
-s += '\r';
-break;
-case 't':
-s += '\t';
-break;
-case 'u':
-u = 0;
-for (i = 0; i < 4; i += 1) {
-t = parseInt(next(), 16);
-if (!isFinite(t)) {
-break outer;
-}
-u = u * 16 + t;
-}
-s += String.fromCharCode(u);
-break;
-default:
-s += ch;
-}
-} else {
-s += ch;
-}
-}
-}
-error("Bad string");
-}
-function array() {
-var a = [];
-if (ch == '[') {
-next();
-white();
-if (ch == ']') {
-next();
-return a;
-}
-while (ch) {
-a.push(value());
-white();
-if (ch == ']') {
-next();
-return a;
-} else if (ch != ',') {
-break;
-}
-next();
-white();
-}
-}
-error("Bad array");
-}
-function object() {
-var k, o = {};
-if (ch == '{') {
-next();
-white();
-if (ch == '}') {
-next();
-return o;
-}
-while (ch) {
-k = string();
-white();
-if (ch != ':') {
-break;
-}
-next();
-o[k] = value();
-white();
-if (ch == '}') {
-next();
-return o;
-} else if (ch != ',') {
-break;
-}
-next();
-white();
-}
-}
-error("Bad object");
-}
-function number() {
-var n = '', v;
-if (ch == '-') {
-n = '-';
-next();
-}
-while (ch >= '0' && ch <= '9') {
-n += ch;
-next();
-}
-if (ch == '.') {
-n += '.';
-while (next() && ch >= '0' && ch <= '9') {
-n += ch;
-}
-}
-if (ch == 'e' || ch == 'E') {
-n += 'e';
-next();
-if (ch == '-' || ch == '+') {
-n += ch;
-next();
-}
-while (ch >= '0' && ch <= '9') {
-n += ch;
-next();
-}
-}
-v = +n;
-if (!isFinite(v)) {
-} else {
-return v;
-}
-}
-function word() {
-switch (ch) {
-case 't':
-if (next() == 'r' && next() == 'u' && next() == 'e') {
-next();
-return true;
-}
-break;
-case 'f':
-if (next() == 'a' && next() == 'l' && next() == 's' &&
-next() == 'e') {
-next();
-return false;
-}
-break;
-case 'n':
-if (next() == 'u' && next() == 'l' && next() == 'l') {
-next();
-return null;
-}
-break;
-}
-error("Syntax error");
-}
-function value() {
-white();
-switch (ch) {
-case '{':
-return object();
-case '[':
-return array();
-case '"':
-return string();
-case '-':
-return number();
-default:
-return ch >= '0' && ch <= '9' ? number() : word();
-}
-}
-return value();
-}
-};
+{if(typeof Logger!="undefined")
+Ajax.Responders.register(Prado.Callback.Exception);});Prado.Callback.prototype={url:window.location.href,options:{},id:null,parameters:null,initialize:function(id,parameters,onSuccess,options)
+{this.options=options||{};this.id=id;this.parameters=parameters;var request={postBody:this._getPostData(),onSuccess:this._onSuccess.bind(this)}
+Object.extend(this.options||{},request);new Ajax.Request(this.url,this.options);},_getPostData:function()
+{var data={};Prado.Callback.PostDataLoaders.each(function(name)
+{$A(document.getElementsByName(name)).each(function(element)
+{var value=$F(element);if(typeof(value)!="undefined")
+data[name]=value;})})
+if(typeof(this.parameters)!="undefined")
+data[Prado.Callback.FIELD_CALLBACK_PARAMETER]=Prado.Callback.encode(this.parameters);data[Prado.Callback.FIELD_CALLBACK_TARGET]=this.id;return $H(data).toQueryString();},_onSuccess:function(response,transport,json)
+{}}
+Array.prototype.______array='______array';Prado.JSON={org:'http://www.JSON.org',copyright:'(c)2005 JSON.org',license:'http://www.crockford.com/JSON/license.html',stringify:function(arg){var c,i,l,s='',v;switch(typeof arg){case'object':if(arg){if(arg.______array=='______array'){for(i=0;i<arg.length;++i){v=this.stringify(arg[i]);if(s){s+=',';}
+s+=v;}
+return'['+s+']';}else if(typeof arg.toString!='undefined'){for(i in arg){v=arg[i];if(typeof v!='undefined'&&typeof v!='function'){v=this.stringify(v);if(s){s+=',';}
+s+=this.stringify(i)+':'+v;}}
+return'{'+s+'}';}}
+return'null';case'number':return isFinite(arg)?String(arg):'null';case'string':l=arg.length;s='"';for(i=0;i<l;i+=1){c=arg.charAt(i);if(c>=' '){if(c=='\\'||c=='"'){s+='\\';}
+s+=c;}else{switch(c){case'\b':s+='\\b';break;case'\f':s+='\\f';break;case'\n':s+='\\n';break;case'\r':s+='\\r';break;case'\t':s+='\\t';break;default:c=c.charCodeAt();s+='\\u00'+Math.floor(c/16).toString(16)+
+(c%16).toString(16);}}}
+return s+'"';case'boolean':return String(arg);default:return'null';}},parse:function(text){var at=0;var ch=' ';function error(m){throw{name:'JSONError',message:m,at:at-1,text:text};}
+function next(){ch=text.charAt(at);at+=1;return ch;}
+function white(){while(ch){if(ch<=' '){next();}else if(ch=='/'){switch(next()){case'/':while(next()&&ch!='\n'&&ch!='\r'){}
+break;case'*':next();for(;;){if(ch){if(ch=='*'){if(next()=='/'){next();break;}}else{next();}}else{error("Unterminated comment");}}
+break;default:error("Syntax error");}}else{break;}}}
+function string(){var i,s='',t,u;if(ch=='"'){outer:while(next()){if(ch=='"'){next();return s;}else if(ch=='\\'){switch(next()){case'b':s+='\b';break;case'f':s+='\f';break;case'n':s+='\n';break;case'r':s+='\r';break;case't':s+='\t';break;case'u':u=0;for(i=0;i<4;i+=1){t=parseInt(next(),16);if(!isFinite(t)){break outer;}
+u=u*16+t;}
+s+=String.fromCharCode(u);break;default:s+=ch;}}else{s+=ch;}}}
+error("Bad string");}
+function array(){var a=[];if(ch=='['){next();white();if(ch==']'){next();return a;}
+while(ch){a.push(value());white();if(ch==']'){next();return a;}else if(ch!=','){break;}
+next();white();}}
+error("Bad array");}
+function object(){var k,o={};if(ch=='{'){next();white();if(ch=='}'){next();return o;}
+while(ch){k=string();white();if(ch!=':'){break;}
+next();o[k]=value();white();if(ch=='}'){next();return o;}else if(ch!=','){break;}
+next();white();}}
+error("Bad object");}
+function number(){var n='',v;if(ch=='-'){n='-';next();}
+while(ch>='0'&&ch<='9'){n+=ch;next();}
+if(ch=='.'){n+='.';while(next()&&ch>='0'&&ch<='9'){n+=ch;}}
+if(ch=='e'||ch=='E'){n+='e';next();if(ch=='-'||ch=='+'){n+=ch;next();}
+while(ch>='0'&&ch<='9'){n+=ch;next();}}
+v=+n;if(!isFinite(v)){}else{return v;}}
+function word(){switch(ch){case't':if(next()=='r'&&next()=='u'&&next()=='e'){next();return true;}
+break;case'f':if(next()=='a'&&next()=='l'&&next()=='s'&&next()=='e'){next();return false;}
+break;case'n':if(next()=='u'&&next()=='l'&&next()=='l'){next();return null;}
+break;}
+error("Syntax error");}
+function value(){white();switch(ch){case'{':return object();case'[':return array();case'"':return string();case'-':return number();default:return ch>='0'&&ch<='9'?number():word();}}
+return value();}}; \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/colorpicker.js b/framework/Web/Javascripts/js/colorpicker.js
index b926dc93..5bfab96d 100644
--- a/framework/Web/Javascripts/js/colorpicker.js
+++ b/framework/Web/Javascripts/js/colorpicker.js
@@ -1,621 +1,93 @@
-
-if(typeof(Rico) == "undefined") Rico = {};
-Rico.Color = Class.create();
-Rico.Color.prototype = {
-initialize: function(red, green, blue) {
-this.rgb = { r: red, g : green, b : blue };
- },
-setRed: function(r) {
-this.rgb.r = r;
- },
-setGreen: function(g) {
-this.rgb.g = g;
- },
-setBlue: function(b) {
-this.rgb.b = b;
- },
-setHue: function(h) {
-var hsb = this.asHSB();
-hsb.h = h;
-this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
- },
-setSaturation: function(s) {
-var hsb = this.asHSB();
-hsb.s = s;
-this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
- },
-setBrightness: function(b) {
-var hsb = this.asHSB();
-hsb.b = b;
-this.rgb = Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b );
- },
-darken: function(percent) {
-var hsb= this.asHSB();
-this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0));
- },
-brighten: function(percent) {
-var hsb= this.asHSB();
-this.rgb = Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1));
- },
-blend: function(other) {
-this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2);
-this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2);
-this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2);
- },
-isBright: function() {
-var hsb = this.asHSB();
-return this.asHSB().b > 0.5;
- },
-isDark: function() {
-return ! this.isBright();
- },
-asRGB: function() {
-return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")";
- },
-asHex: function() {
-return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart();
- },
-asHSB: function() {
-return Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b);
- },
-toString: function() {
-return this.asHex();
- }
-};
-Rico.Color.createFromHex = function(hexCode) {
-if ( hexCode.indexOf('#') == 0 )
-hexCode = hexCode.substring(1);
-var red = "ff", green = "ff", blue="ff";
- if(hexCode.length > 4)
-{
- red = hexCode.substring(0,2);
- green = hexCode.substring(2,4);
- blue= hexCode.substring(4,6);
-}
-else if(hexCode.length > 0 & hexCode.length < 4)
-{
-var r = hexCode.substring(0,1);
-var g = hexCode.substring(1,2);
-var b = hexCode.substring(2);
-red = r+r;
-green = g+g;
-blue = b+b;
-}
- return new Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) );
-}
-Rico.Color.createColorFromBackground = function(elem) {
-var actualColor = Element.getStyle($(elem), "background-color");
-if ( actualColor == "transparent" && elem.parent )
-return Rico.Color.createColorFromBackground(elem.parent);
-if ( actualColor == null )
-return new Rico.Color(255,255,255);
-if ( actualColor.indexOf("rgb(") == 0 ) {
-var colors = actualColor.substring(4, actualColor.length - 1 );
-var colorArray = colors.split(",");
-return new Rico.Color( parseInt( colorArray[0] ),
-parseInt( colorArray[1] ),
-parseInt( colorArray[2] ));
-}
- else if ( actualColor.indexOf("#") == 0 ) {
-return Rico.Color.createFromHex(actualColor);
- }
- else
-return new Rico.Color(255,255,255);
-}
-Rico.Color.HSBtoRGB = function(hue, saturation, brightness) {
-var red = 0;
-var green = 0;
-var blue= 0;
-if (saturation == 0) {
-red = parseInt(brightness * 255.0 + 0.5);
- green = red;
- blue = red;
-}
-else {
-var h = (hue - Math.floor(hue)) * 6.0;
-var f = h - Math.floor(h);
-var p = brightness * (1.0 - saturation);
-var q = brightness * (1.0 - saturation * f);
-var t = brightness * (1.0 - (saturation * (1.0 - f)));
-switch (parseInt(h)) {
- case 0:
-red = (brightness * 255.0 + 0.5);
-green = (t * 255.0 + 0.5);
-blue= (p * 255.0 + 0.5);
-break;
- case 1:
-red = (q * 255.0 + 0.5);
-green = (brightness * 255.0 + 0.5);
-blue= (p * 255.0 + 0.5);
-break;
- case 2:
-red = (p * 255.0 + 0.5);
-green = (brightness * 255.0 + 0.5);
-blue= (t * 255.0 + 0.5);
-break;
- case 3:
-red = (p * 255.0 + 0.5);
-green = (q * 255.0 + 0.5);
-blue= (brightness * 255.0 + 0.5);
-break;
- case 4:
-red = (t * 255.0 + 0.5);
-green = (p * 255.0 + 0.5);
-blue= (brightness * 255.0 + 0.5);
-break;
-case 5:
-red = (brightness * 255.0 + 0.5);
-green = (p * 255.0 + 0.5);
-blue= (q * 255.0 + 0.5);
-break;
-}
-}
-return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) };
-}
-Rico.Color.RGBtoHSB = function(r, g, b) {
-var hue;
- var saturaton;
- var brightness;
-var cmax = (r > g) ? r : g;
- if (b > cmax)
-cmax = b;
-var cmin = (r < g) ? r : g;
- if (b < cmin)
-cmin = b;
-brightness = cmax / 255.0;
- if (cmax != 0)
-saturation = (cmax - cmin)/cmax;
- else
-saturation = 0;
-if (saturation == 0)
-hue = 0;
- else {
-var redc = (cmax - r)/(cmax - cmin);
-var greenc = (cmax - g)/(cmax - cmin);
-var bluec= (cmax - b)/(cmax - cmin);
-if (r == cmax)
- hue = bluec - greenc;
-else if (g == cmax)
- hue = 2.0 + redc - bluec;
+
+if(typeof(Rico)=="undefined")Rico={};Rico.Color=Class.create();Rico.Color.prototype={initialize:function(red,green,blue){this.rgb={r:red,g:green,b:blue};},setRed:function(r){this.rgb.r=r;},setGreen:function(g){this.rgb.g=g;},setBlue:function(b){this.rgb.b=b;},setHue:function(h){var hsb=this.asHSB();hsb.h=h;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setSaturation:function(s){var hsb=this.asHSB();hsb.s=s;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},setBrightness:function(b){var hsb=this.asHSB();hsb.b=b;this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,hsb.b);},darken:function(percent){var hsb=this.asHSB();this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-percent,0));},brighten:function(percent){var hsb=this.asHSB();this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+percent,1));},blend:function(other){this.rgb.r=Math.floor((this.rgb.r+other.rgb.r)/2);this.rgb.g=Math.floor((this.rgb.g+other.rgb.g)/2);this.rgb.b=Math.floor((this.rgb.b+other.rgb.b)/2);},isBright:function(){var hsb=this.asHSB();return this.asHSB().b>0.5;},isDark:function(){return!this.isBright();},asRGB:function(){return"rgb("+this.rgb.r+","+this.rgb.g+","+this.rgb.b+")";},asHex:function(){return"#"+this.rgb.r.toColorPart()+this.rgb.g.toColorPart()+this.rgb.b.toColorPart();},asHSB:function(){return Rico.Color.RGBtoHSB(this.rgb.r,this.rgb.g,this.rgb.b);},toString:function(){return this.asHex();}};Rico.Color.createFromHex=function(hexCode){if(hexCode.indexOf('#')==0)
+hexCode=hexCode.substring(1);var red="ff",green="ff",blue="ff";if(hexCode.length>4)
+{red=hexCode.substring(0,2);green=hexCode.substring(2,4);blue=hexCode.substring(4,6);}
+else if(hexCode.length>0&hexCode.length<4)
+{var r=hexCode.substring(0,1);var g=hexCode.substring(1,2);var b=hexCode.substring(2);red=r+r;green=g+g;blue=b+b;}
+return new Rico.Color(parseInt(red,16),parseInt(green,16),parseInt(blue,16));}
+Rico.Color.createColorFromBackground=function(elem){var actualColor=Element.getStyle($(elem),"background-color");if(actualColor=="transparent"&&elem.parent)
+return Rico.Color.createColorFromBackground(elem.parent);if(actualColor==null)
+return new Rico.Color(255,255,255);if(actualColor.indexOf("rgb(")==0){var colors=actualColor.substring(4,actualColor.length-1);var colorArray=colors.split(",");return new Rico.Color(parseInt(colorArray[0]),parseInt(colorArray[1]),parseInt(colorArray[2]));}
+else if(actualColor.indexOf("#")==0){return Rico.Color.createFromHex(actualColor);}
else
- hue = 4.0 + greenc - redc;
-hue = hue / 6.0;
-if (hue < 0)
- hue = hue + 1.0;
- }
-return { h : hue, s : saturation, b : brightness };
-}
-Prado.WebUI.TColorPicker = Class.create();
-Object.extend(Prado.WebUI.TColorPicker,
-{
-palettes:
-{
-Small : [["fff", "fcc", "fc9", "ff9", "ffc", "9f9", "9ff", "cff", "ccf", "fcf"],
-["ccc", "f66", "f96", "ff6", "ff3", "6f9", "3ff", "6ff", "99f", "f9f"],
-["c0c0c0", "f00", "f90", "fc6", "ff0", "3f3", "6cc", "3cf", "66c", "c6c"],
-["999", "c00", "f60", "fc3", "fc0", "3c0", "0cc", "36f", "63f", "c3c"],
-["666", "900", "c60", "c93", "990", "090", "399", "33f", "60c", "939"],
-["333", "600", "930", "963", "660", "060", "366", "009", "339", "636"],
-["000", "300", "630", "633", "330", "030", "033", "006", "309", "303"]],
-Tiny : [["ffffff" , "00ff00" , "008000" , "0000ff" ],
-["c0c0c0" , "ffff00" , "ff00ff" , "000080" ],
-["808080" , "ff0000" , "800080" , "000000" ]]
-},
-UIImages :
-{
-'button.gif' : 'button.gif',
-'background.png' : 'background.png'
-}
-});
-Object.extend(Prado.WebUI.TColorPicker.prototype,
-{
-initialize : function(options)
-{
-var basics =
-{
-Palette : 'Small',
-ClassName : 'TColorPicker',
-Mode : 'Basic',
-OKButtonText : 'OK',
-CancelButtonText : 'Cancel',
-ShowColorPicker : true
-}
-this.element = null;
-this.showing = false;
-options = Object.extend(basics, options);
-this.options = options;
-this.input = $(options['ID']);
-this.button = $(options['ID']+'_button');
-this._buttonOnClick = this.buttonOnClick.bind(this);
-if(options['ShowColorPicker'])
-Event.observe(this.button, "click", this._buttonOnClick);
-Event.observe(this.input, "change", this.updatePicker.bind(this));
-},
-updatePicker : function(e)
-{
-var color = Rico.Color.createFromHex(this.input.value);
-this.button.style.backgroundColor = color.toString();
-},
-buttonOnClick : function(event)
-{
-var mode = this.options['Mode'];
-if(this.element == null)
-{
-var constructor = mode == "Basic" ? "getBasicPickerContainer": "getFullPickerContainer"
-this.element = this[constructor](this.options['ID'], this.options['Palette'])
-document.body.appendChild(this.element);
-this.element.style.display = "none";
-if(Prado.Browser().ie)
-{
-this.iePopUp = document.createElement('iframe');
-this.iePopUp.src = "";
-this.iePopUp.style.position = "absolute"
+return new Rico.Color(255,255,255);}
+Rico.Color.HSBtoRGB=function(hue,saturation,brightness){var red=0;var green=0;var blue=0;if(saturation==0){red=parseInt(brightness*255.0+0.5);green=red;blue=red;}
+else{var h=(hue-Math.floor(hue))*6.0;var f=h-Math.floor(h);var p=brightness*(1.0-saturation);var q=brightness*(1.0-saturation*f);var t=brightness*(1.0-(saturation*(1.0-f)));switch(parseInt(h)){case 0:red=(brightness*255.0+0.5);green=(t*255.0+0.5);blue=(p*255.0+0.5);break;case 1:red=(q*255.0+0.5);green=(brightness*255.0+0.5);blue=(p*255.0+0.5);break;case 2:red=(p*255.0+0.5);green=(brightness*255.0+0.5);blue=(t*255.0+0.5);break;case 3:red=(p*255.0+0.5);green=(q*255.0+0.5);blue=(brightness*255.0+0.5);break;case 4:red=(t*255.0+0.5);green=(p*255.0+0.5);blue=(brightness*255.0+0.5);break;case 5:red=(brightness*255.0+0.5);green=(p*255.0+0.5);blue=(q*255.0+0.5);break;}}
+return{r:parseInt(red),g:parseInt(green),b:parseInt(blue)};}
+Rico.Color.RGBtoHSB=function(r,g,b){var hue;var saturaton;var brightness;var cmax=(r>g)?r:g;if(b>cmax)
+cmax=b;var cmin=(r<g)?r:g;if(b<cmin)
+cmin=b;brightness=cmax/255.0;if(cmax!=0)
+saturation=(cmax-cmin)/cmax;else
+saturation=0;if(saturation==0)
+hue=0;else{var redc=(cmax-r)/(cmax-cmin);var greenc=(cmax-g)/(cmax-cmin);var bluec=(cmax-b)/(cmax-cmin);if(r==cmax)
+hue=bluec-greenc;else if(g==cmax)
+hue=2.0+redc-bluec;else
+hue=4.0+greenc-redc;hue=hue/6.0;if(hue<0)
+hue=hue+1.0;}
+return{h:hue,s:saturation,b:brightness};}
+Prado.WebUI.TColorPicker=Class.create();Object.extend(Prado.WebUI.TColorPicker,{palettes:{Small:[["fff","fcc","fc9","ff9","ffc","9f9","9ff","cff","ccf","fcf"],["ccc","f66","f96","ff6","ff3","6f9","3ff","6ff","99f","f9f"],["c0c0c0","f00","f90","fc6","ff0","3f3","6cc","3cf","66c","c6c"],["999","c00","f60","fc3","fc0","3c0","0cc","36f","63f","c3c"],["666","900","c60","c93","990","090","399","33f","60c","939"],["333","600","930","963","660","060","366","009","339","636"],["000","300","630","633","330","030","033","006","309","303"]],Tiny:[["ffffff","00ff00","008000","0000ff"],["c0c0c0","ffff00","ff00ff","000080"],["808080","ff0000","800080","000000"]]},UIImages:{'button.gif':'button.gif','background.png':'background.png'}});Object.extend(Prado.WebUI.TColorPicker.prototype,{initialize:function(options)
+{var basics={Palette:'Small',ClassName:'TColorPicker',Mode:'Basic',OKButtonText:'OK',CancelButtonText:'Cancel',ShowColorPicker:true}
+this.element=null;this.showing=false;options=Object.extend(basics,options);this.options=options;this.input=$(options['ID']);this.button=$(options['ID']+'_button');this._buttonOnClick=this.buttonOnClick.bind(this);if(options['ShowColorPicker'])
+Event.observe(this.button,"click",this._buttonOnClick);Event.observe(this.input,"change",this.updatePicker.bind(this));},updatePicker:function(e)
+{var color=Rico.Color.createFromHex(this.input.value);this.button.style.backgroundColor=color.toString();},buttonOnClick:function(event)
+{var mode=this.options['Mode'];if(this.element==null)
+{var constructor=mode=="Basic"?"getBasicPickerContainer":"getFullPickerContainer"
+this.element=this[constructor](this.options['ID'],this.options['Palette'])
+document.body.appendChild(this.element);this.element.style.display="none";if(Prado.Browser().ie)
+{this.iePopUp=document.createElement('iframe');this.iePopUp.src="";this.iePopUp.style.position="absolute"
this.iePopUp.scrolling="no"
this.iePopUp.frameBorder="0"
-this.input.parentNode.appendChild(this.iePopUp);
-}
-if(mode == "Full")
-this.initializeFullPicker();
-}
-this.show(mode);
-},
-show : function(type)
-{
-if(!this.showing)
-{
-var pos = Position.cumulativeOffset(this.input);
-pos[1] += this.input.offsetHeight;
-this.element.style.top = (pos[1]-1) + "px";
-this.element.style.left = pos[0] + "px";
-this.element.style.display = "block";
-this.ieHack(type);
-this._documentClickEvent = this.hideOnClick.bindEvent(this, type);
-this._documentKeyDownEvent = this.keyPressed.bindEvent(this, type);
-Event.observe(document.body, "click", this._documentClickEvent);
-Event.observe(document,"keydown", this._documentKeyDownEvent);
-this.showing = true;
-if(type == "Full")
-{
-this.observeMouseMovement();
-var color = Rico.Color.createFromHex(this.input.value);
-this.inputs.oldColor.style.backgroundColor = color.asHex();
-this.setColor(color,true);
-}
-}
-},
-hide : function(event)
-{
-if(this.showing)
-{
-if(this.iePopUp)
-this.iePopUp.style.display = "none";
-this.element.style.display = "none";
-this.showing = false;
-Event.stopObserving(document.body, "click", this._documentClickEvent);
-Event.stopObserving(document,"keydown", this._documentKeyDownEvent);
-if(this._observingMouseMove)
-{
-Event.stopObserving(document.body, "mousemove", this._onMouseMove);
-this._observingMouseMove = false;
-}
-}
-},
-keyPressed : function(event,type)
-{
-if(Event.keyCode(event) == Event.KEY_ESC)
-this.hide(event,type);
-},
-hideOnClick : function(ev)
-{
-if(!this.showing) return;
-var el = Event.element(ev);
-var within = false;
-do
-{within = within || String(el.className).indexOf('FullColorPicker') > -1
-within = within || el == this.button;
-within = within || el == this.input;
-if(within) break;
-el = el.parentNode;
-}
-while(el);
-if(!within) this.hide(ev);
-},
-ieHack : function()
-{
-if(this.iePopUp)
-{
-this.iePopUp.style.display = "block";
-this.iePopUp.style.top = (this.element.offsetTop) + "px";
-this.iePopUp.style.left = (this.element.offsetLeft)+ "px";
-this.iePopUp.style.width = Math.abs(this.element.offsetWidth)+ "px";
-this.iePopUp.style.height = (this.element.offsetHeight + 1)+ "px";
-}
-},
-getBasicPickerContainer : function(pickerID, palette)
-{
-var table = TABLE({className:'basic_colors palette_'+palette},TBODY());
-var colors = Prado.WebUI.TColorPicker.palettes[palette];
-var pickerOnClick = this.cellOnClick.bind(this);
-colors.each(function(color)
-{
-var row = document.createElement("tr");
-color.each(function(c)
-{
-var td = document.createElement("td");
-var img = IMG({src:Prado.WebUI.TColorPicker.UIImages['button.gif'],width:16,height:16});
-img.style.backgroundColor = "#"+c;
-Event.observe(img,"click", pickerOnClick);
-Event.observe(img,"mouseover", function(e)
-{
-Element.addClassName(Event.element(e), "pickerhover");
-});
-Event.observe(img,"mouseout", function(e)
-{
-Element.removeClassName(Event.element(e), "pickerhover");
-});
-td.appendChild(img);
-row.appendChild(td);
-});
-table.childNodes[0].appendChild(row);
-});
-return DIV({className:this.options['ClassName']+" BasicColorPicker",
-id:pickerID+"_picker"}, table);
-},
-cellOnClick : function(e)
-{
-var el = Event.element(e);
-if(el.tagName.toLowerCase() != "img")
-return;
-var color = Rico.Color.createColorFromBackground(el);
-this.updateColor(color);
-},
-updateColor : function(color)
-{
-this.input.value = color.toString().toUpperCase();
-this.button.style.backgroundColor = color.toString();
-if(typeof(this.onChange) == "function")
-this.onChange(color);
-},
-getFullPickerContainer : function(pickerID)
-{
-this.buttons =
-{
-OK : INPUT({value:this.options.OKButtonText, className:'button', type:'button'}),
-Cancel : INPUT({value:this.options.CancelButtonText, className:'button', type:'button'})
-};
-var inputs = {};
-['H','S','V','R','G','B'].each(function(type)
-{
-inputs[type] = INPUT({type:'text',size:'3',maxlength:'3'});
-});
-inputs['HEX'] = INPUT({className:'hex',type:'text',size:'6',maxlength:'6'});
-this.inputs = inputs;
-var images = Prado.WebUI.TColorPicker.UIImages;
-this.inputs['currentColor'] = SPAN({className:'currentColor'});
-this.inputs['oldColor'] = SPAN({className:'oldColor'});
-var inputsTable =
-TABLE({className:'inputs'}, TBODY(null,
-TR(null,
-TD({className:'currentcolor',colSpan:2},
-this.inputs['currentColor'], this.inputs['oldColor'])),
-TR(null,
-TD(null,'H:'),
-TD(null,this.inputs['H'], '??')),
-TR(null,
-TD(null,'S:'),
-TD(null,this.inputs['S'], '%')),
-TR(null,
-TD(null,'V:'),
-TD(null,this.inputs['V'], '%')),
-TR(null,
-TD({className:'gap'},'R:'),
-TD({className:'gap'},this.inputs['R'])),
-TR(null,
-TD(null,'G:'),
-TD(null, this.inputs['G'])),
-TR(null,
-TD(null,'B:'),
-TD(null, this.inputs['B'])),
-TR(null,
-TD({className:'gap'},'#'),
-TD({className:'gap'},this.inputs['HEX']))
-));
-var UIimages =
-{
-selector : SPAN({className:'selector'}),
-background : SPAN({className:'colorpanel'}),
-slider : SPAN({className:'slider'}),
-hue : SPAN({className:'strip'})
-}
+this.input.parentNode.appendChild(this.iePopUp);}
+if(mode=="Full")
+this.initializeFullPicker();}
+this.show(mode);},show:function(type)
+{if(!this.showing)
+{var pos=Position.cumulativeOffset(this.input);pos[1]+=this.input.offsetHeight;this.element.style.top=(pos[1]-1)+"px";this.element.style.left=pos[0]+"px";this.element.style.display="block";this.ieHack(type);this._documentClickEvent=this.hideOnClick.bindEvent(this,type);this._documentKeyDownEvent=this.keyPressed.bindEvent(this,type);Event.observe(document.body,"click",this._documentClickEvent);Event.observe(document,"keydown",this._documentKeyDownEvent);this.showing=true;if(type=="Full")
+{this.observeMouseMovement();var color=Rico.Color.createFromHex(this.input.value);this.inputs.oldColor.style.backgroundColor=color.asHex();this.setColor(color,true);}}},hide:function(event)
+{if(this.showing)
+{if(this.iePopUp)
+this.iePopUp.style.display="none";this.element.style.display="none";this.showing=false;Event.stopObserving(document.body,"click",this._documentClickEvent);Event.stopObserving(document,"keydown",this._documentKeyDownEvent);if(this._observingMouseMove)
+{Event.stopObserving(document.body,"mousemove",this._onMouseMove);this._observingMouseMove=false;}}},keyPressed:function(event,type)
+{if(Event.keyCode(event)==Event.KEY_ESC)
+this.hide(event,type);},hideOnClick:function(ev)
+{if(!this.showing)return;var el=Event.element(ev);var within=false;do
+{within=within||String(el.className).indexOf('FullColorPicker')>-1
+within=within||el==this.button;within=within||el==this.input;if(within)break;el=el.parentNode;}
+while(el);if(!within)this.hide(ev);},ieHack:function()
+{if(this.iePopUp)
+{this.iePopUp.style.display="block";this.iePopUp.style.top=(this.element.offsetTop)+"px";this.iePopUp.style.left=(this.element.offsetLeft)+"px";this.iePopUp.style.width=Math.abs(this.element.offsetWidth)+"px";this.iePopUp.style.height=(this.element.offsetHeight+1)+"px";}},getBasicPickerContainer:function(pickerID,palette)
+{var table=TABLE({className:'basic_colors palette_'+palette},TBODY());var colors=Prado.WebUI.TColorPicker.palettes[palette];var pickerOnClick=this.cellOnClick.bind(this);colors.each(function(color)
+{var row=document.createElement("tr");color.each(function(c)
+{var td=document.createElement("td");var img=IMG({src:Prado.WebUI.TColorPicker.UIImages['button.gif'],width:16,height:16});img.style.backgroundColor="#"+c;Event.observe(img,"click",pickerOnClick);Event.observe(img,"mouseover",function(e)
+{Element.addClassName(Event.element(e),"pickerhover");});Event.observe(img,"mouseout",function(e)
+{Element.removeClassName(Event.element(e),"pickerhover");});td.appendChild(img);row.appendChild(td);});table.childNodes[0].appendChild(row);});return DIV({className:this.options['ClassName']+" BasicColorPicker",id:pickerID+"_picker"},table);},cellOnClick:function(e)
+{var el=Event.element(e);if(el.tagName.toLowerCase()!="img")
+return;var color=Rico.Color.createColorFromBackground(el);this.updateColor(color);},updateColor:function(color)
+{this.input.value=color.toString().toUpperCase();this.button.style.backgroundColor=color.toString();if(typeof(this.onChange)=="function")
+this.onChange(color);},getFullPickerContainer:function(pickerID)
+{this.buttons={OK:INPUT({value:this.options.OKButtonText,className:'button',type:'button'}),Cancel:INPUT({value:this.options.CancelButtonText,className:'button',type:'button'})};var inputs={};['H','S','V','R','G','B'].each(function(type)
+{inputs[type]=INPUT({type:'text',size:'3',maxlength:'3'});});inputs['HEX']=INPUT({className:'hex',type:'text',size:'6',maxlength:'6'});this.inputs=inputs;var images=Prado.WebUI.TColorPicker.UIImages;this.inputs['currentColor']=SPAN({className:'currentColor'});this.inputs['oldColor']=SPAN({className:'oldColor'});var inputsTable=TABLE({className:'inputs'},TBODY(null,TR(null,TD({className:'currentcolor',colSpan:2},this.inputs['currentColor'],this.inputs['oldColor'])),TR(null,TD(null,'H:'),TD(null,this.inputs['H'],'??')),TR(null,TD(null,'S:'),TD(null,this.inputs['S'],'%')),TR(null,TD(null,'V:'),TD(null,this.inputs['V'],'%')),TR(null,TD({className:'gap'},'R:'),TD({className:'gap'},this.inputs['R'])),TR(null,TD(null,'G:'),TD(null,this.inputs['G'])),TR(null,TD(null,'B:'),TD(null,this.inputs['B'])),TR(null,TD({className:'gap'},'#'),TD({className:'gap'},this.inputs['HEX']))));var UIimages={selector:SPAN({className:'selector'}),background:SPAN({className:'colorpanel'}),slider:SPAN({className:'slider'}),hue:SPAN({className:'strip'})}
if(Prado.Browser().ie)
-{
-var filter = "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader";
-UIimages['background'] = SPAN({className:'colorpanel',style:filter+"(src='"+images['background.png']+"' sizingMethod=scale);"})
-}
-this.inputs = Object.extend(this.inputs, UIimages);
-var pickerTable =
-TABLE(null,TBODY(null,
-TR({className:'selection'},
-TD({className:'colors'},UIimages['selector'],UIimages['background']),
-TD({className:'hue'},UIimages['slider'],UIimages['hue']),
-TD({className:'inputs'}, inputsTable)
-),
-TR({className:'options'},
-TD({colSpan:3},
-this.buttons['OK'],
-this.buttons['Cancel'])
-)
-));
-return DIV({className:this.options['ClassName']+" FullColorPicker",
-id:pickerID+"_picker"},pickerTable);
-},
-initializeFullPicker : function()
-{
-var color = Rico.Color.createFromHex(this.input.value);
-this.inputs.oldColor.style.backgroundColor = color.asHex();
-this.setColor(color,true);
-var i = 0;
-for(var type in this.inputs)
-{
-Event.observe(this.inputs[type], "change",
-this.onInputChanged.bindEvent(this,type));
-i++;
-if(i > 6) break;
-}
-this.isMouseDownOnColor = false;
-this.isMouseDownOnHue = false;
-this._onColorMouseDown = this.onColorMouseDown.bind(this);
-this._onHueMouseDown = this.onHueMouseDown.bind(this);
-this._onMouseUp = this.onMouseUp.bind(this);
-this._onMouseMove = this.onMouseMove.bind(this);
-Event.observe(this.inputs.background, "mousedown", this._onColorMouseDown);
-Event.observe(this.inputs.selector, "mousedown", this._onColorMouseDown);
-Event.observe(this.inputs.hue, "mousedown", this._onHueMouseDown);
-Event.observe(this.inputs.slider, "mousedown", this._onHueMouseDown);
-Event.observe(document.body, "mouseup", this._onMouseUp);
-this.observeMouseMovement();
-Event.observe(this.buttons.Cancel, "click", this.hide.bindEvent(this,this.options['Mode']));
-Event.observe(this.buttons.OK, "click", this.onOKClicked.bind(this));
-},
-observeMouseMovement : function()
-{
-if(!this._observingMouseMove)
-{
-Event.observe(document.body, "mousemove", this._onMouseMove);
-this._observingMouseMove = true;
-}
-},
-onColorMouseDown : function(ev)
-{
-this.isMouseDownOnColor = true;
-this.onMouseMove(ev);
-Event.stop(ev);
-},
-onHueMouseDown : function(ev)
-{
-this.isMouseDownOnHue = true;
-this.onMouseMove(ev);
-Event.stop(ev);
-},
-onMouseUp : function(ev)
-{
-this.isMouseDownOnColor = false;
-this.isMouseDownOnHue = false;
-Event.stop(ev);
-},
-onMouseMove : function(ev)
-{
-if(this.isMouseDownOnColor)
-this.changeSV(ev);
-if(this.isMouseDownOnHue)
-this.changeH(ev);
-Event.stop(ev);
-},
-changeSV : function(ev)
-{
-var px = Event.pointerX(ev);
-var py = Event.pointerY(ev);
-var pos = Position.cumulativeOffset(this.inputs.background);
-var x = this.truncate(px - pos[0],0,255);
-var y = this.truncate(py - pos[1],0,255);
-var s = x/255;
-var b = (255-y)/255;
-var current_s = parseInt(this.inputs.S.value);
-var current_b = parseInt(this.inputs.V.value);
-if(current_s == parseInt(s*100) && current_b == parseInt(b*100)) return;
-var h = this.truncate(this.inputs.H.value,0,360)/360;
-var color = new Rico.Color();
-color.rgb = Rico.Color.HSBtoRGB(h,s,b);
-this.inputs.selector.style.left = x+"px";
-this.inputs.selector.style.top = y+"px";
-this.inputs.currentColor.style.backgroundColor = color.asHex();
-return this.setColor(color);
-},
-changeH : function(ev)
-{
-var py = Event.pointerY(ev);
-var pos = Position.cumulativeOffset(this.inputs.background);
-var y = this.truncate(py - pos[1],0,255);
-var h = (255-y)/255;
-var current_h = this.truncate(this.inputs.H.value,0,360);
-current_h = current_h == 0 ? 360 : current_h;
-if(current_h == parseInt(h*360)) return;
-var s = parseInt(this.inputs.S.value)/100;
-var b = parseInt(this.inputs.V.value)/100;
-var color = new Rico.Color();
-color.rgb = Rico.Color.HSBtoRGB(h,s,b);
-var hue = new Rico.Color(color.rgb.r,color.rgb.g,color.rgb.b);
-hue.setSaturation(1); hue.setBrightness(1);
-this.inputs.background.style.backgroundColor = hue.asHex();
-this.inputs.currentColor.style.backgroundColor = color.asHex();
-this.inputs.slider.style.top = this.truncate(y,0,255)+"px";
-return this.setColor(color);
-},
-onOKClicked : function(ev)
-{
-var r = this.truncate(this.inputs.R.value,0,255);
-var g = this.truncate(this.inputs.G.value,0,255);
-var b = this.truncate(this.inputs.B.value,0,255);
-var color = new Rico.Color(r,g,b);
-this.updateColor(color);
-this.inputs.oldColor.style.backgroundColor = color.asHex();
-this.hide(ev);
-},
-onInputChanged : function(ev, type)
-{
-if(this.isMouseDownOnColor || isMouseDownOnHue)
-return;
-switch(type)
-{
-case "H": case "S": case "V":
-var h = this.truncate(this.inputs.H.value,0,360)/360;
-var s = this.truncate(this.inputs.S.value,0,100)/100;
-var b = this.truncate(this.inputs.V.value,0,100)/100;
-var color = new Rico.Color();
-color.rgb = Rico.Color.HSBtoRGB(h,s,b);
-return this.setColor(color,true);
-case "R": case "G": case "B":
-var r = this.truncate(this.inputs.R.value,0,255);
-var g = this.truncate(this.inputs.G.value,0,255);
-var b = this.truncate(this.inputs.B.value,0,255);
-var color = new Rico.Color(r,g,b);
-return this.setColor(color,true);
-case "HEX":
-var color = Rico.Color.createFromHex(this.inputs.HEX.value);
-return this.setColor(color,true);
-}
-},
-setColor : function(color, update)
-{
-var hsb = color.asHSB();
-this.inputs.H.value = parseInt(hsb.h*360);
-this.inputs.S.value = parseInt(hsb.s*100);
-this.inputs.V.value = parseInt(hsb.b*100);
-this.inputs.R.value = color.rgb.r;
-this.inputs.G.value = color.rgb.g;
-this.inputs.B.value = color.rgb.b;
-this.inputs.HEX.value = color.asHex().substring(1).toUpperCase();
-var images = Prado.WebUI.TColorPicker.UIImages;
-var changeCss = color.isBright() ? 'removeClassName' : 'addClassName';
-Element[changeCss](this.inputs.selector, 'target_white');
-if(update)
-this.updateSelectors(color);
-},
-updateSelectors : function(color)
-{
-var hsb = color.asHSB();
-var pos = [hsb.s*255, hsb.b*255, hsb.h*255];
-this.inputs.selector.style.left = this.truncate(pos[0],0,255)+"px";
-this.inputs.selector.style.top = this.truncate(255-pos[1],0,255)+"px";
-this.inputs.slider.style.top = this.truncate(255-pos[2],0,255)+"px";
-var hue = new Rico.Color(color.rgb.r,color.rgb.g,color.rgb.b);
-hue.setSaturation(1); hue.setBrightness(1);
-this.inputs.background.style.backgroundColor = hue.asHex();
-this.inputs.currentColor.style.backgroundColor = color.asHex();
-},
-truncate : function(value, min, max)
-{
-value = parseInt(value);
-return value < min ? min : value > max ? max : value;
-}
-});
+{var filter="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader";UIimages['background']=SPAN({className:'colorpanel',style:filter+"(src='"+images['background.png']+"' sizingMethod=scale);"})}
+this.inputs=Object.extend(this.inputs,UIimages);var pickerTable=TABLE(null,TBODY(null,TR({className:'selection'},TD({className:'colors'},UIimages['selector'],UIimages['background']),TD({className:'hue'},UIimages['slider'],UIimages['hue']),TD({className:'inputs'},inputsTable)),TR({className:'options'},TD({colSpan:3},this.buttons['OK'],this.buttons['Cancel']))));return DIV({className:this.options['ClassName']+" FullColorPicker",id:pickerID+"_picker"},pickerTable);},initializeFullPicker:function()
+{var color=Rico.Color.createFromHex(this.input.value);this.inputs.oldColor.style.backgroundColor=color.asHex();this.setColor(color,true);var i=0;for(var type in this.inputs)
+{Event.observe(this.inputs[type],"change",this.onInputChanged.bindEvent(this,type));i++;if(i>6)break;}
+this.isMouseDownOnColor=false;this.isMouseDownOnHue=false;this._onColorMouseDown=this.onColorMouseDown.bind(this);this._onHueMouseDown=this.onHueMouseDown.bind(this);this._onMouseUp=this.onMouseUp.bind(this);this._onMouseMove=this.onMouseMove.bind(this);Event.observe(this.inputs.background,"mousedown",this._onColorMouseDown);Event.observe(this.inputs.selector,"mousedown",this._onColorMouseDown);Event.observe(this.inputs.hue,"mousedown",this._onHueMouseDown);Event.observe(this.inputs.slider,"mousedown",this._onHueMouseDown);Event.observe(document.body,"mouseup",this._onMouseUp);this.observeMouseMovement();Event.observe(this.buttons.Cancel,"click",this.hide.bindEvent(this,this.options['Mode']));Event.observe(this.buttons.OK,"click",this.onOKClicked.bind(this));},observeMouseMovement:function()
+{if(!this._observingMouseMove)
+{Event.observe(document.body,"mousemove",this._onMouseMove);this._observingMouseMove=true;}},onColorMouseDown:function(ev)
+{this.isMouseDownOnColor=true;this.onMouseMove(ev);Event.stop(ev);},onHueMouseDown:function(ev)
+{this.isMouseDownOnHue=true;this.onMouseMove(ev);Event.stop(ev);},onMouseUp:function(ev)
+{this.isMouseDownOnColor=false;this.isMouseDownOnHue=false;Event.stop(ev);},onMouseMove:function(ev)
+{if(this.isMouseDownOnColor)
+this.changeSV(ev);if(this.isMouseDownOnHue)
+this.changeH(ev);Event.stop(ev);},changeSV:function(ev)
+{var px=Event.pointerX(ev);var py=Event.pointerY(ev);var pos=Position.cumulativeOffset(this.inputs.background);var x=this.truncate(px-pos[0],0,255);var y=this.truncate(py-pos[1],0,255);var s=x/255;var b=(255-y)/255;var current_s=parseInt(this.inputs.S.value);var current_b=parseInt(this.inputs.V.value);if(current_s==parseInt(s*100)&&current_b==parseInt(b*100))return;var h=this.truncate(this.inputs.H.value,0,360)/360;var color=new Rico.Color();color.rgb=Rico.Color.HSBtoRGB(h,s,b);this.inputs.selector.style.left=x+"px";this.inputs.selector.style.top=y+"px";this.inputs.currentColor.style.backgroundColor=color.asHex();return this.setColor(color);},changeH:function(ev)
+{var py=Event.pointerY(ev);var pos=Position.cumulativeOffset(this.inputs.background);var y=this.truncate(py-pos[1],0,255);var h=(255-y)/255;var current_h=this.truncate(this.inputs.H.value,0,360);current_h=current_h==0?360:current_h;if(current_h==parseInt(h*360))return;var s=parseInt(this.inputs.S.value)/100;var b=parseInt(this.inputs.V.value)/100;var color=new Rico.Color();color.rgb=Rico.Color.HSBtoRGB(h,s,b);var hue=new Rico.Color(color.rgb.r,color.rgb.g,color.rgb.b);hue.setSaturation(1);hue.setBrightness(1);this.inputs.background.style.backgroundColor=hue.asHex();this.inputs.currentColor.style.backgroundColor=color.asHex();this.inputs.slider.style.top=this.truncate(y,0,255)+"px";return this.setColor(color);},onOKClicked:function(ev)
+{var r=this.truncate(this.inputs.R.value,0,255);var g=this.truncate(this.inputs.G.value,0,255);var b=this.truncate(this.inputs.B.value,0,255);var color=new Rico.Color(r,g,b);this.updateColor(color);this.inputs.oldColor.style.backgroundColor=color.asHex();this.hide(ev);},onInputChanged:function(ev,type)
+{if(this.isMouseDownOnColor||isMouseDownOnHue)
+return;switch(type)
+{case"H":case"S":case"V":var h=this.truncate(this.inputs.H.value,0,360)/360;var s=this.truncate(this.inputs.S.value,0,100)/100;var b=this.truncate(this.inputs.V.value,0,100)/100;var color=new Rico.Color();color.rgb=Rico.Color.HSBtoRGB(h,s,b);return this.setColor(color,true);case"R":case"G":case"B":var r=this.truncate(this.inputs.R.value,0,255);var g=this.truncate(this.inputs.G.value,0,255);var b=this.truncate(this.inputs.B.value,0,255);var color=new Rico.Color(r,g,b);return this.setColor(color,true);case"HEX":var color=Rico.Color.createFromHex(this.inputs.HEX.value);return this.setColor(color,true);}},setColor:function(color,update)
+{var hsb=color.asHSB();this.inputs.H.value=parseInt(hsb.h*360);this.inputs.S.value=parseInt(hsb.s*100);this.inputs.V.value=parseInt(hsb.b*100);this.inputs.R.value=color.rgb.r;this.inputs.G.value=color.rgb.g;this.inputs.B.value=color.rgb.b;this.inputs.HEX.value=color.asHex().substring(1).toUpperCase();var images=Prado.WebUI.TColorPicker.UIImages;var changeCss=color.isBright()?'removeClassName':'addClassName';Element[changeCss](this.inputs.selector,'target_white');if(update)
+this.updateSelectors(color);},updateSelectors:function(color)
+{var hsb=color.asHSB();var pos=[hsb.s*255,hsb.b*255,hsb.h*255];this.inputs.selector.style.left=this.truncate(pos[0],0,255)+"px";this.inputs.selector.style.top=this.truncate(255-pos[1],0,255)+"px";this.inputs.slider.style.top=this.truncate(255-pos[2],0,255)+"px";var hue=new Rico.Color(color.rgb.r,color.rgb.g,color.rgb.b);hue.setSaturation(1);hue.setBrightness(1);this.inputs.background.style.backgroundColor=hue.asHex();this.inputs.currentColor.style.backgroundColor=color.asHex();},truncate:function(value,min,max)
+{value=parseInt(value);return value<min?min:value>max?max:value;}}); \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js
index 19d39bbe..6a28c061 100644
--- a/framework/Web/Javascripts/js/datepicker.js
+++ b/framework/Web/Javascripts/js/datepicker.js
@@ -1,537 +1,116 @@
-Prado.WebUI.TDatePicker = Class.create();
-Object.extend(Prado.WebUI.TDatePicker,
-{
-getDropDownDate : function(control)
-{
-var now=new Date();
-var year=now.getFullYear();
-var month=now.getMonth();
-var day=1;
-var month_list = this.getMonthListControl(control);
- var day_list = this.getDayListControl(control);
- var year_list = this.getYearListControl(control);
-var day = day_list ? $F(day_list) : 1;
-var month = month_list ? $F(month_list) : now.getMonth();
-var year = year_list ? $F(year_list) : now.getFullYear();
-return new Date(year,month,day, 0, 0, 0);
-},
-getYearListControl : function(control)
-{
-return $(control.id+"_year");
-},
-getMonthListControl : function(control)
-{
-return $(control.id+"_month");
-},
-getDayListControl : function(control)
-{
-return $(control.id+"_day");
-}
-});
-Prado.WebUI.TDatePicker.prototype =
-{
-MonthNames : ["January","February","March","April",
-"May","June","July","August",
-"September","October","November","December"
-],
-AbbreviatedMonthNames : ["Jan", "Feb", "Mar", "Apr", "May",
-"Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
-ShortWeekDayNames : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
-Format : "yyyy-MM-dd",
-FirstDayOfWeek : 1,
-ClassName : "TDatePicker",
-FromYear : 2000, UpToYear: 2015,
-initialize : function(options)
-{
-this.options = options || [];
-this.control = $(options.ID);
-this.dateSlot = new Array(42);
-this.weekSlot = new Array(6);
-this.minimalDaysInFirstWeek= 4;
-this.selectedDate = this.newDate();
-if(this.options.Trigger)
-{
-this.trigger = $(this.options.Trigger) ;
-var triggerEvent = this.options.TriggerEvent || "click";
-}
+
+Prado.WebUI.TDatePicker=Class.create();Object.extend(Prado.WebUI.TDatePicker,{getDropDownDate:function(control)
+{var now=new Date();var year=now.getFullYear();var month=now.getMonth();var day=1;var month_list=this.getMonthListControl(control);var day_list=this.getDayListControl(control);var year_list=this.getYearListControl(control);var day=day_list?$F(day_list):1;var month=month_list?$F(month_list):now.getMonth();var year=year_list?$F(year_list):now.getFullYear();return new Date(year,month,day,0,0,0);},getYearListControl:function(control)
+{return $(control.id+"_year");},getMonthListControl:function(control)
+{return $(control.id+"_month");},getDayListControl:function(control)
+{return $(control.id+"_day");}});Prado.WebUI.TDatePicker.prototype={MonthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],AbbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],ShortWeekDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Format:"yyyy-MM-dd",FirstDayOfWeek:1,ClassName:"TDatePicker",FromYear:2000,UpToYear:2015,initialize:function(options)
+{this.options=options||[];this.control=$(options.ID);this.dateSlot=new Array(42);this.weekSlot=new Array(6);this.minimalDaysInFirstWeek=4;this.selectedDate=this.newDate();if(this.options.Trigger)
+{this.trigger=$(this.options.Trigger);var triggerEvent=this.options.TriggerEvent||"click";}
else
-{
-this.trigger= this.control;
-var triggerEvent = this.options.TriggerEvent || "focus";
-}
-Object.extend(this,options);
-Event.observe(this.trigger, triggerEvent, this.show.bindEvent(this));
-this.create();
-},
-create : function()
-{
-var div;
-var table;
-var tbody;
-var tr;
-var td;
-this._calDiv = document.createElement("div");
-this._calDiv.className = this.ClassName;
-this._calDiv.style.display = "none";
-this._calDiv.style.position = "absolute"
-div = document.createElement("div");
-div.className = "calendarHeader";
-this._calDiv.appendChild(div);
-table = document.createElement("table");
-table.style.cellSpacing = 0;
-div.appendChild(table);
-tbody = document.createElement("tbody");
-table.appendChild(tbody);
-tr = document.createElement("tr");
-tbody.appendChild(tr);
-td = document.createElement("td");
-var previousMonth = document.createElement("button");
-previousMonth.className = "prevMonthButton";
-previousMonth.appendChild(document.createTextNode("<<"));
-td.appendChild(previousMonth);
-tr.appendChild(td);
-td = document.createElement("td");
-tr.appendChild(td);
-this._monthSelect = document.createElement("select");
-this._monthSelect.className = "months";
-for (var i = 0 ; i < this.MonthNames.length ; i++) {
-var opt = document.createElement("option");
-opt.innerHTML = this.MonthNames[i];
-opt.value = i;
-if (i == this.selectedDate.getMonth()) {
-opt.selected = true;
-}
-this._monthSelect.appendChild(opt);
-}
-td.appendChild(this._monthSelect);
-td = document.createElement("td");
-td.className = "labelContainer";
-tr.appendChild(td);
-this._yearSelect = document.createElement("select");
-for(var i=this.FromYear; i <= this.UpToYear; ++i) {
-var opt = document.createElement("option");
-opt.innerHTML = i;
-opt.value = i;
-if (i == this.selectedDate.getFullYear()) {
-opt.selected = false;
-}
-this._yearSelect.appendChild(opt);
-}
-td.appendChild(this._yearSelect);
-td = document.createElement("td");
-td.className = "nextMonthButton";
-var nextMonth = document.createElement("button");
-nextMonth.appendChild(document.createTextNode(">>"));
-td.appendChild(nextMonth);
-tr.appendChild(td);
-div = document.createElement("div");
-div.className = "calendarBody";
-this._calDiv.appendChild(div);
-var calendarBody = div;
-var text;
-table = document.createElement("table");
-table.className = "grid";
-div.appendChild(table);
-var thead = document.createElement("thead");
-table.appendChild(thead);
-tr = document.createElement("tr");
-thead.appendChild(tr);
-for(i=0; i < 7; ++i) {
-td = document.createElement("th");
-text = document.createTextNode(this.ShortWeekDayNames[(i+this.FirstDayOfWeek)%7]);
-td.appendChild(text);
-td.className = "weekDayHead";
-tr.appendChild(td);
-}
-tbody = document.createElement("tbody");
-table.appendChild(tbody);
-for(week=0; week<6; ++week) {
-tr = document.createElement("tr");
-tbody.appendChild(tr);
-for(day=0; day<7; ++day) {
-td = document.createElement("td");
-td.className = "calendarDate";
-text = document.createTextNode(String.fromCharCode(160));
-td.appendChild(text);
-tr.appendChild(td);
-var tmp = new Object();
-tmp.tag = "DATE";
-tmp.value = -1;
-tmp.data = text;
-this.dateSlot[(week*7)+day] = tmp;
-Event.observe(td, "mouseover", this.hover.bindEvent(this));
-Event.observe(td, "mouseout", this.hover.bindEvent(this));
-}
-}
-div = document.createElement("div");
-div.className = "calendarFooter";
-this._calDiv.appendChild(div);
-var todayButton = document.createElement("button");
-todayButton.className = "todayButton";
-var today = this.newDate();
-var buttonText = today.SimpleFormat(this.Format,this);
-todayButton.appendChild(document.createTextNode(buttonText));
-div.appendChild(todayButton);
-if(Prado.Browser().ie)
-{
-this.iePopUp = document.createElement('iframe');
-this.iePopUp.src = "";
-this.iePopUp.style.position = "absolute"
+{this.trigger=this.control;var triggerEvent=this.options.TriggerEvent||"focus";}
+Object.extend(this,options);Event.observe(this.trigger,triggerEvent,this.show.bindEvent(this));this.create();},create:function()
+{var div;var table;var tbody;var tr;var td;this._calDiv=document.createElement("div");this._calDiv.className=this.ClassName;this._calDiv.style.display="none";this._calDiv.style.position="absolute"
+div=document.createElement("div");div.className="calendarHeader";this._calDiv.appendChild(div);table=document.createElement("table");table.style.cellSpacing=0;div.appendChild(table);tbody=document.createElement("tbody");table.appendChild(tbody);tr=document.createElement("tr");tbody.appendChild(tr);td=document.createElement("td");var previousMonth=document.createElement("button");previousMonth.className="prevMonthButton";previousMonth.appendChild(document.createTextNode("<<"));td.appendChild(previousMonth);tr.appendChild(td);td=document.createElement("td");tr.appendChild(td);this._monthSelect=document.createElement("select");this._monthSelect.className="months";for(var i=0;i<this.MonthNames.length;i++){var opt=document.createElement("option");opt.innerHTML=this.MonthNames[i];opt.value=i;if(i==this.selectedDate.getMonth()){opt.selected=true;}
+this._monthSelect.appendChild(opt);}
+td.appendChild(this._monthSelect);td=document.createElement("td");td.className="labelContainer";tr.appendChild(td);this._yearSelect=document.createElement("select");for(var i=this.FromYear;i<=this.UpToYear;++i){var opt=document.createElement("option");opt.innerHTML=i;opt.value=i;if(i==this.selectedDate.getFullYear()){opt.selected=false;}
+this._yearSelect.appendChild(opt);}
+td.appendChild(this._yearSelect);td=document.createElement("td");td.className="nextMonthButton";var nextMonth=document.createElement("button");nextMonth.appendChild(document.createTextNode(">>"));td.appendChild(nextMonth);tr.appendChild(td);div=document.createElement("div");div.className="calendarBody";this._calDiv.appendChild(div);var calendarBody=div;var text;table=document.createElement("table");table.className="grid";div.appendChild(table);var thead=document.createElement("thead");table.appendChild(thead);tr=document.createElement("tr");thead.appendChild(tr);for(i=0;i<7;++i){td=document.createElement("th");text=document.createTextNode(this.ShortWeekDayNames[(i+this.FirstDayOfWeek)%7]);td.appendChild(text);td.className="weekDayHead";tr.appendChild(td);}
+tbody=document.createElement("tbody");table.appendChild(tbody);for(week=0;week<6;++week){tr=document.createElement("tr");tbody.appendChild(tr);for(day=0;day<7;++day){td=document.createElement("td");td.className="calendarDate";text=document.createTextNode(String.fromCharCode(160));td.appendChild(text);tr.appendChild(td);var tmp=new Object();tmp.tag="DATE";tmp.value=-1;tmp.data=text;this.dateSlot[(week*7)+day]=tmp;Event.observe(td,"mouseover",this.hover.bindEvent(this));Event.observe(td,"mouseout",this.hover.bindEvent(this));}}
+div=document.createElement("div");div.className="calendarFooter";this._calDiv.appendChild(div);var todayButton=document.createElement("button");todayButton.className="todayButton";var today=this.newDate();var buttonText=today.SimpleFormat(this.Format,this);todayButton.appendChild(document.createTextNode(buttonText));div.appendChild(todayButton);if(Prado.Browser().ie)
+{this.iePopUp=document.createElement('iframe');this.iePopUp.src="";this.iePopUp.style.position="absolute"
this.iePopUp.scrolling="no"
this.iePopUp.frameBorder="0"
-document.body.appendChild(this.iePopUp);
-}
-document.body.appendChild(this._calDiv);
-this.update();
-this.updateHeader();
-this.ieHack(true);
-previousMonth.hideFocus = true;
-nextMonth.hideFocus = true;
-todayButton.hideFocus = true;
-Event.observe(previousMonth, "click", this.prevMonth.bindEvent(this));
-Event.observe(nextMonth, "click", this.nextMonth.bindEvent(this));
-Event.observe(todayButton, "click", this.selectToday.bindEvent(this));
-Event.observe(this._monthSelect, "change", this.monthSelect.bindEvent(this));
-Event.observe(this._yearSelect, "change", this.yearSelect.bindEvent(this));
-Event.observe(this._calDiv, "mousewheel", this.mouseWheelChange.bindEvent(this));
-Event.observe(calendarBody, "click", this.selectDate.bindEvent(this));
-},
-ieHack : function(cleanup)
-{
-if(this.iePopUp)
-{
-this.iePopUp.style.display = "block";
-this.iePopUp.style.top = (this._calDiv.offsetTop -1 ) + "px";
-this.iePopUp.style.left = (this._calDiv.offsetLeft -1)+ "px";
-this.iePopUp.style.width = Math.abs(this._calDiv.offsetWidth -2)+ "px";
-this.iePopUp.style.height = (this._calDiv.offsetHeight + 1)+ "px";
-if(cleanup) this.iePopUp.style.display = "none";
-}
-},
-keyPressed : function(ev)
-{
-if(!this.showing) return;
-if (!ev) ev = document.parentWindow.event;
-var kc = ev.keyCode != null ? ev.keyCode : ev.charCode;
-if(kc == Event.KEY_RETURN)
-{
-this.setSelectedDate(this.selectedDate);
-Event.stop(ev);
-this.hide();
-}
-if(kc == Event.KEY_ESC)
-{
-Event.stop(ev); this.hide();
-}
-var getDaysPerMonth = function (nMonth, nYear)
-{
-nMonth = (nMonth + 12) % 12;
-var days= [31,28,31,30,31,30,31,31,30,31,30,31];
-var res = days[nMonth];
-if (nMonth == 1)
-res += nYear % 4 == 0 && !(nYear % 400 == 0) ? 1 : 0;
-return res;
-}
-if(kc < 37 || kc > 40) return true;
-var current = this.selectedDate;
-var d = current.valueOf();
-if(kc == Event.KEY_LEFT)
-{
-if(ev.ctrlKey || ev.shiftKey)
-{
-current.setDate( Math.min(current.getDate(), getDaysPerMonth(current.getMonth() - 1,current.getFullYear())) );
-d = current.setMonth( current.getMonth() - 1 );
-}
+document.body.appendChild(this.iePopUp);}
+document.body.appendChild(this._calDiv);this.update();this.updateHeader();this.ieHack(true);previousMonth.hideFocus=true;nextMonth.hideFocus=true;todayButton.hideFocus=true;Event.observe(previousMonth,"click",this.prevMonth.bindEvent(this));Event.observe(nextMonth,"click",this.nextMonth.bindEvent(this));Event.observe(todayButton,"click",this.selectToday.bindEvent(this));Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this));Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this));Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this));Event.observe(calendarBody,"click",this.selectDate.bindEvent(this));},ieHack:function(cleanup)
+{if(this.iePopUp)
+{this.iePopUp.style.display="block";this.iePopUp.style.top=(this._calDiv.offsetTop-1)+"px";this.iePopUp.style.left=(this._calDiv.offsetLeft-1)+"px";this.iePopUp.style.width=Math.abs(this._calDiv.offsetWidth-2)+"px";this.iePopUp.style.height=(this._calDiv.offsetHeight+1)+"px";if(cleanup)this.iePopUp.style.display="none";}},keyPressed:function(ev)
+{if(!this.showing)return;if(!ev)ev=document.parentWindow.event;var kc=ev.keyCode!=null?ev.keyCode:ev.charCode;if(kc==Event.KEY_RETURN)
+{this.setSelectedDate(this.selectedDate);Event.stop(ev);this.hide();}
+if(kc==Event.KEY_ESC)
+{Event.stop(ev);this.hide();}
+var getDaysPerMonth=function(nMonth,nYear)
+{nMonth=(nMonth+12)%12;var days=[31,28,31,30,31,30,31,31,30,31,30,31];var res=days[nMonth];if(nMonth==1)
+res+=nYear%4==0&&!(nYear%400==0)?1:0;return res;}
+if(kc<37||kc>40)return true;var current=this.selectedDate;var d=current.valueOf();if(kc==Event.KEY_LEFT)
+{if(ev.ctrlKey||ev.shiftKey)
+{current.setDate(Math.min(current.getDate(),getDaysPerMonth(current.getMonth()-1,current.getFullYear())));d=current.setMonth(current.getMonth()-1);}
else
-d -= 86400000;
-}
-else if (kc == Event.KEY_RIGHT)
-{
-if(ev.ctrlKey || ev.shiftKey)
-{
-current.setDate( Math.min(current.getDate(), getDaysPerMonth(current.getMonth() + 1,current.getFullYear())) );
-d = current.setMonth( current.getMonth() + 1 );
-}
+d-=86400000;}
+else if(kc==Event.KEY_RIGHT)
+{if(ev.ctrlKey||ev.shiftKey)
+{current.setDate(Math.min(current.getDate(),getDaysPerMonth(current.getMonth()+1,current.getFullYear())));d=current.setMonth(current.getMonth()+1);}
else
-d += 86400000;
-}
-else if (kc == Event.KEY_UP)
-{
-if(ev.ctrlKey || ev.shiftKey)
-{
-current.setDate( Math.min(current.getDate(), getDaysPerMonth(current.getMonth(),current.getFullYear() - 1)) );
-d = current.setFullYear( current.getFullYear() - 1 );
-}
+d+=86400000;}
+else if(kc==Event.KEY_UP)
+{if(ev.ctrlKey||ev.shiftKey)
+{current.setDate(Math.min(current.getDate(),getDaysPerMonth(current.getMonth(),current.getFullYear()-1)));d=current.setFullYear(current.getFullYear()-1);}
else
-d -= 604800000;
-}
-else if (kc == Event.KEY_DOWN)
-{
-if(ev.ctrlKey || ev.shiftKey)
-{
-current.setDate( Math.min(current.getDate(), getDaysPerMonth(current.getMonth(),current.getFullYear() + 1)) );
-d = current.setFullYear( current.getFullYear() + 1 );
-}
-else
-d += 7 * 24 * 61 * 60 * 1000;
-}
-this.setSelectedDate(d);
-Event.stop(ev);
-},
-selectDate : function(ev)
-{
-var el = Event.element(ev);
-while (el.nodeType != 1)
-el = el.parentNode;
-while (el != null && el.tagName && el.tagName.toLowerCase() != "td")
-el = el.parentNode;
-if (el == null || el.tagName == null || el.tagName.toLowerCase() != "td")
-return;
-var d = this.newDate(this.selectedDate);
-var n = Number(el.firstChild.data);
-if (isNaN(n) || n <= 0 || n == null)
-return;
-d.setDate(n);
-this.setSelectedDate(d);
-this.hide();
-},
-selectToday : function()
-{
-if(this.selectedDate.toISODate() == this.newDate().toISODate())
-this.hide();
-this.setSelectedDate(this.newDate());
-},
-clearSelection : function()
-{
-this.setSelectedDate(this.newDate());
-this.hide();
-},
-monthSelect : function(ev)
-{
-this.setMonth(Form.Element.getValue(Event.element(ev)));
-},
-yearSelect : function(ev)
-{
-this.setYear(Form.Element.getValue(Event.element(ev)));
-},
-mouseWheelChange : function (e)
-{
-if (e == null) e = document.parentWindow.event;
-var n = - e.wheelDelta / 120;
-var d = this.newDate(this.selectedDate);
-var m = d.getMonth() + n;
-this.setMonth(m);
-return false;
-},
-onChange : function()
-{
-if(this.options.InputMode == "TextBox")
-{
-this.control.value = this.formatDate();
-Event.fireEvent(this.control, "change");
-}
+d-=604800000;}
+else if(kc==Event.KEY_DOWN)
+{if(ev.ctrlKey||ev.shiftKey)
+{current.setDate(Math.min(current.getDate(),getDaysPerMonth(current.getMonth(),current.getFullYear()+1)));d=current.setFullYear(current.getFullYear()+1);}
else
-{
-var day = Prado.WebUI.TDatePicker.getDayListControl(this.control);
-var month = Prado.WebUI.TDatePicker.getMonthListControl(this.control);
-var year = Prado.WebUI.TDatePicker.getYearListControl(this.control);
-var date = this.selectedDate;
-if(day)
-{
-day.selectedIndex = date.getDate()-1;
-}
+d+=7*24*61*60*1000;}
+this.setSelectedDate(d);Event.stop(ev);},selectDate:function(ev)
+{var el=Event.element(ev);while(el.nodeType!=1)
+el=el.parentNode;while(el!=null&&el.tagName&&el.tagName.toLowerCase()!="td")
+el=el.parentNode;if(el==null||el.tagName==null||el.tagName.toLowerCase()!="td")
+return;var d=this.newDate(this.selectedDate);var n=Number(el.firstChild.data);if(isNaN(n)||n<=0||n==null)
+return;d.setDate(n);this.setSelectedDate(d);this.hide();},selectToday:function()
+{if(this.selectedDate.toISODate()==this.newDate().toISODate())
+this.hide();this.setSelectedDate(this.newDate());},clearSelection:function()
+{this.setSelectedDate(this.newDate());this.hide();},monthSelect:function(ev)
+{this.setMonth(Form.Element.getValue(Event.element(ev)));},yearSelect:function(ev)
+{this.setYear(Form.Element.getValue(Event.element(ev)));},mouseWheelChange:function(e)
+{if(e==null)e=document.parentWindow.event;var n=-e.wheelDelta/120;var d=this.newDate(this.selectedDate);var m=d.getMonth()+n;this.setMonth(m);return false;},onChange:function()
+{if(this.options.InputMode=="TextBox")
+{this.control.value=this.formatDate();Event.fireEvent(this.control,"change");}
+else
+{var day=Prado.WebUI.TDatePicker.getDayListControl(this.control);var month=Prado.WebUI.TDatePicker.getMonthListControl(this.control);var year=Prado.WebUI.TDatePicker.getYearListControl(this.control);var date=this.selectedDate;if(day)
+{day.selectedIndex=date.getDate()-1;}
if(month)
-{
-month.selectedIndex = date.getMonth();
-}
+{month.selectedIndex=date.getMonth();}
if(year)
-{
-var years = year.options;
-var currentYear = date.getFullYear();
-for(var i = 0; i < years.length; i++)
-years[i].selected = years[i].value.toInteger() == currentYear;
-}
-Event.fireEvent(day || month || year, "change");
-}
-},
-formatDate : function()
-{
-return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format,this) : '';
-},
-newDate : function(date)
-{
-if(!date)
-date = new Date();
-if(typeof(date) == "string" || typeof(date) == "number")
-date = new Date(date);
-return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0,0,0);
-},
-setSelectedDate : function(date)
-{
-if (date == null)
-return;
-this.selectedDate = this.newDate(date);
-this.updateHeader();
-this.update();
-if (typeof(this.onChange) == "function")
-this.onChange();
-},
-getElement : function()
-{
-return this._calDiv;
-},
-getSelectedDate : function ()
-{
-return this.selectedDate == null ? null : this.newDate(this.selectedDate);
-},
-setYear : function(year)
-{
-var d = this.newDate(this.selectedDate);
-d.setFullYear(year);
-this.setSelectedDate(d);
-},
-setMonth : function (month)
-{
-var d = this.newDate(this.selectedDate);
-d.setMonth(month);
-this.setSelectedDate(d);
-},
-nextMonth : function ()
-{
-this.setMonth(this.selectedDate.getMonth()+1);
-},
-prevMonth : function ()
-{
-this.setMonth(this.selectedDate.getMonth()-1);
-},
-show : function()
-{
-if(!this.showing)
-{
-var pos = Position.cumulativeOffset(this.control);
-if(this.options.InputMode == "TextBox")
-pos[1] += this.control.offsetHeight;
-else
-{
-var dayList = Prado.WebUI.TDatePicker.getDayListControl(this.control);
-if(dayList)
-pos[1] += dayList.offsetHeight-1;
-}
-this._calDiv.style.display = "block";
-this._calDiv.style.top = (pos[1]-1) + "px";
-this._calDiv.style.left = pos[0] + "px";
-this.ieHack(false);
-this.documentClickEvent = this.hideOnClick.bindEvent(this);
-this.documentKeyDownEvent = this.keyPressed.bindEvent(this);
-Event.observe(document.body, "click", this.documentClickEvent);
-var date = this.getDateFromInput();
-if(date)
-{
-this.selectedDate = date;
-this.setSelectedDate(date);
-}
-Event.observe(document,"keydown", this.documentKeyDownEvent);
-this.showing = true;
-}
-},
-getDateFromInput : function()
-{
-if(this.options.InputMode == "TextBox")
-return Date.SimpleParse($F(this.control), this.Format);
-else
-return Prado.WebUI.TDatePicker.getDropDownDate(this.control);
-},
-hideOnClick : function(ev)
-{
-if(!this.showing) return;
-var el = Event.element(ev);
-var within = false;
-do
-{
-within = within || el.className == this.ClassName;
-within = within || el == this.trigger;
-within = within || el == this.control;
-if(within) break;
-el = el.parentNode;
-}
-while(el);
-if(!within) this.hide();
-},
-hide : function()
-{
-if(this.showing)
-{
-this._calDiv.style.display = "none";
-if(this.iePopUp)
-this.iePopUp.style.display = "none";
-this.showing = false;
-Event.stopObserving(document.body, "click", this.documentClickEvent);
-Event.stopObserving(document,"keydown", this.documentKeyDownEvent);
-}
-},
-update : function()
-{
-var date = this.selectedDate;
-var today = (this.newDate()).toISODate();
-var selected = date.toISODate();
-var d1 = new Date(date.getFullYear(), date.getMonth(), 1);
-var d2 = new Date(date.getFullYear(), date.getMonth()+1, 1);
-var monthLength = Math.round((d2 - d1) / (24 * 60 * 60 * 1000));
-var firstIndex = (d1.getDay() - this.FirstDayOfWeek) % 7 ;
-if (firstIndex < 0)
-firstIndex += 7;
-var index = 0;
-while (index < firstIndex) {
-this.dateSlot[index].value = -1;
-this.dateSlot[index].data.data = String.fromCharCode(160);
-this.dateSlot[index].data.parentNode.className = "empty";
-index++;
-}
-for (i = 1; i <= monthLength; i++, index++) {
-var slot = this.dateSlot[index];
-var slotNode = slot.data.parentNode;
-slot.value = i;
-slot.data.data = i;
-slotNode.className = "date";
-if (d1.toISODate() == today) {
-slotNode.className += " today";
-}
-if (d1.toISODate() == selected) {
-slotNode.className += " selected";
-}
-d1 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate()+1);
-}
-var lastDateIndex = index;
-while(index < 42) {
-this.dateSlot[index].value = -1;
-this.dateSlot[index].data.data = String.fromCharCode(160);
-this.dateSlot[index].data.parentNode.className = "empty";
-++index;
-}
-},
-hover : function(ev)
-{
-if(ev.type == "mouseover")
-Event.element(ev).addClassName("hover");
-else
-Event.element(ev).removeClassName("hover");
-},
-updateHeader : function () {
-var options = this._monthSelect.options;
-var m = this.selectedDate.getMonth();
-for(var i=0; i < options.length; ++i) {
-options[i].selected = false;
-if (options[i].value == m) {
-options[i].selected = true;
-}
-}
-options = this._yearSelect.options;
-var year = this.selectedDate.getFullYear();
-for(var i=0; i < options.length; ++i) {
-options[i].selected = false;
-if (options[i].value == year) {
-options[i].selected = true;
-}
-}
-}
-};
+{var years=year.options;var currentYear=date.getFullYear();for(var i=0;i<years.length;i++)
+years[i].selected=years[i].value.toInteger()==currentYear;}
+Event.fireEvent(day||month||year,"change");}},formatDate:function()
+{return this.selectedDate?this.selectedDate.SimpleFormat(this.Format,this):'';},newDate:function(date)
+{if(!date)
+date=new Date();if(typeof(date)=="string"||typeof(date)=="number")
+date=new Date(date);return new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0);},setSelectedDate:function(date)
+{if(date==null)
+return;this.selectedDate=this.newDate(date);this.updateHeader();this.update();if(typeof(this.onChange)=="function")
+this.onChange();},getElement:function()
+{return this._calDiv;},getSelectedDate:function()
+{return this.selectedDate==null?null:this.newDate(this.selectedDate);},setYear:function(year)
+{var d=this.newDate(this.selectedDate);d.setFullYear(year);this.setSelectedDate(d);},setMonth:function(month)
+{var d=this.newDate(this.selectedDate);d.setMonth(month);this.setSelectedDate(d);},nextMonth:function()
+{this.setMonth(this.selectedDate.getMonth()+1);},prevMonth:function()
+{this.setMonth(this.selectedDate.getMonth()-1);},show:function()
+{if(!this.showing)
+{var pos=Position.cumulativeOffset(this.control);if(this.options.InputMode=="TextBox")
+pos[1]+=this.control.offsetHeight;else
+{var dayList=Prado.WebUI.TDatePicker.getDayListControl(this.control);if(dayList)
+pos[1]+=dayList.offsetHeight-1;}
+this._calDiv.style.display="block";this._calDiv.style.top=(pos[1]-1)+"px";this._calDiv.style.left=pos[0]+"px";this.ieHack(false);this.documentClickEvent=this.hideOnClick.bindEvent(this);this.documentKeyDownEvent=this.keyPressed.bindEvent(this);Event.observe(document.body,"click",this.documentClickEvent);var date=this.getDateFromInput();if(date)
+{this.selectedDate=date;this.setSelectedDate(date);}
+Event.observe(document,"keydown",this.documentKeyDownEvent);this.showing=true;}},getDateFromInput:function()
+{if(this.options.InputMode=="TextBox")
+return Date.SimpleParse($F(this.control),this.Format);else
+return Prado.WebUI.TDatePicker.getDropDownDate(this.control);},hideOnClick:function(ev)
+{if(!this.showing)return;var el=Event.element(ev);var within=false;do
+{within=within||el.className==this.ClassName;within=within||el==this.trigger;within=within||el==this.control;if(within)break;el=el.parentNode;}
+while(el);if(!within)this.hide();},hide:function()
+{if(this.showing)
+{this._calDiv.style.display="none";if(this.iePopUp)
+this.iePopUp.style.display="none";this.showing=false;Event.stopObserving(document.body,"click",this.documentClickEvent);Event.stopObserving(document,"keydown",this.documentKeyDownEvent);}},update:function()
+{var date=this.selectedDate;var today=(this.newDate()).toISODate();var selected=date.toISODate();var d1=new Date(date.getFullYear(),date.getMonth(),1);var d2=new Date(date.getFullYear(),date.getMonth()+1,1);var monthLength=Math.round((d2-d1)/(24*60*60*1000));var firstIndex=(d1.getDay()-this.FirstDayOfWeek)%7;if(firstIndex<0)
+firstIndex+=7;var index=0;while(index<firstIndex){this.dateSlot[index].value=-1;this.dateSlot[index].data.data=String.fromCharCode(160);this.dateSlot[index].data.parentNode.className="empty";index++;}
+for(i=1;i<=monthLength;i++,index++){var slot=this.dateSlot[index];var slotNode=slot.data.parentNode;slot.value=i;slot.data.data=i;slotNode.className="date";if(d1.toISODate()==today){slotNode.className+=" today";}
+if(d1.toISODate()==selected){slotNode.className+=" selected";}
+d1=new Date(d1.getFullYear(),d1.getMonth(),d1.getDate()+1);}
+var lastDateIndex=index;while(index<42){this.dateSlot[index].value=-1;this.dateSlot[index].data.data=String.fromCharCode(160);this.dateSlot[index].data.parentNode.className="empty";++index;}},hover:function(ev)
+{if(ev.type=="mouseover")
+Event.element(ev).addClassName("hover");else
+Event.element(ev).removeClassName("hover");},updateHeader:function(){var options=this._monthSelect.options;var m=this.selectedDate.getMonth();for(var i=0;i<options.length;++i){options[i].selected=false;if(options[i].value==m){options[i].selected=true;}}
+options=this._yearSelect.options;var year=this.selectedDate.getFullYear();for(var i=0;i<options.length;++i){options[i].selected=false;if(options[i].value==year){options[i].selected=true;}}}}; \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/effects.js b/framework/Web/Javascripts/js/effects.js
index 24aea4f9..14d659b7 100644
--- a/framework/Web/Javascripts/js/effects.js
+++ b/framework/Web/Javascripts/js/effects.js
@@ -1,855 +1,66 @@
-
-String.prototype.parseColor = function() {
-var color = '#';
-if(this.slice(0,4) == 'rgb(') {
-var cols = this.slice(4,this.length-1).split(',');
-var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
-} else {
-if(this.slice(0,1) == '#') {
-if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
-if(this.length==7) color = this.toLowerCase();
-}
-}
-return(color.length==7 ? color : (arguments[0] || this));
-}
-Element.collectTextNodes = function(element) {
-return $A($(element).childNodes).collect( function(node) {
-return (node.nodeType==3 ? node.nodeValue :
-(node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
-}).flatten().join('');
-}
-Element.collectTextNodesIgnoreClass = function(element, className) {
-return $A($(element).childNodes).collect( function(node) {
-return (node.nodeType==3 ? node.nodeValue :
-((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
-Element.collectTextNodesIgnoreClass(node, className) : ''));
-}).flatten().join('');
-}
-Element.setContentZoom = function(element, percent) {
-element = $(element);
-Element.setStyle(element, {fontSize: (percent/100) + 'em'});
-if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
-}
-Element.getOpacity = function(element){
-var opacity;
-if (opacity = Element.getStyle(element, 'opacity'))
-return parseFloat(opacity);
-if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
-if(opacity[1]) return parseFloat(opacity[1]) / 100;
-return 1.0;
-}
-Element.setOpacity = function(element, value){
-element= $(element);
-if (value == 1){
-Element.setStyle(element, { opacity:
-(/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
-0.999999 : null });
-if(/MSIE/.test(navigator.userAgent))
-Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
-} else {
-if(value < 0.00001) value = 0;
-Element.setStyle(element, {opacity: value});
-if(/MSIE/.test(navigator.userAgent))
- Element.setStyle(element,
- { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
- 'alpha(opacity='+value*100+')' });
-}
-}
-Element.getInlineOpacity = function(element){
-return $(element).style.opacity || '';
-}
-Element.childrenWithClassName = function(element, className, findFirst) {
-var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
-var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
-return (c.className && c.className.match(classNameRegExp));
-});
-if(!results) results = [];
-return results;
-}
-Element.forceRerendering = function(element) {
-try {
-element = $(element);
-var n = document.createTextNode(' ');
-element.appendChild(n);
-element.removeChild(n);
-} catch(e) { }
-};
-Array.prototype.call = function() {
-var args = arguments;
-this.each(function(f){ f.apply(this, args) });
-}
-var Effect = {
-tagifyText: function(element) {
-var tagifyStyle = 'position:relative';
-if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
-element = $(element);
-$A(element.childNodes).each( function(child) {
-if(child.nodeType==3) {
-child.nodeValue.toArray().each( function(character) {
-element.insertBefore(
-Builder.node('span',{style: tagifyStyle},
-character == ' ' ? String.fromCharCode(160) : character),
-child);
-});
-Element.remove(child);
-}
-});
-},
-multiple: function(element, effect) {
-var elements;
-if(((typeof element == 'object') ||
-(typeof element == 'function')) &&
- (element.length))
-elements = element;
-else
-elements = $(element).childNodes;
-var options = Object.extend({
-speed: 0.1,
-delay: 0.0
-}, arguments[2] || {});
-var masterDelay = options.delay;
-$A(elements).each( function(element, index) {
-new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
-});
-},
-PAIRS: {
-'slide':['SlideDown','SlideUp'],
-'blind':['BlindDown','BlindUp'],
-'appear': ['Appear','Fade']
-},
-toggle: function(element, effect) {
-element = $(element);
-effect = (effect || 'appear').toLowerCase();
-var options = Object.extend({
-queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
-}, arguments[2] || {});
-Effect[element.visible() ?
-Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
-}
-};
-var Effect2 = Effect;
-Effect.Transitions = {}
-Effect.Transitions.linear = function(pos) {
-return pos;
-}
-Effect.Transitions.sinoidal = function(pos) {
-return (-Math.cos(pos*Math.PI)/2) + 0.5;
-}
-Effect.Transitions.reverse= function(pos) {
-return 1-pos;
-}
-Effect.Transitions.flicker = function(pos) {
-return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-}
-Effect.Transitions.wobble = function(pos) {
-return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-}
-Effect.Transitions.pulse = function(pos) {
-return (Math.floor(pos*10) % 2 == 0 ?
-(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
-}
-Effect.Transitions.none = function(pos) {
-return 0;
-}
-Effect.Transitions.full = function(pos) {
-return 1;
-}
-Effect.ScopedQueue = Class.create();
-Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
-initialize: function() {
-this.effects= [];
-this.interval = null;
-},
-_each: function(iterator) {
-this.effects._each(iterator);
-},
-add: function(effect) {
-var timestamp = new Date().getTime();
-var position = (typeof effect.options.queue == 'string') ?
-effect.options.queue : effect.options.queue.position;
-switch(position) {
-case 'front':
- this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
-e.startOn+= effect.finishOn;
-e.finishOn += effect.finishOn;
-});
-break;
-case 'end':
- timestamp = this.effects.pluck('finishOn').max() || timestamp;
-break;
-}
-effect.startOn+= timestamp;
-effect.finishOn += timestamp;
-if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
-this.effects.push(effect);
-if(!this.interval)
-this.interval = setInterval(this.loop.bind(this), 40);
-},
-remove: function(effect) {
-this.effects = this.effects.reject(function(e) { return e==effect });
-if(this.effects.length == 0) {
-clearInterval(this.interval);
-this.interval = null;
-}
-},
-loop: function() {
-var timePos = new Date().getTime();
-this.effects.invoke('loop', timePos);
-}
-});
-Effect.Queues = {
-instances: $H(),
-get: function(queueName) {
-if(typeof queueName != 'string') return queueName;
-if(!this.instances[queueName])
-this.instances[queueName] = new Effect.ScopedQueue();
-return this.instances[queueName];
-}
-}
-Effect.Queue = Effect.Queues.get('global');
-Effect.DefaultOptions = {
-transition: Effect.Transitions.sinoidal,
-duration: 1.0,fps:25.0, sync: false,from: 0.0,
-to: 1.0,
-delay:0.0,
-queue:'parallel'
-}
-Effect.Base = function() {};
-Effect.Base.prototype = {
-position: null,
-start: function(options) {
-this.options= Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
-this.currentFrame = 0;
-this.state= 'idle';
-this.startOn= this.options.delay*1000;
-this.finishOn = this.startOn + (this.options.duration*1000);
-this.event('beforeStart');
-if(!this.options.sync)
-Effect.Queues.get(typeof this.options.queue == 'string' ?
-'global' : this.options.queue.scope).add(this);
-},
-loop: function(timePos) {
-if(timePos >= this.startOn) {
-if(timePos >= this.finishOn) {
-this.render(1.0);
-this.cancel();
-this.event('beforeFinish');
-if(this.finish) this.finish();
-this.event('afterFinish');
-return;
-}
-var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
-var frame = Math.round(pos * this.options.fps * this.options.duration);
-if(frame > this.currentFrame) {
-this.render(pos);
-this.currentFrame = frame;
-}
-}
-},
-render: function(pos) {
-if(this.state == 'idle') {
-this.state = 'running';
-this.event('beforeSetup');
-if(this.setup) this.setup();
-this.event('afterSetup');
-}
-if(this.state == 'running') {
-if(this.options.transition) pos = this.options.transition(pos);
-pos *= (this.options.to-this.options.from);
-pos += this.options.from;
-this.position = pos;
-this.event('beforeUpdate');
-if(this.update) this.update(pos);
-this.event('afterUpdate');
-}
-},
-cancel: function() {
-if(!this.options.sync)
-Effect.Queues.get(typeof this.options.queue == 'string' ?
-'global' : this.options.queue.scope).remove(this);
-this.state = 'finished';
-},
-event: function(eventName) {
-if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
-if(this.options[eventName]) this.options[eventName](this);
-},
-inspect: function() {
-return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
-}
-}
-Effect.Parallel = Class.create();
-Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
-initialize: function(effects) {
-this.effects = effects || [];
-this.start(arguments[1]);
-},
-update: function(position) {
-this.effects.invoke('render', position);
-},
-finish: function(position) {
-this.effects.each( function(effect) {
-effect.render(1.0);
-effect.cancel();
-effect.event('beforeFinish');
-if(effect.finish) effect.finish(position);
-effect.event('afterFinish');
-});
-}
-});
-Effect.Opacity = Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
-initialize: function(element) {
-this.element = $(element);
- if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
-this.element.setStyle({zoom: 1});
-var options = Object.extend({
-from: this.element.getOpacity() || 0.0,
-to: 1.0
-}, arguments[1] || {});
-this.start(options);
-},
-update: function(position) {
-this.element.setOpacity(position);
-}
-});
-Effect.Move = Class.create();
-Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
-initialize: function(element) {
-this.element = $(element);
-var options = Object.extend({
-x:0,
-y:0,
-mode: 'relative'
-}, arguments[1] || {});
-this.start(options);
-},
-setup: function() {
-this.element.makePositioned();
-this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
-this.originalTop= parseFloat(this.element.getStyle('top')|| '0');
-if(this.options.mode == 'absolute') {
- this.options.x = this.options.x - this.originalLeft;
-this.options.y = this.options.y - this.originalTop;
-}
-},
-update: function(position) {
-this.element.setStyle({
-left: this.options.x* position + this.originalLeft + 'px',
-top:this.options.y* position + this.originalTop+ 'px'
-});
-}
-});
-Effect.MoveBy = function(element, toTop, toLeft) {
-return new Effect.Move(element,
-Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
-};
-Effect.Scale = Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
-initialize: function(element, percent) {
-this.element = $(element)
-var options = Object.extend({
-scaleX: true,
-scaleY: true,
-scaleContent: true,
-scaleFromCenter: false,
-scaleMode: 'box', scaleFrom: 100.0,
-scaleTo: percent
-}, arguments[2] || {});
-this.start(options);
-},
-setup: function() {
-this.restoreAfterFinish = this.options.restoreAfterFinish || false;
-this.elementPositioning = this.element.getStyle('position');
-this.originalStyle = {};
-['top','left','width','height','fontSize'].each( function(k) {
-this.originalStyle[k] = this.element.style[k];
-}.bind(this));
-this.originalTop= this.element.offsetTop;
-this.originalLeft = this.element.offsetLeft;
-var fontSize = this.element.getStyle('font-size') || '100%';
-['em','px','%'].each( function(fontSizeType) {
-if(fontSize.indexOf(fontSizeType)>0) {
-this.fontSize = parseFloat(fontSize);
-this.fontSizeType = fontSizeType;
-}
-}.bind(this));
-this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-this.dims = null;
-if(this.options.scaleMode=='box')
-this.dims = [this.element.offsetHeight, this.element.offsetWidth];
-if(/^content/.test(this.options.scaleMode))
-this.dims = [this.element.scrollHeight, this.element.scrollWidth];
-if(!this.dims)
-this.dims = [this.options.scaleMode.originalHeight,
- this.options.scaleMode.originalWidth];
-},
-update: function(position) {
-var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
-if(this.options.scaleContent && this.fontSize)
-this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
-this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
-},
-finish: function(position) {
-if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
-},
-setDimensions: function(height, width) {
-var d = {};
-if(this.options.scaleX) d.width = width + 'px';
-if(this.options.scaleY) d.height = height + 'px';
-if(this.options.scaleFromCenter) {
-var topd= (height - this.dims[0])/2;
-var leftd = (width- this.dims[1])/2;
-if(this.elementPositioning == 'absolute') {
-if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
-if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
-} else {
-if(this.options.scaleY) d.top = -topd + 'px';
-if(this.options.scaleX) d.left = -leftd + 'px';
-}
-}
-this.element.setStyle(d);
-}
-});
-Effect.Highlight = Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
-initialize: function(element) {
-this.element = $(element);
-var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
-this.start(options);
-},
-setup: function() {
- if(this.element.getStyle('display')=='none') { this.cancel(); return; }
- this.oldStyle = {
-backgroundImage: this.element.getStyle('background-image') };
-this.element.setStyle({backgroundImage: 'none'});
-if(!this.options.endcolor)
-this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
-if(!this.options.restorecolor)
-this.options.restorecolor = this.element.getStyle('background-color');
- this._base= $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
-this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
-},
-update: function(position) {
-this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
-return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
-},
-finish: function() {
-this.element.setStyle(Object.extend(this.oldStyle, {
-backgroundColor: this.options.restorecolor
-}));
-}
-});
-Effect.ScrollTo = Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
-initialize: function(element) {
-this.element = $(element);
-this.start(arguments[1] || {});
-},
-setup: function() {
-Position.prepare();
-var offsets = Position.cumulativeOffset(this.element);
-if(this.options.offset) offsets[1] += this.options.offset;
-var max = window.innerHeight ?
-window.height - window.innerHeight :
-document.body.scrollHeight -
-(document.documentElement.clientHeight ?
-document.documentElement.clientHeight : document.body.clientHeight);
-this.scrollStart = Position.deltaY;
-this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
-},
-update: function(position) {
-Position.prepare();
-window.scrollTo(Position.deltaX,
-this.scrollStart + (position*this.delta));
-}
-});
-Effect.Fade = function(element) {
-element = $(element);
-var oldOpacity = element.getInlineOpacity();
-var options = Object.extend({
-from: element.getOpacity() || 1.0,
-to: 0.0,
-afterFinishInternal: function(effect) {
-if(effect.options.to!=0) return;
-effect.element.hide();
-effect.element.setStyle({opacity: oldOpacity});
-}}, arguments[1] || {});
-return new Effect.Opacity(element,options);
-}
-Effect.Appear = function(element) {
-element = $(element);
-var options = Object.extend({
-from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
-to: 1.0,
- afterFinishInternal: function(effect) {
-effect.element.forceRerendering();
-},
-beforeSetup: function(effect) {
-effect.element.setOpacity(effect.options.from);
-effect.element.show();
-}}, arguments[1] || {});
-return new Effect.Opacity(element,options);
-}
-Effect.Puff = function(element) {
-element = $(element);
-var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') };
-return new Effect.Parallel(
- [ new Effect.Scale(element, 200,
-{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
- new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
- Object.extend({ duration: 1.0,
-beforeSetupInternal: function(effect) {
-effect.effects[0].element.setStyle({position: 'absolute'}); },
-afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.setStyle(oldStyle); }
- }, arguments[1] || {})
- );
-}
-Effect.BlindUp = function(element) {
-element = $(element);
-element.makeClipping();
-return new Effect.Scale(element, 0,
-Object.extend({ scaleContent: false,
-scaleX: false,
-restoreAfterFinish: true,
-afterFinishInternal: function(effect) {
-effect.element.hide();
-effect.element.undoClipping();
-}
-}, arguments[1] || {})
-);
-}
-Effect.BlindDown = function(element) {
-element = $(element);
-var elementDimensions = element.getDimensions();
-return new Effect.Scale(element, 100,
-Object.extend({ scaleContent: false,
-scaleX: false,
-scaleFrom: 0,
-scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
-restoreAfterFinish: true,
-afterSetup: function(effect) {
-effect.element.makeClipping();
-effect.element.setStyle({height: '0px'});
-effect.element.show();
-},
-afterFinishInternal: function(effect) {
-effect.element.undoClipping();
-}
-}, arguments[1] || {})
-);
-}
-Effect.SwitchOff = function(element) {
-element = $(element);
-var oldOpacity = element.getInlineOpacity();
-return new Effect.Appear(element, {
-duration: 0.4,
-from: 0,
-transition: Effect.Transitions.flicker,
-afterFinishInternal: function(effect) {
-new Effect.Scale(effect.element, 1, {
-duration: 0.3, scaleFromCenter: true,
-scaleX: false, scaleContent: false, restoreAfterFinish: true,
-beforeSetup: function(effect) {
-effect.element.makePositioned();
-effect.element.makeClipping();
-},
-afterFinishInternal: function(effect) {
-effect.element.hide();
-effect.element.undoClipping();
-effect.element.undoPositioned();
-effect.element.setStyle({opacity: oldOpacity});
-}
-})
-}
-});
-}
-Effect.DropOut = function(element) {
-element = $(element);
-var oldStyle = {
-top: element.getStyle('top'),
-left: element.getStyle('left'),
-opacity: element.getInlineOpacity() };
-return new Effect.Parallel(
-[ new Effect.Move(element, {x: 0, y: 100, sync: true }),
-new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
-Object.extend(
-{ duration: 0.5,
-beforeSetup: function(effect) {
-effect.effects[0].element.makePositioned();
-},
-afterFinishInternal: function(effect) {
-effect.effects[0].element.hide();
-effect.effects[0].element.undoPositioned();
-effect.effects[0].element.setStyle(oldStyle);
-}
-}, arguments[1] || {}));
-}
-Effect.Shake = function(element) {
-element = $(element);
-var oldStyle = {
-top: element.getStyle('top'),
-left: element.getStyle('left') };
-return new Effect.Move(element,
-{ x:20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
-new Effect.Move(effect.element,
-{ x: -40, y: 0, duration: 0.1,afterFinishInternal: function(effect) {
-new Effect.Move(effect.element,
-{ x:40, y: 0, duration: 0.1,afterFinishInternal: function(effect) {
-new Effect.Move(effect.element,
-{ x: -40, y: 0, duration: 0.1,afterFinishInternal: function(effect) {
-new Effect.Move(effect.element,
-{ x:40, y: 0, duration: 0.1,afterFinishInternal: function(effect) {
-new Effect.Move(effect.element,
-{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
-effect.element.undoPositioned();
-effect.element.setStyle(oldStyle);
-}}) }}) }}) }}) }}) }});
-}
-Effect.SlideDown = function(element) {
-element = $(element);
-element.cleanWhitespace();
- var oldInnerBottom = $(element.firstChild).getStyle('bottom');
-var elementDimensions = element.getDimensions();
-return new Effect.Scale(element, 100, Object.extend({
-scaleContent: false,
-scaleX: false,
-scaleFrom: window.opera ? 0 : 1,
-scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
-restoreAfterFinish: true,
-afterSetup: function(effect) {
-effect.element.makePositioned();
-effect.element.firstChild.makePositioned();
-if(window.opera) effect.element.setStyle({top: ''});
-effect.element.makeClipping();
-effect.element.setStyle({height: '0px'});
-effect.element.show(); },
-afterUpdateInternal: function(effect) {
-effect.element.firstChild.setStyle({bottom:
-(effect.dims[0] - effect.element.clientHeight) + 'px' });
-},
-afterFinishInternal: function(effect) {
-effect.element.undoClipping();
- if(/MSIE/.test(navigator.userAgent)){
-effect.element.undoPositioned();
-effect.element.firstChild.undoPositioned();
-}else{
-effect.element.firstChild.undoPositioned();
-effect.element.undoPositioned();
-}
-effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
-}, arguments[1] || {})
-);
-}
-Effect.SlideUp = function(element) {
-element = $(element);
-element.cleanWhitespace();
-var oldInnerBottom = $(element.firstChild).getStyle('bottom');
-return new Effect.Scale(element, window.opera ? 0 : 1,
- Object.extend({ scaleContent: false,
-scaleX: false,
-scaleMode: 'box',
-scaleFrom: 100,
-restoreAfterFinish: true,
-beforeStartInternal: function(effect) {
-effect.element.makePositioned();
-effect.element.firstChild.makePositioned();
-if(window.opera) effect.element.setStyle({top: ''});
-effect.element.makeClipping();
-effect.element.show(); },
-afterUpdateInternal: function(effect) {
-effect.element.firstChild.setStyle({bottom:
-(effect.dims[0] - effect.element.clientHeight) + 'px' }); },
-afterFinishInternal: function(effect) {
-effect.element.hide();
-effect.element.undoClipping();
-effect.element.firstChild.undoPositioned();
-effect.element.undoPositioned();
-effect.element.setStyle({bottom: oldInnerBottom}); }
- }, arguments[1] || {})
-);
-}
-Effect.Squish = function(element) {
-return new Effect.Scale(element, window.opera ? 1 : 0,
-{ restoreAfterFinish: true,
-beforeSetup: function(effect) {
-effect.element.makeClipping(effect.element); },
-afterFinishInternal: function(effect) {
-effect.element.hide(effect.element);
-effect.element.undoClipping(effect.element); }
-});
-}
-Effect.Grow = function(element) {
-element = $(element);
-var options = Object.extend({
-direction: 'center',
-moveTransition: Effect.Transitions.sinoidal,
-scaleTransition: Effect.Transitions.sinoidal,
-opacityTransition: Effect.Transitions.full
-}, arguments[1] || {});
-var oldStyle = {
-top: element.style.top,
-left: element.style.left,
-height: element.style.height,
-width: element.style.width,
-opacity: element.getInlineOpacity() };
-var dims = element.getDimensions();
-var initialMoveX, initialMoveY;
-var moveX, moveY;
-switch (options.direction) {
-case 'top-left':
-initialMoveX = initialMoveY = moveX = moveY = 0;
-break;
-case 'top-right':
-initialMoveX = dims.width;
-initialMoveY = moveY = 0;
-moveX = -dims.width;
-break;
-case 'bottom-left':
-initialMoveX = moveX = 0;
-initialMoveY = dims.height;
-moveY = -dims.height;
-break;
-case 'bottom-right':
-initialMoveX = dims.width;
-initialMoveY = dims.height;
-moveX = -dims.width;
-moveY = -dims.height;
-break;
-case 'center':
-initialMoveX = dims.width / 2;
-initialMoveY = dims.height / 2;
-moveX = -dims.width / 2;
-moveY = -dims.height / 2;
-break;
-}
-return new Effect.Move(element, {
-x: initialMoveX,
-y: initialMoveY,
-duration: 0.01,
-beforeSetup: function(effect) {
-effect.element.hide();
-effect.element.makeClipping();
-effect.element.makePositioned();
-},
-afterFinishInternal: function(effect) {
-new Effect.Parallel(
-[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
-new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
-new Effect.Scale(effect.element, 100, {
-scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
-sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
-], Object.extend({
- beforeSetup: function(effect) {
- effect.effects[0].element.setStyle({height: '0px'});
- effect.effects[0].element.show();
- },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle);
- }
- }, options)
-)
-}
-});
-}
-Effect.Shrink = function(element) {
-element = $(element);
-var options = Object.extend({
-direction: 'center',
-moveTransition: Effect.Transitions.sinoidal,
-scaleTransition: Effect.Transitions.sinoidal,
-opacityTransition: Effect.Transitions.none
-}, arguments[1] || {});
-var oldStyle = {
-top: element.style.top,
-left: element.style.left,
-height: element.style.height,
-width: element.style.width,
-opacity: element.getInlineOpacity() };
-var dims = element.getDimensions();
-var moveX, moveY;
-switch (options.direction) {
-case 'top-left':
-moveX = moveY = 0;
-break;
-case 'top-right':
-moveX = dims.width;
-moveY = 0;
-break;
-case 'bottom-left':
-moveX = 0;
-moveY = dims.height;
-break;
-case 'bottom-right':
-moveX = dims.width;
-moveY = dims.height;
-break;
-case 'center':
-moveX = dims.width / 2;
-moveY = dims.height / 2;
-break;
-}
-return new Effect.Parallel(
-[ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
-new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
-new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
-], Object.extend({
- beforeStartInternal: function(effect) {
- effect.effects[0].element.makePositioned();
- effect.effects[0].element.makeClipping(); },
- afterFinishInternal: function(effect) {
- effect.effects[0].element.hide();
- effect.effects[0].element.undoClipping();
- effect.effects[0].element.undoPositioned();
- effect.effects[0].element.setStyle(oldStyle); }
- }, options)
-);
-}
-Effect.Pulsate = function(element) {
-element = $(element);
-var options= arguments[1] || {};
-var oldOpacity = element.getInlineOpacity();
-var transition = options.transition || Effect.Transitions.sinoidal;
-var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
-reverser.bind(transition);
-return new Effect.Opacity(element,
-Object.extend(Object.extend({duration: 3.0, from: 0,
-afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
-}, options), {transition: reverser}));
-}
-Effect.Fold = function(element) {
-element = $(element);
-var oldStyle = {
-top: element.style.top,
-left: element.style.left,
-width: element.style.width,
-height: element.style.height };
-Element.makeClipping(element);
-return new Effect.Scale(element, 5, Object.extend({
-scaleContent: false,
-scaleX: false,
-afterFinishInternal: function(effect) {
-new Effect.Scale(element, 1, {
-scaleContent: false,
-scaleY: false,
-afterFinishInternal: function(effect) {
-effect.element.hide();
-effect.element.undoClipping();
-effect.element.setStyle(oldStyle);
-} });
-}}, arguments[1] || {}));
-};
-['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
- 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
-function(f) { Element.Methods[f] = Element[f]; }
-);
-Element.Methods.visualEffect = function(element, effect, options) {
-s = effect.gsub(/_/, '-').camelize();
-effect_class = s.charAt(0).toUpperCase() + s.substring(1);
-new Effect[effect_class](element, options);
-return $(element);
-};
-Element.addMethods();
+
+String.prototype.parseColor=function(){var color='#';if(this.slice(0,4)=='rgb('){var cols=this.slice(4,this.length-1).split(',');var i=0;do{color+=parseInt(cols[i]).toColorPart()}while(++i<3);}else{if(this.slice(0,1)=='#'){if(this.length==4)for(var i=1;i<4;i++)color+=(this.charAt(i)+this.charAt(i)).toLowerCase();if(this.length==7)color=this.toLowerCase();}}
+return(color.length==7?color:(arguments[0]||this));}
+Element.collectTextNodes=function(element){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:(node.hasChildNodes()?Element.collectTextNodes(node):''));}).flatten().join('');}
+Element.collectTextNodesIgnoreClass=function(element,className){return $A($(element).childNodes).collect(function(node){return(node.nodeType==3?node.nodeValue:((node.hasChildNodes()&&!Element.hasClassName(node,className))?Element.collectTextNodesIgnoreClass(node,className):''));}).flatten().join('');}
+Element.setContentZoom=function(element,percent){element=$(element);Element.setStyle(element,{fontSize:(percent/100)+'em'});if(navigator.appVersion.indexOf('AppleWebKit')>0)window.scrollBy(0,0);}
+Element.getOpacity=function(element){var opacity;if(opacity=Element.getStyle(element,'opacity'))
+return parseFloat(opacity);if(opacity=(Element.getStyle(element,'filter')||'').match(/alpha\(opacity=(.*)\)/))
+if(opacity[1])return parseFloat(opacity[1])/100;return 1.0;}
+Element.setOpacity=function(element,value){element=$(element);if(value==1){Element.setStyle(element,{opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?0.999999:null});if(/MSIE/.test(navigator.userAgent))
+Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});}else{if(value<0.00001)value=0;Element.setStyle(element,{opacity:value});if(/MSIE/.test(navigator.userAgent))
+Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')+'alpha(opacity='+value*100+')'});}}
+Element.getInlineOpacity=function(element){return $(element).style.opacity||'';}
+Element.childrenWithClassName=function(element,className,findFirst){var classNameRegExp=new RegExp("(^|\\s)"+className+"(\\s|$)");var results=$A($(element).getElementsByTagName('*'))[findFirst?'detect':'select'](function(c){return(c.className&&c.className.match(classNameRegExp));});if(!results)results=[];return results;}
+Element.forceRerendering=function(element){try{element=$(element);var n=document.createTextNode(' ');element.appendChild(n);element.removeChild(n);}catch(e){}};Array.prototype.call=function(){var args=arguments;this.each(function(f){f.apply(this,args)});}
+var Effect={tagifyText:function(element){var tagifyStyle='position:relative';if(/MSIE/.test(navigator.userAgent))tagifyStyle+=';zoom:1';element=$(element);$A(element.childNodes).each(function(child){if(child.nodeType==3){child.nodeValue.toArray().each(function(character){element.insertBefore(Builder.node('span',{style:tagifyStyle},character==' '?String.fromCharCode(160):character),child);});Element.remove(child);}});},multiple:function(element,effect){var elements;if(((typeof element=='object')||(typeof element=='function'))&&(element.length))
+elements=element;else
+elements=$(element).childNodes;var options=Object.extend({speed:0.1,delay:0.0},arguments[2]||{});var masterDelay=options.delay;$A(elements).each(function(element,index){new effect(element,Object.extend(options,{delay:index*options.speed+masterDelay}));});},PAIRS:{'slide':['SlideDown','SlideUp'],'blind':['BlindDown','BlindUp'],'appear':['Appear','Fade']},toggle:function(element,effect){element=$(element);effect=(effect||'appear').toLowerCase();var options=Object.extend({queue:{position:'end',scope:(element.id||'global'),limit:1}},arguments[2]||{});Effect[element.visible()?Effect.PAIRS[effect][1]:Effect.PAIRS[effect][0]](element,options);}};var Effect2=Effect;Effect.Transitions={}
+Effect.Transitions.linear=function(pos){return pos;}
+Effect.Transitions.sinoidal=function(pos){return(-Math.cos(pos*Math.PI)/2)+0.5;}
+Effect.Transitions.reverse=function(pos){return 1-pos;}
+Effect.Transitions.flicker=function(pos){return((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;}
+Effect.Transitions.wobble=function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;}
+Effect.Transitions.pulse=function(pos){return(Math.floor(pos*10)%2==0?(pos*10-Math.floor(pos*10)):1-(pos*10-Math.floor(pos*10)));}
+Effect.Transitions.none=function(pos){return 0;}
+Effect.Transitions.full=function(pos){return 1;}
+Effect.ScopedQueue=Class.create();Object.extend(Object.extend(Effect.ScopedQueue.prototype,Enumerable),{initialize:function(){this.effects=[];this.interval=null;},_each:function(iterator){this.effects._each(iterator);},add:function(effect){var timestamp=new Date().getTime();var position=(typeof effect.options.queue=='string')?effect.options.queue:effect.options.queue.position;switch(position){case'front':this.effects.findAll(function(e){return e.state=='idle'}).each(function(e){e.startOn+=effect.finishOn;e.finishOn+=effect.finishOn;});break;case'end':timestamp=this.effects.pluck('finishOn').max()||timestamp;break;}
+effect.startOn+=timestamp;effect.finishOn+=timestamp;if(!effect.options.queue.limit||(this.effects.length<effect.options.queue.limit))
+this.effects.push(effect);if(!this.interval)
+this.interval=setInterval(this.loop.bind(this),40);},remove:function(effect){this.effects=this.effects.reject(function(e){return e==effect});if(this.effects.length==0){clearInterval(this.interval);this.interval=null;}},loop:function(){var timePos=new Date().getTime();this.effects.invoke('loop',timePos);}});Effect.Queues={instances:$H(),get:function(queueName){if(typeof queueName!='string')return queueName;if(!this.instances[queueName])
+this.instances[queueName]=new Effect.ScopedQueue();return this.instances[queueName];}}
+Effect.Queue=Effect.Queues.get('global');Effect.DefaultOptions={transition:Effect.Transitions.sinoidal,duration:1.0,fps:25.0,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'}
+Effect.Base=function(){};Effect.Base.prototype={position:null,start:function(options){this.options=Object.extend(Object.extend({},Effect.DefaultOptions),options||{});this.currentFrame=0;this.state='idle';this.startOn=this.options.delay*1000;this.finishOn=this.startOn+(this.options.duration*1000);this.event('beforeStart');if(!this.options.sync)
+Effect.Queues.get(typeof this.options.queue=='string'?'global':this.options.queue.scope).add(this);},loop:function(timePos){if(timePos>=this.startOn){if(timePos>=this.finishOn){this.render(1.0);this.cancel();this.event('beforeFinish');if(this.finish)this.finish();this.event('afterFinish');return;}
+var pos=(timePos-this.startOn)/(this.finishOn-this.startOn);var frame=Math.round(pos*this.options.fps*this.options.duration);if(frame>this.currentFrame){this.render(pos);this.currentFrame=frame;}}},render:function(pos){if(this.state=='idle'){this.state='running';this.event('beforeSetup');if(this.setup)this.setup();this.event('afterSetup');}
+if(this.state=='running'){if(this.options.transition)pos=this.options.transition(pos);pos*=(this.options.to-this.options.from);pos+=this.options.from;this.position=pos;this.event('beforeUpdate');if(this.update)this.update(pos);this.event('afterUpdate');}},cancel:function(){if(!this.options.sync)
+Effect.Queues.get(typeof this.options.queue=='string'?'global':this.options.queue.scope).remove(this);this.state='finished';},event:function(eventName){if(this.options[eventName+'Internal'])this.options[eventName+'Internal'](this);if(this.options[eventName])this.options[eventName](this);},inspect:function(){return'#<Effect:'+$H(this).inspect()+',options:'+$H(this.options).inspect()+'>';}}
+Effect.Parallel=Class.create();Object.extend(Object.extend(Effect.Parallel.prototype,Effect.Base.prototype),{initialize:function(effects){this.effects=effects||[];this.start(arguments[1]);},update:function(position){this.effects.invoke('render',position);},finish:function(position){this.effects.each(function(effect){effect.render(1.0);effect.cancel();effect.event('beforeFinish');if(effect.finish)effect.finish(position);effect.event('afterFinish');});}});Effect.Opacity=Class.create();Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);if(/MSIE/.test(navigator.userAgent)&&(!this.element.hasLayout))
+this.element.setStyle({zoom:1});var options=Object.extend({from:this.element.getOpacity()||0.0,to:1.0},arguments[1]||{});this.start(options);},update:function(position){this.element.setOpacity(position);}});Effect.Move=Class.create();Object.extend(Object.extend(Effect.Move.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({x:0,y:0,mode:'relative'},arguments[1]||{});this.start(options);},setup:function(){this.element.makePositioned();this.originalLeft=parseFloat(this.element.getStyle('left')||'0');this.originalTop=parseFloat(this.element.getStyle('top')||'0');if(this.options.mode=='absolute'){this.options.x=this.options.x-this.originalLeft;this.options.y=this.options.y-this.originalTop;}},update:function(position){this.element.setStyle({left:this.options.x*position+this.originalLeft+'px',top:this.options.y*position+this.originalTop+'px'});}});Effect.MoveBy=function(element,toTop,toLeft){return new Effect.Move(element,Object.extend({x:toLeft,y:toTop},arguments[3]||{}));};Effect.Scale=Class.create();Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{initialize:function(element,percent){this.element=$(element)
+var options=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:'box',scaleFrom:100.0,scaleTo:percent},arguments[2]||{});this.start(options);},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=this.element.getStyle('position');this.originalStyle={};['top','left','width','height','fontSize'].each(function(k){this.originalStyle[k]=this.element.style[k];}.bind(this));this.originalTop=this.element.offsetTop;this.originalLeft=this.element.offsetLeft;var fontSize=this.element.getStyle('font-size')||'100%';['em','px','%'].each(function(fontSizeType){if(fontSize.indexOf(fontSizeType)>0){this.fontSize=parseFloat(fontSize);this.fontSizeType=fontSizeType;}}.bind(this));this.factor=(this.options.scaleTo-this.options.scaleFrom)/100;this.dims=null;if(this.options.scaleMode=='box')
+this.dims=[this.element.offsetHeight,this.element.offsetWidth];if(/^content/.test(this.options.scaleMode))
+this.dims=[this.element.scrollHeight,this.element.scrollWidth];if(!this.dims)
+this.dims=[this.options.scaleMode.originalHeight,this.options.scaleMode.originalWidth];},update:function(position){var currentScale=(this.options.scaleFrom/100.0)+(this.factor*position);if(this.options.scaleContent&&this.fontSize)
+this.element.setStyle({fontSize:this.fontSize*currentScale+this.fontSizeType});this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale);},finish:function(position){if(this.restoreAfterFinish)this.element.setStyle(this.originalStyle);},setDimensions:function(height,width){var d={};if(this.options.scaleX)d.width=width+'px';if(this.options.scaleY)d.height=height+'px';if(this.options.scaleFromCenter){var topd=(height-this.dims[0])/2;var leftd=(width-this.dims[1])/2;if(this.elementPositioning=='absolute'){if(this.options.scaleY)d.top=this.originalTop-topd+'px';if(this.options.scaleX)d.left=this.originalLeft-leftd+'px';}else{if(this.options.scaleY)d.top=-topd+'px';if(this.options.scaleX)d.left=-leftd+'px';}}
+this.element.setStyle(d);}});Effect.Highlight=Class.create();Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options);},setup:function(){if(this.element.getStyle('display')=='none'){this.cancel();return;}
+this.oldStyle={backgroundImage:this.element.getStyle('background-image')};this.element.setStyle({backgroundImage:'none'});if(!this.options.endcolor)
+this.options.endcolor=this.element.getStyle('background-color').parseColor('#ffffff');if(!this.options.restorecolor)
+this.options.restorecolor=this.element.getStyle('background-color');this._base=$R(0,2).map(function(i){return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16)}.bind(this));this._delta=$R(0,2).map(function(i){return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i]}.bind(this));},update:function(position){this.element.setStyle({backgroundColor:$R(0,2).inject('#',function(m,v,i){return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart());}.bind(this))});},finish:function(){this.element.setStyle(Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));}});Effect.ScrollTo=Class.create();Object.extend(Object.extend(Effect.ScrollTo.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);this.start(arguments[1]||{});},setup:function(){Position.prepare();var offsets=Position.cumulativeOffset(this.element);if(this.options.offset)offsets[1]+=this.options.offset;var max=window.innerHeight?window.height-window.innerHeight:document.body.scrollHeight-
+(document.documentElement.clientHeight?document.documentElement.clientHeight:document.body.clientHeight);this.scrollStart=Position.deltaY;this.delta=(offsets[1]>max?max:offsets[1])-this.scrollStart;},update:function(position){Position.prepare();window.scrollTo(Position.deltaX,this.scrollStart+(position*this.delta));}});Effect.Fade=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();var options=Object.extend({from:element.getOpacity()||1.0,to:0.0,afterFinishInternal:function(effect){if(effect.options.to!=0)return;effect.element.hide();effect.element.setStyle({opacity:oldOpacity});}},arguments[1]||{});return new Effect.Opacity(element,options);}
+Effect.Appear=function(element){element=$(element);var options=Object.extend({from:(element.getStyle('display')=='none'?0.0:element.getOpacity()||0.0),to:1.0,afterFinishInternal:function(effect){effect.element.forceRerendering();},beforeSetup:function(effect){effect.element.setOpacity(effect.options.from);effect.element.show();}},arguments[1]||{});return new Effect.Opacity(element,options);}
+Effect.Puff=function(element){element=$(element);var oldStyle={opacity:element.getInlineOpacity(),position:element.getStyle('position')};return new Effect.Parallel([new Effect.Scale(element,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:1.0,beforeSetupInternal:function(effect){effect.effects[0].element.setStyle({position:'absolute'});},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.setStyle(oldStyle);}},arguments[1]||{}));}
+Effect.BlindUp=function(element){element=$(element);element.makeClipping();return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();}},arguments[1]||{}));}
+Effect.BlindDown=function(element){element=$(element);var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makeClipping();effect.element.setStyle({height:'0px'});effect.element.show();},afterFinishInternal:function(effect){effect.element.undoClipping();}},arguments[1]||{}));}
+Effect.SwitchOff=function(element){element=$(element);var oldOpacity=element.getInlineOpacity();return new Effect.Appear(element,{duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(effect){new Effect.Scale(effect.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makePositioned();effect.element.makeClipping();},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.undoPositioned();effect.element.setStyle({opacity:oldOpacity});}})}});}
+Effect.DropOut=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left'),opacity:element.getInlineOpacity()};return new Effect.Parallel([new Effect.Move(element,{x:0,y:100,sync:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:0.5,beforeSetup:function(effect){effect.effects[0].element.makePositioned();},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},arguments[1]||{}));}
+Effect.Shake=function(element){element=$(element);var oldStyle={top:element.getStyle('top'),left:element.getStyle('left')};return new Effect.Move(element,{x:20,y:0,duration:0.05,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(effect){new Effect.Move(effect.element,{x:-20,y:0,duration:0.05,afterFinishInternal:function(effect){effect.element.undoPositioned();effect.element.setStyle(oldStyle);}})}})}})}})}})}});}
+Effect.SlideDown=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');var elementDimensions=element.getDimensions();return new Effect.Scale(element,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:window.opera?0:1,scaleMode:{originalHeight:elementDimensions.height,originalWidth:elementDimensions.width},restoreAfterFinish:true,afterSetup:function(effect){effect.element.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.setStyle({height:'0px'});effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.undoClipping();if(/MSIE/.test(navigator.userAgent)){effect.element.undoPositioned();effect.element.firstChild.undoPositioned();}else{effect.element.firstChild.undoPositioned();effect.element.undoPositioned();}
+effect.element.firstChild.setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));}
+Effect.SlideUp=function(element){element=$(element);element.cleanWhitespace();var oldInnerBottom=$(element.firstChild).getStyle('bottom');return new Effect.Scale(element,window.opera?0:1,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(effect){effect.element.makePositioned();effect.element.firstChild.makePositioned();if(window.opera)effect.element.setStyle({top:''});effect.element.makeClipping();effect.element.show();},afterUpdateInternal:function(effect){effect.element.firstChild.setStyle({bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});},afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.firstChild.undoPositioned();effect.element.undoPositioned();effect.element.setStyle({bottom:oldInnerBottom});}},arguments[1]||{}));}
+Effect.Squish=function(element){return new Effect.Scale(element,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(effect){effect.element.makeClipping(effect.element);},afterFinishInternal:function(effect){effect.element.hide(effect.element);effect.element.undoClipping(effect.element);}});}
+Effect.Grow=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var initialMoveX,initialMoveY;var moveX,moveY;switch(options.direction){case'top-left':initialMoveX=initialMoveY=moveX=moveY=0;break;case'top-right':initialMoveX=dims.width;initialMoveY=moveY=0;moveX=-dims.width;break;case'bottom-left':initialMoveX=moveX=0;initialMoveY=dims.height;moveY=-dims.height;break;case'bottom-right':initialMoveX=dims.width;initialMoveY=dims.height;moveX=-dims.width;moveY=-dims.height;break;case'center':initialMoveX=dims.width/2;initialMoveY=dims.height/2;moveX=-dims.width/2;moveY=-dims.height/2;break;}
+return new Effect.Move(element,{x:initialMoveX,y:initialMoveY,duration:0.01,beforeSetup:function(effect){effect.element.hide();effect.element.makeClipping();effect.element.makePositioned();},afterFinishInternal:function(effect){new Effect.Parallel([new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}),new Effect.Move(effect.element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition}),new Effect.Scale(effect.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:options.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(effect){effect.effects[0].element.setStyle({height:'0px'});effect.effects[0].element.show();},afterFinishInternal:function(effect){effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},options))}});}
+Effect.Shrink=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransition:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});var oldStyle={top:element.style.top,left:element.style.left,height:element.style.height,width:element.style.width,opacity:element.getInlineOpacity()};var dims=element.getDimensions();var moveX,moveY;switch(options.direction){case'top-left':moveX=moveY=0;break;case'top-right':moveX=dims.width;moveY=0;break;case'bottom-left':moveX=0;moveY=dims.height;break;case'bottom-right':moveX=dims.width;moveY=dims.height;break;case'center':moveX=dims.width/2;moveY=dims.height/2;break;}
+return new Effect.Parallel([new Effect.Opacity(element,{sync:true,to:0.0,from:1.0,transition:options.opacityTransition}),new Effect.Scale(element,window.opera?1:0,{sync:true,transition:options.scaleTransition,restoreAfterFinish:true}),new Effect.Move(element,{x:moveX,y:moveY,sync:true,transition:options.moveTransition})],Object.extend({beforeStartInternal:function(effect){effect.effects[0].element.makePositioned();effect.effects[0].element.makeClipping();},afterFinishInternal:function(effect){effect.effects[0].element.hide();effect.effects[0].element.undoClipping();effect.effects[0].element.undoPositioned();effect.effects[0].element.setStyle(oldStyle);}},options));}
+Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{};var oldOpacity=element.getInlineOpacity();var transition=options.transition||Effect.Transitions.sinoidal;var reverser=function(pos){return transition(1-Effect.Transitions.pulse(pos))};reverser.bind(transition);return new Effect.Opacity(element,Object.extend(Object.extend({duration:3.0,from:0,afterFinishInternal:function(effect){effect.element.setStyle({opacity:oldOpacity});}},options),{transition:reverser}));}
+Effect.Fold=function(element){element=$(element);var oldStyle={top:element.style.top,left:element.style.left,width:element.style.width,height:element.style.height};Element.makeClipping(element);return new Effect.Scale(element,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(effect){new Effect.Scale(element,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(effect){effect.element.hide();effect.element.undoClipping();effect.element.setStyle(oldStyle);}});}},arguments[1]||{}));};['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom','collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(function(f){Element.Methods[f]=Element[f];});Element.Methods.visualEffect=function(element,effect,options){s=effect.gsub(/_/,'-').camelize();effect_class=s.charAt(0).toUpperCase()+s.substring(1);new Effect[effect_class](element,options);return $(element);};Element.addMethods(); \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/logger.js b/framework/Web/Javascripts/js/logger.js
index 924f6323..aaef1482 100644
--- a/framework/Web/Javascripts/js/logger.js
+++ b/framework/Web/Javascripts/js/logger.js
@@ -1,539 +1,188 @@
-
-CustomEvent = Class.create()
-CustomEvent.prototype = {
-initialize : function() {
-this.listeners = []
-},
-addListener : function(method) {
-this.listeners.push(method)
-},
-removeListener : function(method) {
-var foundIndexes = this._findListenerIndexes(method)
-for(var i = 0; i < foundIndexes.length; i++) {
-this.listeners.splice(foundIndexes[i], 1)
-}
-},
-dispatch : function(handler) {
-for(var i = 0; i < this.listeners.length; i++) {
-try {
-this.listeners[i](handler)
-}
-catch (e) {
-alert("Could not run the listener " + this.listeners[i] + ". " + e)
-}
-}
-},
-_findListenerIndexes : function(method) {
-var indexes = []
-for(var i = 0; i < this.listeners.length; i++) {
-if (this.listeners[i] == method) {
-indexes.push(i)
-}
-}
-return indexes
-}
-}
-var Cookie = {
-set : function(name, value, expirationInDays, path) {
-var cookie = escape(name) + "=" + escape(value)
-if (expirationInDays) {
-var date = new Date()
-date.setDate(date.getDate() + expirationInDays)
-cookie += "; expires=" + date.toGMTString()
-}
-if (path) {
-cookie += ";path=" + path
-}
-document.cookie = cookie
-if (value && (expirationInDays == undefined || expirationInDays > 0) && !this.get(name)) {
-Logger.error("Cookie (" + name + ") was not set correctly... The value was " + value.toString().length + " charachters long (This may be over the cookie limit)");
-}
-},
-get : function(name) {
-var pattern = "(^|;)\\s*" + escape(name) + "=([^;]+)"
-var m = document.cookie.match(pattern)
-if (m && m[2]) {
-return unescape(m[2])
-}
-else return null
-},
-getAll : function() {
-var cookies = document.cookie.split(';')
-var cookieArray = []
-for (var i = 0; i < cookies.length; i++) {
-try {
-var name = unescape(cookies[i].match(/^\s*([^=]+)/m)[1])
-var value = unescape(cookies[i].match(/=(.*$)/m)[1])
-}
-catch (e) {
-continue
-}
-cookieArray.push({name : name, value : value})
-if (cookieArray[name] != undefined) {
-Logger.waring("Trying to retrieve cookie named(" + name + "). There appears to be another property with this name though.");
-}
-cookieArray[name] = value
-}
-return cookieArray
-},
-clear : function(name) {
-this.set(name, "", -1)
-},
-clearAll : function() {
-var cookies = this.getAll()
-for(var i = 0; i < cookies.length; i++) {
-this.clear(cookies[i].name)
-}
-}
-}
-Logger = {
-logEntries : [],
-onupdate : new CustomEvent(),
-onclear : new CustomEvent(),
-log : function(message, tag) {
-var logEntry = new LogEntry(message, tag || "info")
+
+CustomEvent=Class.create()
+CustomEvent.prototype={initialize:function(){this.listeners=[]},addListener:function(method){this.listeners.push(method)},removeListener:function(method){var foundIndexes=this._findListenerIndexes(method)
+for(var i=0;i<foundIndexes.length;i++){this.listeners.splice(foundIndexes[i],1)}},dispatch:function(handler){for(var i=0;i<this.listeners.length;i++){try{this.listeners[i](handler)}
+catch(e){alert("Could not run the listener "+this.listeners[i]+". "+e)}}},_findListenerIndexes:function(method){var indexes=[]
+for(var i=0;i<this.listeners.length;i++){if(this.listeners[i]==method){indexes.push(i)}}
+return indexes}}
+var Cookie={set:function(name,value,expirationInDays,path){var cookie=escape(name)+"="+escape(value)
+if(expirationInDays){var date=new Date()
+date.setDate(date.getDate()+expirationInDays)
+cookie+="; expires="+date.toGMTString()}
+if(path){cookie+=";path="+path}
+document.cookie=cookie
+if(value&&(expirationInDays==undefined||expirationInDays>0)&&!this.get(name)){Logger.error("Cookie ("+name+") was not set correctly... The value was "+value.toString().length+" charachters long (This may be over the cookie limit)");}},get:function(name){var pattern="(^|;)\\s*"+escape(name)+"=([^;]+)"
+var m=document.cookie.match(pattern)
+if(m&&m[2]){return unescape(m[2])}
+else return null},getAll:function(){var cookies=document.cookie.split(';')
+var cookieArray=[]
+for(var i=0;i<cookies.length;i++){try{var name=unescape(cookies[i].match(/^\s*([^=]+)/m)[1])
+var value=unescape(cookies[i].match(/=(.*$)/m)[1])}
+catch(e){continue}
+cookieArray.push({name:name,value:value})
+if(cookieArray[name]!=undefined){Logger.waring("Trying to retrieve cookie named("+name+"). There appears to be another property with this name though.");}
+cookieArray[name]=value}
+return cookieArray},clear:function(name){this.set(name,"",-1)},clearAll:function(){var cookies=this.getAll()
+for(var i=0;i<cookies.length;i++){this.clear(cookies[i].name)}}}
+Logger={logEntries:[],onupdate:new CustomEvent(),onclear:new CustomEvent(),log:function(message,tag){var logEntry=new LogEntry(message,tag||"info")
this.logEntries.push(logEntry)
-this.onupdate.dispatch(logEntry)
-},
-info : function(message) {
-this.log(message, 'info')
-},
-debug : function(message) {
-this.log(message, 'debug')
-},
-warn : function(message) {
-this.log(message, 'warning')
-},
-error : function(message, error) {
-this.log(message + ": \n" + error, 'error')
-},
-clear : function () {
-this.logEntries = []
-this.onclear.dispatch()
-}
-}
-LogEntry = Class.create()
-LogEntry.prototype = {
-initialize : function(message, tag) {
-this.message = message
-this.tag = tag
-}
-}
-LogConsole = Class.create()
-LogConsole.prototype = {
-commandHistory : [],
-commandIndex : 0,
-initialize : function() {
-this.outputCount = 0
-this.tagPattern = Cookie.get('tagPattern') || ".*"
-this.logElement = document.createElement('div')
+this.onupdate.dispatch(logEntry)},info:function(message){this.log(message,'info')},debug:function(message){this.log(message,'debug')},warn:function(message){this.log(message,'warning')},error:function(message,error){this.log(message+": \n"+error,'error')},clear:function(){this.logEntries=[]
+this.onclear.dispatch()}}
+LogEntry=Class.create()
+LogEntry.prototype={initialize:function(message,tag){this.message=message
+this.tag=tag}}
+LogConsole=Class.create()
+LogConsole.prototype={commandHistory:[],commandIndex:0,initialize:function(){this.outputCount=0
+this.tagPattern=Cookie.get('tagPattern')||".*"
+this.logElement=document.createElement('div')
document.body.appendChild(this.logElement)
Element.hide(this.logElement)
-this.logElement.style.position = "absolute"
-this.logElement.style.left = '0px'
-this.logElement.style.width = '100%'
-this.logElement.style.textAlign = "left"
-this.logElement.style.fontFamily = "lucida console"
-this.logElement.style.fontSize = "100%"
-this.logElement.style.backgroundColor = 'darkgray'
-this.logElement.style.opacity = 0.9
-this.logElement.style.zIndex = 2000
-this.toolbarElement = document.createElement('div')
-this.logElement.appendChild(this.toolbarElement)
-this.toolbarElement.style.padding = "0 0 0 2px"
-this.buttonsContainerElement = document.createElement('span')
-this.toolbarElement.appendChild(this.buttonsContainerElement)
-this.buttonsContainerElement.innerHTML += '<button onclick="logConsole.toggle()" style="float:right;color:black">close</button>'
-this.buttonsContainerElement.innerHTML += '<button onclick="Logger.clear()" style="float:right;color:black">clear</button>'
+this.logElement.style.position="absolute"
+this.logElement.style.left='0px'
+this.logElement.style.width='100%'
+this.logElement.style.textAlign="left"
+this.logElement.style.fontFamily="lucida console"
+this.logElement.style.fontSize="100%"
+this.logElement.style.backgroundColor='darkgray'
+this.logElement.style.opacity=0.9
+this.logElement.style.zIndex=2000
+this.toolbarElement=document.createElement('div')
+this.logElement.appendChild(this.toolbarElement)
+this.toolbarElement.style.padding="0 0 0 2px"
+this.buttonsContainerElement=document.createElement('span')
+this.toolbarElement.appendChild(this.buttonsContainerElement)
+this.buttonsContainerElement.innerHTML+='<button onclick="logConsole.toggle()" style="float:right;color:black">close</button>'
+this.buttonsContainerElement.innerHTML+='<button onclick="Logger.clear()" style="float:right;color:black">clear</button>'
if(!Prado.Inspector.disabled)
-this.buttonsContainerElement.innerHTML += '<button onclick="Prado.Inspector.inspect()" style="float:right;color:black; margin-right:15px;">Object Tree</button>'
-this.tagFilterContainerElement = document.createElement('span')
-this.toolbarElement.appendChild(this.tagFilterContainerElement)
-this.tagFilterContainerElement.style.cssFloat = 'left'
+this.buttonsContainerElement.innerHTML+='<button onclick="Prado.Inspector.inspect()" style="float:right;color:black; margin-right:15px;">Object Tree</button>'
+this.tagFilterContainerElement=document.createElement('span')
+this.toolbarElement.appendChild(this.tagFilterContainerElement)
+this.tagFilterContainerElement.style.cssFloat='left'
this.tagFilterContainerElement.appendChild(document.createTextNode("Log Filter"))
-this.tagFilterElement = document.createElement('input')
+this.tagFilterElement=document.createElement('input')
this.tagFilterContainerElement.appendChild(this.tagFilterElement)
-this.tagFilterElement.style.width = '200px'
-this.tagFilterElement.value = this.tagPattern
-this.tagFilterElement.setAttribute('autocomplete', 'off')
-Event.observe(this.tagFilterElement, 'keyup', this.updateTags.bind(this))
-Event.observe(this.tagFilterElement, 'click', function() {this.tagFilterElement.select()}.bind(this))
-this.outputElement = document.createElement('div')
+this.tagFilterElement.style.width='200px'
+this.tagFilterElement.value=this.tagPattern
+this.tagFilterElement.setAttribute('autocomplete','off')
+Event.observe(this.tagFilterElement,'keyup',this.updateTags.bind(this))
+Event.observe(this.tagFilterElement,'click',function(){this.tagFilterElement.select()}.bind(this))
+this.outputElement=document.createElement('div')
this.logElement.appendChild(this.outputElement)
-this.outputElement.style.overflow = "auto"
-this.outputElement.style.clear = "both"
-this.outputElement.style.height = "200px"
-this.outputElement.style.backgroundColor = 'black'
-this.inputContainerElement = document.createElement('div')
-this.inputContainerElement.style.width = "100%"
+this.outputElement.style.overflow="auto"
+this.outputElement.style.clear="both"
+this.outputElement.style.height="200px"
+this.outputElement.style.backgroundColor='black'
+this.inputContainerElement=document.createElement('div')
+this.inputContainerElement.style.width="100%"
this.logElement.appendChild(this.inputContainerElement)
-this.inputElement = document.createElement('input')
+this.inputElement=document.createElement('input')
this.inputContainerElement.appendChild(this.inputElement)
-this.inputElement.style.width = '100%'
-this.inputElement.style.borderWidth = '0px'
-this.inputElement.style.margin = '0px'
-this.inputElement.style.padding = '0px'
-this.inputElement.value = 'Type command here'
-this.inputElement.setAttribute('autocomplete', 'off')
-Event.observe(this.inputElement, 'keyup', this.handleInput.bind(this))
-Event.observe(this.inputElement, 'click', function() {this.inputElement.select()}.bind(this))
-window.setInterval(this.repositionWindow.bind(this), 500)
+this.inputElement.style.width='100%'
+this.inputElement.style.borderWidth='0px'
+this.inputElement.style.margin='0px'
+this.inputElement.style.padding='0px'
+this.inputElement.value='Type command here'
+this.inputElement.setAttribute('autocomplete','off')
+Event.observe(this.inputElement,'keyup',this.handleInput.bind(this))
+Event.observe(this.inputElement,'click',function(){this.inputElement.select()}.bind(this))
+window.setInterval(this.repositionWindow.bind(this),500)
this.repositionWindow()
Logger.onupdate.addListener(this.logUpdate.bind(this))
Logger.onclear.addListener(this.clear.bind(this))
-for (var i = 0; i < Logger.logEntries.length; i++) {
-this.logUpdate(Logger.logEntries[i])
-}
-Event.observe(window, 'error', function(msg, url, lineNumber) {Logger.error("Error in (" + (url || location) + ") on line "+lineNumber+"", msg)})
-var accessElement = document.createElement('span')
-accessElement.innerHTML = '<button style="position:absolute;top:-100px" onclick="javascript:logConsole.toggle()" accesskey="d"></button>'
+for(var i=0;i<Logger.logEntries.length;i++){this.logUpdate(Logger.logEntries[i])}
+Event.observe(window,'error',function(msg,url,lineNumber){Logger.error("Error in ("+(url||location)+") on line "+lineNumber+"",msg)})
+var accessElement=document.createElement('span')
+accessElement.innerHTML='<button style="position:absolute;top:-100px" onclick="javascript:logConsole.toggle()" accesskey="d"></button>'
document.body.appendChild(accessElement)
-if (Cookie.get('ConsoleVisible') == 'true') {
-this.toggle()
-}
-},
-toggle : function() {
-if (this.logElement.style.display == 'none') {
-this.show()
-}
-else {
-this.hide()
-}
-},
-show : function() {
-Element.show(this.logElement)
-this.outputElement.scrollTop = this.outputElement.scrollHeight
-Cookie.set('ConsoleVisible', 'true')
- this.inputElement.select()
-},
-hide : function() {
-Element.hide(this.logElement)
-Cookie.set('ConsoleVisible', 'false')
-},
-output : function(message, style) {
-var shouldScroll = (this.outputElement.scrollTop + (2 * this.outputElement.clientHeight)) >= this.outputElement.scrollHeight
+if(Cookie.get('ConsoleVisible')=='true'){this.toggle()}},toggle:function(){if(this.logElement.style.display=='none'){this.show()}
+else{this.hide()}},show:function(){Element.show(this.logElement)
+this.outputElement.scrollTop=this.outputElement.scrollHeight
+Cookie.set('ConsoleVisible','true')
+this.inputElement.select()},hide:function(){Element.hide(this.logElement)
+Cookie.set('ConsoleVisible','false')},output:function(message,style){var shouldScroll=(this.outputElement.scrollTop+(2*this.outputElement.clientHeight))>=this.outputElement.scrollHeight
this.outputCount++
-style = (style ? style += ';' : '')
-style += 'padding:1px;margin:0 0 5px 0'
-if (this.outputCount % 2 == 0) style += ";background-color:#101010"
-message = message || "undefined"
-message = message.toString().escapeHTML()
-this.outputElement.innerHTML += "<pre style='" + style + "'>" + message + "</pre>"
-if (shouldScroll) {
-this.outputElement.scrollTop = this.outputElement.scrollHeight
-}
-},
-updateTags : function() {
-var pattern = this.tagFilterElement.value
-if (this.tagPattern == pattern) return
-try {
-new RegExp(pattern)
-}
-catch (e) {
-return
-}
-this.tagPattern = pattern
-Cookie.set('tagPattern', this.tagPattern)
-this.outputElement.innerHTML = ""
-this.outputCount = 0;
-for (var i = 0; i < Logger.logEntries.length; i++) {
-this.logUpdate(Logger.logEntries[i])
-}
-},
-repositionWindow : function() {
-var offset = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
-var pageHeight = self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
-this.logElement.style.top = (offset + pageHeight - Element.getHeight(this.logElement)) + "px"
-},
-logUpdate : function(logEntry) {
-if (logEntry.tag.search(new RegExp(this.tagPattern, 'igm')) == -1) return
-var style = ''
-if (logEntry.tag.search(/error/) != -1) style += 'color:red'
-else if (logEntry.tag.search(/warning/) != -1) style += 'color:orange'
-else if (logEntry.tag.search(/debug/) != -1) style += 'color:green'
- else if (logEntry.tag.search(/info/) != -1) style += 'color:white'
-else style += 'color:yellow'
-this.output(logEntry.message, style)
-},
-clear : function(e) {
-this.outputElement.innerHTML = ""
-},
-handleInput : function(e) {
-if (e.keyCode == Event.KEY_RETURN ) {
-var command = this.inputElement.value
-switch(command) {
-case "clear":
-Logger.clear()
-break
-default:
-var consoleOutput = ""
-try {
-consoleOutput = eval(this.inputElement.value)
-}
-catch (e) {
-Logger.error("Problem parsing input <" + command + ">", e)
+style=(style?style+=';':'')
+style+='padding:1px;margin:0 0 5px 0'
+if(this.outputCount%2==0)style+=";background-color:#101010"
+message=message||"undefined"
+message=message.toString().escapeHTML()
+this.outputElement.innerHTML+="<pre style='"+style+"'>"+message+"</pre>"
+if(shouldScroll){this.outputElement.scrollTop=this.outputElement.scrollHeight}},updateTags:function(){var pattern=this.tagFilterElement.value
+if(this.tagPattern==pattern)return
+try{new RegExp(pattern)}
+catch(e){return}
+this.tagPattern=pattern
+Cookie.set('tagPattern',this.tagPattern)
+this.outputElement.innerHTML=""
+this.outputCount=0;for(var i=0;i<Logger.logEntries.length;i++){this.logUpdate(Logger.logEntries[i])}},repositionWindow:function(){var offset=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop
+var pageHeight=self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight
+this.logElement.style.top=(offset+pageHeight-Element.getHeight(this.logElement))+"px"},logUpdate:function(logEntry){if(logEntry.tag.search(new RegExp(this.tagPattern,'igm'))==-1)return
+var style=''
+if(logEntry.tag.search(/error/)!=-1)style+='color:red'
+else if(logEntry.tag.search(/warning/)!=-1)style+='color:orange'
+else if(logEntry.tag.search(/debug/)!=-1)style+='color:green'
+else if(logEntry.tag.search(/info/)!=-1)style+='color:white'
+else style+='color:yellow'
+this.output(logEntry.message,style)},clear:function(e){this.outputElement.innerHTML=""},handleInput:function(e){if(e.keyCode==Event.KEY_RETURN){var command=this.inputElement.value
+switch(command){case"clear":Logger.clear()
break
-}
+default:var consoleOutput=""
+try{consoleOutput=eval(this.inputElement.value)}
+catch(e){Logger.error("Problem parsing input <"+command+">",e)
+break}
Logger.log(consoleOutput)
-break
-}
-if (this.inputElement.value != "" && this.inputElement.value != this.commandHistory[0]) {
-this.commandHistory.unshift(this.inputElement.value)
-}
-this.commandIndex = 0
-this.inputElement.value = ""
-}
-else if (e.keyCode == Event.KEY_UP && this.commandHistory.length > 0) {
-this.inputElement.value = this.commandHistory[this.commandIndex]
-if (this.commandIndex < this.commandHistory.length - 1) {
-this.commandIndex += 1
-}
-}
-else if (e.keyCode == Event.KEY_DOWN && this.commandHistory.length > 0) {
-if (this.commandIndex > 0) {
-this.commandIndex -= 1
-}
-this.inputElement.value = this.commandHistory[this.commandIndex]
-}
- else {
-this.commandIndex = 0
-}
-}
-}
-var logConsole;
-Event.OnLoad(function() { logConsole = new LogConsole()});
-function inspect(o)
-{
-var objtype = typeof(o);
-if (objtype == "undefined") {
-return "undefined";
-} else if (objtype == "number" || objtype == "boolean") {
-return o + "";
-} else if (o === null) {
-return "null";
-}
-try {
-var ostring = (o + "");
-} catch (e) {
-return "[" + typeof(o) + "]";
-}
-if (typeof(o) == "function")
-{
-o = ostring.replace(/^\s+/, "");
-var idx = o.indexOf("{");
-if (idx != -1) {
-o = o.substr(0, idx) + "{...}";
-}
-return o;
- }
-var reprString = function (o)
-{
-return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
-).replace(/[\f]/g, "\\f"
-).replace(/[\b]/g, "\\b"
-).replace(/[\n]/g, "\\n"
-).replace(/[\t]/g, "\\t"
-).replace(/[\r]/g, "\\r");
-};
-if (objtype == "string") {
-return reprString(o);
-}
-var me = arguments.callee;
-var newObj;
-if (typeof(o.__json__) == "function") {
-newObj = o.__json__();
-if (o !== newObj) {
-return me(newObj);
-}
-}
-if (typeof(o.json) == "function") {
-newObj = o.json();
-if (o !== newObj) {
-return me(newObj);
-}
-}
-if (objtype != "function" && typeof(o.length) == "number") {
-var res = [];
-for (var i = 0; i < o.length; i++) {
-var val = me(o[i]);
-if (typeof(val) != "string") {
-val = "undefined";
-}
-res.push(val);
-}
-return "[" + res.join(", ") + "]";
-}
-res = [];
-for (var k in o) {
-var useKey;
-if (typeof(k) == "number") {
-useKey = '"' + k + '"';
-} else if (typeof(k) == "string") {
-useKey = reprString(k);
-} else {
-continue;
-}
-val = me(o[k]);
-if (typeof(val) != "string") {
-continue;
-}
-res.push(useKey + ":" + val);
-}
-return "{" + res.join(", ") + "}";
-}
-Array.prototype.contains = function(object) {
-for(var i = 0; i < this.length; i++) {
-if (object == this[i]) return true
-}
-return false
-}
-var puts = function() {return Logger.log(arguments[0], arguments[1])}
-if(typeof Prado == "undefined")
-var Prado = {};
-Prado.Inspector =
-{
-d : document,
-types : new Array(),
-objs : new Array(),
-hidden : new Array(),
-opera : window.opera,
-displaying : '',
-nameList : new Array(),
-format : function(str) {
-if(typeof(str) != "string") return str;
-str=str.replace(/</g,"&lt;");
-str=str.replace(/>/g,"&gt;");
-return str;
-},
-parseJS : function(obj) {
-var name;
-if(typeof obj == "string") {name = obj; obj = eval(obj); }
-win= typeof obj == 'undefined' ? window : obj;
-this.displaying = name ? name : win.toString();
-for(js in win) {
-try {
-if(win[js] && js.toString().indexOf("Inspector")==-1 && (win[js]+"").indexOf("[native code]")==-1) {
-t=typeof(win[js]);
-if(!this.objs[t.toString()]) {
-this.types[this.types.length]=t;
-this.objs[t]={};
-this.nameList[t] = new Array();
-}
-this.nameList[t].push(js);
-this.objs[t][js] = this.format(win[js]+"");
-}
-} catch(err) { }
-}
-for(i=0;i<this.types.length;i++)
-this.nameList[this.types[i]].sort();
-},
-show : function(objID) {
-this.d.getElementById(objID).style.display=this.hidden[objID]?"none":"block";
-this.hidden[objID]=this.hidden[objID]?0:1;
-},
-changeSpan : function(spanID) {
-if(this.d.getElementById(spanID).innerHTML.indexOf("+")>-1){
-this.d.getElementById(spanID).innerHTML="[-]";
-} else {
-this.d.getElementById(spanID).innerHTML="[+]";
-}
-},
-buildInspectionLevel : function()
-{
-var display = this.displaying;
-var list = display.split(".");
-var links = ["<a href=\"javascript:var_dump()\">[object Window]</a>"];
-var name = '';
-if(display.indexOf("[object ") >= 0) return links.join(".");
-for(var i = 0; i < list.length; i++)
-{
-name += (name.length ? "." : "") + list[i];
-links[i+1] = "<a href=\"javascript:var_dump('"+name+"')\">"+list[i]+"</a>";
-}
-return links.join(".");
-},
-buildTree : function() {
-mHTML = "<div>Inspecting "+this.buildInspectionLevel()+"</div>";
-mHTML +="<ul class=\"topLevel\">";
-this.types.sort();
-var so_objIndex=0;
-for(i=0;i<this.types.length;i++)
-{
-mHTML+="<li style=\"cursor:pointer;\" onclick=\"Prado.Inspector.show('ul"+i+"');Prado.Inspector.changeSpan('sp" + i + "')\"><span id=\"sp" + i + "\">[+]</span><b>" + this.types[i] + "</b> (" + this.nameList[this.types[i]].length + ")</li><ul style=\"display:none;\" id=\"ul"+i+"\">";
-this.hidden["ul"+i]=0;
-for(e=0;e<this.nameList[this.types[i]].length;e++)
-{
-var prop = this.nameList[this.types[i]][e];
-var value = this.objs[this.types[i]][prop]
-var more = "";
-if(value.indexOf("[object ") >= 0 && /^[a-zA-Z_]/.test(prop))
-{
-if(this.displaying.indexOf("[object ") < 0)
-more = " <a href=\"javascript:var_dump('"+this.displaying+"."+prop+"')\"><b>more</b></a>";
-else if(this.displaying.indexOf("[object Window]") >= 0)
-more = " <a href=\"javascript:var_dump('"+prop+"')\"><b>more</b></a>";
-}
-mHTML+="<li style=\"cursor:pointer;\" onclick=\"Prado.Inspector.show('mul" + so_objIndex + "');Prado.Inspector.changeSpan('sk" + so_objIndex + "')\"><span id=\"sk" + so_objIndex + "\">[+]</span>" + prop + "</li><ul id=\"mul" + so_objIndex + "\" style=\"display:none;\"><li style=\"list-style-type:none;\"><pre>" + value + more + "</pre></li></ul>";
-this.hidden["mul"+so_objIndex]=0;
-so_objIndex++;
-}
-mHTML+="</ul>";
-}
-mHTML+="</ul>";
-this.d.getElementById("so_mContainer").innerHTML =mHTML;
-},
-handleKeyEvent : function(e) {
-keyCode=document.all?window.event.keyCode:e.keyCode;
-if(keyCode==27) {
-this.cleanUp();
-}
-},
-cleanUp : function()
-{
-if(this.d.getElementById("so_mContainer"))
-{
-this.d.body.removeChild(this.d.getElementById("so_mContainer"));
-this.d.body.removeChild(this.d.getElementById("so_mStyle"));
-if(typeof Event != "undefined")
-Event.stopObserving(this.d, "keydown", this.dKeyDownEvent);
-this.types = new Array();
-this.objs = new Array();
-this.hidden = new Array();
-}
-},
-disabled : document.all && !this.opera,
-inspect : function(obj)
-{
-if(this.disabled)return alert("Sorry, this only works in Mozilla and Firefox currently.");
-this.cleanUp();
-mObj=this.d.body.appendChild(this.d.createElement("div"));
-mObj.id="so_mContainer";
-sObj=this.d.body.appendChild(this.d.createElement("style"));
-sObj.id="so_mStyle";
-sObj.type="text/css";
-sObj.innerHTML = this.style;
-this.dKeyDownEvent = this.handleKeyEvent.bind(this);
-if(typeof Event != "undefined")
-Event.observe(this.d, "keydown", this.dKeyDownEvent);
-this.parseJS(obj);
-this.buildTree();
-cObj=mObj.appendChild(this.d.createElement("div"));
-cObj.className="credits";
-cObj.innerHTML = "<b>[esc] to <a href=\"javascript:Prado.Inspector.cleanUp();\">close</a></b><br />Javascript Object Tree V2.0.";
-window.scrollTo(0,0);
-},
-style : "#so_mContainer { position:absolute; top:5px; left:5px; background-color:#E3EBED; text-align:left; font:9pt verdana; width:85%; border:2px solid #000; padding:5px; z-index:1000;color:#000; } " +
-"#so_mContainer ul { padding-left:20px; } " +
-"#so_mContainer ul li { display:block; list-style-type:none; list-style-image:url(); line-height:2em; -moz-border-radius:.75em; font:10px verdana; padding:0; margin:2px; color:#000; } " +
-"#so_mContainer li:hover { background-color:#E3EBED; } " +
-"#so_mContainer ul li span { position:relative; width:15px; height:15px; margin-right:4px; } " +
-"#so_mContainer pre { background-color:#F9FAFB; border:1px solid #638DA1; height:auto; padding:5px; font:9px verdana; color:#000; } " +
-"#so_mContainer .topLevel { margin:0; padding:0; } " +
-"#so_mContainer .credits { float:left; width:200px; font:6.5pt verdana; color:#000; padding:2px; margin-left:5px; text-align:left; border-top:1px solid #000; margin-top:15px; width:75%; } " +
-"#so_mContainer .credits a { font:9px verdana; font-weight:bold; color:#004465; text-decoration:none; background-color:transparent; }"
-}
+break}
+if(this.inputElement.value!=""&&this.inputElement.value!=this.commandHistory[0]){this.commandHistory.unshift(this.inputElement.value)}
+this.commandIndex=0
+this.inputElement.value=""}
+else if(e.keyCode==Event.KEY_UP&&this.commandHistory.length>0){this.inputElement.value=this.commandHistory[this.commandIndex]
+if(this.commandIndex<this.commandHistory.length-1){this.commandIndex+=1}}
+else if(e.keyCode==Event.KEY_DOWN&&this.commandHistory.length>0){if(this.commandIndex>0){this.commandIndex-=1}
+this.inputElement.value=this.commandHistory[this.commandIndex]}
+else{this.commandIndex=0}}}
+var logConsole;Event.OnLoad(function(){logConsole=new LogConsole()});function inspect(o)
+{var objtype=typeof(o);if(objtype=="undefined"){return"undefined";}else if(objtype=="number"||objtype=="boolean"){return o+"";}else if(o===null){return"null";}
+try{var ostring=(o+"");}catch(e){return"["+typeof(o)+"]";}
+if(typeof(o)=="function")
+{o=ostring.replace(/^\s+/,"");var idx=o.indexOf("{");if(idx!=-1){o=o.substr(0,idx)+"{...}";}
+return o;}
+var reprString=function(o)
+{return('"'+o.replace(/(["\\])/g,'\\$1')+'"').replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};if(objtype=="string"){return reprString(o);}
+var me=arguments.callee;var newObj;if(typeof(o.__json__)=="function"){newObj=o.__json__();if(o!==newObj){return me(newObj);}}
+if(typeof(o.json)=="function"){newObj=o.json();if(o!==newObj){return me(newObj);}}
+if(objtype!="function"&&typeof(o.length)=="number"){var res=[];for(var i=0;i<o.length;i++){var val=me(o[i]);if(typeof(val)!="string"){val="undefined";}
+res.push(val);}
+return"["+res.join(", ")+"]";}
+res=[];for(var k in o){var useKey;if(typeof(k)=="number"){useKey='"'+k+'"';}else if(typeof(k)=="string"){useKey=reprString(k);}else{continue;}
+val=me(o[k]);if(typeof(val)!="string"){continue;}
+res.push(useKey+":"+val);}
+return"{"+res.join(", ")+"}";}
+Array.prototype.contains=function(object){for(var i=0;i<this.length;i++){if(object==this[i])return true}
+return false}
+var puts=function(){return Logger.log(arguments[0],arguments[1])}
+if(typeof Prado=="undefined")
+var Prado={};Prado.Inspector={d:document,types:new Array(),objs:new Array(),hidden:new Array(),opera:window.opera,displaying:'',nameList:new Array(),format:function(str){if(typeof(str)!="string")return str;str=str.replace(/</g,"&lt;");str=str.replace(/>/g,"&gt;");return str;},parseJS:function(obj){var name;if(typeof obj=="string"){name=obj;obj=eval(obj);}
+win=typeof obj=='undefined'?window:obj;this.displaying=name?name:win.toString();for(js in win){try{if(win[js]&&js.toString().indexOf("Inspector")==-1&&(win[js]+"").indexOf("[native code]")==-1){t=typeof(win[js]);if(!this.objs[t.toString()]){this.types[this.types.length]=t;this.objs[t]={};this.nameList[t]=new Array();}
+this.nameList[t].push(js);this.objs[t][js]=this.format(win[js]+"");}}catch(err){}}
+for(i=0;i<this.types.length;i++)
+this.nameList[this.types[i]].sort();},show:function(objID){this.d.getElementById(objID).style.display=this.hidden[objID]?"none":"block";this.hidden[objID]=this.hidden[objID]?0:1;},changeSpan:function(spanID){if(this.d.getElementById(spanID).innerHTML.indexOf("+")>-1){this.d.getElementById(spanID).innerHTML="[-]";}else{this.d.getElementById(spanID).innerHTML="[+]";}},buildInspectionLevel:function()
+{var display=this.displaying;var list=display.split(".");var links=["<a href=\"javascript:var_dump()\">[object Window]</a>"];var name='';if(display.indexOf("[object ")>=0)return links.join(".");for(var i=0;i<list.length;i++)
+{name+=(name.length?".":"")+list[i];links[i+1]="<a href=\"javascript:var_dump('"+name+"')\">"+list[i]+"</a>";}
+return links.join(".");},buildTree:function(){mHTML="<div>Inspecting "+this.buildInspectionLevel()+"</div>";mHTML+="<ul class=\"topLevel\">";this.types.sort();var so_objIndex=0;for(i=0;i<this.types.length;i++)
+{mHTML+="<li style=\"cursor:pointer;\" onclick=\"Prado.Inspector.show('ul"+i+"');Prado.Inspector.changeSpan('sp"+i+"')\"><span id=\"sp"+i+"\">[+]</span><b>"+this.types[i]+"</b> ("+this.nameList[this.types[i]].length+")</li><ul style=\"display:none;\" id=\"ul"+i+"\">";this.hidden["ul"+i]=0;for(e=0;e<this.nameList[this.types[i]].length;e++)
+{var prop=this.nameList[this.types[i]][e];var value=this.objs[this.types[i]][prop]
+var more="";if(value.indexOf("[object ")>=0&&/^[a-zA-Z_]/.test(prop))
+{if(this.displaying.indexOf("[object ")<0)
+more=" <a href=\"javascript:var_dump('"+this.displaying+"."+prop+"')\"><b>more</b></a>";else if(this.displaying.indexOf("[object Window]")>=0)
+more=" <a href=\"javascript:var_dump('"+prop+"')\"><b>more</b></a>";}
+mHTML+="<li style=\"cursor:pointer;\" onclick=\"Prado.Inspector.show('mul"+so_objIndex+"');Prado.Inspector.changeSpan('sk"+so_objIndex+"')\"><span id=\"sk"+so_objIndex+"\">[+]</span>"+prop+"</li><ul id=\"mul"+so_objIndex+"\" style=\"display:none;\"><li style=\"list-style-type:none;\"><pre>"+value+more+"</pre></li></ul>";this.hidden["mul"+so_objIndex]=0;so_objIndex++;}
+mHTML+="</ul>";}
+mHTML+="</ul>";this.d.getElementById("so_mContainer").innerHTML=mHTML;},handleKeyEvent:function(e){keyCode=document.all?window.event.keyCode:e.keyCode;if(keyCode==27){this.cleanUp();}},cleanUp:function()
+{if(this.d.getElementById("so_mContainer"))
+{this.d.body.removeChild(this.d.getElementById("so_mContainer"));this.d.body.removeChild(this.d.getElementById("so_mStyle"));if(typeof Event!="undefined")
+Event.stopObserving(this.d,"keydown",this.dKeyDownEvent);this.types=new Array();this.objs=new Array();this.hidden=new Array();}},disabled:document.all&&!this.opera,inspect:function(obj)
+{if(this.disabled)return alert("Sorry, this only works in Mozilla and Firefox currently.");this.cleanUp();mObj=this.d.body.appendChild(this.d.createElement("div"));mObj.id="so_mContainer";sObj=this.d.body.appendChild(this.d.createElement("style"));sObj.id="so_mStyle";sObj.type="text/css";sObj.innerHTML=this.style;this.dKeyDownEvent=this.handleKeyEvent.bind(this);if(typeof Event!="undefined")
+Event.observe(this.d,"keydown",this.dKeyDownEvent);this.parseJS(obj);this.buildTree();cObj=mObj.appendChild(this.d.createElement("div"));cObj.className="credits";cObj.innerHTML="<b>[esc] to <a href=\"javascript:Prado.Inspector.cleanUp();\">close</a></b><br />Javascript Object Tree V2.0.";window.scrollTo(0,0);},style:"#so_mContainer { position:absolute; top:5px; left:5px; background-color:#E3EBED; text-align:left; font:9pt verdana; width:85%; border:2px solid #000; padding:5px; z-index:1000; color:#000; } "+"#so_mContainer ul { padding-left:20px; } "+"#so_mContainer ul li { display:block; list-style-type:none; list-style-image:url(); line-height:2em; -moz-border-radius:.75em; font:10px verdana; padding:0; margin:2px; color:#000; } "+"#so_mContainer li:hover { background-color:#E3EBED; } "+"#so_mContainer ul li span { position:relative; width:15px; height:15px; margin-right:4px; } "+"#so_mContainer pre { background-color:#F9FAFB; border:1px solid #638DA1; height:auto; padding:5px; font:9px verdana; color:#000; } "+"#so_mContainer .topLevel { margin:0; padding:0; } "+"#so_mContainer .credits { float:left; width:200px; font:6.5pt verdana; color:#000; padding:2px; margin-left:5px; text-align:left; border-top:1px solid #000; margin-top:15px; width:75%; } "+"#so_mContainer .credits a { font:9px verdana; font-weight:bold; color:#004465; text-decoration:none; background-color:transparent; }"}
function var_dump(obj)
-{
-Prado.Inspector.inspect(obj);
-}
-var print_r = inspect;
+{Prado.Inspector.inspect(obj);}
+var print_r=inspect; \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/prado.js b/framework/Web/Javascripts/js/prado.js
index 394d5eeb..d80f984d 100644
--- a/framework/Web/Javascripts/js/prado.js
+++ b/framework/Web/Javascripts/js/prado.js
@@ -1,2260 +1,346 @@
-
-var Prototype = {
-Version: '1.50',
-ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-emptyFunction: function() {},
-K: function(x) {return x}
-}
-var Class = {
-create: function() {
-return function() {
-this.initialize.apply(this, arguments);
-}
-}
-}
-var Abstract = new Object();
-Object.extend = function(destination, source) {
-for (var property in source) {
-destination[property] = source[property];
-}
-return destination;
-}
-Object.inspect = function(object) {
-try {
-if (object == undefined) return 'undefined';
-if (object == null) return 'null';
-return object.inspect ? object.inspect() : object.toString();
-} catch (e) {
-if (e instanceof RangeError) return '...';
-throw e;
-}
-}
-Function.prototype.bind = function() {
-var __method = this, args = $A(arguments), object = args.shift();
-return function() {
-return __method.apply(object, args.concat($A(arguments)));
-}
-}
-Function.prototype.bindAsEventListener = function(object) {
-var __method = this;
-return function(event) {
-return __method.call(object, event || window.event);
-}
-}
-Object.extend(Number.prototype, {
-toColorPart: function() {
-var digits = this.toString(16);
-if (this < 16) return '0' + digits;
-return digits;
-},
-succ: function() {
-return this + 1;
-},
-times: function(iterator) {
-$R(0, this, true).each(iterator);
-return this;
-}
-});
-var Try = {
-these: function() {
-var returnValue;
-for (var i = 0; i < arguments.length; i++) {
-var lambda = arguments[i];
-try {
-returnValue = lambda();
-break;
-} catch (e) {}
-}
-return returnValue;
-}
-}
-var PeriodicalExecuter = Class.create();
-PeriodicalExecuter.prototype = {
-initialize: function(callback, frequency) {
-this.callback = callback;
-this.frequency = frequency;
-this.currentlyExecuting = false;
-this.registerCallback();
-},
-registerCallback: function() {
-setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
-},
-onTimerEvent: function() {
-if (!this.currentlyExecuting) {
-try {
-this.currentlyExecuting = true;
-this.callback();
-} finally {
-this.currentlyExecuting = false;
-}
-}
-}
-}
-Function.prototype.bindEvent = function()
-{
-var __method = this, args = $A(arguments), object = args.shift();
-return function(event)
-{
-return __method.apply(object, [event || window.event].concat(args));
-}
-}
-Class.extend = function(base, definition)
-{
-var component = Class.create();
-Object.extend(component.prototype, base.prototype);
-if(definition)
-Object.extend(component.prototype, definition);
-return component;
-}
-Object.extend(String.prototype, {
-gsub: function(pattern, replacement) {
-var result = '', source = this, match;
-replacement = arguments.callee.prepareReplacement(replacement);
-while (source.length > 0) {
-if (match = source.match(pattern)) {
-result += source.slice(0, match.index);
-result += (replacement(match) || '').toString();
-source= source.slice(match.index + match[0].length);
-} else {
-result += source, source = '';
-}
-}
-return result;
-},
-sub: function(pattern, replacement, count) {
-replacement = this.gsub.prepareReplacement(replacement);
-count = count === undefined ? 1 : count;
-return this.gsub(pattern, function(match) {
-if (--count < 0) return match[0];
-return replacement(match);
-});
-},
-scan: function(pattern, iterator) {
-this.gsub(pattern, iterator);
-return this;
-},
-truncate: function(length, truncation) {
-length = length || 30;
-truncation = truncation === undefined ? '...' : truncation;
-return this.length > length ?
-this.slice(0, length - truncation.length) + truncation : this;
-},
-strip: function() {
-return this.replace(/^\s+/, '').replace(/\s+$/, '');
-},
-stripTags: function() {
-return this.replace(/<\/?[^>]+>/gi, '');
-},
-stripScripts: function() {
-return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
-},
-extractScripts: function() {
-var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
-var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
-return (this.match(matchAll) || []).map(function(scriptTag) {
-return (scriptTag.match(matchOne) || ['', ''])[1];
-});
-},
-evalScripts: function() {
-return this.extractScripts().map(function(script) { return eval(script) });
-},
-escapeHTML: function() {
-var div = document.createElement('div');
-var text = document.createTextNode(this);
-div.appendChild(text);
-return div.innerHTML;
-},
-unescapeHTML: function() {
-var div = document.createElement('div');
-div.innerHTML = this.stripTags();
-return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
-},
-toQueryParams: function() {
-var pairs = this.match(/^\??(.*)$/)[1].split('&');
-return pairs.inject({}, function(params, pairString) {
-var pair = pairString.split('=');
-params[pair[0]] = pair[1];
-return params;
-});
-},
-toArray: function() {
-return this.split('');
-},
-camelize: function() {
-var oStringList = this.split('-');
-if (oStringList.length == 1) return oStringList[0];
-var camelizedString = this.indexOf('-') == 0
-? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
-: oStringList[0];
-for (var i = 1, len = oStringList.length; i < len; i++) {
-var s = oStringList[i];
-camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
-}
-return camelizedString;
-},
-inspect: function() {
-return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'";
-}
-});
-String.prototype.gsub.prepareReplacement = function(replacement) {
-if (typeof replacement == 'function') return replacement;
-var template = new Template(replacement);
-return function(match) { return template.evaluate(match) };
-}
-String.prototype.parseQuery = String.prototype.toQueryParams;
-var Template = Class.create();
-Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
-Template.prototype = {
-initialize: function(template, pattern) {
-this.template = template.toString();
-this.pattern= pattern || Template.Pattern;
-},
-evaluate: function(object) {
-return this.template.gsub(this.pattern, function(match) {
-var before = match[1];
-if (before == '\\') return match[2];
-return before + (object[match[3]] || '').toString();
-});
-}
-}
-Object.extend(String.prototype, {
-pad : function(side, len, chr) {
-if (!chr) chr = ' ';
-var s = this;
-var left = side.toLowerCase()=='left';
-while (s.length<len) s = left? chr + s : s + chr;
-return s;
-},
-padLeft : function(len, chr) {
-return this.pad('left',len,chr);
-},
-padRight : function(len, chr) {
-return this.pad('right',len,chr);
-},
-zerofill : function(len) {
-return this.padLeft(len,'0');
-},
-trim : function() {
-return this.replace(/^\s+|\s+$/g,'');
-},
-trimLeft : function() {
-return this.replace(/^\s+/,'');
-},
-trimRight : function() {
-return this.replace(/\s+$/,'');
-},
-toFunction : function()
-{
-var commands = this.split(/\./);
-var command = window;
-commands.each(function(action)
-{
-if(command[new String(action)])
-command=command[new String(action)];
-});
-if(typeof(command) == "function")
-return command;
-else
-{
-if(typeof Logger != "undefined")
-Logger.error("Missing function", this);
-throw new Error("Missing function '"+this+"'");
-}
-},
-toInteger : function()
-{
-var exp = /^\s*[-\+]?\d+\s*$/;
-if (this.match(exp) == null)
-return null;
-var num = parseInt(this, 10);
-return (isNaN(num) ? null : num);
-},
-toDouble : function(decimalchar)
-{
-if(this.length <= 0) return null;
-decimalchar = decimalchar || ".";
-var exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + decimalchar + "(\\d+))?\\s*$");
-var m = this.match(exp);
-if (m == null)
-return null;
-m[1] = m[1] || "";
-m[2] = m[2] || "0";
-m[4] = m[4] || "0";
-var cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + m[4];
-var num = parseFloat(cleanInput);
-return (isNaN(num) ? null : num);
-},
-toCurrency : function(groupchar, digits, decimalchar)
-{
-groupchar = groupchar || ",";
-decimalchar = decimalchar || ".";
-digits = typeof(digits) == "undefined" ? 2 : digits;
-var exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\" + groupchar + ")*)(\\d+)"
-+ ((digits > 0) ? "(\\" + decimalchar + "(\\d{1," + digits + "}))?" : "")
-+ "\\s*$");
-var m = this.match(exp);
-if (m == null)
-return null;
-var intermed = m[2] + m[5] ;
-var cleanInput = m[1] + intermed.replace(
-new RegExp("(\\" + groupchar + ")", "g"), "")
-+ ((digits > 0) ? "." + m[7] : "");
-var num = parseFloat(cleanInput);
-return (isNaN(num) ? null : num);
-},
-toDate : function(format)
-{
-return Date.SimpleParse(this, format);
-}
-});
-var $break= new Object();
-var $continue = new Object();
-var Enumerable = {
-each: function(iterator) {
-var index = 0;
-try {
-this._each(function(value) {
-try {
-iterator(value, index++);
-} catch (e) {
-if (e != $continue) throw e;
-}
-});
-} catch (e) {
-if (e != $break) throw e;
-}
-},
-all: function(iterator) {
-var result = true;
-this.each(function(value, index) {
-result = result && !!(iterator || Prototype.K)(value, index);
-if (!result) throw $break;
-});
-return result;
-},
-any: function(iterator) {
-var result = true;
-this.each(function(value, index) {
-if (result = !!(iterator || Prototype.K)(value, index))
-throw $break;
-});
-return result;
-},
-collect: function(iterator) {
-var results = [];
-this.each(function(value, index) {
-results.push(iterator(value, index));
-});
-return results;
-},
-detect: function (iterator) {
-var result;
-this.each(function(value, index) {
-if (iterator(value, index)) {
-result = value;
-throw $break;
-}
-});
-return result;
-},
-findAll: function(iterator) {
-var results = [];
-this.each(function(value, index) {
-if (iterator(value, index))
-results.push(value);
-});
-return results;
-},
-grep: function(pattern, iterator) {
-var results = [];
-this.each(function(value, index) {
-var stringValue = value.toString();
-if (stringValue.match(pattern))
-results.push((iterator || Prototype.K)(value, index));
-})
-return results;
-},
-include: function(object) {
-var found = false;
-this.each(function(value) {
-if (value == object) {
-found = true;
-throw $break;
-}
-});
-return found;
-},
-inject: function(memo, iterator) {
-this.each(function(value, index) {
-memo = iterator(memo, value, index);
-});
-return memo;
-},
-invoke: function(method) {
-var args = $A(arguments).slice(1);
-return this.collect(function(value) {
-return value[method].apply(value, args);
-});
-},
-max: function(iterator) {
-var result;
-this.each(function(value, index) {
-value = (iterator || Prototype.K)(value, index);
-if (result == undefined || value >= result)
-result = value;
-});
-return result;
-},
-min: function(iterator) {
-var result;
-this.each(function(value, index) {
-value = (iterator || Prototype.K)(value, index);
-if (result == undefined || value < result)
-result = value;
-});
-return result;
-},
-partition: function(iterator) {
-var trues = [], falses = [];
-this.each(function(value, index) {
-((iterator || Prototype.K)(value, index) ?
-trues : falses).push(value);
-});
-return [trues, falses];
-},
-pluck: function(property) {
-var results = [];
-this.each(function(value, index) {
-results.push(value[property]);
-});
-return results;
-},
-reject: function(iterator) {
-var results = [];
-this.each(function(value, index) {
-if (!iterator(value, index))
-results.push(value);
-});
-return results;
-},
-sortBy: function(iterator) {
-return this.collect(function(value, index) {
-return {value: value, criteria: iterator(value, index)};
-}).sort(function(left, right) {
-var a = left.criteria, b = right.criteria;
-return a < b ? -1 : a > b ? 1 : 0;
-}).pluck('value');
-},
-toArray: function() {
-return this.collect(Prototype.K);
-},
-zip: function() {
-var iterator = Prototype.K, args = $A(arguments);
-if (typeof args.last() == 'function')
-iterator = args.pop();
-var collections = [this].concat(args).map($A);
-return this.map(function(value, index) {
-return iterator(collections.pluck(index));
-});
-},
-inspect: function() {
-return '#<Enumerable:' + this.toArray().inspect() + '>';
-}
-}
-Object.extend(Enumerable, {
-map: Enumerable.collect,
-find:Enumerable.detect,
-select:Enumerable.findAll,
-member:Enumerable.include,
-entries: Enumerable.toArray
-});
-var $A = Array.from = function(iterable) {
-if (!iterable) return [];
-if (iterable.toArray) {
-return iterable.toArray();
-} else {
-var results = [];
-for (var i = 0; i < iterable.length; i++)
-results.push(iterable[i]);
-return results;
-}
-}
-Object.extend(Array.prototype, Enumerable);
-if (!Array.prototype._reverse)
-Array.prototype._reverse = Array.prototype.reverse;
-Object.extend(Array.prototype, {
-_each: function(iterator) {
-for (var i = 0; i < this.length; i++)
-iterator(this[i]);
-},
-clear: function() {
-this.length = 0;
-return this;
-},
-first: function() {
-return this[0];
-},
-last: function() {
-return this[this.length - 1];
-},
-compact: function() {
-return this.select(function(value) {
-return value != undefined || value != null;
-});
-},
-flatten: function() {
-return this.inject([], function(array, value) {
-return array.concat(value && value.constructor == Array ?
-value.flatten() : [value]);
-});
-},
-without: function() {
-var values = $A(arguments);
-return this.select(function(value) {
-return !values.include(value);
-});
-},
-indexOf: function(object) {
-for (var i = 0; i < this.length; i++)
-if (this[i] == object) return i;
-return -1;
-},
-reverse: function(inline) {
-return (inline !== false ? this : this.toArray())._reverse();
-},
-inspect: function() {
-return '[' + this.map(Object.inspect).join(', ') + ']';
-}
-});
-var Hash = {
-_each: function(iterator) {
-for (var key in this) {
-var value = this[key];
-if (typeof value == 'function') continue;
-var pair = [key, value];
-pair.key = key;
-pair.value = value;
-iterator(pair);
-}
-},
-keys: function() {
-return this.pluck('key');
-},
-values: function() {
-return this.pluck('value');
-},
-merge: function(hash) {
-return $H(hash).inject($H(this), function(mergedHash, pair) {
-mergedHash[pair.key] = pair.value;
-return mergedHash;
-});
-},
-toQueryString: function() {
-return this.map(function(pair) {
-return pair.map(encodeURIComponent).join('=');
-}).join('&');
-},
-inspect: function() {
-return '#<Hash:{' + this.map(function(pair) {
-return pair.map(Object.inspect).join(': ');
-}).join(', ') + '}>';
-}
-}
-function $H(object) {
-var hash = Object.extend({}, object || {});
-Object.extend(hash, Enumerable);
-Object.extend(hash, Hash);
-return hash;
-}
-ObjectRange = Class.create();
-Object.extend(ObjectRange.prototype, Enumerable);
-Object.extend(ObjectRange.prototype, {
-initialize: function(start, end, exclusive) {
-this.start = start;
-this.end = end;
-this.exclusive = exclusive;
-},
-_each: function(iterator) {
-var value = this.start;
-do {
-iterator(value);
-value = value.succ();
-} while (this.include(value));
-},
-include: function(value) {
-if (value < this.start)
-return false;
-if (this.exclusive)
-return value < this.end;
-return value <= this.end;
-}
-});
-var $R = function(start, end, exclusive) {
-return new ObjectRange(start, end, exclusive);
-}
-function $() {
-var results = [], element;
-for (var i = 0; i < arguments.length; i++) {
-element = arguments[i];
-if (typeof element == 'string')
-element = document.getElementById(element);
-results.push(Element.extend(element));
-}
-return results.length < 2 ? results[0] : results;
-}
-document.getElementsByClassName = function(className, parentElement) {
-var children = ($(parentElement) || document.body).getElementsByTagName('*');
-return $A(children).inject([], function(elements, child) {
-if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
-elements.push(Element.extend(child));
-return elements;
-});
-}
-if (!window.Element)
-var Element = new Object();
-Element.extend = function(element) {
-if (!element) return;
-if (_nativeExtensions) return element;
-if (!element._extended && element.tagName && element != window) {
-var methods = Element.Methods, cache = Element.extend.cache;
-for (property in methods) {
-var value = methods[property];
-if (typeof value == 'function')
-element[property] = cache.findOrStore(value);
-}
-}
-element._extended = true;
-return element;
-}
-Element.extend.cache = {
-findOrStore: function(value) {
-return this[value] = this[value] || function() {
-return value.apply(null, [this].concat($A(arguments)));
-}
-}
-}
-Element.Methods = {
-visible: function(element) {
-return $(element).style.display != 'none';
-},
-toggle: function() {
-for (var i = 0; i < arguments.length; i++) {
-var element = $(arguments[i]);
-Element[Element.visible(element) ? 'hide' : 'show'](element);
-}
-},
-hide: function() {
-for (var i = 0; i < arguments.length; i++) {
-var element = $(arguments[i]);
-element.style.display = 'none';
-}
-},
-show: function() {
-for (var i = 0; i < arguments.length; i++) {
-var element = $(arguments[i]);
-element.style.display = '';
-}
-},
-remove: function(element) {
-element = $(element);
-element.parentNode.removeChild(element);
-},
-update: function(element, html) {
-$(element).innerHTML = html.stripScripts();
-setTimeout(function() {html.evalScripts()}, 10);
-},
-replace: function(element, html) {
-element = $(element);
-if (element.outerHTML) {
-element.outerHTML = html.stripScripts();
-} else {
-var range = element.ownerDocument.createRange();
-range.selectNodeContents(element);
-element.parentNode.replaceChild(
-range.createContextualFragment(html.stripScripts()), element);
-}
-setTimeout(function() {html.evalScripts()}, 10);
-},
-getHeight: function(element) {
-element = $(element);
-return element.offsetHeight;
-},
-classNames: function(element) {
-return new Element.ClassNames(element);
-},
-hasClassName: function(element, className) {
-if (!(element = $(element))) return;
-return Element.classNames(element).include(className);
-},
-addClassName: function(element, className) {
-if (!(element = $(element))) return;
-return Element.classNames(element).add(className);
-},
-removeClassName: function(element, className) {
-if (!(element = $(element))) return;
-return Element.classNames(element).remove(className);
-},
-cleanWhitespace: function(element) {
-element = $(element);
-for (var i = 0; i < element.childNodes.length; i++) {
-var node = element.childNodes[i];
-if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
-Element.remove(node);
-}
-},
-empty: function(element) {
-return $(element).innerHTML.match(/^\s*$/);
-},
-childOf: function(element, ancestor) {
-element = $(element), ancestor = $(ancestor);
-while (element = element.parentNode)
-if (element == ancestor) return true;
-return false;
-},
-scrollTo: function(element) {
-element = $(element);
-var x = element.x ? element.x : element.offsetLeft,
-y = element.y ? element.y : element.offsetTop;
-window.scrollTo(x, y);
-},
-getStyle: function(element, style) {
-element = $(element);
-var value = element.style[style.camelize()];
-if (!value) {
-if (document.defaultView && document.defaultView.getComputedStyle) {
-var css = document.defaultView.getComputedStyle(element, null);
-value = css ? css.getPropertyValue(style) : null;
-} else if (element.currentStyle) {
-value = element.currentStyle[style.camelize()];
-}
-}
-if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
-if (Element.getStyle(element, 'position') == 'static') value = 'auto';
-return value == 'auto' ? null : value;
-},
-setStyle: function(element, style) {
-element = $(element);
-for (var name in style)
-element.style[name.camelize()] = style[name];
-},
-getDimensions: function(element) {
-element = $(element);
-if (Element.getStyle(element, 'display') != 'none')
-return {width: element.offsetWidth, height: element.offsetHeight};
-var els = element.style;
-var originalVisibility = els.visibility;
-var originalPosition = els.position;
-els.visibility = 'hidden';
-els.position = 'absolute';
-els.display = '';
-var originalWidth = element.clientWidth;
-var originalHeight = element.clientHeight;
-els.display = 'none';
-els.position = originalPosition;
-els.visibility = originalVisibility;
-return {width: originalWidth, height: originalHeight};
-},
-makePositioned: function(element) {
-element = $(element);
-var pos = Element.getStyle(element, 'position');
-if (pos == 'static' || !pos) {
-element._madePositioned = true;
-element.style.position = 'relative';
-if (window.opera) {
-element.style.top = 0;
-element.style.left = 0;
-}
-}
-},
-undoPositioned: function(element) {
-element = $(element);
-if (element._madePositioned) {
-element._madePositioned = undefined;
-element.style.position =
-element.style.top =
-element.style.left =
-element.style.bottom =
-element.style.right = '';
-}
-},
-makeClipping: function(element) {
-element = $(element);
-if (element._overflow) return;
-element._overflow = element.style.overflow;
-if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
-element.style.overflow = 'hidden';
-},
-undoClipping: function(element) {
-element = $(element);
-if (element._overflow) return;
-element.style.overflow = element._overflow;
-element._overflow = undefined;
-}
-}
-Object.extend(Element, Element.Methods);
-var _nativeExtensions = false;
-if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
-var HTMLElement = {}
-HTMLElement.prototype = document.createElement('div').__proto__;
-}
-Element.addMethods = function(methods) {
-Object.extend(Element.Methods, methods || {});
-if(typeof HTMLElement != 'undefined') {
-var methods = Element.Methods, cache = Element.extend.cache;
-for (property in methods) {
-var value = methods[property];
-if (typeof value == 'function')
-HTMLElement.prototype[property] = cache.findOrStore(value);
-}
-_nativeExtensions = true;
-}
-}
-Element.addMethods();
-var Toggle = new Object();
-Toggle.display = Element.toggle;
-Abstract.Insertion = function(adjacency) {
-this.adjacency = adjacency;
-}
-Abstract.Insertion.prototype = {
-initialize: function(element, content) {
-this.element = $(element);
-this.content = content.stripScripts();
-if (this.adjacency && this.element.insertAdjacentHTML) {
-try {
-this.element.insertAdjacentHTML(this.adjacency, this.content);
-} catch (e) {
-var tagName = this.element.tagName.toLowerCase();
-if (tagName == 'tbody' || tagName == 'tr') {
-this.insertContent(this.contentFromAnonymousTable());
-} else {
-throw e;
-}
-}
-} else {
-this.range = this.element.ownerDocument.createRange();
-if (this.initializeRange) this.initializeRange();
-this.insertContent([this.range.createContextualFragment(this.content)]);
-}
-setTimeout(function() {content.evalScripts()}, 10);
-},
-contentFromAnonymousTable: function() {
-var div = document.createElement('div');
-div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
-return $A(div.childNodes[0].childNodes[0].childNodes);
-}
-}
-var Insertion = new Object();
-Insertion.Before = Class.create();
-Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
-initializeRange: function() {
-this.range.setStartBefore(this.element);
-},
-insertContent: function(fragments) {
-fragments.each((function(fragment) {
-this.element.parentNode.insertBefore(fragment, this.element);
-}).bind(this));
-}
-});
-Insertion.Top = Class.create();
-Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
-initializeRange: function() {
-this.range.selectNodeContents(this.element);
-this.range.collapse(true);
-},
-insertContent: function(fragments) {
-fragments.reverse(false).each((function(fragment) {
-this.element.insertBefore(fragment, this.element.firstChild);
-}).bind(this));
-}
-});
-Insertion.Bottom = Class.create();
-Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
-initializeRange: function() {
-this.range.selectNodeContents(this.element);
-this.range.collapse(this.element);
-},
-insertContent: function(fragments) {
-fragments.each((function(fragment) {
-this.element.appendChild(fragment);
-}).bind(this));
-}
-});
-Insertion.After = Class.create();
-Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
-initializeRange: function() {
-this.range.setStartAfter(this.element);
-},
-insertContent: function(fragments) {
-fragments.each((function(fragment) {
-this.element.parentNode.insertBefore(fragment,
-this.element.nextSibling);
-}).bind(this));
-}
-});
-Element.ClassNames = Class.create();
-Element.ClassNames.prototype = {
-initialize: function(element) {
-this.element = $(element);
-},
-_each: function(iterator) {
-this.element.className.split(/\s+/).select(function(name) {
-return name.length > 0;
-})._each(iterator);
-},
-set: function(className) {
-this.element.className = className;
-},
-add: function(classNameToAdd) {
-if (this.include(classNameToAdd)) return;
-this.set(this.toArray().concat(classNameToAdd).join(' '));
-},
-remove: function(classNameToRemove) {
-if (!this.include(classNameToRemove)) return;
-this.set(this.select(function(className) {
-return className != classNameToRemove;
-}).join(' '));
-},
-toString: function() {
-return this.toArray().join(' ');
-}
-}
-Object.extend(Element.ClassNames.prototype, Enumerable);
-var Field = {
-clear: function() {
-for (var i = 0; i < arguments.length; i++)
-$(arguments[i]).value = '';
-},
-focus: function(element) {
-$(element).focus();
-},
-present: function() {
-for (var i = 0; i < arguments.length; i++)
-if ($(arguments[i]).value == '') return false;
-return true;
-},
-select: function(element) {
-$(element).select();
-},
-activate: function(element) {
-element = $(element);
-element.focus();
-if (element.select)
-element.select();
-}
-}
-var Form = {
-serialize: function(form) {
-var elements = Form.getElements($(form));
-var queryComponents = new Array();
-for (var i = 0; i < elements.length; i++) {
-var queryComponent = Form.Element.serialize(elements[i]);
-if (queryComponent)
-queryComponents.push(queryComponent);
-}
-return queryComponents.join('&');
-},
-getElements: function(form) {
-form = $(form);
-var elements = new Array();
-for (var tagName in Form.Element.Serializers) {
-var tagElements = form.getElementsByTagName(tagName);
-for (var j = 0; j < tagElements.length; j++)
-elements.push(tagElements[j]);
-}
-return elements;
-},
-getInputs: function(form, typeName, name) {
-form = $(form);
-var inputs = form.getElementsByTagName('input');
-if (!typeName && !name)
-return inputs;
-var matchingInputs = new Array();
-for (var i = 0; i < inputs.length; i++) {
-var input = inputs[i];
-if ((typeName && input.type != typeName) ||
-(name && input.name != name))
-continue;
-matchingInputs.push(input);
-}
-return matchingInputs;
-},
-disable: function(form) {
-var elements = Form.getElements(form);
-for (var i = 0; i < elements.length; i++) {
-var element = elements[i];
-element.blur();
-element.disabled = 'true';
-}
-},
-enable: function(form) {
-var elements = Form.getElements(form);
-for (var i = 0; i < elements.length; i++) {
-var element = elements[i];
-element.disabled = '';
-}
-},
-findFirstElement: function(form) {
-return Form.getElements(form).find(function(element) {
-return element.type != 'hidden' && !element.disabled &&
-['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
-});
-},
-focusFirstElement: function(form) {
-Field.activate(Form.findFirstElement(form));
-},
-reset: function(form) {
-$(form).reset();
-}
-}
-Form.Element = {
-serialize: function(element) {
-element = $(element);
-var method = element.tagName.toLowerCase();
-var parameter = Form.Element.Serializers[method](element);
-if (parameter) {
-var key = encodeURIComponent(parameter[0]);
-if (key.length == 0) return;
-if (parameter[1].constructor != Array)
-parameter[1] = [parameter[1]];
-return parameter[1].map(function(value) {
-return key + '=' + encodeURIComponent(value);
-}).join('&');
-}
-},
-getValue: function(element) {
-element = $(element);
-var method = element.tagName.toLowerCase();
-var parameter = Form.Element.Serializers[method](element);
-if (parameter)
-return parameter[1];
-}
-}
-Form.Element.Serializers = {
-input: function(element) {
-switch (element.type.toLowerCase()) {
-case 'submit':
-case 'hidden':
-case 'password':
-case 'text':
-return Form.Element.Serializers.textarea(element);
-case 'checkbox':
-case 'radio':
-return Form.Element.Serializers.inputSelector(element);
-}
-return false;
-},
-inputSelector: function(element) {
-if (element.checked)
-return [element.name, element.value];
-},
-textarea: function(element) {
-return [element.name, element.value];
-},
-select: function(element) {
-return Form.Element.Serializers[element.type == 'select-one' ?
-'selectOne' : 'selectMany'](element);
-},
-selectOne: function(element) {
-var value = '', opt, index = element.selectedIndex;
-if (index >= 0) {
-opt = element.options[index];
-value = opt.value || opt.text;
-}
-return [element.name, value];
-},
-selectMany: function(element) {
-var value = [];
-for (var i = 0; i < element.length; i++) {
-var opt = element.options[i];
-if (opt.selected)
-value.push(opt.value || opt.text);
-}
-return [element.name, value];
-}
-}
-var $F = Form.Element.getValue;
-Abstract.TimedObserver = function() {}
-Abstract.TimedObserver.prototype = {
-initialize: function(element, frequency, callback) {
-this.frequency = frequency;
-this.element = $(element);
-this.callback= callback;
-this.lastValue = this.getValue();
-this.registerCallback();
-},
-registerCallback: function() {
-setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
-},
-onTimerEvent: function() {
-var value = this.getValue();
-if (this.lastValue != value) {
-this.callback(this.element, value);
-this.lastValue = value;
-}
-}
-}
-Form.Element.Observer = Class.create();
-Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-getValue: function() {
-return Form.Element.getValue(this.element);
-}
-});
-Form.Observer = Class.create();
-Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
-getValue: function() {
-return Form.serialize(this.element);
-}
-});
-Abstract.EventObserver = function() {}
-Abstract.EventObserver.prototype = {
-initialize: function(element, callback) {
-this.element= $(element);
-this.callback = callback;
-this.lastValue = this.getValue();
-if (this.element.tagName.toLowerCase() == 'form')
-this.registerFormCallbacks();
-else
-this.registerCallback(this.element);
-},
-onElementEvent: function() {
-var value = this.getValue();
-if (this.lastValue != value) {
-this.callback(this.element, value);
-this.lastValue = value;
-}
-},
-registerFormCallbacks: function() {
-var elements = Form.getElements(this.element);
-for (var i = 0; i < elements.length; i++)
-this.registerCallback(elements[i]);
-},
-registerCallback: function(element) {
-if (element.type) {
-switch (element.type.toLowerCase()) {
-case 'checkbox':
-case 'radio':
-Event.observe(element, 'click', this.onElementEvent.bind(this));
-break;
-case 'password':
-case 'text':
-case 'textarea':
-case 'select-one':
-case 'select-multiple':
-Event.observe(element, 'change', this.onElementEvent.bind(this));
-break;
-}
-}
-}
-}
-Form.Element.EventObserver = Class.create();
-Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-getValue: function() {
-return Form.Element.getValue(this.element);
-}
-});
-Form.EventObserver = Class.create();
-Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
-getValue: function() {
-return Form.serialize(this.element);
-}
-});
-if (!window.Event) {
-var Event = new Object();
-}
-Object.extend(Event, {
-KEY_BACKSPACE: 8,
-KEY_TAB: 9,
-KEY_RETURN: 13,
-KEY_ESC:27,
-KEY_LEFT: 37,
-KEY_UP: 38,
-KEY_RIGHT:39,
-KEY_DOWN: 40,
-KEY_DELETE: 46,
-element: function(event) {
-return event.target || event.srcElement;
-},
-isLeftClick: function(event) {
-return (((event.which) && (event.which == 1)) ||
-((event.button) && (event.button == 1)));
-},
-pointerX: function(event) {
-return event.pageX || (event.clientX +
-(document.documentElement.scrollLeft || document.body.scrollLeft));
-},
-pointerY: function(event) {
-return event.pageY || (event.clientY +
-(document.documentElement.scrollTop || document.body.scrollTop));
-},
-stop: function(event) {
-if (event.preventDefault) {
-event.preventDefault();
-event.stopPropagation();
-} else {
-event.returnValue = false;
-event.cancelBubble = true;
-}
-},
-findElement: function(event, tagName) {
-var element = Event.element(event);
-while (element.parentNode && (!element.tagName ||
-(element.tagName.toUpperCase() != tagName.toUpperCase())))
-element = element.parentNode;
-return element;
-},
-observers: false,
-_observeAndCache: function(element, name, observer, useCapture) {
-if (!this.observers) this.observers = [];
-if (element.addEventListener) {
-this.observers.push([element, name, observer, useCapture]);
-element.addEventListener(name, observer, useCapture);
-} else if (element.attachEvent) {
-this.observers.push([element, name, observer, useCapture]);
-element.attachEvent('on' + name, observer);
-}
-},
-unloadCache: function() {
-if (!Event.observers) return;
-for (var i = 0; i < Event.observers.length; i++) {
-Event.stopObserving.apply(this, Event.observers[i]);
-Event.observers[i][0] = null;
-}
-Event.observers = false;
-},
-observe: function(element, name, observer, useCapture) {
-var element = $(element);
-useCapture = useCapture || false;
-if (name == 'keypress' &&
-(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-|| element.attachEvent))
-name = 'keydown';
-this._observeAndCache(element, name, observer, useCapture);
-},
-stopObserving: function(element, name, observer, useCapture) {
-var element = $(element);
-useCapture = useCapture || false;
-if (name == 'keypress' &&
-(navigator.appVersion.match(/Konqueror|Safari|KHTML/)
-|| element.detachEvent))
-name = 'keydown';
-if (element.removeEventListener) {
-element.removeEventListener(name, observer, useCapture);
-} else if (element.detachEvent) {
-element.detachEvent('on' + name, observer);
-}
-}
-});
-if (navigator.appVersion.match(/\bMSIE\b/))
-Event.observe(window, 'unload', Event.unloadCache, false);
-Object.extend(Event,
-{
-OnLoad : function (fn)
-{
-var w = document.addEventListener &&
-!window.addEventListener ? document : window;
-Event.observe(w,'load',fn);
-},
-keyCode : function(e)
-{
- return e.keyCode != null ? e.keyCode : e.charCode
-},
-isHTMLEvent : function(type)
-{
-var events = ['abort', 'blur', 'change', 'error', 'focus',
-'load', 'reset', 'resize', 'scroll', 'select',
-'submit', 'unload'];
-return events.include(type);
-},
-isMouseEvent : function(type)
-{
-var events = ['click', 'mousedown', 'mousemove', 'mouseout',
-'mouseover', 'mouseup'];
-return events.include(type);
-},
-fireEvent : function(element,type)
-{
-element = $(element);
-if(document.createEvent)
-{
-if(Event.isHTMLEvent(type))
-{
-var event = document.createEvent('HTMLEvents');
-event.initEvent(type, true, true);
-}
+
+var Prototype={Version:'1.50',ScriptFragment:'(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',emptyFunction:function(){},K:function(x){return x}}
+var Class={create:function(){return function(){this.initialize.apply(this,arguments);}}}
+var Abstract=new Object();Object.extend=function(destination,source){for(var property in source){destination[property]=source[property];}
+return destination;}
+Object.inspect=function(object){try{if(object==undefined)return'undefined';if(object==null)return'null';return object.inspect?object.inspect():object.toString();}catch(e){if(e instanceof RangeError)return'...';throw e;}}
+Function.prototype.bind=function(){var __method=this,args=$A(arguments),object=args.shift();return function(){return __method.apply(object,args.concat($A(arguments)));}}
+Function.prototype.bindAsEventListener=function(object){var __method=this;return function(event){return __method.call(object,event||window.event);}}
+Object.extend(Number.prototype,{toColorPart:function(){var digits=this.toString(16);if(this<16)return'0'+digits;return digits;},succ:function(){return this+1;},times:function(iterator){$R(0,this,true).each(iterator);return this;}});var Try={these:function(){var returnValue;for(var i=0;i<arguments.length;i++){var lambda=arguments[i];try{returnValue=lambda();break;}catch(e){}}
+return returnValue;}}
+var PeriodicalExecuter=Class.create();PeriodicalExecuter.prototype={initialize:function(callback,frequency){this.callback=callback;this.frequency=frequency;this.currentlyExecuting=false;this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.callback();}finally{this.currentlyExecuting=false;}}}}
+Function.prototype.bindEvent=function()
+{var __method=this,args=$A(arguments),object=args.shift();return function(event)
+{return __method.apply(object,[event||window.event].concat(args));}}
+Class.extend=function(base,definition)
+{var component=Class.create();Object.extend(component.prototype,base.prototype);if(definition)
+Object.extend(component.prototype,definition);return component;}
+Object.extend(String.prototype,{gsub:function(pattern,replacement){var result='',source=this,match;replacement=arguments.callee.prepareReplacement(replacement);while(source.length>0){if(match=source.match(pattern)){result+=source.slice(0,match.index);result+=(replacement(match)||'').toString();source=source.slice(match.index+match[0].length);}else{result+=source,source='';}}
+return result;},sub:function(pattern,replacement,count){replacement=this.gsub.prepareReplacement(replacement);count=count===undefined?1:count;return this.gsub(pattern,function(match){if(--count<0)return match[0];return replacement(match);});},scan:function(pattern,iterator){this.gsub(pattern,iterator);return this;},truncate:function(length,truncation){length=length||30;truncation=truncation===undefined?'...':truncation;return this.length>length?this.slice(0,length-truncation.length)+truncation:this;},strip:function(){return this.replace(/^\s+/,'').replace(/\s+$/,'');},stripTags:function(){return this.replace(/<\/?[^>]+>/gi,'');},stripScripts:function(){return this.replace(new RegExp(Prototype.ScriptFragment,'img'),'');},extractScripts:function(){var matchAll=new RegExp(Prototype.ScriptFragment,'img');var matchOne=new RegExp(Prototype.ScriptFragment,'im');return(this.match(matchAll)||[]).map(function(scriptTag){return(scriptTag.match(matchOne)||['',''])[1];});},evalScripts:function(){return this.extractScripts().map(function(script){return eval(script)});},escapeHTML:function(){var div=document.createElement('div');var text=document.createTextNode(this);div.appendChild(text);return div.innerHTML;},unescapeHTML:function(){var div=document.createElement('div');div.innerHTML=this.stripTags();return div.childNodes[0]?div.childNodes[0].nodeValue:'';},toQueryParams:function(){var pairs=this.match(/^\??(.*)$/)[1].split('&');return pairs.inject({},function(params,pairString){var pair=pairString.split('=');params[pair[0]]=pair[1];return params;});},toArray:function(){return this.split('');},camelize:function(){var oStringList=this.split('-');if(oStringList.length==1)return oStringList[0];var camelizedString=this.indexOf('-')==0?oStringList[0].charAt(0).toUpperCase()+oStringList[0].substring(1):oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
+return camelizedString;},inspect:function(){return"'"+this.replace(/\\/g,'\\\\').replace(/'/g,'\\\'')+"'";}});String.prototype.gsub.prepareReplacement=function(replacement){if(typeof replacement=='function')return replacement;var template=new Template(replacement);return function(match){return template.evaluate(match)};}
+String.prototype.parseQuery=String.prototype.toQueryParams;var Template=Class.create();Template.Pattern=/(^|.|\r|\n)(#\{(.*?)\})/;Template.prototype={initialize:function(template,pattern){this.template=template.toString();this.pattern=pattern||Template.Pattern;},evaluate:function(object){return this.template.gsub(this.pattern,function(match){var before=match[1];if(before=='\\')return match[2];return before+(object[match[3]]||'').toString();});}}
+Object.extend(String.prototype,{pad:function(side,len,chr){if(!chr)chr=' ';var s=this;var left=side.toLowerCase()=='left';while(s.length<len)s=left?chr+s:s+chr;return s;},padLeft:function(len,chr){return this.pad('left',len,chr);},padRight:function(len,chr){return this.pad('right',len,chr);},zerofill:function(len){return this.padLeft(len,'0');},trim:function(){return this.replace(/^\s+|\s+$/g,'');},trimLeft:function(){return this.replace(/^\s+/,'');},trimRight:function(){return this.replace(/\s+$/,'');},toFunction:function()
+{var commands=this.split(/\./);var command=window;commands.each(function(action)
+{if(command[new String(action)])
+command=command[new String(action)];});if(typeof(command)=="function")
+return command;else
+{if(typeof Logger!="undefined")
+Logger.error("Missing function",this);throw new Error("Missing function '"+this+"'");}},toInteger:function()
+{var exp=/^\s*[-\+]?\d+\s*$/;if(this.match(exp)==null)
+return null;var num=parseInt(this,10);return(isNaN(num)?null:num);},toDouble:function(decimalchar)
+{if(this.length<=0)return null;decimalchar=decimalchar||".";var exp=new RegExp("^\\s*([-\\+])?(\\d+)?(\\"+decimalchar+"(\\d+))?\\s*$");var m=this.match(exp);if(m==null)
+return null;m[1]=m[1]||"";m[2]=m[2]||"0";m[4]=m[4]||"0";var cleanInput=m[1]+(m[2].length>0?m[2]:"0")+"."+m[4];var num=parseFloat(cleanInput);return(isNaN(num)?null:num);},toCurrency:function(groupchar,digits,decimalchar)
+{groupchar=groupchar||",";decimalchar=decimalchar||".";digits=typeof(digits)=="undefined"?2:digits;var exp=new RegExp("^\\s*([-\\+])?(((\\d+)\\"+groupchar+")*)(\\d+)"
++((digits>0)?"(\\"+decimalchar+"(\\d{1,"+digits+"}))?":"")
++"\\s*$");var m=this.match(exp);if(m==null)
+return null;var intermed=m[2]+m[5];var cleanInput=m[1]+intermed.replace(new RegExp("(\\"+groupchar+")","g"),"")
++((digits>0)?"."+m[7]:"");var num=parseFloat(cleanInput);return(isNaN(num)?null:num);},toDate:function(format)
+{return Date.SimpleParse(this,format);}});var $break=new Object();var $continue=new Object();var Enumerable={each:function(iterator){var index=0;try{this._each(function(value){try{iterator(value,index++);}catch(e){if(e!=$continue)throw e;}});}catch(e){if(e!=$break)throw e;}},all:function(iterator){var result=true;this.each(function(value,index){result=result&&!!(iterator||Prototype.K)(value,index);if(!result)throw $break;});return result;},any:function(iterator){var result=true;this.each(function(value,index){if(result=!!(iterator||Prototype.K)(value,index))
+throw $break;});return result;},collect:function(iterator){var results=[];this.each(function(value,index){results.push(iterator(value,index));});return results;},detect:function(iterator){var result;this.each(function(value,index){if(iterator(value,index)){result=value;throw $break;}});return result;},findAll:function(iterator){var results=[];this.each(function(value,index){if(iterator(value,index))
+results.push(value);});return results;},grep:function(pattern,iterator){var results=[];this.each(function(value,index){var stringValue=value.toString();if(stringValue.match(pattern))
+results.push((iterator||Prototype.K)(value,index));})
+return results;},include:function(object){var found=false;this.each(function(value){if(value==object){found=true;throw $break;}});return found;},inject:function(memo,iterator){this.each(function(value,index){memo=iterator(memo,value,index);});return memo;},invoke:function(method){var args=$A(arguments).slice(1);return this.collect(function(value){return value[method].apply(value,args);});},max:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(result==undefined||value>=result)
+result=value;});return result;},min:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(result==undefined||value<result)
+result=value;});return result;},partition:function(iterator){var trues=[],falses=[];this.each(function(value,index){((iterator||Prototype.K)(value,index)?trues:falses).push(value);});return[trues,falses];},pluck:function(property){var results=[];this.each(function(value,index){results.push(value[property]);});return results;},reject:function(iterator){var results=[];this.each(function(value,index){if(!iterator(value,index))
+results.push(value);});return results;},sortBy:function(iterator){return this.collect(function(value,index){return{value:value,criteria:iterator(value,index)};}).sort(function(left,right){var a=left.criteria,b=right.criteria;return a<b?-1:a>b?1:0;}).pluck('value');},toArray:function(){return this.collect(Prototype.K);},zip:function(){var iterator=Prototype.K,args=$A(arguments);if(typeof args.last()=='function')
+iterator=args.pop();var collections=[this].concat(args).map($A);return this.map(function(value,index){return iterator(collections.pluck(index));});},inspect:function(){return'#<Enumerable:'+this.toArray().inspect()+'>';}}
+Object.extend(Enumerable,{map:Enumerable.collect,find:Enumerable.detect,select:Enumerable.findAll,member:Enumerable.include,entries:Enumerable.toArray});var $A=Array.from=function(iterable){if(!iterable)return[];if(iterable.toArray){return iterable.toArray();}else{var results=[];for(var i=0;i<iterable.length;i++)
+results.push(iterable[i]);return results;}}
+Object.extend(Array.prototype,Enumerable);if(!Array.prototype._reverse)
+Array.prototype._reverse=Array.prototype.reverse;Object.extend(Array.prototype,{_each:function(iterator){for(var i=0;i<this.length;i++)
+iterator(this[i]);},clear:function(){this.length=0;return this;},first:function(){return this[0];},last:function(){return this[this.length-1];},compact:function(){return this.select(function(value){return value!=undefined||value!=null;});},flatten:function(){return this.inject([],function(array,value){return array.concat(value&&value.constructor==Array?value.flatten():[value]);});},without:function(){var values=$A(arguments);return this.select(function(value){return!values.include(value);});},indexOf:function(object){for(var i=0;i<this.length;i++)
+if(this[i]==object)return i;return-1;},reverse:function(inline){return(inline!==false?this:this.toArray())._reverse();},inspect:function(){return'['+this.map(Object.inspect).join(', ')+']';}});var Hash={_each:function(iterator){for(var key in this){var value=this[key];if(typeof value=='function')continue;var pair=[key,value];pair.key=key;pair.value=value;iterator(pair);}},keys:function(){return this.pluck('key');},values:function(){return this.pluck('value');},merge:function(hash){return $H(hash).inject($H(this),function(mergedHash,pair){mergedHash[pair.key]=pair.value;return mergedHash;});},toQueryString:function(){return this.map(function(pair){return pair.map(encodeURIComponent).join('=');}).join('&');},inspect:function(){return'#<Hash:{'+this.map(function(pair){return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';}}
+function $H(object){var hash=Object.extend({},object||{});Object.extend(hash,Enumerable);Object.extend(hash,Hash);return hash;}
+ObjectRange=Class.create();Object.extend(ObjectRange.prototype,Enumerable);Object.extend(ObjectRange.prototype,{initialize:function(start,end,exclusive){this.start=start;this.end=end;this.exclusive=exclusive;},_each:function(iterator){var value=this.start;do{iterator(value);value=value.succ();}while(this.include(value));},include:function(value){if(value<this.start)
+return false;if(this.exclusive)
+return value<this.end;return value<=this.end;}});var $R=function(start,end,exclusive){return new ObjectRange(start,end,exclusive);}
+function $(){var results=[],element;for(var i=0;i<arguments.length;i++){element=arguments[i];if(typeof element=='string')
+element=document.getElementById(element);results.push(Element.extend(element));}
+return results.length<2?results[0]:results;}
+document.getElementsByClassName=function(className,parentElement){var children=($(parentElement)||document.body).getElementsByTagName('*');return $A(children).inject([],function(elements,child){if(child.className.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))
+elements.push(Element.extend(child));return elements;});}
+if(!window.Element)
+var Element=new Object();Element.extend=function(element){if(!element)return;if(_nativeExtensions)return element;if(!element._extended&&element.tagName&&element!=window){var methods=Element.Methods,cache=Element.extend.cache;for(property in methods){var value=methods[property];if(typeof value=='function')
+element[property]=cache.findOrStore(value);}}
+element._extended=true;return element;}
+Element.extend.cache={findOrStore:function(value){return this[value]=this[value]||function(){return value.apply(null,[this].concat($A(arguments)));}}}
+Element.Methods={visible:function(element){return $(element).style.display!='none';},toggle:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);Element[Element.visible(element)?'hide':'show'](element);}},hide:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='none';}},show:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='';}},remove:function(element){element=$(element);element.parentNode.removeChild(element);},update:function(element,html){$(element).innerHTML=html.stripScripts();setTimeout(function(){html.evalScripts()},10);},replace:function(element,html){element=$(element);if(element.outerHTML){element.outerHTML=html.stripScripts();}else{var range=element.ownerDocument.createRange();range.selectNodeContents(element);element.parentNode.replaceChild(range.createContextualFragment(html.stripScripts()),element);}
+setTimeout(function(){html.evalScripts()},10);},getHeight:function(element){element=$(element);return element.offsetHeight;},classNames:function(element){return new Element.ClassNames(element);},hasClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).include(className);},addClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).add(className);},removeClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).remove(className);},cleanWhitespace:function(element){element=$(element);for(var i=0;i<element.childNodes.length;i++){var node=element.childNodes[i];if(node.nodeType==3&&!/\S/.test(node.nodeValue))
+Element.remove(node);}},empty:function(element){return $(element).innerHTML.match(/^\s*$/);},childOf:function(element,ancestor){element=$(element),ancestor=$(ancestor);while(element=element.parentNode)
+if(element==ancestor)return true;return false;},scrollTo:function(element){element=$(element);var x=element.x?element.x:element.offsetLeft,y=element.y?element.y:element.offsetTop;window.scrollTo(x,y);},getStyle:function(element,style){element=$(element);var value=element.style[style.camelize()];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[style.camelize()];}}
+if(window.opera&&['left','top','right','bottom'].include(style))
+if(Element.getStyle(element,'position')=='static')value='auto';return value=='auto'?null:value;},setStyle:function(element,style){element=$(element);for(var name in style)
+element.style[name.camelize()]=style[name];},getDimensions:function(element){element=$(element);if(Element.getStyle(element,'display')!='none')
+return{width:element.offsetWidth,height:element.offsetHeight};var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display='none';els.position=originalPosition;els.visibility=originalVisibility;return{width:originalWidth,height:originalHeight};},makePositioned:function(element){element=$(element);var pos=Element.getStyle(element,'position');if(pos=='static'||!pos){element._madePositioned=true;element.style.position='relative';if(window.opera){element.style.top=0;element.style.left=0;}}},undoPositioned:function(element){element=$(element);if(element._madePositioned){element._madePositioned=undefined;element.style.position=element.style.top=element.style.left=element.style.bottom=element.style.right='';}},makeClipping:function(element){element=$(element);if(element._overflow)return;element._overflow=element.style.overflow;if((Element.getStyle(element,'overflow')||'visible')!='hidden')
+element.style.overflow='hidden';},undoClipping:function(element){element=$(element);if(element._overflow)return;element.style.overflow=element._overflow;element._overflow=undefined;}}
+Object.extend(Element,Element.Methods);var _nativeExtensions=false;if(!HTMLElement&&/Konqueror|Safari|KHTML/.test(navigator.userAgent)){var HTMLElement={}
+HTMLElement.prototype=document.createElement('div').__proto__;}
+Element.addMethods=function(methods){Object.extend(Element.Methods,methods||{});if(typeof HTMLElement!='undefined'){var methods=Element.Methods,cache=Element.extend.cache;for(property in methods){var value=methods[property];if(typeof value=='function')
+HTMLElement.prototype[property]=cache.findOrStore(value);}
+_nativeExtensions=true;}}
+Element.addMethods();var Toggle=new Object();Toggle.display=Element.toggle;Abstract.Insertion=function(adjacency){this.adjacency=adjacency;}
+Abstract.Insertion.prototype={initialize:function(element,content){this.element=$(element);this.content=content.stripScripts();if(this.adjacency&&this.element.insertAdjacentHTML){try{this.element.insertAdjacentHTML(this.adjacency,this.content);}catch(e){var tagName=this.element.tagName.toLowerCase();if(tagName=='tbody'||tagName=='tr'){this.insertContent(this.contentFromAnonymousTable());}else{throw e;}}}else{this.range=this.element.ownerDocument.createRange();if(this.initializeRange)this.initializeRange();this.insertContent([this.range.createContextualFragment(this.content)]);}
+setTimeout(function(){content.evalScripts()},10);},contentFromAnonymousTable:function(){var div=document.createElement('div');div.innerHTML='<table><tbody>'+this.content+'</tbody></table>';return $A(div.childNodes[0].childNodes[0].childNodes);}}
+var Insertion=new Object();Insertion.Before=Class.create();Insertion.Before.prototype=Object.extend(new Abstract.Insertion('beforeBegin'),{initializeRange:function(){this.range.setStartBefore(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element);}).bind(this));}});Insertion.Top=Class.create();Insertion.Top.prototype=Object.extend(new Abstract.Insertion('afterBegin'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(true);},insertContent:function(fragments){fragments.reverse(false).each((function(fragment){this.element.insertBefore(fragment,this.element.firstChild);}).bind(this));}});Insertion.Bottom=Class.create();Insertion.Bottom.prototype=Object.extend(new Abstract.Insertion('beforeEnd'),{initializeRange:function(){this.range.selectNodeContents(this.element);this.range.collapse(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.appendChild(fragment);}).bind(this));}});Insertion.After=Class.create();Insertion.After.prototype=Object.extend(new Abstract.Insertion('afterEnd'),{initializeRange:function(){this.range.setStartAfter(this.element);},insertContent:function(fragments){fragments.each((function(fragment){this.element.parentNode.insertBefore(fragment,this.element.nextSibling);}).bind(this));}});Element.ClassNames=Class.create();Element.ClassNames.prototype={initialize:function(element){this.element=$(element);},_each:function(iterator){this.element.className.split(/\s+/).select(function(name){return name.length>0;})._each(iterator);},set:function(className){this.element.className=className;},add:function(classNameToAdd){if(this.include(classNameToAdd))return;this.set(this.toArray().concat(classNameToAdd).join(' '));},remove:function(classNameToRemove){if(!this.include(classNameToRemove))return;this.set(this.select(function(className){return className!=classNameToRemove;}).join(' '));},toString:function(){return this.toArray().join(' ');}}
+Object.extend(Element.ClassNames.prototype,Enumerable);var Field={clear:function(){for(var i=0;i<arguments.length;i++)
+$(arguments[i]).value='';},focus:function(element){$(element).focus();},present:function(){for(var i=0;i<arguments.length;i++)
+if($(arguments[i]).value=='')return false;return true;},select:function(element){$(element).select();},activate:function(element){element=$(element);element.focus();if(element.select)
+element.select();}}
+var Form={serialize:function(form){var elements=Form.getElements($(form));var queryComponents=new Array();for(var i=0;i<elements.length;i++){var queryComponent=Form.Element.serialize(elements[i]);if(queryComponent)
+queryComponents.push(queryComponent);}
+return queryComponents.join('&');},getElements:function(form){form=$(form);var elements=new Array();for(var tagName in Form.Element.Serializers){var tagElements=form.getElementsByTagName(tagName);for(var j=0;j<tagElements.length;j++)
+elements.push(tagElements[j]);}
+return elements;},getInputs:function(form,typeName,name){form=$(form);var inputs=form.getElementsByTagName('input');if(!typeName&&!name)
+return inputs;var matchingInputs=new Array();for(var i=0;i<inputs.length;i++){var input=inputs[i];if((typeName&&input.type!=typeName)||(name&&input.name!=name))
+continue;matchingInputs.push(input);}
+return matchingInputs;},disable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.blur();element.disabled='true';}},enable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.disabled='';}},findFirstElement:function(form){return Form.getElements(form).find(function(element){return element.type!='hidden'&&!element.disabled&&['input','select','textarea'].include(element.tagName.toLowerCase());});},focusFirstElement:function(form){Field.activate(Form.findFirstElement(form));},reset:function(form){$(form).reset();}}
+Form.Element={serialize:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter){var key=encodeURIComponent(parameter[0]);if(key.length==0)return;if(parameter[1].constructor!=Array)
+parameter[1]=[parameter[1]];return parameter[1].map(function(value){return key+'='+encodeURIComponent(value);}).join('&');}},getValue:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter)
+return parameter[1];}}
+Form.Element.Serializers={input:function(element){switch(element.type.toLowerCase()){case'submit':case'hidden':case'password':case'text':return Form.Element.Serializers.textarea(element);case'checkbox':case'radio':return Form.Element.Serializers.inputSelector(element);}
+return false;},inputSelector:function(element){if(element.checked)
+return[element.name,element.value];},textarea:function(element){return[element.name,element.value];},select:function(element){return Form.Element.Serializers[element.type=='select-one'?'selectOne':'selectMany'](element);},selectOne:function(element){var value='',opt,index=element.selectedIndex;if(index>=0){opt=element.options[index];value=opt.value||opt.text;}
+return[element.name,value];},selectMany:function(element){var value=[];for(var i=0;i<element.length;i++){var opt=element.options[i];if(opt.selected)
+value.push(opt.value||opt.text);}
+return[element.name,value];}}
+var $F=Form.Element.getValue;Abstract.TimedObserver=function(){}
+Abstract.TimedObserver.prototype={initialize:function(element,frequency,callback){this.frequency=frequency;this.element=$(element);this.callback=callback;this.lastValue=this.getValue();this.registerCallback();},registerCallback:function(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}}}
+Form.Element.Observer=Class.create();Form.Element.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.Observer=Class.create();Form.Observer.prototype=Object.extend(new Abstract.TimedObserver(),{getValue:function(){return Form.serialize(this.element);}});Abstract.EventObserver=function(){}
+Abstract.EventObserver.prototype={initialize:function(element,callback){this.element=$(element);this.callback=callback;this.lastValue=this.getValue();if(this.element.tagName.toLowerCase()=='form')
+this.registerFormCallbacks();else
+this.registerCallback(this.element);},onElementEvent:function(){var value=this.getValue();if(this.lastValue!=value){this.callback(this.element,value);this.lastValue=value;}},registerFormCallbacks:function(){var elements=Form.getElements(this.element);for(var i=0;i<elements.length;i++)
+this.registerCallback(elements[i]);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;case'password':case'text':case'textarea':case'select-one':case'select-multiple':Event.observe(element,'change',this.onElementEvent.bind(this));break;}}}}
+Form.Element.EventObserver=Class.create();Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.Element.getValue(this.element);}});Form.EventObserver=Class.create();Form.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){return Form.serialize(this.element);}});if(!window.Event){var Event=new Object();}
+Object.extend(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,element:function(event){return event.target||event.srcElement;},isLeftClick:function(event){return(((event.which)&&(event.which==1))||((event.button)&&(event.button==1)));},pointerX:function(event){return event.pageX||(event.clientX+
+(document.documentElement.scrollLeft||document.body.scrollLeft));},pointerY:function(event){return event.pageY||(event.clientY+
+(document.documentElement.scrollTop||document.body.scrollTop));},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}},findElement:function(event,tagName){var element=Event.element(event);while(element.parentNode&&(!element.tagName||(element.tagName.toUpperCase()!=tagName.toUpperCase())))
+element=element.parentNode;return element;},observers:false,_observeAndCache:function(element,name,observer,useCapture){if(!this.observers)this.observers=[];if(element.addEventListener){this.observers.push([element,name,observer,useCapture]);element.addEventListener(name,observer,useCapture);}else if(element.attachEvent){this.observers.push([element,name,observer,useCapture]);element.attachEvent('on'+name,observer);}},unloadCache:function(){if(!Event.observers)return;for(var i=0;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null;}
+Event.observers=false;},observe:function(element,name,observer,useCapture){var element=$(element);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
+name='keydown';this._observeAndCache(element,name,observer,useCapture);},stopObserving:function(element,name,observer,useCapture){var element=$(element);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.detachEvent))
+name='keydown';if(element.removeEventListener){element.removeEventListener(name,observer,useCapture);}else if(element.detachEvent){element.detachEvent('on'+name,observer);}}});if(navigator.appVersion.match(/\bMSIE\b/))
+Event.observe(window,'unload',Event.unloadCache,false);Object.extend(Event,{OnLoad:function(fn)
+{var w=document.addEventListener&&!window.addEventListener?document:window;Event.observe(w,'load',fn);},keyCode:function(e)
+{return e.keyCode!=null?e.keyCode:e.charCode},isHTMLEvent:function(type)
+{var events=['abort','blur','change','error','focus','load','reset','resize','scroll','select','submit','unload'];return events.include(type);},isMouseEvent:function(type)
+{var events=['click','mousedown','mousemove','mouseout','mouseover','mouseup'];return events.include(type);},fireEvent:function(element,type)
+{element=$(element);if(document.createEvent)
+{if(Event.isHTMLEvent(type))
+{var event=document.createEvent('HTMLEvents');event.initEvent(type,true,true);}
else if(Event.isMouseEvent(type))
-{
-var event = document.createEvent('MouseEvents');
-event.initMouseEvent(type,true,true,
-document.defaultView, 1, 0, 0, 0, 0, false,
-false, false, false, 0, null);
-}
+{var event=document.createEvent('MouseEvents');event.initMouseEvent(type,true,true,document.defaultView,1,0,0,0,0,false,false,false,false,0,null);}
else
-{
-if(Logger)
-Logger.error("undefined event", type);
-return;
-}
-element.dispatchEvent(event);
-}
+{if(Logger)
+Logger.error("undefined event",type);return;}
+element.dispatchEvent(event);}
else if(element.fireEvent)
-{
-element.fireEvent('on'+type);
-if(element[type])
-element[type]();
-}
+{element.fireEvent('on'+type);if(element[type])
+element[type]();}
else if(element[type])
-element[type]();
-}
-});
-var Position = {
- includeScrollOffsets: false,
-prepare: function() {
-this.deltaX =window.pageXOffset
-|| document.documentElement.scrollLeft
-|| document.body.scrollLeft
-|| 0;
-this.deltaY =window.pageYOffset
-|| document.documentElement.scrollTop
-|| document.body.scrollTop
-|| 0;
-},
-realOffset: function(element) {
-var valueT = 0, valueL = 0;
-do {
-valueT += element.scrollTop|| 0;
-valueL += element.scrollLeft || 0;
-element = element.parentNode;
-} while (element);
-return [valueL, valueT];
-},
-cumulativeOffset: function(element) {
-var valueT = 0, valueL = 0;
-do {
-valueT += element.offsetTop|| 0;
-valueL += element.offsetLeft || 0;
-element = element.offsetParent;
-} while (element);
-return [valueL, valueT];
-},
-positionedOffset: function(element) {
-var valueT = 0, valueL = 0;
-do {
-valueT += element.offsetTop|| 0;
-valueL += element.offsetLeft || 0;
-element = element.offsetParent;
-if (element) {
-p = Element.getStyle(element, 'position');
-if (p == 'relative' || p == 'absolute') break;
-}
-} while (element);
-return [valueL, valueT];
-},
-offsetParent: function(element) {
-if (element.offsetParent) return element.offsetParent;
-if (element == document.body) return element;
-while ((element = element.parentNode) && element != document.body)
-if (Element.getStyle(element, 'position') != 'static')
-return element;
-return document.body;
-},
-within: function(element, x, y) {
-if (this.includeScrollOffsets)
-return this.withinIncludingScrolloffsets(element, x, y);
-this.xcomp = x;
-this.ycomp = y;
-this.offset = this.cumulativeOffset(element);
-return (y >= this.offset[1] &&
-y <this.offset[1] + element.offsetHeight &&
-x >= this.offset[0] &&
-x <this.offset[0] + element.offsetWidth);
-},
-withinIncludingScrolloffsets: function(element, x, y) {
-var offsetcache = this.realOffset(element);
-this.xcomp = x + offsetcache[0] - this.deltaX;
-this.ycomp = y + offsetcache[1] - this.deltaY;
-this.offset = this.cumulativeOffset(element);
-return (this.ycomp >= this.offset[1] &&
-this.ycomp <this.offset[1] + element.offsetHeight &&
-this.xcomp >= this.offset[0] &&
-this.xcomp <this.offset[0] + element.offsetWidth);
-},
-overlap: function(mode, element) {
-if (!mode) return 0;
-if (mode == 'vertical')
-return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
-element.offsetHeight;
-if (mode == 'horizontal')
-return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
-element.offsetWidth;
-},
-clone: function(source, target) {
-source = $(source);
-target = $(target);
-target.style.position = 'absolute';
-var offsets = this.cumulativeOffset(source);
-target.style.top= offsets[1] + 'px';
-target.style.left = offsets[0] + 'px';
-target.style.width= source.offsetWidth + 'px';
-target.style.height = source.offsetHeight + 'px';
-},
-page: function(forElement) {
-var valueT = 0, valueL = 0;
-var element = forElement;
-do {
-valueT += element.offsetTop|| 0;
-valueL += element.offsetLeft || 0;
-if (element.offsetParent==document.body)
-if (Element.getStyle(element,'position')=='absolute') break;
-} while (element = element.offsetParent);
-element = forElement;
-do {
-valueT -= element.scrollTop|| 0;
-valueL -= element.scrollLeft || 0;
-} while (element = element.parentNode);
-return [valueL, valueT];
-},
-clone: function(source, target) {
-var options = Object.extend({
-setLeft:true,
-setTop: true,
-setWidth: true,
-setHeight:true,
-offsetTop:0,
-offsetLeft: 0
-}, arguments[2] || {})
-source = $(source);
-var p = Position.page(source);
-target = $(target);
-var delta = [0, 0];
-var parent = null;
-if (Element.getStyle(target,'position') == 'absolute') {
-parent = Position.offsetParent(target);
-delta = Position.page(parent);
-}
-if (parent == document.body) {
-delta[0] -= document.body.offsetLeft;
-delta[1] -= document.body.offsetTop;
-}
-if(options.setLeft) target.style.left= (p[0] - delta[0] + options.offsetLeft) + 'px';
-if(options.setTop)target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
-if(options.setWidth)target.style.width = source.offsetWidth + 'px';
-if(options.setHeight) target.style.height = source.offsetHeight + 'px';
-},
-absolutize: function(element) {
-element = $(element);
-if (element.style.position == 'absolute') return;
-Position.prepare();
-var offsets = Position.positionedOffset(element);
-var top = offsets[1];
-var left= offsets[0];
-var width = element.clientWidth;
-var height= element.clientHeight;
-element._originalLeft = left - parseFloat(element.style.left|| 0);
-element._originalTop= top- parseFloat(element.style.top || 0);
-element._originalWidth= element.style.width;
-element._originalHeight = element.style.height;
-element.style.position = 'absolute';
-element.style.top= top + 'px';;
-element.style.left = left + 'px';;
-element.style.width= width + 'px';;
-element.style.height = height + 'px';;
-},
-relativize: function(element) {
-element = $(element);
-if (element.style.position == 'relative') return;
-Position.prepare();
-element.style.position = 'relative';
-var top= parseFloat(element.style.top|| 0) - (element._originalTop || 0);
-var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
-element.style.top= top + 'px';
-element.style.left = left + 'px';
-element.style.height = element._originalHeight;
-element.style.width= element._originalWidth;
-}
-}
-if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
-Position.cumulativeOffset = function(element) {
-var valueT = 0, valueL = 0;
-do {
-valueT += element.offsetTop|| 0;
-valueL += element.offsetLeft || 0;
-if (element.offsetParent == document.body)
-if (Element.getStyle(element, 'position') == 'absolute') break;
-element = element.offsetParent;
-} while (element);
-return [valueL, valueT];
-}
-}
-var Selector = Class.create();
-Selector.prototype = {
-initialize: function(expression) {
-this.params = {classNames: []};
-this.expression = expression.toString().strip();
-this.parseExpression();
-this.compileMatcher();
-},
-parseExpression: function() {
-function abort(message) { throw 'Parse error in selector: ' + message; }
-if (this.expression == '')abort('empty expression');
-var params = this.params, expr = this.expression, match, modifier, clause, rest;
-while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
-params.attributes = params.attributes || [];
-params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
-expr = match[1];
-}
-if (expr == '*') return this.params.wildcard = true;
-while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
-modifier = match[1], clause = match[2], rest = match[3];
-switch (modifier) {
-case '#': params.id = clause; break;
-case '.': params.classNames.push(clause); break;
-case '':
-case undefined: params.tagName = clause.toUpperCase(); break;
-default:abort(expr.inspect());
-}
-expr = rest;
-}
-if (expr.length > 0) abort(expr.inspect());
-},
-buildMatchExpression: function() {
-var params = this.params, conditions = [], clause;
-if (params.wildcard)
-conditions.push('true');
-if (clause = params.id)
-conditions.push('element.id == ' + clause.inspect());
-if (clause = params.tagName)
-conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
-if ((clause = params.classNames).length > 0)
-for (var i = 0; i < clause.length; i++)
-conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
-if (clause = params.attributes) {
-clause.each(function(attribute) {
-var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
-var splitValueBy = function(delimiter) {
-return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
-}
-switch (attribute.operator) {
-case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;
-case '~=':conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
-case '|=':conditions.push(
-splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
-); break;
-case '!=':conditions.push(value + ' != ' + attribute.value.inspect()); break;
-case '':
-case undefined: conditions.push(value + ' != null'); break;
-default:throw 'Unknown operator ' + attribute.operator + ' in selector';
-}
-});
-}
-return conditions.join(' && ');
-},
-compileMatcher: function() {
-this.match = new Function('element', 'if (!element.tagName) return false; \
-return ' + this.buildMatchExpression());
-},
-findElements: function(scope) {
-var element;
-if (element = $(this.params.id))
-if (this.match(element))
-if (!scope || Element.childOf(element, scope))
-return [element];
-scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
-var results = [];
-for (var i = 0; i < scope.length; i++)
-if (this.match(element = scope[i]))
-results.push(Element.extend(element));
-return results;
-},
-toString: function() {
-return this.expression;
-}
-}
-function $$() {
-return $A(arguments).map(function(expression) {
-return expression.strip().split(/\s+/).inject([null], function(results, expr) {
-var selector = new Selector(expr);
-return results.map(selector.findElements.bind(selector)).flatten();
-});
-}).flatten();
-}
-var Builder = {
-NODEMAP: {
-AREA: 'map',
-CAPTION: 'table',
-COL: 'table',
-COLGROUP: 'table',
-LEGEND: 'fieldset',
-OPTGROUP: 'select',
-OPTION: 'select',
-PARAM: 'object',
-TBODY: 'table',
-TD: 'table',
-TFOOT: 'table',
-TH: 'table',
-THEAD: 'table',
-TR: 'table'
-},
-node: function(elementName) {
-elementName = elementName.toUpperCase();
-var parentTag = this.NODEMAP[elementName] || 'div';
-var parentElement = document.createElement(parentTag);
-try {parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
-} catch(e) {}
-var element = parentElement.firstChild || null;
-if(element && (element.tagName != elementName))
-element = element.getElementsByTagName(elementName)[0];
-if(!element) element = document.createElement(elementName);
-if(!element) return;
-if(arguments[1])
-if(this._isStringOrNumber(arguments[1]) ||
-(arguments[1] instanceof Array)) {
-this._children(element, arguments[1]);
-} else {
-var attrs = this._attributes(arguments[1]);
-if(attrs.length) {
-try {parentElement.innerHTML = "<" +elementName + " " +
-attrs + "></" + elementName + ">";
-} catch(e) {}
-element = parentElement.firstChild || null;
- if(!element) {
-element = document.createElement(elementName);
-for(attr in arguments[1])
-element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
-}
-if(element.tagName != elementName)
-element = parentElement.getElementsByTagName(elementName)[0];
-}
-}
+element[type]();}});var Position={includeScrollOffsets:false,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0;this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;},realOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.scrollTop||0;valueL+=element.scrollLeft||0;element=element.parentNode;}while(element);return[valueL,valueT];},cumulativeOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;}while(element);return[valueL,valueT];},positionedOffset:function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;element=element.offsetParent;if(element){p=Element.getStyle(element,'position');if(p=='relative'||p=='absolute')break;}}while(element);return[valueL,valueT];},offsetParent:function(element){if(element.offsetParent)return element.offsetParent;if(element==document.body)return element;while((element=element.parentNode)&&element!=document.body)
+if(Element.getStyle(element,'position')!='static')
+return element;return document.body;},within:function(element,x,y){if(this.includeScrollOffsets)
+return this.withinIncludingScrolloffsets(element,x,y);this.xcomp=x;this.ycomp=y;this.offset=this.cumulativeOffset(element);return(y>=this.offset[1]&&y<this.offset[1]+element.offsetHeight&&x>=this.offset[0]&&x<this.offset[0]+element.offsetWidth);},withinIncludingScrolloffsets:function(element,x,y){var offsetcache=this.realOffset(element);this.xcomp=x+offsetcache[0]-this.deltaX;this.ycomp=y+offsetcache[1]-this.deltaY;this.offset=this.cumulativeOffset(element);return(this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+element.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+element.offsetWidth);},overlap:function(mode,element){if(!mode)return 0;if(mode=='vertical')
+return((this.offset[1]+element.offsetHeight)-this.ycomp)/element.offsetHeight;if(mode=='horizontal')
+return((this.offset[0]+element.offsetWidth)-this.xcomp)/element.offsetWidth;},clone:function(source,target){source=$(source);target=$(target);target.style.position='absolute';var offsets=this.cumulativeOffset(source);target.style.top=offsets[1]+'px';target.style.left=offsets[0]+'px';target.style.width=source.offsetWidth+'px';target.style.height=source.offsetHeight+'px';},page:function(forElement){var valueT=0,valueL=0;var element=forElement;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
+if(Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);element=forElement;do{valueT-=element.scrollTop||0;valueL-=element.scrollLeft||0;}while(element=element.parentNode);return[valueL,valueT];},clone:function(source,target){var options=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{})
+source=$(source);var p=Position.page(source);target=$(target);var delta=[0,0];var parent=null;if(Element.getStyle(target,'position')=='absolute'){parent=Position.offsetParent(target);delta=Position.page(parent);}
+if(parent==document.body){delta[0]-=document.body.offsetLeft;delta[1]-=document.body.offsetTop;}
+if(options.setLeft)target.style.left=(p[0]-delta[0]+options.offsetLeft)+'px';if(options.setTop)target.style.top=(p[1]-delta[1]+options.offsetTop)+'px';if(options.setWidth)target.style.width=source.offsetWidth+'px';if(options.setHeight)target.style.height=source.offsetHeight+'px';},absolutize:function(element){element=$(element);if(element.style.position=='absolute')return;Position.prepare();var offsets=Position.positionedOffset(element);var top=offsets[1];var left=offsets[0];var width=element.clientWidth;var height=element.clientHeight;element._originalLeft=left-parseFloat(element.style.left||0);element._originalTop=top-parseFloat(element.style.top||0);element._originalWidth=element.style.width;element._originalHeight=element.style.height;element.style.position='absolute';element.style.top=top+'px';;element.style.left=left+'px';;element.style.width=width+'px';;element.style.height=height+'px';;},relativize:function(element){element=$(element);if(element.style.position=='relative')return;Position.prepare();element.style.position='relative';var top=parseFloat(element.style.top||0)-(element._originalTop||0);var left=parseFloat(element.style.left||0)-(element._originalLeft||0);element.style.top=top+'px';element.style.left=left+'px';element.style.height=element._originalHeight;element.style.width=element._originalWidth;}}
+if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){Position.cumulativeOffset=function(element){var valueT=0,valueL=0;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
+if(Element.getStyle(element,'position')=='absolute')break;element=element.offsetParent;}while(element);return[valueL,valueT];}}
+var Selector=Class.create();Selector.prototype={initialize:function(expression){this.params={classNames:[]};this.expression=expression.toString().strip();this.parseExpression();this.compileMatcher();},parseExpression:function(){function abort(message){throw'Parse error in selector: '+message;}
+if(this.expression=='')abort('empty expression');var params=this.params,expr=this.expression,match,modifier,clause,rest;while(match=expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)){params.attributes=params.attributes||[];params.attributes.push({name:match[2],operator:match[3],value:match[4]||match[5]||''});expr=match[1];}
+if(expr=='*')return this.params.wildcard=true;while(match=expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)){modifier=match[1],clause=match[2],rest=match[3];switch(modifier){case'#':params.id=clause;break;case'.':params.classNames.push(clause);break;case'':case undefined:params.tagName=clause.toUpperCase();break;default:abort(expr.inspect());}
+expr=rest;}
+if(expr.length>0)abort(expr.inspect());},buildMatchExpression:function(){var params=this.params,conditions=[],clause;if(params.wildcard)
+conditions.push('true');if(clause=params.id)
+conditions.push('element.id == '+clause.inspect());if(clause=params.tagName)
+conditions.push('element.tagName.toUpperCase() == '+clause.inspect());if((clause=params.classNames).length>0)
+for(var i=0;i<clause.length;i++)
+conditions.push('Element.hasClassName(element, '+clause[i].inspect()+')');if(clause=params.attributes){clause.each(function(attribute){var value='element.getAttribute('+attribute.name.inspect()+')';var splitValueBy=function(delimiter){return value+' && '+value+'.split('+delimiter.inspect()+')';}
+switch(attribute.operator){case'=':conditions.push(value+' == '+attribute.value.inspect());break;case'~=':conditions.push(splitValueBy(' ')+'.include('+attribute.value.inspect()+')');break;case'|=':conditions.push(splitValueBy('-')+'.first().toUpperCase() == '+attribute.value.toUpperCase().inspect());break;case'!=':conditions.push(value+' != '+attribute.value.inspect());break;case'':case undefined:conditions.push(value+' != null');break;default:throw'Unknown operator '+attribute.operator+' in selector';}});}
+return conditions.join(' && ');},compileMatcher:function(){this.match=new Function('element','if (!element.tagName) return false; \
+ return '+this.buildMatchExpression());},findElements:function(scope){var element;if(element=$(this.params.id))
+if(this.match(element))
+if(!scope||Element.childOf(element,scope))
+return[element];scope=(scope||document).getElementsByTagName(this.params.tagName||'*');var results=[];for(var i=0;i<scope.length;i++)
+if(this.match(element=scope[i]))
+results.push(Element.extend(element));return results;},toString:function(){return this.expression;}}
+function $$(){return $A(arguments).map(function(expression){return expression.strip().split(/\s+/).inject([null],function(results,expr){var selector=new Selector(expr);return results.map(selector.findElements.bind(selector)).flatten();});}).flatten();}
+var Builder={NODEMAP:{AREA:'map',CAPTION:'table',COL:'table',COLGROUP:'table',LEGEND:'fieldset',OPTGROUP:'select',OPTION:'select',PARAM:'object',TBODY:'table',TD:'table',TFOOT:'table',TH:'table',THEAD:'table',TR:'table'},node:function(elementName){elementName=elementName.toUpperCase();var parentTag=this.NODEMAP[elementName]||'div';var parentElement=document.createElement(parentTag);try{parentElement.innerHTML="<"+elementName+"></"+elementName+">";}catch(e){}
+var element=parentElement.firstChild||null;if(element&&(element.tagName!=elementName))
+element=element.getElementsByTagName(elementName)[0];if(!element)element=document.createElement(elementName);if(!element)return;if(arguments[1])
+if(this._isStringOrNumber(arguments[1])||(arguments[1]instanceof Array)){this._children(element,arguments[1]);}else{var attrs=this._attributes(arguments[1]);if(attrs.length){try{parentElement.innerHTML="<"+elementName+" "+
+attrs+"></"+elementName+">";}catch(e){}
+element=parentElement.firstChild||null;if(!element){element=document.createElement(elementName);for(attr in arguments[1])
+element[attr=='class'?'className':attr]=arguments[1][attr];}
+if(element.tagName!=elementName)
+element=parentElement.getElementsByTagName(elementName)[0];}}
if(arguments[2])
-this._children(element, arguments[2]);
-return element;
-},
-_text: function(text) {
- return document.createTextNode(text);
-},
-_attributes: function(attributes) {
-var attrs = [];
-for(attribute in attributes)
-attrs.push((attribute=='className' ? 'class' : attribute) +
-'="' + attributes[attribute].toString().escapeHTML() + '"');
-return attrs.join(" ");
-},
-_children: function(element, children) {
-if(typeof children=='object') {children.flatten().each( function(e) {
-if(typeof e=='object')
+this._children(element,arguments[2]);return element;},_text:function(text){return document.createTextNode(text);},_attributes:function(attributes){var attrs=[];for(attribute in attributes)
+attrs.push((attribute=='className'?'class':attribute)+'="'+attributes[attribute].toString().escapeHTML()+'"');return attrs.join(" ");},_children:function(element,children){if(typeof children=='object'){children.flatten().each(function(e){if(typeof e=='object')
element.appendChild(e)
else
if(Builder._isStringOrNumber(e))
-element.appendChild(Builder._text(e));
-});
-} else
-if(Builder._isStringOrNumber(children))
- element.appendChild(Builder._text(children));
-},
-_isStringOrNumber: function(param) {
-return(typeof param=='string' || typeof param=='number');
-}
-}
-Object.extend(Builder,
-{
-exportTags:function()
-{
-var tags=["BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG", "CAPTION"];
-tags.each(function(tag)
-{
-window[tag]=function()
-{
-var args=$A(arguments);
-if(args.length==0)
-return Builder.node(tag,null);
-if(args.length==1)
-return Builder.node(tag,args[0]);
-if(args.length>1)
-return Builder.node(tag,args.shift(),args);
-};
-});
-}
-});
-Builder.exportTags();
-Object.extend(Date.prototype,
-{
-SimpleFormat: function(format, data)
-{
-data = data || {};
-var bits = new Array();
-bits['d'] = this.getDate();
-bits['dd'] = String(this.getDate()).zerofill(2);
-bits['M'] = this.getMonth()+1;
-bits['MM'] = String(this.getMonth()+1).zerofill(2);
-if(data.AbbreviatedMonthNames)
-bits['MMM'] = data.AbbreviatedMonthNames[this.getMonth()];
-if(data.MonthNames)
-bits['MMMM'] = data.MonthNames[this.getMonth()];
-var yearStr = "" + this.getFullYear();
-yearStr = (yearStr.length == 2) ? '19' + yearStr: yearStr;
-bits['yyyy'] = yearStr;
-bits['yy'] = bits['yyyy'].toString().substr(2,2);
-var frm = new String(format);
-for (var sect in bits)
-{
-var reg = new RegExp("\\b"+sect+"\\b" ,"g");
-frm = frm.replace(reg, bits[sect]);
-}
-return frm;
-},
-toISODate : function()
-{
-var y = this.getFullYear();
-var m = String(this.getMonth() + 1).zerofill(2);
-var d = String(this.getDate()).zerofill(2);
-return String(y) + String(m) + String(d);
-}
-});
-Object.extend(Date,
-{
-SimpleParse: function(value, format)
-{
-val=String(value);
-format=String(format);
-if(val.length <= 0) return null;
-if(format.length <= 0) return new Date(value);
-var isInteger = function (val)
-{
-var digits="1234567890";
-for (var i=0; i < val.length; i++)
-{
-if (digits.indexOf(val.charAt(i))==-1) { return false; }
-}
-return true;
-};
-var getInt = function(str,i,minlength,maxlength)
-{
-for (var x=maxlength; x>=minlength; x--)
-{
-var token=str.substring(i,i+x);
-if (token.length < minlength) { return null; }
-if (isInteger(token)) { return token; }
-}
-return null;
-};
-var i_val=0;
-var i_format=0;
-var c="";
-var token="";
-var token2="";
-var x,y;
-var now=new Date();
-var year=now.getFullYear();
-var month=now.getMonth()+1;
-var date=1;
-while (i_format < format.length)
-{
-c=format.charAt(i_format);
-token="";
-while ((format.charAt(i_format)==c) && (i_format < format.length))
-{
-token += format.charAt(i_format++);
-}
-if (token=="yyyy" || token=="yy" || token=="y")
-{
-if (token=="yyyy") { x=4;y=4; }
-if (token=="yy") { x=2;y=2; }
-if (token=="y"){ x=2;y=4; }
-year=getInt(val,i_val,x,y);
-if (year==null) { return null; }
-i_val += year.length;
-if (year.length==2)
-{
-if (year > 70) { year=1900+(year-0); }
-else { year=2000+(year-0); }
-}
-}
-else if (token=="MM"||token=="M")
-{
-month=getInt(val,i_val,token.length,2);
-if(month==null||(month<1)||(month>12)){return null;}
-i_val+=month.length;
-}
-else if (token=="dd"||token=="d")
-{
-date=getInt(val,i_val,token.length,2);
-if(date==null||(date<1)||(date>31)){return null;}
-i_val+=date.length;
-}
-else
-{
-if (val.substring(i_val,i_val+token.length)!=token) {return null;}
-else {i_val+=token.length;}
-}
-}
-if (i_val != val.length) { return null; }
-if (month==2)
-{
-if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) {
-if (date > 29){ return null; }
-}
-else { if (date > 28) { return null; } }
-}
-if ((month==4)||(month==6)||(month==9)||(month==11))
-{
-if (date > 30) { return null; }
-}
-var newdate=new Date(year,month-1,date, 0, 0, 0);
-return newdate;
-}
-});
-var Prado =
-{
-Version: '3.0.0',
-Browser : function()
-{
-var info = { Version : "1.0" };
-var is_major = parseInt( navigator.appVersion );
-info.nver = is_major;
-info.ver = navigator.appVersion;
-info.agent = navigator.userAgent;
-info.dom = document.getElementById ? 1 : 0;
-info.opera = window.opera ? 1 : 0;
-info.ie5 = ( info.ver.indexOf( "MSIE 5" ) > -1 && info.dom && !info.opera ) ? 1 : 0;
-info.ie6 = ( info.ver.indexOf( "MSIE 6" ) > -1 && info.dom && !info.opera ) ? 1 : 0;
-info.ie4 = ( document.all && !info.dom && !info.opera ) ? 1 : 0;
-info.ie = info.ie4 || info.ie5 || info.ie6;
-info.mac = info.agent.indexOf( "Mac" ) > -1;
-info.ns6 = ( info.dom && parseInt( info.ver ) >= 5 ) ? 1 : 0;
-info.ie3 = ( info.ver.indexOf( "MSIE" ) && ( is_major < 4 ) );
-info.hotjava = ( info.agent.toLowerCase().indexOf( 'hotjava' ) != -1 ) ? 1 : 0;
-info.ns4 = ( document.layers && !info.dom && !info.hotjava ) ? 1 : 0;
-info.bw = ( info.ie6 || info.ie5 || info.ie4 || info.ns4 || info.ns6 || info.opera );
-info.ver3 = ( info.hotjava || info.ie3 );
-info.opera7 = ( ( info.agent.toLowerCase().indexOf( 'opera 7' ) > -1 ) || ( info.agent.toLowerCase().indexOf( 'opera/7' ) > -1 ) );
-info.operaOld = info.opera && !info.opera7;
-return info;
-},
-ImportCss : function(doc, css_file)
-{
-if (Prado.Browser().ie)
-var styleSheet = doc.createStyleSheet(css_file);
-else
-{
-var elm = doc.createElement("link");
-elm.rel = "stylesheet";
-elm.href = css_file;
-if (headArr = doc.getElementsByTagName("head"))
-headArr[0].appendChild(elm);
-}
-}
-};
-Prado.PostBack = function(event,options)
-{
-var form = $(options['FormID']);
-var canSubmit = true;
-if(options['CausesValidation'] && typeof(Prado.Validation) != "undefined")
-{
-if(!Prado.Validation.validate(options['FormID'], options['ValidationGroup'], $(options['ID'])))
-return Event.stop(event);
-}
-if(options['PostBackUrl'] && options['PostBackUrl'].length > 0)
-form.action = options['PostBackUrl'];
-if(options['TrackFocus'])
-{
-var lastFocus = $('PRADO_LASTFOCUS');
-if(lastFocus)
-{
-var active = document.activeElement;
-if(active)
-lastFocus.value = active.id;
+element.appendChild(Builder._text(e));});}else
+if(Builder._isStringOrNumber(children))
+element.appendChild(Builder._text(children));},_isStringOrNumber:function(param){return(typeof param=='string'||typeof param=='number');}}
+Object.extend(Builder,{exportTags:function()
+{var tags=["BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG","CAPTION"];tags.each(function(tag)
+{window[tag]=function()
+{var args=$A(arguments);if(args.length==0)
+return Builder.node(tag,null);if(args.length==1)
+return Builder.node(tag,args[0]);if(args.length>1)
+return Builder.node(tag,args.shift(),args);};});}});Builder.exportTags();Object.extend(Date.prototype,{SimpleFormat:function(format,data)
+{data=data||{};var bits=new Array();bits['d']=this.getDate();bits['dd']=String(this.getDate()).zerofill(2);bits['M']=this.getMonth()+1;bits['MM']=String(this.getMonth()+1).zerofill(2);if(data.AbbreviatedMonthNames)
+bits['MMM']=data.AbbreviatedMonthNames[this.getMonth()];if(data.MonthNames)
+bits['MMMM']=data.MonthNames[this.getMonth()];var yearStr=""+this.getFullYear();yearStr=(yearStr.length==2)?'19'+yearStr:yearStr;bits['yyyy']=yearStr;bits['yy']=bits['yyyy'].toString().substr(2,2);var frm=new String(format);for(var sect in bits)
+{var reg=new RegExp("\\b"+sect+"\\b","g");frm=frm.replace(reg,bits[sect]);}
+return frm;},toISODate:function()
+{var y=this.getFullYear();var m=String(this.getMonth()+1).zerofill(2);var d=String(this.getDate()).zerofill(2);return String(y)+String(m)+String(d);}});Object.extend(Date,{SimpleParse:function(value,format)
+{val=String(value);format=String(format);if(val.length<=0)return null;if(format.length<=0)return new Date(value);var isInteger=function(val)
+{var digits="1234567890";for(var i=0;i<val.length;i++)
+{if(digits.indexOf(val.charAt(i))==-1){return false;}}
+return true;};var getInt=function(str,i,minlength,maxlength)
+{for(var x=maxlength;x>=minlength;x--)
+{var token=str.substring(i,i+x);if(token.length<minlength){return null;}
+if(isInteger(token)){return token;}}
+return null;};var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var now=new Date();var year=now.getFullYear();var month=now.getMonth()+1;var date=1;while(i_format<format.length)
+{c=format.charAt(i_format);token="";while((format.charAt(i_format)==c)&&(i_format<format.length))
+{token+=format.charAt(i_format++);}
+if(token=="yyyy"||token=="yy"||token=="y")
+{if(token=="yyyy"){x=4;y=4;}
+if(token=="yy"){x=2;y=2;}
+if(token=="y"){x=2;y=4;}
+year=getInt(val,i_val,x,y);if(year==null){return null;}
+i_val+=year.length;if(year.length==2)
+{if(year>70){year=1900+(year-0);}
+else{year=2000+(year-0);}}}
+else if(token=="MM"||token=="M")
+{month=getInt(val,i_val,token.length,2);if(month==null||(month<1)||(month>12)){return null;}
+i_val+=month.length;}
+else if(token=="dd"||token=="d")
+{date=getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return null;}
+i_val+=date.length;}
else
-lastFocus.value = options['EventTarget'];
-}
-}
-$('PRADO_POSTBACK_TARGET').value = options['EventTarget'];
-$('PRADO_POSTBACK_PARAMETER').value = options['EventParameter'];
-if(options['StopEvent'])
-Event.stop(event);
-Event.fireEvent(form,"submit");
-}
-Prado.Element =
-{
-setValue : function(element, value)
-{
-var el = $(element);
-if(el && typeof(el.value) != "undefined")
-el.value = value;
-},
-select : function(element, method, value)
-{
-var el = $(element);
-var isList = element.indexOf('[]') > -1;
-if(!el && !isList) return;
-method = isList ? 'check'+method : el.tagName.toLowerCase()+method;
-var selection = Prado.Element.Selection;
-if(isFunction(selection[method]))
-selection[method](isList ? element : el,value);
-},
-click : function(element)
-{
-var el = $(element);
-if(!el) return;
-if(document.createEvent)
-{
-var evt = document.createEvent('HTMLEvents');
-evt.initEvent('click', true, true);
-el.dispatchEvent(evt);
-}
+{if(val.substring(i_val,i_val+token.length)!=token){return null;}
+else{i_val+=token.length;}}}
+if(i_val!=val.length){return null;}
+if(month==2)
+{if(((year%4==0)&&(year%100!=0))||(year%400==0)){if(date>29){return null;}}
+else{if(date>28){return null;}}}
+if((month==4)||(month==6)||(month==9)||(month==11))
+{if(date>30){return null;}}
+var newdate=new Date(year,month-1,date,0,0,0);return newdate;}});var Prado={Version:'3.0.0',Browser:function()
+{var info={Version:"1.0"};var is_major=parseInt(navigator.appVersion);info.nver=is_major;info.ver=navigator.appVersion;info.agent=navigator.userAgent;info.dom=document.getElementById?1:0;info.opera=window.opera?1:0;info.ie5=(info.ver.indexOf("MSIE 5")>-1&&info.dom&&!info.opera)?1:0;info.ie6=(info.ver.indexOf("MSIE 6")>-1&&info.dom&&!info.opera)?1:0;info.ie4=(document.all&&!info.dom&&!info.opera)?1:0;info.ie=info.ie4||info.ie5||info.ie6;info.mac=info.agent.indexOf("Mac")>-1;info.ns6=(info.dom&&parseInt(info.ver)>=5)?1:0;info.ie3=(info.ver.indexOf("MSIE")&&(is_major<4));info.hotjava=(info.agent.toLowerCase().indexOf('hotjava')!=-1)?1:0;info.ns4=(document.layers&&!info.dom&&!info.hotjava)?1:0;info.bw=(info.ie6||info.ie5||info.ie4||info.ns4||info.ns6||info.opera);info.ver3=(info.hotjava||info.ie3);info.opera7=((info.agent.toLowerCase().indexOf('opera 7')>-1)||(info.agent.toLowerCase().indexOf('opera/7')>-1));info.operaOld=info.opera&&!info.opera7;return info;},ImportCss:function(doc,css_file)
+{if(Prado.Browser().ie)
+var styleSheet=doc.createStyleSheet(css_file);else
+{var elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if(headArr=doc.getElementsByTagName("head"))
+headArr[0].appendChild(elm);}}};Prado.PostBack=function(event,options)
+{var form=$(options['FormID']);var canSubmit=true;if(options['CausesValidation']&&typeof(Prado.Validation)!="undefined")
+{if(!Prado.Validation.validate(options['FormID'],options['ValidationGroup'],$(options['ID'])))
+return Event.stop(event);}
+if(options['PostBackUrl']&&options['PostBackUrl'].length>0)
+form.action=options['PostBackUrl'];if(options['TrackFocus'])
+{var lastFocus=$('PRADO_LASTFOCUS');if(lastFocus)
+{var active=document.activeElement;if(active)
+lastFocus.value=active.id;else
+lastFocus.value=options['EventTarget'];}}
+$('PRADO_POSTBACK_TARGET').value=options['EventTarget'];$('PRADO_POSTBACK_PARAMETER').value=options['EventParameter'];if(options['StopEvent'])
+Event.stop(event);Event.fireEvent(form,"submit");}
+Prado.Element={setValue:function(element,value)
+{var el=$(element);if(el&&typeof(el.value)!="undefined")
+el.value=value;},select:function(element,method,value)
+{var el=$(element);var isList=element.indexOf('[]')>-1;if(!el&&!isList)return;method=isList?'check'+method:el.tagName.toLowerCase()+method;var selection=Prado.Element.Selection;if(isFunction(selection[method]))
+selection[method](isList?element:el,value);},click:function(element)
+{var el=$(element);if(!el)return;if(document.createEvent)
+{var evt=document.createEvent('HTMLEvents');evt.initEvent('click',true,true);el.dispatchEvent(evt);}
else if(el.fireEvent)
-{
-el.fireEvent('onclick');
-if(isFunction(el.onclick))
-el.onclick();
-}
-},
-setAttribute : function(element, attribute, value)
-{
-var el = $(element);
-if(attribute == "disabled" && value==false)
-el.removeAttribute(attribute);
-else
-el.setAttribute(attribute, value);
-},
-setOptions : function(element, options)
-{
-var el = $(element);
-if(el && el.tagName.toLowerCase() == "select")
-{
-while(el.length > 0)
-el.remove(0);
-for(var i = 0; i<options.length; i++)
-el.options[el.options.length] = new Option(options[i][0],options[i][1]);
-}
-},
-focus : function(element)
-{
-var obj = $(element);
-if(isObject(obj) && isdef(obj.focus))
-setTimeout(function(){ obj.focus(); }, 100);
-return false;
-}
-}
-Prado.Element.Selection =
-{
-inputValue : function(el, value)
-{
-switch(el.type.toLowerCase())
-{
-case 'checkbox':
-case 'radio':
-return el.checked = value;
-}
-},
-selectValue : function(el, value)
-{
-$A(el.options).each(function(option)
-{
-option.selected = option.value == value;
-});
-},
-selectIndex : function(el, index)
-{
-if(el.type == 'select-one')
-el.selectedIndex = index;
-else
-{
-for(var i = 0; i<el.length; i++)
-{
-if(i == index)
-el.options[i].selected = true;
-}
-}
-},
-selectClear : function(el)
-{
-el.selectedIndex = -1;
-},
-selectAll : function(el)
-{
-$A(el.options).each(function(option)
-{
-option.selected = true;
-Logger.warn(option.value);
-});
-},
-selectInvert : function(el)
-{
-$A(el.options).each(function(option)
-{
-option.selected = !option.selected;
-});
-},
-checkValue : function(name, value)
-{
-$A(document.getElementsByName(name)).each(function(el)
-{
-el.checked = el.value == value
-});
-},
-checkIndex : function(name, index)
-{
-var elements = $A(document.getElementsByName(name));
-for(var i = 0; i<elements.length; i++)
-{
-if(i == index)
-elements[i].checked = true;
-}
-},
-checkClear : function(name)
-{
-$A(document.getElementsByName(name)).each(function(el)
-{
-el.checked = false;
-});
-},
-checkAll : function(name)
-{
-$A(document.getElementsByName(name)).each(function(el)
-{
-el.checked = true;
-});
-},
-checkInvert : function(name)
-{
-$A(document.getElementsByName(name)).each(function(el)
-{
-el.checked = !el.checked;
-});
-}
-};
-Prado.WebUI = Class.create();
-Prado.WebUI.PostBackControl = Class.create();
-Prado.WebUI.PostBackControl.prototype =
-{
-_elementOnClick : null,
-initialize : function(options)
-{
-this.element = $(options.ID);
-if(this.onInit)
-this.onInit(options);
-},
-onInit : function(options)
-{
-if(typeof(this.element.onclick)=="function")
-{
-this._elementOnClick = this.element.onclick;
-this.element.onclick = null;
-}
-Event.observe(this.element, "click", this.onClick.bindEvent(this,options));
-},
-onClick : function(event, options)
-{
-var src = Event.element(event);
-var doPostBack = true;
-var onclicked = null;
-if(this._elementOnClick)
-{
-var onclicked = this._elementOnClick(event);
-if(typeof(onclicked) == "boolean")
-doPostBack = onclicked;
-}
+{el.fireEvent('onclick');if(isFunction(el.onclick))
+el.onclick();}},setAttribute:function(element,attribute,value)
+{var el=$(element);if(attribute=="disabled"&&value==false)
+el.removeAttribute(attribute);else
+el.setAttribute(attribute,value);},setOptions:function(element,options)
+{var el=$(element);if(el&&el.tagName.toLowerCase()=="select")
+{while(el.length>0)
+el.remove(0);for(var i=0;i<options.length;i++)
+el.options[el.options.length]=new Option(options[i][0],options[i][1]);}},focus:function(element)
+{var obj=$(element);if(isObject(obj)&&isdef(obj.focus))
+setTimeout(function(){obj.focus();},100);return false;}}
+Prado.Element.Selection={inputValue:function(el,value)
+{switch(el.type.toLowerCase())
+{case'checkbox':case'radio':return el.checked=value;}},selectValue:function(el,value)
+{$A(el.options).each(function(option)
+{option.selected=option.value==value;});},selectIndex:function(el,index)
+{if(el.type=='select-one')
+el.selectedIndex=index;else
+{for(var i=0;i<el.length;i++)
+{if(i==index)
+el.options[i].selected=true;}}},selectClear:function(el)
+{el.selectedIndex=-1;},selectAll:function(el)
+{$A(el.options).each(function(option)
+{option.selected=true;Logger.warn(option.value);});},selectInvert:function(el)
+{$A(el.options).each(function(option)
+{option.selected=!option.selected;});},checkValue:function(name,value)
+{$A(document.getElementsByName(name)).each(function(el)
+{el.checked=el.value==value});},checkIndex:function(name,index)
+{var elements=$A(document.getElementsByName(name));for(var i=0;i<elements.length;i++)
+{if(i==index)
+elements[i].checked=true;}},checkClear:function(name)
+{$A(document.getElementsByName(name)).each(function(el)
+{el.checked=false;});},checkAll:function(name)
+{$A(document.getElementsByName(name)).each(function(el)
+{el.checked=true;});},checkInvert:function(name)
+{$A(document.getElementsByName(name)).each(function(el)
+{el.checked=!el.checked;});}};Prado.WebUI=Class.create();Prado.WebUI.PostBackControl=Class.create();Prado.WebUI.PostBackControl.prototype={_elementOnClick:null,initialize:function(options)
+{this.element=$(options.ID);if(this.onInit)
+this.onInit(options);},onInit:function(options)
+{if(typeof(this.element.onclick)=="function")
+{this._elementOnClick=this.element.onclick;this.element.onclick=null;}
+Event.observe(this.element,"click",this.onClick.bindEvent(this,options));},onClick:function(event,options)
+{var src=Event.element(event);var doPostBack=true;var onclicked=null;if(this._elementOnClick)
+{var onclicked=this._elementOnClick(event);if(typeof(onclicked)=="boolean")
+doPostBack=onclicked;}
if(doPostBack)
-this.onPostBack(event,options);
-if(typeof(onclicked) == "boolean" && !onclicked)
-Event.stop(event);
-},
-onPostBack : function(event, options)
-{
-Prado.PostBack(event,options);
-}
-};
-Prado.WebUI.TButton = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TLinkButton = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TCheckBox = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TBulletedList = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TImageMap = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TImageButton = Class.extend(Prado.WebUI.PostBackControl);
-Object.extend(Prado.WebUI.TImageButton.prototype,
-{
-hasXYInput : false,
-onPostBack : function(event, options)
-{
-if(!this.hasXYInput)
-{
-this.addXYInput(event,options);
-this.hasXYInput = true;
-}
-Prado.PostBack(event, options);
-},
-addXYInput : function(event,options)
-{
-var imagePos = Position.cumulativeOffset(this.element);
-var clickedPos = [event.clientX, event.clientY];
-var x = clickedPos[0]-imagePos[0]+1;
-var y = clickedPos[1]-imagePos[1]+1;
-var id = options['EventTarget'];
-var x_input = INPUT({type:'hidden',name:id+'_x',value:x});
-var y_input = INPUT({type:'hidden',name:id+'_y',value:y});
-this.element.parentNode.appendChild(x_input);
-this.element.parentNode.appendChild(y_input);
-}
-});
-Prado.WebUI.TRadioButton = Class.extend(Prado.WebUI.PostBackControl);
-Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize = Prado.WebUI.TRadioButton.prototype.initialize;
-Object.extend(Prado.WebUI.TRadioButton.prototype,
-{
-initialize : function(options)
-{
-this.element = $(options['ID']);
-if(!this.element.checked)
-this.onRadioButtonInitialize(options);
-}
-});
-Prado.WebUI.TTextBox = Class.extend(Prado.WebUI.PostBackControl,
-{
-onInit : function(options)
-{
-if(options['TextMode'] != 'MultiLine')
-Event.observe(this.element, "keydown", this.handleReturnKey.bind(this));
-Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options));
-},
-handleReturnKey : function(e)
-{
- if(Event.keyCode(e) == Event.KEY_RETURN)
-{
-var target = Event.element(e);
-if(target)
-{
-Event.fireEvent(target, "change");
-Event.stop(e);
-}
-}
-}
-});
-Prado.WebUI.TListControl = Class.extend(Prado.WebUI.PostBackControl,
-{
-onInit : function(options)
-{
-Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options));
-}
-});
-Prado.WebUI.TListBox = Class.extend(Prado.WebUI.TListControl);
-Prado.WebUI.TDropDownList = Class.extend(Prado.WebUI.TListControl);
-Prado.WebUI.DefaultButton = Class.create();
-Prado.WebUI.DefaultButton.prototype =
-{
-initialize : function(options)
-{
-this.options = options;
-this._event = this.triggerEvent.bindEvent(this);
-Event.observe(options['Panel'], 'keydown', this._event);
-},
-triggerEvent : function(ev, target)
-{
-var enterPressed = Event.keyCode(ev) == Event.KEY_RETURN;
-var isTextArea = Event.element(ev).tagName.toLowerCase() == "textarea";
-if(enterPressed && !isTextArea)
-{
-var defaultButton = $(this.options['Target']);
-if(defaultButton)
-{
-this.triggered = true;
-Event.fireEvent(defaultButton, this.options['Event']);
-Event.stop(ev);
-}
-}
-}
-};
-Prado.WebUI.TTextHighlighter=Class.create();
-Prado.WebUI.TTextHighlighter.prototype=
-{
-initialize:function(id)
-{
-if(!window.clipboardData) return;
-var options =
-{
-href : 'javascript:;/'+'/copy code to clipboard',
-onclick : 'Prado.WebUI.TTextHighlighter.copy(this)',
-onmouseover : 'Prado.WebUI.TTextHighlighter.hover(this)',
-onmouseout : 'Prado.WebUI.TTextHighlighter.out(this)'
-}
-var div = DIV({className:'copycode'}, A(options, 'Copy Code'));
-document.write(DIV(null,div).innerHTML);
-}
-};
-Object.extend(Prado.WebUI.TTextHighlighter,
-{
-copy : function(obj)
-{
-var parent = obj.parentNode.parentNode.parentNode;
-var text = '';
-for(var i = 0; i < parent.childNodes.length; i++)
-{
-var node = parent.childNodes[i];
-if(node.innerText)
-text += node.innerText == 'Copy Code' ? '' : node.innerText;
-else
-text += node.nodeValue;
-}
-if(text.length > 0)
-window.clipboardData.setData("Text", text);
-},
-hover : function(obj)
-{
-obj.parentNode.className = "copycode copycode_hover";
-},
-out : function(obj)
-{
-obj.parentNode.className = "copycode";
-}
-});
-Prado.WebUI.TRatingList = Class.create();
-Prado.WebUI.TRatingList.prototype =
-{
-selectedIndex : -1,
-initialize : function(options)
-{
-this.options = options;
-this.element = $(options['ID']);
-Element.addClassName(this.element,options.cssClass);
-this.radios = document.getElementsByName(options.field);
-for(var i = 0; i<this.radios.length; i++)
-{
-Event.observe(this.radios[i].parentNode, "mouseover", this.hover.bindEvent(this,i));
-Event.observe(this.radios[i].parentNode, "mouseout", this.recover.bindEvent(this,i));
-Event.observe(this.radios[i].parentNode, "click", this.click.bindEvent(this, i));
-}
-this.caption = CAPTION();
-this.element.appendChild(this.caption);
-this.selectedIndex = options.selectedIndex;
-this.setRating(this.selectedIndex);
-},
-hover : function(ev,index)
-{
-for(var i = 0; i<this.radios.length; i++)
-this.radios[i].parentNode.className = (i<=index) ? "rating_hover" : "";
-this.setCaption(index);
-},
-recover : function(ev,index)
-{
-for(var i = 0; i<=index; i++)
-Element.removeClassName(this.radios[i].parentNode, "rating_hover");
-this.setRating(this.selectedIndex);
-},
-click : function(ev, index)
-{
-for(var i = 0; i<this.radios.length; i++)
-this.radios[i].checked = (i == index);
-this.selectedIndex = index;
-this.setRating(index);
-if(isFunction(this.options.onChange))
-this.options.onChange(this,index);
-},
-setRating: function(index)
-{
-for(var i = 0; i<=index; i++)
-this.radios[i].parentNode.className = "rating_selected";
-this.setCaption(index);
-},
-setCaption : function(index)
-{
-this.caption.innerHTML = index > -1 ?
-this.radios[index].value : this.options.caption;
-}
-}
+this.onPostBack(event,options);if(typeof(onclicked)=="boolean"&&!onclicked)
+Event.stop(event);},onPostBack:function(event,options)
+{Prado.PostBack(event,options);}};Prado.WebUI.TButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TLinkButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TCheckBox=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TBulletedList=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageMap=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageButton=Class.extend(Prado.WebUI.PostBackControl);Object.extend(Prado.WebUI.TImageButton.prototype,{hasXYInput:false,onPostBack:function(event,options)
+{if(!this.hasXYInput)
+{this.addXYInput(event,options);this.hasXYInput=true;}
+Prado.PostBack(event,options);},addXYInput:function(event,options)
+{var imagePos=Position.cumulativeOffset(this.element);var clickedPos=[event.clientX,event.clientY];var x=clickedPos[0]-imagePos[0]+1;var y=clickedPos[1]-imagePos[1]+1;var id=options['EventTarget'];var x_input=INPUT({type:'hidden',name:id+'_x',value:x});var y_input=INPUT({type:'hidden',name:id+'_y',value:y});this.element.parentNode.appendChild(x_input);this.element.parentNode.appendChild(y_input);}});Prado.WebUI.TRadioButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize=Prado.WebUI.TRadioButton.prototype.initialize;Object.extend(Prado.WebUI.TRadioButton.prototype,{initialize:function(options)
+{this.element=$(options['ID']);if(!this.element.checked)
+this.onRadioButtonInitialize(options);}});Prado.WebUI.TTextBox=Class.extend(Prado.WebUI.PostBackControl,{onInit:function(options)
+{if(options['TextMode']!='MultiLine')
+Event.observe(this.element,"keydown",this.handleReturnKey.bind(this));Event.observe(this.element,"change",Prado.PostBack.bindEvent(this,options));},handleReturnKey:function(e)
+{if(Event.keyCode(e)==Event.KEY_RETURN)
+{var target=Event.element(e);if(target)
+{Event.fireEvent(target,"change");Event.stop(e);}}}});Prado.WebUI.TListControl=Class.extend(Prado.WebUI.PostBackControl,{onInit:function(options)
+{Event.observe(this.element,"change",Prado.PostBack.bindEvent(this,options));}});Prado.WebUI.TListBox=Class.extend(Prado.WebUI.TListControl);Prado.WebUI.TDropDownList=Class.extend(Prado.WebUI.TListControl);Prado.WebUI.DefaultButton=Class.create();Prado.WebUI.DefaultButton.prototype={initialize:function(options)
+{this.options=options;this._event=this.triggerEvent.bindEvent(this);Event.observe(options['Panel'],'keydown',this._event);},triggerEvent:function(ev,target)
+{var enterPressed=Event.keyCode(ev)==Event.KEY_RETURN;var isTextArea=Event.element(ev).tagName.toLowerCase()=="textarea";if(enterPressed&&!isTextArea)
+{var defaultButton=$(this.options['Target']);if(defaultButton)
+{this.triggered=true;Event.fireEvent(defaultButton,this.options['Event']);Event.stop(ev);}}}};Prado.WebUI.TTextHighlighter=Class.create();Prado.WebUI.TTextHighlighter.prototype={initialize:function(id)
+{if(!window.clipboardData)return;var options={href:'javascript:;/'+'/copy code to clipboard',onclick:'Prado.WebUI.TTextHighlighter.copy(this)',onmouseover:'Prado.WebUI.TTextHighlighter.hover(this)',onmouseout:'Prado.WebUI.TTextHighlighter.out(this)'}
+var div=DIV({className:'copycode'},A(options,'Copy Code'));document.write(DIV(null,div).innerHTML);}};Object.extend(Prado.WebUI.TTextHighlighter,{copy:function(obj)
+{var parent=obj.parentNode.parentNode.parentNode;var text='';for(var i=0;i<parent.childNodes.length;i++)
+{var node=parent.childNodes[i];if(node.innerText)
+text+=node.innerText=='Copy Code'?'':node.innerText;else
+text+=node.nodeValue;}
+if(text.length>0)
+window.clipboardData.setData("Text",text);},hover:function(obj)
+{obj.parentNode.className="copycode copycode_hover";},out:function(obj)
+{obj.parentNode.className="copycode";}});Prado.WebUI.TRatingList=Class.create();Prado.WebUI.TRatingList.prototype={selectedIndex:-1,initialize:function(options)
+{this.options=options;this.element=$(options['ID']);Element.addClassName(this.element,options.cssClass);this.radios=document.getElementsByName(options.field);for(var i=0;i<this.radios.length;i++)
+{Event.observe(this.radios[i].parentNode,"mouseover",this.hover.bindEvent(this,i));Event.observe(this.radios[i].parentNode,"mouseout",this.recover.bindEvent(this,i));Event.observe(this.radios[i].parentNode,"click",this.click.bindEvent(this,i));}
+this.caption=CAPTION();this.element.appendChild(this.caption);this.selectedIndex=options.selectedIndex;this.setRating(this.selectedIndex);},hover:function(ev,index)
+{for(var i=0;i<this.radios.length;i++)
+this.radios[i].parentNode.className=(i<=index)?"rating_hover":"";this.setCaption(index);},recover:function(ev,index)
+{for(var i=0;i<=index;i++)
+Element.removeClassName(this.radios[i].parentNode,"rating_hover");this.setRating(this.selectedIndex);},click:function(ev,index)
+{for(var i=0;i<this.radios.length;i++)
+this.radios[i].checked=(i==index);this.selectedIndex=index;this.setRating(index);if(isFunction(this.options.onChange))
+this.options.onChange(this,index);},setRating:function(index)
+{for(var i=0;i<=index;i++)
+this.radios[i].parentNode.className="rating_selected";this.setCaption(index);},setCaption:function(index)
+{this.caption.innerHTML=index>-1?this.radios[index].value:this.options.caption;}} \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/rico.js b/framework/Web/Javascripts/js/rico.js
index 3c2035ca..ff75a9f9 100644
--- a/framework/Web/Javascripts/js/rico.js
+++ b/framework/Web/Javascripts/js/rico.js
@@ -1,900 +1,265 @@
-
-var Rico = {
-Version: '1.1rc1',
-prototypeVersion: parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1])
-}
-Rico.ArrayExtensions = new Array();
-if (Object.prototype.extend) {
- Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
-}else{
-Object.prototype.extend = function(object) {
-return Object.extend.apply(this, [this, object]);
-}
-Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
-}
-if (Array.prototype.push) {
- Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push;
-}
-if (!Array.prototype.remove) {
- Array.prototype.remove = function(dx) {
-if( isNaN(dx) || dx > this.length )
- return false;
-for( var i=0,n=0; i<this.length; i++ )
- if( i != dx )
-this[n++]=this[i];
-this.length-=1;
- };
-Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.remove;
-}
-if (!Array.prototype.removeItem) {
- Array.prototype.removeItem = function(item) {
-for ( var i = 0 ; i < this.length ; i++ )
- if ( this[i] == item ) {
-this.remove(i);
-break;
- }
- };
-Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.removeItem;
-}
-if (!Array.prototype.indices) {
- Array.prototype.indices = function() {
-var indexArray = new Array();
-for ( index in this ) {
- var ignoreThis = false;
- for ( var i = 0 ; i < Rico.ArrayExtensions.length ; i++ ) {
-if ( this[index] == Rico.ArrayExtensions[i] ) {
- ignoreThis = true;
- break;
-}
- }
- if ( !ignoreThis )
-indexArray[ indexArray.length ] = index;
-}
-return indexArray;
- }
-Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.indices;
-}
-if ( window.DOMParser &&
-window.XMLSerializer &&
-window.Node && Node.prototype && Node.prototype.__defineGetter__ ) {
-if (!Document.prototype.loadXML) {
-Document.prototype.loadXML = function (s) {
- var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
- while (this.hasChildNodes())
-this.removeChild(this.lastChild);
-for (var i = 0; i < doc2.childNodes.length; i++) {
-this.appendChild(this.importNode(doc2.childNodes[i], true));
- }
-};
-}
-Document.prototype.__defineGetter__( "xml",
- function () {
- return (new XMLSerializer()).serializeToString(this);
- }
- );
-}
-document.getElementsByTagAndClassName = function(tagName, className) {
-if ( tagName == null )
- tagName = '*';
-var children = document.getElementsByTagName(tagName) || document.all;
-var elements = new Array();
-if ( className == null )
-return children;
-for (var i = 0; i < children.length; i++) {
-var child = children[i];
-var classNames = child.className.split(' ');
-for (var j = 0; j < classNames.length; j++) {
-if (classNames[j] == className) {
-elements.push(child);
-break;
-}
-}
-}
-return elements;
-}
-Rico.Accordion = Class.create();
-Rico.Accordion.prototype = {
-initialize: function(container, options) {
-this.container= $(container);
-this.lastExpandedTab= null;
-this.accordionTabs= new Array();
-this.setOptions(options);
-this._attachBehaviors();
-if(!container) return;
-this.container.style.borderBottom = '1px solid ' + this.options.borderColor;
-if (this.options.onLoadShowTab >= this.accordionTabs.length)
-this.options.onLoadShowTab = 0;
-for ( var i=0 ; i < this.accordionTabs.length ; i++ )
-{
-if (i != this.options.onLoadShowTab){
- this.accordionTabs[i].collapse();
- this.accordionTabs[i].content.style.display = 'none';
-}
-}
-this.lastExpandedTab = this.accordionTabs[this.options.onLoadShowTab];
-if (this.options.panelHeight == 'auto'){
-var tabToCheck = (this.options.onloadShowTab === 0)? 1 : 0;
-var titleBarSize = parseInt(RicoUtil.getElementsComputedStyle(this.accordionTabs[tabToCheck].titleBar, 'height'));
-if (isNaN(titleBarSize))
-titleBarSize = this.accordionTabs[tabToCheck].titleBar.offsetHeight;
-var totalTitleBarSize = this.accordionTabs.length * titleBarSize;
-var parentHeight = parseInt(RicoUtil.getElementsComputedStyle(this.container.parentNode, 'height'));
-if (isNaN(parentHeight))
-parentHeight = this.container.parentNode.offsetHeight;
-this.options.panelHeight = parentHeight - totalTitleBarSize-2;
-}
-this.lastExpandedTab.content.style.height = this.options.panelHeight + "px";
-this.lastExpandedTab.showExpanded();
-this.lastExpandedTab.titleBar.style.fontWeight = this.options.expandedFontWeight;
-},
-setOptions: function(options) {
-this.options = {
- expandedBg: '#63699c',
- hoverBg : '#63699c',
- collapsedBg : '#6b79a5',
- expandedTextColor : '#ffffff',
- expandedFontWeight: 'bold',
- hoverTextColor: '#ffffff',
- collapsedTextColor: '#ced7ef',
- collapsedFontWeight : 'normal',
- hoverTextColor: '#ffffff',
- borderColor : '#1f669b',
- panelHeight : 200,
- onHideTab : null,
- onShowTab : null,
- onLoadShowTab : 0
-}
-Object.extend(this.options, options || {});
- },
-showTabByIndex: function( anIndex, animate ) {
-var doAnimate = arguments.length == 1 ? true : animate;
-this.showTab( this.accordionTabs[anIndex], doAnimate );
- },
-showTab: function( accordionTab, animate ) {
-var doAnimate = arguments.length == 1 ? true : animate;
-if ( this.options.onHideTab )
- this.options.onHideTab(this.lastExpandedTab);
-this.lastExpandedTab.showCollapsed();
-var accordion = this;
-var lastExpandedTab = this.lastExpandedTab;
-this.lastExpandedTab.content.style.height = (this.options.panelHeight - 1) + 'px';
-accordionTab.content.style.display = '';
-accordionTab.titleBar.style.fontWeight = this.options.expandedFontWeight;
-if ( doAnimate ) {
- new Effect.AccordionSize( this.lastExpandedTab.content,
- accordionTab.content,
- 1,
- this.options.panelHeight,
- 100, 10,
- { complete: function() {accordion.showTabDone(lastExpandedTab)} } );
- this.lastExpandedTab = accordionTab;
-}
-else {
- this.lastExpandedTab.content.style.height = "1px";
- accordionTab.content.style.height = this.options.panelHeight + "px";
- this.lastExpandedTab = accordionTab;
- this.showTabDone(lastExpandedTab);
-}
- },
-showTabDone: function(collapsedTab) {
-collapsedTab.content.style.display = 'none';
-this.lastExpandedTab.showExpanded();
-if ( this.options.onShowTab )
- this.options.onShowTab(this.lastExpandedTab);
- },
-_attachBehaviors: function() {
-var panels = this._getDirectChildrenByTag(this.container, 'DIV');
-for ( var i = 0 ; i < panels.length ; i++ ) {
-var tabChildren = this._getDirectChildrenByTag(panels[i],'DIV');
- if ( tabChildren.length != 2 )
-continue;
-var tabTitleBar = tabChildren[0];
- var tabContentBox = tabChildren[1];
- this.accordionTabs.push( new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox) );
-}
- },
-_getDirectChildrenByTag: function(e, tagName) {
-var kids = new Array();
-var allKids = e.childNodes;
-for( var i = 0 ; i < allKids.length ; i++ )
- if ( allKids[i] && allKids[i].tagName && allKids[i].tagName == tagName )
-kids.push(allKids[i]);
-return kids;
- }
-};
-Rico.Accordion.Tab = Class.create();
-Rico.Accordion.Tab.prototype = {
-initialize: function(accordion, titleBar, content) {
-this.accordion = accordion;
-this.titleBar= titleBar;
-this.content = content;
-this._attachBehaviors();
- },
-collapse: function() {
-this.showCollapsed();
-this.content.style.height = "1px";
- },
-showCollapsed: function() {
-this.expanded = false;
-this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
-this.titleBar.style.color = this.accordion.options.collapsedTextColor;
-this.titleBar.style.fontWeight= this.accordion.options.collapsedFontWeight;
-this.content.style.overflow = "hidden";
- },
-showExpanded: function() {
-this.expanded = true;
-this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
-this.titleBar.style.color = this.accordion.options.expandedTextColor;
-this.content.style.overflow = "visible";
- },
-titleBarClicked: function(e) {
-if ( this.accordion.lastExpandedTab == this )
- return;
-this.accordion.showTab(this);
- },
-hover: function(e) {
-this.titleBar.style.backgroundColor = this.accordion.options.hoverBg;
-this.titleBar.style.color = this.accordion.options.hoverTextColor;
- },
-unhover: function(e) {
-if ( this.expanded ) {
- this.titleBar.style.backgroundColor = this.accordion.options.expandedBg;
- this.titleBar.style.color = this.accordion.options.expandedTextColor;
-}
-else {
- this.titleBar.style.backgroundColor = this.accordion.options.collapsedBg;
- this.titleBar.style.color = this.accordion.options.collapsedTextColor;
-}
- },
-_attachBehaviors: function() {
-this.content.style.border = "1px solid " + this.accordion.options.borderColor;
-this.content.style.borderTopWidth= "0px";
-this.content.style.borderBottomWidth = "0px";
-this.content.style.margin= "0px";
-this.titleBar.onclick = this.titleBarClicked.bindAsEventListener(this);
-this.titleBar.onmouseover = this.hover.bindAsEventListener(this);
-this.titleBar.onmouseout= this.unhover.bindAsEventListener(this);
- }
-};
-Rico.Corner = {
-round: function(e, options) {
-var e = $(e);
-this._setOptions(options);
-var color = this.options.color;
-if ( this.options.color == "fromElement" )
- color = this._background(e);
-var bgColor = this.options.bgColor;
-if ( this.options.bgColor == "fromParent" )
- bgColor = this._background(e.offsetParent);
-this._roundCornersImpl(e, color, bgColor);
- },
-_roundCornersImpl: function(e, color, bgColor) {
-if(this.options.border)
- this._renderBorder(e,bgColor);
-if(this._isTopRounded())
- this._roundTopCorners(e,color,bgColor);
-if(this._isBottomRounded())
- this._roundBottomCorners(e,color,bgColor);
- },
-_renderBorder: function(el,bgColor) {
-var borderValue = "1px solid " + this._borderColor(bgColor);
-var borderL = "border-left: "+ borderValue;
-var borderR = "border-right: " + borderValue;
-var style = "style='" + borderL + ";" + borderR +"'";
-el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>"
- },
-_roundTopCorners: function(el, color, bgColor) {
-var corner = this._createCorner(bgColor);
-for(var i=0 ; i < this.options.numSlices ; i++ )
- corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));
-el.style.paddingTop = 0;
-el.insertBefore(corner,el.firstChild);
- },
-_roundBottomCorners: function(el, color, bgColor) {
-var corner = this._createCorner(bgColor);
-for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- )
- corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));
-el.style.paddingBottom = 0;
-el.appendChild(corner);
- },
-_createCorner: function(bgColor) {
-var corner = document.createElement("div");
-corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor);
-return corner;
- },
-_createCornerSlice: function(color,bgColor, n, position) {
-var slice = document.createElement("span");
-var inStyle = slice.style;
-inStyle.backgroundColor = color;
-inStyle.display= "block";
-inStyle.height = "1px";
-inStyle.overflow = "hidden";
-inStyle.fontSize = "1px";
-var borderColor = this._borderColor(color,bgColor);
-if ( this.options.border && n == 0 ) {
- inStyle.borderTopStyle= "solid";
- inStyle.borderTopWidth= "1px";
- inStyle.borderLeftWidth = "0px";
- inStyle.borderRightWidth= "0px";
- inStyle.borderBottomWidth = "0px";
- inStyle.height= "0px";
- inStyle.borderColor = borderColor;
-}
-else if(borderColor) {
- inStyle.borderColor = borderColor;
- inStyle.borderStyle = "solid";
- inStyle.borderWidth = "0px 1px";
-}
-if ( !this.options.compact && (n == (this.options.numSlices-1)) )
- inStyle.height = "2px";
-this._setMargin(slice, n, position);
-this._setBorder(slice, n, position);
-return slice;
- },
-_setOptions: function(options) {
-this.options = {
- corners : "all",
- color : "fromElement",
- bgColor : "fromParent",
- blend : true,
- border: false,
- compact : false
-}
-Object.extend(this.options, options || {});
-this.options.numSlices = this.options.compact ? 2 : 4;
-if ( this._isTransparent() )
- this.options.blend = false;
- },
-_whichSideTop: function() {
-if ( this._hasString(this.options.corners, "all", "top") )
- return "";
-if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 )
- return "";
-if (this.options.corners.indexOf("tl") >= 0)
- return "left";
-else if (this.options.corners.indexOf("tr") >= 0)
-return "right";
-return "";
- },
-_whichSideBottom: function() {
-if ( this._hasString(this.options.corners, "all", "bottom") )
- return "";
-if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 )
- return "";
-if(this.options.corners.indexOf("bl") >=0)
- return "left";
-else if(this.options.corners.indexOf("br")>=0)
- return "right";
-return "";
- },
-_borderColor : function(color,bgColor) {
-if ( color == "transparent" )
- return bgColor;
-else if ( this.options.border )
- return this.options.border;
-else if ( this.options.blend )
- return this._blend( bgColor, color );
+
+var Rico={Version:'1.1rc1',prototypeVersion:parseFloat(Prototype.Version.split(".")[0]+"."+Prototype.Version.split(".")[1])}
+Rico.ArrayExtensions=new Array();if(Object.prototype.extend){Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}else{Object.prototype.extend=function(object){return Object.extend.apply(this,[this,object]);}
+Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}
+if(Array.prototype.push){Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.push;}
+if(!Array.prototype.remove){Array.prototype.remove=function(dx){if(isNaN(dx)||dx>this.length)
+return false;for(var i=0,n=0;i<this.length;i++)
+if(i!=dx)
+this[n++]=this[i];this.length-=1;};Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.remove;}
+if(!Array.prototype.removeItem){Array.prototype.removeItem=function(item){for(var i=0;i<this.length;i++)
+if(this[i]==item){this.remove(i);break;}};Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.removeItem;}
+if(!Array.prototype.indices){Array.prototype.indices=function(){var indexArray=new Array();for(index in this){var ignoreThis=false;for(var i=0;i<Rico.ArrayExtensions.length;i++){if(this[index]==Rico.ArrayExtensions[i]){ignoreThis=true;break;}}
+if(!ignoreThis)
+indexArray[indexArray.length]=index;}
+return indexArray;}
+Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.indices;}
+if(window.DOMParser&&window.XMLSerializer&&window.Node&&Node.prototype&&Node.prototype.__defineGetter__){if(!Document.prototype.loadXML){Document.prototype.loadXML=function(s){var doc2=(new DOMParser()).parseFromString(s,"text/xml");while(this.hasChildNodes())
+this.removeChild(this.lastChild);for(var i=0;i<doc2.childNodes.length;i++){this.appendChild(this.importNode(doc2.childNodes[i],true));}};}
+Document.prototype.__defineGetter__("xml",function(){return(new XMLSerializer()).serializeToString(this);});}
+document.getElementsByTagAndClassName=function(tagName,className){if(tagName==null)
+tagName='*';var children=document.getElementsByTagName(tagName)||document.all;var elements=new Array();if(className==null)
+return children;for(var i=0;i<children.length;i++){var child=children[i];var classNames=child.className.split(' ');for(var j=0;j<classNames.length;j++){if(classNames[j]==className){elements.push(child);break;}}}
+return elements;}
+Rico.Accordion=Class.create();Rico.Accordion.prototype={initialize:function(container,options){this.container=$(container);this.lastExpandedTab=null;this.accordionTabs=new Array();this.setOptions(options);this._attachBehaviors();if(!container)return;this.container.style.borderBottom='1px solid '+this.options.borderColor;if(this.options.onLoadShowTab>=this.accordionTabs.length)
+this.options.onLoadShowTab=0;for(var i=0;i<this.accordionTabs.length;i++)
+{if(i!=this.options.onLoadShowTab){this.accordionTabs[i].collapse();this.accordionTabs[i].content.style.display='none';}}
+this.lastExpandedTab=this.accordionTabs[this.options.onLoadShowTab];if(this.options.panelHeight=='auto'){var tabToCheck=(this.options.onloadShowTab===0)?1:0;var titleBarSize=parseInt(RicoUtil.getElementsComputedStyle(this.accordionTabs[tabToCheck].titleBar,'height'));if(isNaN(titleBarSize))
+titleBarSize=this.accordionTabs[tabToCheck].titleBar.offsetHeight;var totalTitleBarSize=this.accordionTabs.length*titleBarSize;var parentHeight=parseInt(RicoUtil.getElementsComputedStyle(this.container.parentNode,'height'));if(isNaN(parentHeight))
+parentHeight=this.container.parentNode.offsetHeight;this.options.panelHeight=parentHeight-totalTitleBarSize-2;}
+this.lastExpandedTab.content.style.height=this.options.panelHeight+"px";this.lastExpandedTab.showExpanded();this.lastExpandedTab.titleBar.style.fontWeight=this.options.expandedFontWeight;},setOptions:function(options){this.options={expandedBg:'#63699c',hoverBg:'#63699c',collapsedBg:'#6b79a5',expandedTextColor:'#ffffff',expandedFontWeight:'bold',hoverTextColor:'#ffffff',collapsedTextColor:'#ced7ef',collapsedFontWeight:'normal',hoverTextColor:'#ffffff',borderColor:'#1f669b',panelHeight:200,onHideTab:null,onShowTab:null,onLoadShowTab:0}
+Object.extend(this.options,options||{});},showTabByIndex:function(anIndex,animate){var doAnimate=arguments.length==1?true:animate;this.showTab(this.accordionTabs[anIndex],doAnimate);},showTab:function(accordionTab,animate){var doAnimate=arguments.length==1?true:animate;if(this.options.onHideTab)
+this.options.onHideTab(this.lastExpandedTab);this.lastExpandedTab.showCollapsed();var accordion=this;var lastExpandedTab=this.lastExpandedTab;this.lastExpandedTab.content.style.height=(this.options.panelHeight-1)+'px';accordionTab.content.style.display='';accordionTab.titleBar.style.fontWeight=this.options.expandedFontWeight;if(doAnimate){new Effect.AccordionSize(this.lastExpandedTab.content,accordionTab.content,1,this.options.panelHeight,100,10,{complete:function(){accordion.showTabDone(lastExpandedTab)}});this.lastExpandedTab=accordionTab;}
+else{this.lastExpandedTab.content.style.height="1px";accordionTab.content.style.height=this.options.panelHeight+"px";this.lastExpandedTab=accordionTab;this.showTabDone(lastExpandedTab);}},showTabDone:function(collapsedTab){collapsedTab.content.style.display='none';this.lastExpandedTab.showExpanded();if(this.options.onShowTab)
+this.options.onShowTab(this.lastExpandedTab);},_attachBehaviors:function(){var panels=this._getDirectChildrenByTag(this.container,'DIV');for(var i=0;i<panels.length;i++){var tabChildren=this._getDirectChildrenByTag(panels[i],'DIV');if(tabChildren.length!=2)
+continue;var tabTitleBar=tabChildren[0];var tabContentBox=tabChildren[1];this.accordionTabs.push(new Rico.Accordion.Tab(this,tabTitleBar,tabContentBox));}},_getDirectChildrenByTag:function(e,tagName){var kids=new Array();var allKids=e.childNodes;for(var i=0;i<allKids.length;i++)
+if(allKids[i]&&allKids[i].tagName&&allKids[i].tagName==tagName)
+kids.push(allKids[i]);return kids;}};Rico.Accordion.Tab=Class.create();Rico.Accordion.Tab.prototype={initialize:function(accordion,titleBar,content){this.accordion=accordion;this.titleBar=titleBar;this.content=content;this._attachBehaviors();},collapse:function(){this.showCollapsed();this.content.style.height="1px";},showCollapsed:function(){this.expanded=false;this.titleBar.style.backgroundColor=this.accordion.options.collapsedBg;this.titleBar.style.color=this.accordion.options.collapsedTextColor;this.titleBar.style.fontWeight=this.accordion.options.collapsedFontWeight;this.content.style.overflow="hidden";},showExpanded:function(){this.expanded=true;this.titleBar.style.backgroundColor=this.accordion.options.expandedBg;this.titleBar.style.color=this.accordion.options.expandedTextColor;this.content.style.overflow="visible";},titleBarClicked:function(e){if(this.accordion.lastExpandedTab==this)
+return;this.accordion.showTab(this);},hover:function(e){this.titleBar.style.backgroundColor=this.accordion.options.hoverBg;this.titleBar.style.color=this.accordion.options.hoverTextColor;},unhover:function(e){if(this.expanded){this.titleBar.style.backgroundColor=this.accordion.options.expandedBg;this.titleBar.style.color=this.accordion.options.expandedTextColor;}
+else{this.titleBar.style.backgroundColor=this.accordion.options.collapsedBg;this.titleBar.style.color=this.accordion.options.collapsedTextColor;}},_attachBehaviors:function(){this.content.style.border="1px solid "+this.accordion.options.borderColor;this.content.style.borderTopWidth="0px";this.content.style.borderBottomWidth="0px";this.content.style.margin="0px";this.titleBar.onclick=this.titleBarClicked.bindAsEventListener(this);this.titleBar.onmouseover=this.hover.bindAsEventListener(this);this.titleBar.onmouseout=this.unhover.bindAsEventListener(this);}};Rico.Corner={round:function(e,options){var e=$(e);this._setOptions(options);var color=this.options.color;if(this.options.color=="fromElement")
+color=this._background(e);var bgColor=this.options.bgColor;if(this.options.bgColor=="fromParent")
+bgColor=this._background(e.offsetParent);this._roundCornersImpl(e,color,bgColor);},_roundCornersImpl:function(e,color,bgColor){if(this.options.border)
+this._renderBorder(e,bgColor);if(this._isTopRounded())
+this._roundTopCorners(e,color,bgColor);if(this._isBottomRounded())
+this._roundBottomCorners(e,color,bgColor);},_renderBorder:function(el,bgColor){var borderValue="1px solid "+this._borderColor(bgColor);var borderL="border-left: "+borderValue;var borderR="border-right: "+borderValue;var style="style='"+borderL+";"+borderR+"'";el.innerHTML="<div "+style+">"+el.innerHTML+"</div>"},_roundTopCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=0;i<this.options.numSlices;i++)
+corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));el.style.paddingTop=0;el.insertBefore(corner,el.firstChild);},_roundBottomCorners:function(el,color,bgColor){var corner=this._createCorner(bgColor);for(var i=(this.options.numSlices-1);i>=0;i--)
+corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));el.style.paddingBottom=0;el.appendChild(corner);},_createCorner:function(bgColor){var corner=document.createElement("div");corner.style.backgroundColor=(this._isTransparent()?"transparent":bgColor);return corner;},_createCornerSlice:function(color,bgColor,n,position){var slice=document.createElement("span");var inStyle=slice.style;inStyle.backgroundColor=color;inStyle.display="block";inStyle.height="1px";inStyle.overflow="hidden";inStyle.fontSize="1px";var borderColor=this._borderColor(color,bgColor);if(this.options.border&&n==0){inStyle.borderTopStyle="solid";inStyle.borderTopWidth="1px";inStyle.borderLeftWidth="0px";inStyle.borderRightWidth="0px";inStyle.borderBottomWidth="0px";inStyle.height="0px";inStyle.borderColor=borderColor;}
+else if(borderColor){inStyle.borderColor=borderColor;inStyle.borderStyle="solid";inStyle.borderWidth="0px 1px";}
+if(!this.options.compact&&(n==(this.options.numSlices-1)))
+inStyle.height="2px";this._setMargin(slice,n,position);this._setBorder(slice,n,position);return slice;},_setOptions:function(options){this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false}
+Object.extend(this.options,options||{});this.options.numSlices=this.options.compact?2:4;if(this._isTransparent())
+this.options.blend=false;},_whichSideTop:function(){if(this._hasString(this.options.corners,"all","top"))
+return"";if(this.options.corners.indexOf("tl")>=0&&this.options.corners.indexOf("tr")>=0)
+return"";if(this.options.corners.indexOf("tl")>=0)
+return"left";else if(this.options.corners.indexOf("tr")>=0)
+return"right";return"";},_whichSideBottom:function(){if(this._hasString(this.options.corners,"all","bottom"))
+return"";if(this.options.corners.indexOf("bl")>=0&&this.options.corners.indexOf("br")>=0)
+return"";if(this.options.corners.indexOf("bl")>=0)
+return"left";else if(this.options.corners.indexOf("br")>=0)
+return"right";return"";},_borderColor:function(color,bgColor){if(color=="transparent")
+return bgColor;else if(this.options.border)
+return this.options.border;else if(this.options.blend)
+return this._blend(bgColor,color);else
+return"";},_setMargin:function(el,n,corners){var marginSize=this._marginSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.marginLeft=marginSize+"px";el.style.marginRight="0px";}
+else if(whichSide=="right"){el.style.marginRight=marginSize+"px";el.style.marginLeft="0px";}
+else{el.style.marginLeft=marginSize+"px";el.style.marginRight=marginSize+"px";}},_setBorder:function(el,n,corners){var borderSize=this._borderSize(n);var whichSide=corners=="top"?this._whichSideTop():this._whichSideBottom();if(whichSide=="left"){el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth="0px";}
+else if(whichSide=="right"){el.style.borderRightWidth=borderSize+"px";el.style.borderLeftWidth="0px";}
+else{el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";}
+if(this.options.border!=false)
+el.style.borderLeftWidth=borderSize+"px";el.style.borderRightWidth=borderSize+"px";},_marginSize:function(n){if(this._isTransparent())
+return 0;var marginSizes=[5,3,2,1];var blendedMarginSizes=[3,2,1,0];var compactMarginSizes=[2,1];var smBlendedMarginSizes=[1,0];if(this.options.compact&&this.options.blend)
+return smBlendedMarginSizes[n];else if(this.options.compact)
+return compactMarginSizes[n];else if(this.options.blend)
+return blendedMarginSizes[n];else
+return marginSizes[n];},_borderSize:function(n){var transparentBorderSizes=[5,3,2,1];var blendedBorderSizes=[2,1,1,1];var compactBorderSizes=[1,0];var actualBorderSizes=[0,2,0,0];if(this.options.compact&&(this.options.blend||this._isTransparent()))
+return 1;else if(this.options.compact)
+return compactBorderSizes[n];else if(this.options.blend)
+return blendedBorderSizes[n];else if(this.options.border)
+return actualBorderSizes[n];else if(this._isTransparent())
+return transparentBorderSizes[n];return 0;},_hasString:function(str){for(var i=1;i<arguments.length;i++)if(str.indexOf(arguments[i])>=0)return true;return false;},_blend:function(c1,c2){var cc1=Rico.Color.createFromHex(c1);cc1.blend(Rico.Color.createFromHex(c2));return cc1;},_background:function(el){try{return Rico.Color.createColorFromBackground(el).asHex();}catch(err){return"#ffffff";}},_isTransparent:function(){return this.options.color=="transparent";},_isTopRounded:function(){return this._hasString(this.options.corners,"all","top","tl","tr");},_isBottomRounded:function(){return this._hasString(this.options.corners,"all","bottom","bl","br");},_hasSingleTextChild:function(el){return el.childNodes.length==1&&el.childNodes[0].nodeType==3;}}
+if(window.Effect==undefined)
+Effect={};Effect.SizeAndPosition=Class.create();Effect.SizeAndPosition.prototype={initialize:function(element,x,y,w,h,duration,steps,options){this.element=$(element);this.x=x;this.y=y;this.w=w;this.h=h;this.duration=duration;this.steps=steps;this.options=arguments[7]||{};this.sizeAndPosition();},sizeAndPosition:function(){if(this.isFinished()){if(this.options.complete)this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var currentX=this.element.offsetLeft;var currentY=this.element.offsetTop;var currentW=this.element.offsetWidth;var currentH=this.element.offsetHeight;this.x=(this.x)?this.x:currentX;this.y=(this.y)?this.y:currentY;this.w=(this.w)?this.w:currentW;this.h=(this.h)?this.h:currentH;var difX=this.steps>0?(this.x-currentX)/this.steps:0;var difY=this.steps>0?(this.y-currentY)/this.steps:0;var difW=this.steps>0?(this.w-currentW)/this.steps:0;var difH=this.steps>0?(this.h-currentH)/this.steps:0;this.moveBy(difX,difY);this.resizeBy(difW,difH);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.sizeAndPosition.bind(this),stepDuration);},isFinished:function(){return this.steps<=0;},moveBy:function(difX,difY){var currentLeft=this.element.offsetLeft;var currentTop=this.element.offsetTop;var intDifX=parseInt(difX);var intDifY=parseInt(difY);var style=this.element.style;if(intDifX!=0)
+style.left=(currentLeft+intDifX)+"px";if(intDifY!=0)
+style.top=(currentTop+intDifY)+"px";},resizeBy:function(difW,difH){var currentWidth=this.element.offsetWidth;var currentHeight=this.element.offsetHeight;var intDifW=parseInt(difW);var intDifH=parseInt(difH);var style=this.element.style;if(intDifW!=0)
+style.width=(currentWidth+intDifW)+"px";if(intDifH!=0)
+style.height=(currentHeight+intDifH)+"px";}}
+Effect.Size=Class.create();Effect.Size.prototype={initialize:function(element,w,h,duration,steps,options){new Effect.SizeAndPosition(element,null,null,w,h,duration,steps,options);}}
+Effect.Position=Class.create();Effect.Position.prototype={initialize:function(element,x,y,duration,steps,options){new Effect.SizeAndPosition(element,x,y,null,null,duration,steps,options);}}
+Effect.Round=Class.create();Effect.Round.prototype={initialize:function(tagName,className,options){var elements=document.getElementsByTagAndClassName(tagName,className);for(var i=0;i<elements.length;i++)
+Rico.Corner.round(elements[i],options);}};Effect.FadeTo=Class.create();Effect.FadeTo.prototype={initialize:function(element,opacity,duration,steps,options){this.element=$(element);this.opacity=opacity;this.duration=duration;this.steps=steps;this.options=arguments[4]||{};this.fadeTo();},fadeTo:function(){if(this.isFinished()){if(this.options.complete)this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var currentOpacity=this.getElementOpacity();var delta=this.steps>0?(this.opacity-currentOpacity)/this.steps:0;this.changeOpacityBy(delta);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.fadeTo.bind(this),stepDuration);},changeOpacityBy:function(v){var currentOpacity=this.getElementOpacity();var newOpacity=Math.max(0,Math.min(currentOpacity+v,1));this.element.ricoOpacity=newOpacity;this.element.style.filter="alpha(opacity:"+Math.round(newOpacity*100)+")";this.element.style.opacity=newOpacity;;},isFinished:function(){return this.steps<=0;},getElementOpacity:function(){if(this.element.ricoOpacity==undefined){var opacity=RicoUtil.getElementsComputedStyle(this.element,'opacity');this.element.ricoOpacity=opacity!=undefined?opacity:1.0;}
+return parseFloat(this.element.ricoOpacity);}}
+Effect.AccordionSize=Class.create();Effect.AccordionSize.prototype={initialize:function(e1,e2,start,end,duration,steps,options){this.e1=$(e1);this.e2=$(e2);this.start=start;this.end=end;this.duration=duration;this.steps=steps;this.options=arguments[6]||{};this.accordionSize();},accordionSize:function(){if(this.isFinished()){this.e1.style.height=this.start+"px";this.e2.style.height=this.end+"px";if(this.options.complete)
+this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var diff=this.steps>0?(parseInt(this.e1.offsetHeight)-this.start)/this.steps:0;this.resizeBy(diff);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.accordionSize.bind(this),stepDuration);},isFinished:function(){return this.steps<=0;},resizeBy:function(diff){var h1Height=this.e1.offsetHeight;var h2Height=this.e2.offsetHeight;var intDiff=parseInt(diff);if(diff!=0){this.e1.style.height=(h1Height-intDiff)+"px";this.e2.style.height=(h2Height+intDiff)+"px";}}};if(window.Effect==undefined)
+Effect={};Effect.SizeAndPosition=Class.create();Effect.SizeAndPosition.prototype={initialize:function(element,x,y,w,h,duration,steps,options){this.element=$(element);this.x=x;this.y=y;this.w=w;this.h=h;this.duration=duration;this.steps=steps;this.options=arguments[7]||{};this.sizeAndPosition();},sizeAndPosition:function(){if(this.isFinished()){if(this.options.complete)this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var currentX=this.element.offsetLeft;var currentY=this.element.offsetTop;var currentW=this.element.offsetWidth;var currentH=this.element.offsetHeight;this.x=(this.x)?this.x:currentX;this.y=(this.y)?this.y:currentY;this.w=(this.w)?this.w:currentW;this.h=(this.h)?this.h:currentH;var difX=this.steps>0?(this.x-currentX)/this.steps:0;var difY=this.steps>0?(this.y-currentY)/this.steps:0;var difW=this.steps>0?(this.w-currentW)/this.steps:0;var difH=this.steps>0?(this.h-currentH)/this.steps:0;this.moveBy(difX,difY);this.resizeBy(difW,difH);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.sizeAndPosition.bind(this),stepDuration);},isFinished:function(){return this.steps<=0;},moveBy:function(difX,difY){var currentLeft=this.element.offsetLeft;var currentTop=this.element.offsetTop;var intDifX=parseInt(difX);var intDifY=parseInt(difY);var style=this.element.style;if(intDifX!=0)
+style.left=(currentLeft+intDifX)+"px";if(intDifY!=0)
+style.top=(currentTop+intDifY)+"px";},resizeBy:function(difW,difH){var currentWidth=this.element.offsetWidth;var currentHeight=this.element.offsetHeight;var intDifW=parseInt(difW);var intDifH=parseInt(difH);var style=this.element.style;if(intDifW!=0)
+style.width=(currentWidth+intDifW)+"px";if(intDifH!=0)
+style.height=(currentHeight+intDifH)+"px";}}
+Effect.Size=Class.create();Effect.Size.prototype={initialize:function(element,w,h,duration,steps,options){new Effect.SizeAndPosition(element,null,null,w,h,duration,steps,options);}}
+Effect.Position=Class.create();Effect.Position.prototype={initialize:function(element,x,y,duration,steps,options){new Effect.SizeAndPosition(element,x,y,null,null,duration,steps,options);}}
+Effect.Round=Class.create();Effect.Round.prototype={initialize:function(tagName,className,options){var elements=document.getElementsByTagAndClassName(tagName,className);for(var i=0;i<elements.length;i++)
+Rico.Corner.round(elements[i],options);}};Effect.FadeTo=Class.create();Effect.FadeTo.prototype={initialize:function(element,opacity,duration,steps,options){this.element=$(element);this.opacity=opacity;this.duration=duration;this.steps=steps;this.options=arguments[4]||{};this.fadeTo();},fadeTo:function(){if(this.isFinished()){if(this.options.complete)this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var currentOpacity=this.getElementOpacity();var delta=this.steps>0?(this.opacity-currentOpacity)/this.steps:0;this.changeOpacityBy(delta);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.fadeTo.bind(this),stepDuration);},changeOpacityBy:function(v){var currentOpacity=this.getElementOpacity();var newOpacity=Math.max(0,Math.min(currentOpacity+v,1));this.element.ricoOpacity=newOpacity;this.element.style.filter="alpha(opacity:"+Math.round(newOpacity*100)+")";this.element.style.opacity=newOpacity;;},isFinished:function(){return this.steps<=0;},getElementOpacity:function(){if(this.element.ricoOpacity==undefined){var opacity=RicoUtil.getElementsComputedStyle(this.element,'opacity');this.element.ricoOpacity=opacity!=undefined?opacity:1.0;}
+return parseFloat(this.element.ricoOpacity);}}
+Effect.AccordionSize=Class.create();Effect.AccordionSize.prototype={initialize:function(e1,e2,start,end,duration,steps,options){this.e1=$(e1);this.e2=$(e2);this.start=start;this.end=end;this.duration=duration;this.steps=steps;this.options=arguments[6]||{};this.accordionSize();},accordionSize:function(){if(this.isFinished()){this.e1.style.height=this.start+"px";this.e2.style.height=this.end+"px";if(this.options.complete)
+this.options.complete(this);return;}
+if(this.timer)
+clearTimeout(this.timer);var stepDuration=Math.round(this.duration/this.steps);var diff=this.steps>0?(parseInt(this.e1.offsetHeight)-this.start)/this.steps:0;this.resizeBy(diff);this.duration-=stepDuration;this.steps--;this.timer=setTimeout(this.accordionSize.bind(this),stepDuration);},isFinished:function(){return this.steps<=0;},resizeBy:function(diff){var h1Height=this.e1.offsetHeight;var h2Height=this.e2.offsetHeight;var intDiff=parseInt(diff);if(diff!=0){this.e1.style.height=(h1Height-intDiff)+"px";this.e2.style.height=(h2Height+intDiff)+"px";}}};Rico.LiveGridMetaData=Class.create();Rico.LiveGridMetaData.prototype={initialize:function(pageSize,totalRows,columnCount,options){this.pageSize=pageSize;this.totalRows=totalRows;this.setOptions(options);this.ArrowHeight=16;this.columnCount=columnCount;},setOptions:function(options){this.options={largeBufferSize:7.0,nearLimitFactor:0.2};Object.extend(this.options,options||{});},getPageSize:function(){return this.pageSize;},getTotalRows:function(){return this.totalRows;},setTotalRows:function(n){this.totalRows=n;},getLargeBufferSize:function(){return parseInt(this.options.largeBufferSize*this.pageSize);},getLimitTolerance:function(){return parseInt(this.getLargeBufferSize()*this.options.nearLimitFactor);}};Rico.LiveGridScroller=Class.create();Rico.LiveGridScroller.prototype={initialize:function(liveGrid,viewPort){this.isIE=navigator.userAgent.toLowerCase().indexOf("msie")>=0;this.liveGrid=liveGrid;this.metaData=liveGrid.metaData;this.createScrollBar();this.scrollTimeout=null;this.lastScrollPos=0;this.viewPort=viewPort;this.rows=new Array();},isUnPlugged:function(){return this.scrollerDiv.onscroll==null;},plugin:function(){this.scrollerDiv.onscroll=this.handleScroll.bindAsEventListener(this);},unplug:function(){this.scrollerDiv.onscroll=null;},sizeIEHeaderHack:function(){if(!this.isIE)return;var headerTable=$(this.liveGrid.tableId+"_header");if(headerTable)
+headerTable.rows[0].cells[0].style.width=(headerTable.rows[0].cells[0].offsetWidth+1)+"px";},createScrollBar:function(){var visibleHeight=this.liveGrid.viewPort.visibleHeight();this.scrollerDiv=document.createElement("div");var scrollerStyle=this.scrollerDiv.style;scrollerStyle.borderRight=this.liveGrid.options.scrollerBorderRight;scrollerStyle.position="relative";scrollerStyle.left=this.isIE?"-6px":"-3px";scrollerStyle.width="19px";scrollerStyle.height=visibleHeight+"px";scrollerStyle.overflow="auto";this.heightDiv=document.createElement("div");this.heightDiv.style.width="1px";this.heightDiv.style.height=parseInt(visibleHeight*this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";this.scrollerDiv.appendChild(this.heightDiv);this.scrollerDiv.onscroll=this.handleScroll.bindAsEventListener(this);var table=this.liveGrid.table;table.parentNode.parentNode.insertBefore(this.scrollerDiv,table.parentNode.nextSibling);var eventName=this.isIE?"mousewheel":"DOMMouseScroll";Event.observe(table,eventName,function(evt){if(evt.wheelDelta>=0||evt.detail<0)
+this.scrollerDiv.scrollTop-=(2*this.viewPort.rowHeight);else
+this.scrollerDiv.scrollTop+=(2*this.viewPort.rowHeight);this.handleScroll(false);}.bindAsEventListener(this),false);},updateSize:function(){var table=this.liveGrid.table;var visibleHeight=this.viewPort.visibleHeight();this.heightDiv.style.height=parseInt(visibleHeight*this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";},rowToPixel:function(rowOffset){return(rowOffset/this.metaData.getTotalRows())*this.heightDiv.offsetHeight},moveScroll:function(rowOffset){this.scrollerDiv.scrollTop=this.rowToPixel(rowOffset);if(this.metaData.options.onscroll)
+this.metaData.options.onscroll(this.liveGrid,rowOffset);},handleScroll:function(){if(this.scrollTimeout)
+clearTimeout(this.scrollTimeout);var scrollDiff=this.lastScrollPos-this.scrollerDiv.scrollTop;if(scrollDiff!=0.00){var r=this.scrollerDiv.scrollTop%this.viewPort.rowHeight;if(r!=0){this.unplug();if(scrollDiff<0){this.scrollerDiv.scrollTop+=(this.viewPort.rowHeight-r);}else{this.scrollerDiv.scrollTop-=r;}
+this.plugin();}}
+var contentOffset=parseInt(this.scrollerDiv.scrollTop/this.viewPort.rowHeight);this.liveGrid.requestContentRefresh(contentOffset);this.viewPort.scrollTo(this.scrollerDiv.scrollTop);if(this.metaData.options.onscroll)
+this.metaData.options.onscroll(this.liveGrid,contentOffset);this.scrollTimeout=setTimeout(this.scrollIdle.bind(this),1200);this.lastScrollPos=this.scrollerDiv.scrollTop;},scrollIdle:function(){if(this.metaData.options.onscrollidle)
+this.metaData.options.onscrollidle();}};Rico.LiveGridBuffer=Class.create();Rico.LiveGridBuffer.prototype={initialize:function(metaData,viewPort){this.startPos=0;this.size=0;this.metaData=metaData;this.rows=new Array();this.updateInProgress=false;this.viewPort=viewPort;this.maxBufferSize=metaData.getLargeBufferSize()*2;this.maxFetchSize=metaData.getLargeBufferSize();this.lastOffset=0;},getBlankRow:function(){if(!this.blankRow){this.blankRow=new Array();for(var i=0;i<this.metaData.columnCount;i++)
+this.blankRow[i]="&nbsp;";}
+return this.blankRow;},loadRows:function(ajaxResponse){var rowsElement=ajaxResponse.getElementsByTagName('rows')[0];this.updateUI=rowsElement.getAttribute("update_ui")=="true"
+var newRows=new Array()
+var trs=rowsElement.getElementsByTagName("tr");for(var i=0;i<trs.length;i++){var row=newRows[i]=new Array();var cells=trs[i].getElementsByTagName("td");for(var j=0;j<cells.length;j++){var cell=cells[j];var convertSpaces=cell.getAttribute("convert_spaces")=="true";var cellContent=RicoUtil.getContentAsString(cell);row[j]=convertSpaces?this.convertSpaces(cellContent):cellContent;if(!row[j])
+row[j]='&nbsp;';}}
+return newRows;},update:function(ajaxResponse,start){var newRows=this.loadRows(ajaxResponse);if(this.rows.length==0){this.rows=newRows;this.size=this.rows.length;this.startPos=start;return;}
+if(start>this.startPos){if(this.startPos+this.rows.length<start){this.rows=newRows;this.startPos=start;}else{this.rows=this.rows.concat(newRows.slice(0,newRows.length));if(this.rows.length>this.maxBufferSize){var fullSize=this.rows.length;this.rows=this.rows.slice(this.rows.length-this.maxBufferSize,this.rows.length)
+this.startPos=this.startPos+(fullSize-this.rows.length);}}}else{if(start+newRows.length<this.startPos){this.rows=newRows;}else{this.rows=newRows.slice(0,this.startPos).concat(this.rows);if(this.rows.length>this.maxBufferSize)
+this.rows=this.rows.slice(0,this.maxBufferSize)}
+this.startPos=start;}
+this.size=this.rows.length;},clear:function(){this.rows=new Array();this.startPos=0;this.size=0;},isOverlapping:function(start,size){return((start<this.endPos())&&(this.startPos<start+size))||(this.endPos()==0)},isInRange:function(position){return(position>=this.startPos)&&(position+this.metaData.getPageSize()<=this.endPos());},isNearingTopLimit:function(position){return position-this.startPos<this.metaData.getLimitTolerance();},endPos:function(){return this.startPos+this.rows.length;},isNearingBottomLimit:function(position){return this.endPos()-(position+this.metaData.getPageSize())<this.metaData.getLimitTolerance();},isAtTop:function(){return this.startPos==0;},isAtBottom:function(){return this.endPos()==this.metaData.getTotalRows();},isNearingLimit:function(position){return(!this.isAtTop()&&this.isNearingTopLimit(position))||(!this.isAtBottom()&&this.isNearingBottomLimit(position))},getFetchSize:function(offset){var adjustedOffset=this.getFetchOffset(offset);var adjustedSize=0;if(adjustedOffset>=this.startPos){var endFetchOffset=this.maxFetchSize+adjustedOffset;if(endFetchOffset>this.metaData.totalRows)
+endFetchOffset=this.metaData.totalRows;adjustedSize=endFetchOffset-adjustedOffset;if(adjustedOffset==0&&adjustedSize<this.maxFetchSize){adjustedSize=this.maxFetchSize;}}else{var adjustedSize=this.startPos-adjustedOffset;if(adjustedSize>this.maxFetchSize)
+adjustedSize=this.maxFetchSize;}
+return adjustedSize;},getFetchOffset:function(offset){var adjustedOffset=offset;if(offset>this.startPos)
+adjustedOffset=(offset>this.endPos())?offset:this.endPos();else{if(offset+this.maxFetchSize>=this.startPos){var adjustedOffset=this.startPos-this.maxFetchSize;if(adjustedOffset<0)
+adjustedOffset=0;}}
+this.lastOffset=adjustedOffset;return adjustedOffset;},getRows:function(start,count){var begPos=start-this.startPos
+var endPos=begPos+count
+if(endPos>this.size)
+endPos=this.size
+var results=new Array()
+var index=0;for(var i=begPos;i<endPos;i++){results[index++]=this.rows[i]}
+return results},convertSpaces:function(s){return s.split(" ").join("&nbsp;");}};Rico.GridViewPort=Class.create();Rico.GridViewPort.prototype={initialize:function(table,rowHeight,visibleRows,buffer,liveGrid){this.lastDisplayedStartPos=0;this.div=table.parentNode;this.table=table
+this.rowHeight=rowHeight;this.div.style.height=this.rowHeight*visibleRows;this.div.style.overflow="hidden";this.buffer=buffer;this.liveGrid=liveGrid;this.visibleRows=visibleRows+1;this.lastPixelOffset=0;this.startPos=0;},populateRow:function(htmlRow,row){for(var j=0;j<row.length;j++){htmlRow.cells[j].innerHTML=row[j]}},bufferChanged:function(){this.refreshContents(parseInt(this.lastPixelOffset/this.rowHeight));},clearRows:function(){if(!this.isBlank){this.liveGrid.table.className=this.liveGrid.options.loadingClass;for(var i=0;i<this.visibleRows;i++)
+this.populateRow(this.table.rows[i],this.buffer.getBlankRow());this.isBlank=true;}},clearContents:function(){this.clearRows();this.scrollTo(0);this.startPos=0;this.lastStartPos=-1;},refreshContents:function(startPos){if(startPos==this.lastRowPos&&!this.isPartialBlank&&!this.isBlank){return;}
+if((startPos+this.visibleRows<this.buffer.startPos)||(this.buffer.startPos+this.buffer.size<startPos)||(this.buffer.size==0)){this.clearRows();return;}
+this.isBlank=false;var viewPrecedesBuffer=this.buffer.startPos>startPos
+var contentStartPos=viewPrecedesBuffer?this.buffer.startPos:startPos;var contentEndPos=(this.buffer.startPos+this.buffer.size<startPos+this.visibleRows)?this.buffer.startPos+this.buffer.size:startPos+this.visibleRows;var rowSize=contentEndPos-contentStartPos;var rows=this.buffer.getRows(contentStartPos,rowSize);var blankSize=this.visibleRows-rowSize;var blankOffset=viewPrecedesBuffer?0:rowSize;var contentOffset=viewPrecedesBuffer?blankSize:0;for(var i=0;i<rows.length;i++){this.populateRow(this.table.rows[i+contentOffset],rows[i]);}
+for(var i=0;i<blankSize;i++){this.populateRow(this.table.rows[i+blankOffset],this.buffer.getBlankRow());}
+this.isPartialBlank=blankSize>0;this.lastRowPos=startPos;this.liveGrid.table.className=this.liveGrid.options.tableClass;var onRefreshComplete=this.liveGrid.options.onRefreshComplete;if(onRefreshComplete!=null)
+onRefreshComplete();},scrollTo:function(pixelOffset){if(this.lastPixelOffset==pixelOffset)
+return;this.refreshContents(parseInt(pixelOffset/this.rowHeight))
+this.div.scrollTop=pixelOffset%this.rowHeight
+this.lastPixelOffset=pixelOffset;},visibleHeight:function(){return parseInt(RicoUtil.getElementsComputedStyle(this.div,'height'));}};Rico.LiveGridRequest=Class.create();Rico.LiveGridRequest.prototype={initialize:function(requestOffset,options){this.requestOffset=requestOffset;}};Rico.LiveGrid=Class.create();Rico.LiveGrid.prototype={initialize:function(tableId,visibleRows,totalRows,url,options,ajaxOptions){this.options={tableClass:$(tableId).className,loadingClass:$(tableId).className,scrollerBorderRight:'1px solid #ababab',bufferTimeout:20000,sortAscendImg:'images/sort_asc.gif',sortDescendImg:'images/sort_desc.gif',sortImageWidth:9,sortImageHeight:5,ajaxSortURLParms:[],onRefreshComplete:null,requestParameters:null,inlineStyles:true};Object.extend(this.options,options||{});this.ajaxOptions={parameters:null};Object.extend(this.ajaxOptions,ajaxOptions||{});this.tableId=tableId;this.table=$(tableId);this.addLiveGridHtml();var columnCount=this.table.rows[0].cells.length;this.metaData=new Rico.LiveGridMetaData(visibleRows,totalRows,columnCount,options);this.buffer=new Rico.LiveGridBuffer(this.metaData);var rowCount=this.table.rows.length;this.viewPort=new Rico.GridViewPort(this.table,this.table.offsetHeight/rowCount,visibleRows,this.buffer,this);this.scroller=new Rico.LiveGridScroller(this,this.viewPort);this.options.sortHandler=this.sortHandler.bind(this);if($(tableId+'_header'))
+this.sort=new Rico.LiveGridSort(tableId+'_header',this.options)
+this.processingRequest=null;this.unprocessedRequest=null;this.initAjax(url);if(this.options.prefetchBuffer||this.options.prefetchOffset>0){var offset=0;if(this.options.offset){offset=this.options.offset;this.scroller.moveScroll(offset);this.viewPort.scrollTo(this.scroller.rowToPixel(offset));}
+if(this.options.sortCol){this.sortCol=options.sortCol;this.sortDir=options.sortDir;}
+this.requestContentRefresh(offset);}},addLiveGridHtml:function(){if(this.table.getElementsByTagName("thead").length>0){var tableHeader=this.table.cloneNode(true);tableHeader.setAttribute('id',this.tableId+'_header');tableHeader.setAttribute('class',this.table.className+'_header');for(var i=0;i<tableHeader.tBodies.length;i++)
+tableHeader.removeChild(tableHeader.tBodies[i]);this.table.deleteTHead();this.table.parentNode.insertBefore(tableHeader,this.table);}
+new Insertion.Before(this.table,"<div id='"+this.tableId+"_container'></div>");this.table.previousSibling.appendChild(this.table);new Insertion.Before(this.table,"<div id='"+this.tableId+"_viewport' style='float:left;'></div>");this.table.previousSibling.appendChild(this.table);},resetContents:function(){this.scroller.moveScroll(0);this.buffer.clear();this.viewPort.clearContents();},sortHandler:function(column){this.sortCol=column.name;this.sortDir=column.currentSort;this.resetContents();this.requestContentRefresh(0)},setTotalRows:function(newTotalRows){this.resetContents();this.metaData.setTotalRows(newTotalRows);this.scroller.updateSize();},initAjax:function(url){ajaxEngine.registerRequest(this.tableId+'_request',url);ajaxEngine.registerAjaxObject(this.tableId+'_updater',this);},invokeAjax:function(){},handleTimedOut:function(){this.processingRequest=null;this.processQueuedRequest();},fetchBuffer:function(offset){if(this.buffer.isInRange(offset)&&!this.buffer.isNearingLimit(offset)){return;}
+if(this.processingRequest){this.unprocessedRequest=new Rico.LiveGridRequest(offset);return;}
+var bufferStartPos=this.buffer.getFetchOffset(offset);this.processingRequest=new Rico.LiveGridRequest(offset);this.processingRequest.bufferOffset=bufferStartPos;var fetchSize=this.buffer.getFetchSize(offset);var partialLoaded=false;var queryString
+if(this.options.requestParameters)
+queryString=this._createQueryString(this.options.requestParameters,0);queryString=(queryString==null)?'':queryString+'&';queryString=queryString+'id='+this.tableId+'&page_size='+fetchSize+'&offset='+bufferStartPos;if(this.sortCol)
+queryString=queryString+'&sort_col='+escape(this.sortCol)+'&sort_dir='+this.sortDir;this.ajaxOptions.parameters=queryString;ajaxEngine.sendRequest(this.tableId+'_request',this.ajaxOptions);this.timeoutHandler=setTimeout(this.handleTimedOut.bind(this),this.options.bufferTimeout);},setRequestParams:function(){this.options.requestParameters=[];for(var i=0;i<arguments.length;i++)
+this.options.requestParameters[i]=arguments[i];},requestContentRefresh:function(contentOffset){this.fetchBuffer(contentOffset);},ajaxUpdate:function(ajaxResponse){try{clearTimeout(this.timeoutHandler);this.buffer.update(ajaxResponse,this.processingRequest.bufferOffset);this.viewPort.bufferChanged();}
+catch(err){}
+finally{this.processingRequest=null;}
+this.processQueuedRequest();},_createQueryString:function(theArgs,offset){var queryString=""
+if(!theArgs)
+return queryString;for(var i=offset;i<theArgs.length;i++){if(i!=offset)
+queryString+="&";var anArg=theArgs[i];if(anArg.name!=undefined&&anArg.value!=undefined){queryString+=anArg.name+"="+escape(anArg.value);}
+else{var ePos=anArg.indexOf('=');var argName=anArg.substring(0,ePos);var argValue=anArg.substring(ePos+1);queryString+=argName+"="+escape(argValue);}}
+return queryString;},processQueuedRequest:function(){if(this.unprocessedRequest!=null){this.requestContentRefresh(this.unprocessedRequest.requestOffset);this.unprocessedRequest=null}}};Rico.LiveGridSort=Class.create();Rico.LiveGridSort.prototype={initialize:function(headerTableId,options){this.headerTableId=headerTableId;this.headerTable=$(headerTableId);this.options=options;this.setOptions();this.applySortBehavior();if(this.options.sortCol){this.setSortUI(this.options.sortCol,this.options.sortDir);}},setSortUI:function(columnName,sortDirection){var cols=this.options.columns;for(var i=0;i<cols.length;i++){if(cols[i].name==columnName){this.setColumnSort(i,sortDirection);break;}}},setOptions:function(){new Image().src=this.options.sortAscendImg;new Image().src=this.options.sortDescendImg;this.sort=this.options.sortHandler;if(!this.options.columns)
+this.options.columns=this.introspectForColumnInfo();else{this.options.columns=this.convertToTableColumns(this.options.columns);}},applySortBehavior:function(){var headerRow=this.headerTable.rows[0];var headerCells=headerRow.cells;for(var i=0;i<headerCells.length;i++){this.addSortBehaviorToColumn(i,headerCells[i]);}},addSortBehaviorToColumn:function(n,cell){if(this.options.columns[n].isSortable()){cell.id=this.headerTableId+'_'+n;cell.style.cursor='pointer';cell.onclick=this.headerCellClicked.bindAsEventListener(this);cell.innerHTML=cell.innerHTML+'<span id="'+this.headerTableId+'_img_'+n+'">'
++'&nbsp;&nbsp;&nbsp;</span>';}},headerCellClicked:function(evt){var eventTarget=evt.target?evt.target:evt.srcElement;var cellId=eventTarget.id;var columnNumber=parseInt(cellId.substring(cellId.lastIndexOf('_')+1));var sortedColumnIndex=this.getSortedColumnIndex();if(sortedColumnIndex!=-1){if(sortedColumnIndex!=columnNumber){this.removeColumnSort(sortedColumnIndex);this.setColumnSort(columnNumber,Rico.TableColumn.SORT_ASC);}
else
- return "";
- },
-_setMargin: function(el, n, corners) {
-var marginSize = this._marginSize(n);
-var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
-if ( whichSide == "left" ) {
- el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px";
-}
-else if ( whichSide == "right" ) {
- el.style.marginRight = marginSize + "px"; el.style.marginLeft= "0px";
-}
-else {
- el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px";
-}
- },
-_setBorder: function(el,n,corners) {
-var borderSize = this._borderSize(n);
-var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
-if ( whichSide == "left" ) {
- el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px";
-}
-else if ( whichSide == "right" ) {
- el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth= "0px";
-}
-else {
- el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
-}
-if (this.options.border != false)
-el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
- },
-_marginSize: function(n) {
-if ( this._isTransparent() )
- return 0;
-var marginSizes= [ 5, 3, 2, 1 ];
-var blendedMarginSizes = [ 3, 2, 1, 0 ];
-var compactMarginSizes = [ 2, 1 ];
-var smBlendedMarginSizes = [ 1, 0 ];
-if ( this.options.compact && this.options.blend )
- return smBlendedMarginSizes[n];
-else if ( this.options.compact )
- return compactMarginSizes[n];
-else if ( this.options.blend )
- return blendedMarginSizes[n];
+this.toggleColumnSort(sortedColumnIndex);}
else
- return marginSizes[n];
- },
-_borderSize: function(n) {
-var transparentBorderSizes = [ 5, 3, 2, 1 ];
-var blendedBorderSizes = [ 2, 1, 1, 1 ];
-var compactBorderSizes = [ 1, 0 ];
-var actualBorderSizes= [ 0, 2, 0, 0 ];
-if ( this.options.compact && (this.options.blend || this._isTransparent()) )
- return 1;
-else if ( this.options.compact )
- return compactBorderSizes[n];
-else if ( this.options.blend )
- return blendedBorderSizes[n];
-else if ( this.options.border )
- return actualBorderSizes[n];
-else if ( this._isTransparent() )
- return transparentBorderSizes[n];
-return 0;
- },
-_hasString: function(str) { for(var i=1 ; i<arguments.length ; i++) if (str.indexOf(arguments[i]) >= 0) return true; return false; },
- _blend: function(c1, c2) { var cc1 = Rico.Color.createFromHex(c1); cc1.blend(Rico.Color.createFromHex(c2)); return cc1; },
- _background: function(el) { try { return Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } },
- _isTransparent: function() { return this.options.color == "transparent"; },
- _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); },
- _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); },
- _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; }
-}
-if ( window.Effect == undefined )
- Effect = {};
-Effect.SizeAndPosition = Class.create();
-Effect.SizeAndPosition.prototype = {
-initialize: function(element, x, y, w, h, duration, steps, options) {
-this.element = $(element);
-this.x = x;
-this.y = y;
-this.w = w;
-this.h = h;
-this.duration = duration;
-this.steps= steps;
-this.options= arguments[7] || {};
-this.sizeAndPosition();
- },
-sizeAndPosition: function() {
-if (this.isFinished()) {
- if(this.options.complete) this.options.complete(this);
- return;
-}
-if (this.timer)
- clearTimeout(this.timer);
-var stepDuration = Math.round(this.duration/this.steps) ;
-var currentX = this.element.offsetLeft;
-var currentY = this.element.offsetTop;
-var currentW = this.element.offsetWidth;
-var currentH = this.element.offsetHeight;
-this.x = (this.x) ? this.x : currentX;
-this.y = (this.y) ? this.y : currentY;
-this.w = (this.w) ? this.w : currentW;
-this.h = (this.h) ? this.h : currentH;
-var difX = this.steps >0 ? (this.x - currentX)/this.steps : 0;
-var difY = this.steps >0 ? (this.y - currentY)/this.steps : 0;
-var difW = this.steps >0 ? (this.w - currentW)/this.steps : 0;
-var difH = this.steps >0 ? (this.h - currentH)/this.steps : 0;
-this.moveBy(difX, difY);
-this.resizeBy(difW, difH);
-this.duration -= stepDuration;
-this.steps--;
-this.timer = setTimeout(this.sizeAndPosition.bind(this), stepDuration);
- },
-isFinished: function() {
-return this.steps <= 0;
- },
-moveBy: function( difX, difY ) {
-var currentLeft = this.element.offsetLeft;
-var currentTop= this.element.offsetTop;
-var intDifX = parseInt(difX);
-var intDifY = parseInt(difY);
-var style = this.element.style;
-if ( intDifX != 0 )
- style.left = (currentLeft + intDifX) + "px";
-if ( intDifY != 0 )
- style.top= (currentTop + intDifY) + "px";
- },
-resizeBy: function( difW, difH ) {
-var currentWidth= this.element.offsetWidth;
-var currentHeight = this.element.offsetHeight;
-var intDifW = parseInt(difW);
-var intDifH = parseInt(difH);
-var style = this.element.style;
-if ( intDifW != 0 )
- style.width = (currentWidth+ intDifW) + "px";
-if ( intDifH != 0 )
- style.height= (currentHeight + intDifH) + "px";
- }
-}
-Effect.Size = Class.create();
-Effect.Size.prototype = {
-initialize: function(element, w, h, duration, steps, options) {
-new Effect.SizeAndPosition(element, null, null, w, h, duration, steps, options);
-}
-}
-Effect.Position = Class.create();
-Effect.Position.prototype = {
-initialize: function(element, x, y, duration, steps, options) {
-new Effect.SizeAndPosition(element, x, y, null, null, duration, steps, options);
-}
-}
-Effect.Round = Class.create();
-Effect.Round.prototype = {
-initialize: function(tagName, className, options) {
-var elements = document.getElementsByTagAndClassName(tagName,className);
-for ( var i = 0 ; i < elements.length ; i++ )
- Rico.Corner.round( elements[i], options );
- }
-};
-Effect.FadeTo = Class.create();
-Effect.FadeTo.prototype = {
-initialize: function( element, opacity, duration, steps, options) {
-this.element= $(element);
-this.opacity= opacity;
-this.duration = duration;
-this.steps= steps;
-this.options= arguments[4] || {};
-this.fadeTo();
- },
-fadeTo: function() {
-if (this.isFinished()) {
- if(this.options.complete) this.options.complete(this);
- return;
-}
-if (this.timer)
- clearTimeout(this.timer);
-var stepDuration = Math.round(this.duration/this.steps) ;
-var currentOpacity = this.getElementOpacity();
-var delta = this.steps > 0 ? (this.opacity - currentOpacity)/this.steps : 0;
-this.changeOpacityBy(delta);
-this.duration -= stepDuration;
-this.steps--;
-this.timer = setTimeout(this.fadeTo.bind(this), stepDuration);
- },
-changeOpacityBy: function(v) {
-var currentOpacity = this.getElementOpacity();
-var newOpacity = Math.max(0, Math.min(currentOpacity+v, 1));
-this.element.ricoOpacity = newOpacity;
-this.element.style.filter = "alpha(opacity:"+Math.round(newOpacity*100)+")";
-this.element.style.opacity = newOpacity;
-if ( window.Effect == undefined )
- Effect = {};
-Effect.SizeAndPosition = Class.create();
-Effect.SizeAndPosition.prototype = {
-initialize: function(element, x, y, w, h, duration, steps, options) {
-this.element = $(element);
-this.x = x;
-this.y = y;
-this.w = w;
-this.h = h;
-this.duration = duration;
-this.steps= steps;
-this.options= arguments[7] || {};
-this.sizeAndPosition();
- },
-sizeAndPosition: function() {
-if (this.isFinished()) {
- if(this.options.complete) this.options.complete(this);
- return;
-}
-if (this.timer)
- clearTimeout(this.timer);
-var stepDuration = Math.round(this.duration/this.steps) ;
-var currentX = this.element.offsetLeft;
-var currentY = this.element.offsetTop;
-var currentW = this.element.offsetWidth;
-var currentH = this.element.offsetHeight;
-this.x = (this.x) ? this.x : currentX;
-this.y = (this.y) ? this.y : currentY;
-this.w = (this.w) ? this.w : currentW;
-this.h = (this.h) ? this.h : currentH;
-var difX = this.steps >0 ? (this.x - currentX)/this.steps : 0;
-var difY = this.steps >0 ? (this.y - currentY)/this.steps : 0;
-var difW = this.steps >0 ? (this.w - currentW)/this.steps : 0;
-var difH = this.steps >0 ? (this.h - currentH)/this.steps : 0;
-this.moveBy(difX, difY);
-this.resizeBy(difW, difH);
-this.duration -= stepDuration;
-this.steps--;
-this.timer = setTimeout(this.sizeAndPosition.bind(this), stepDuration);
- },
-isFinished: function() {
-return this.steps <= 0;
- },
-moveBy: function( difX, difY ) {
-var currentLeft = this.element.offsetLeft;
-var currentTop= this.element.offsetTop;
-var intDifX = parseInt(difX);
-var intDifY = parseInt(difY);
-var style = this.element.style;
-if ( intDifX != 0 )
- style.left = (currentLeft + intDifX) + "px";
-if ( intDifY != 0 )
- style.top= (currentTop + intDifY) + "px";
- },
-resizeBy: function( difW, difH ) {
-var currentWidth= this.element.offsetWidth;
-var currentHeight = this.element.offsetHeight;
-var intDifW = parseInt(difW);
-var intDifH = parseInt(difH);
-var style = this.element.style;
-if ( intDifW != 0 )
- style.width = (currentWidth+ intDifW) + "px";
-if ( intDifH != 0 )
- style.height= (currentHeight + intDifH) + "px";
- }
-}
-Effect.Size = Class.create();
-Effect.Size.prototype = {
-initialize: function(element, w, h, duration, steps, options) {
-new Effect.SizeAndPosition(element, null, null, w, h, duration, steps, options);
-}
-}
-Effect.Position = Class.create();
-Effect.Position.prototype = {
-initialize: function(element, x, y, duration, steps, options) {
-new Effect.SizeAndPosition(element, x, y, null, null, duration, steps, options);
-}
-}
-Effect.Round = Class.create();
-Effect.Round.prototype = {
-initialize: function(tagName, className, options) {
-var elements = document.getElementsByTagAndClassName(tagName,className);
-for ( var i = 0 ; i < elements.length ; i++ )
- Rico.Corner.round( elements[i], options );
- }
-};
-Effect.FadeTo = Class.create();
-Effect.FadeTo.prototype = {
-initialize: function( element, opacity, duration, steps, options) {
-this.element= $(element);
-this.opacity= opacity;
-this.duration = duration;
-this.steps= steps;
-this.options= arguments[4] || {};
-this.fadeTo();
- },
-fadeTo: function() {
-if (this.isFinished()) {
- if(this.options.complete) this.options.complete(this);
- return;
-}
-if (this.timer)
- clearTimeout(this.timer);
-var stepDuration = Math.round(this.duration/this.steps) ;
-var currentOpacity = this.getElementOpacity();
-var delta = this.steps > 0 ? (this.opacity - currentOpacity)/this.steps : 0;
-this.changeOpacityBy(delta);
-this.duration -= stepDuration;
-this.steps--;
-this.timer = setTimeout(this.fadeTo.bind(this), stepDuration);
- },
-changeOpacityBy: function(v) {
-var currentOpacity = this.getElementOpacity();
-var newOpacity = Math.max(0, Math.min(currentOpacity+v, 1));
-this.element.ricoOpacity = newOpacity;
-this.element.style.filter = "alpha(opacity:"+Math.round(newOpacity*100)+")";
-this.element.style.opacity = newOpacity;
- _toAbsolute: function(element,accountForDocScroll) {
-if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 )
- return this._toAbsoluteMozilla(element,accountForDocScroll);
-var x = 0;
-var y = 0;
-var parent = element;
-while ( parent ) {
-var borderXOffset = 0;
- var borderYOffset = 0;
- if ( parent != element ) {
-var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
-var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
-borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
-borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
- }
-x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
- y += parent.offsetTop - parent.scrollTop + borderYOffset;
- parent = parent.offsetParent;
-}
-if ( accountForDocScroll ) {
- x -= this.docScrollLeft();
- y -= this.docScrollTop();
-}
-return { x:x, y:y };
- },
-_toAbsoluteMozilla: function(element,accountForDocScroll) {
-var x = 0;
-var y = 0;
-var parent = element;
-while ( parent ) {
- x += parent.offsetLeft;
- y += parent.offsetTop;
- parent = parent.offsetParent;
-}
-parent = element;
-while ( parent &&
-parent != document.body &&
-parent != document.documentElement ) {
- if ( parent.scrollLeft)
-x -= parent.scrollLeft;
- if ( parent.scrollTop )
-y -= parent.scrollTop;
- parent = parent.parentNode;
-}
-if ( accountForDocScroll ) {
- x -= this.docScrollLeft();
- y -= this.docScrollTop();
-}
-return { x:x, y:y };
- },
-docScrollLeft: function() {
-if ( window.pageXOffset )
- return window.pageXOffset;
-else if ( document.documentElement && document.documentElement.scrollLeft )
- return document.documentElement.scrollLeft;
-else if ( document.body )
- return document.body.scrollLeft;
-else
- return 0;
- },
-docScrollTop: function() {
-if ( window.pageYOffset )
- return window.pageYOffset;
-else if ( document.documentElement && document.documentElement.scrollTop )
- return document.documentElement.scrollTop;
-else if ( document.body )
- return document.body.scrollTop;
-else
- return 0;
- }
-};
-Prado.RicoLiveGrid = Class.create();
-Prado.RicoLiveGrid.prototype = Object.extend(Rico.LiveGrid.prototype,
-{
-initialize : function(tableId, options)
-{
- this.options = {
-tableClass: $(tableId).className || '',
-loadingClass: $(tableId).className || '',
-scrollerBorderRight: '1px solid #ababab',
-bufferTimeout:20000,
-sortAscendImg:'images/sort_asc.gif',
-sortDescendImg: 'images/sort_desc.gif',
-sortImageWidth: 9,
-sortImageHeight:5,
-ajaxSortURLParms: [],
-onRefreshComplete:null,
-requestParameters:null,
-inlineStyles: true,
-visibleRows:10,
-totalRows:0,
-initialOffset:0
-};
-Object.extend(this.options, options || {});
-this.tableId = tableId;
-this.table = $(tableId);
-this.addLiveGridHtml();
-var columnCount= this.table.rows[0].cells.length;
-this.metaData= new Rico.LiveGridMetaData(this.options.visibleRows, this.options.totalRows, columnCount, options);
-this.buffer= new Rico.LiveGridBuffer(this.metaData);
-var rowCount = this.table.rows.length;
-this.viewPort =new Rico.GridViewPort(this.table,
-this.table.offsetHeight/rowCount,
-this.options.visibleRows,
-this.buffer, this);
-this.scroller= new Rico.LiveGridScroller(this,this.viewPort);
-this.options.sortHandler = this.sortHandler.bind(this);
-if ( $(tableId + '_header') )
- this.sort = new Rico.LiveGridSort(tableId + '_header', this.options)
-this.processingRequest = null;
-this.unprocessedRequest = null;
-if (this.options.initialOffset >= 0)
-{
- var offset = this.options.initialOffset;
-this.scroller.moveScroll(offset);
-this.viewPort.scrollTo(this.scroller.rowToPixel(offset));
- if (this.options.sortCol) {
- this.sortCol = options.sortCol;
- this.sortDir = options.sortDir;
- }
- var grid = this;
- setTimeout(function(){
- grid.requestContentRefresh(offset);
- },100);
-}
-},
-fetchBuffer: function(offset)
- {
-if ( this.buffer.isInRange(offset) &&
- !this.buffer.isNearingLimit(offset)) {
- return;
- }
-if (this.processingRequest) {
-this.unprocessedRequest = new Rico.LiveGridRequest(offset);
- return;
-}
-var bufferStartPos = this.buffer.getFetchOffset(offset);
-this.processingRequest = new Rico.LiveGridRequest(offset);
-this.processingRequest.bufferOffset = bufferStartPos;
-var fetchSize = this.buffer.getFetchSize(offset);
-var partialLoaded = false;
-var param =
- {
-'page_size' : fetchSize,
-'offset' : bufferStartPos
- };
-if(this.sortCol)
- {
-Object.extend(param,
- {
-'sort_col': this.sortCol,
-'sort_dir': this.sortDir
-});
- }
-Prado.Callback(this.tableId, param, this.ajaxUpdate.bind(this), this.options);
- this.timeoutHandler = setTimeout( this.handleTimedOut.bind(this), this.options.bufferTimeout);
-},
-ajaxUpdate: function(result, output)
- {
-try {
- clearTimeout( this.timeoutHandler );
- this.buffer.update(result,this.processingRequest.bufferOffset);
- this.viewPort.bufferChanged();
-}
-catch(err) {}
-finally {this.processingRequest = null; }
-this.processQueuedRequest();
- }
-});
-Object.extend(Rico.LiveGridBuffer.prototype,
-{
- update: function(newRows, start)
-{
- if (this.rows.length == 0) {
- this.rows = newRows;
- this.size = this.rows.length;
- this.startPos = start;
- return;
-}
-if (start > this.startPos) {
- if (this.startPos + this.rows.length < start) {
-this.rows =newRows;
-this.startPos = start;
- } else {
-this.rows = this.rows.concat( newRows.slice(0, newRows.length));
-if (this.rows.length > this.maxBufferSize) {
- var fullSize = this.rows.length;
- this.rows = this.rows.slice(this.rows.length - this.maxBufferSize, this.rows.length)
- this.startPos = this.startPos +(fullSize - this.rows.length);
-}
- }
-} else {
- if (start + newRows.length < this.startPos) {
-this.rows =newRows;
- } else {
-this.rows = newRows.slice(0, this.startPos).concat(this.rows);
-if (this.rows.length > this.maxBufferSize)
- this.rows = this.rows.slice(0, this.maxBufferSize)
- }
- this.startPos =start;
-}
-this.size = this.rows.length;
- }
-});
-Object.extend(Rico.GridViewPort.prototype,
-{
- populateRow: function(htmlRow, row)
- {
- if(isdef(htmlRow))
- {
-for (var j=0; j < row.length; j++) {
- htmlRow.cells[j].innerHTML = row[j]
-}
- }
- }
-});
+this.setColumnSort(columnNumber,Rico.TableColumn.SORT_ASC);if(this.options.sortHandler){this.options.sortHandler(this.options.columns[columnNumber]);}},removeColumnSort:function(n){this.options.columns[n].setUnsorted();this.setSortImage(n);},setColumnSort:function(n,direction){this.options.columns[n].setSorted(direction);this.setSortImage(n);},toggleColumnSort:function(n){this.options.columns[n].toggleSort();this.setSortImage(n);},setSortImage:function(n){var sortDirection=this.options.columns[n].getSortDirection();var sortImageSpan=$(this.headerTableId+'_img_'+n);if(sortDirection==Rico.TableColumn.UNSORTED)
+sortImageSpan.innerHTML='&nbsp;&nbsp;';else if(sortDirection==Rico.TableColumn.SORT_ASC)
+sortImageSpan.innerHTML='&nbsp;&nbsp;<img width="'+this.options.sortImageWidth+'" '+'height="'+this.options.sortImageHeight+'" '+'src="'+this.options.sortAscendImg+'"/>';else if(sortDirection==Rico.TableColumn.SORT_DESC)
+sortImageSpan.innerHTML='&nbsp;&nbsp;<img width="'+this.options.sortImageWidth+'" '+'height="'+this.options.sortImageHeight+'" '+'src="'+this.options.sortDescendImg+'"/>';},getSortedColumnIndex:function(){var cols=this.options.columns;for(var i=0;i<cols.length;i++){if(cols[i].isSorted())
+return i;}
+return-1;},introspectForColumnInfo:function(){var columns=new Array();var headerRow=this.headerTable.rows[0];var headerCells=headerRow.cells;for(var i=0;i<headerCells.length;i++)
+columns.push(new Rico.TableColumn(this.deriveColumnNameFromCell(headerCells[i],i),true));return columns;},convertToTableColumns:function(cols){var columns=new Array();for(var i=0;i<cols.length;i++)
+columns.push(new Rico.TableColumn(cols[i][0],cols[i][1]));return columns;},deriveColumnNameFromCell:function(cell,columnNumber){var cellContent=cell.innerText!=undefined?cell.innerText:cell.textContent;return cellContent?cellContent.toLowerCase().split(' ').join('_'):"col_"+columnNumber;}};Rico.TableColumn=Class.create();Rico.TableColumn.UNSORTED=0;Rico.TableColumn.SORT_ASC="ASC";Rico.TableColumn.SORT_DESC="DESC";Rico.TableColumn.prototype={initialize:function(name,sortable){this.name=name;this.sortable=sortable;this.currentSort=Rico.TableColumn.UNSORTED;},isSortable:function(){return this.sortable;},isSorted:function(){return this.currentSort!=Rico.TableColumn.UNSORTED;},getSortDirection:function(){return this.currentSort;},toggleSort:function(){if(this.currentSort==Rico.TableColumn.UNSORTED||this.currentSort==Rico.TableColumn.SORT_DESC)
+this.currentSort=Rico.TableColumn.SORT_ASC;else if(this.currentSort==Rico.TableColumn.SORT_ASC)
+this.currentSort=Rico.TableColumn.SORT_DESC;},setUnsorted:function(direction){this.setSorted(Rico.TableColumn.UNSORTED);},setSorted:function(direction){this.currentSort=direction;}};Rico.ArrayExtensions=new Array();if(Object.prototype.extend){Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}else{Object.prototype.extend=function(object){return Object.extend.apply(this,[this,object]);}
+Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;}
+if(Array.prototype.push){Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.push;}
+if(!Array.prototype.remove){Array.prototype.remove=function(dx){if(isNaN(dx)||dx>this.length)
+return false;for(var i=0,n=0;i<this.length;i++)
+if(i!=dx)
+this[n++]=this[i];this.length-=1;};Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.remove;}
+if(!Array.prototype.removeItem){Array.prototype.removeItem=function(item){for(var i=0;i<this.length;i++)
+if(this[i]==item){this.remove(i);break;}};Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.removeItem;}
+if(!Array.prototype.indices){Array.prototype.indices=function(){var indexArray=new Array();for(index in this){var ignoreThis=false;for(var i=0;i<Rico.ArrayExtensions.length;i++){if(this[index]==Rico.ArrayExtensions[i]){ignoreThis=true;break;}}
+if(!ignoreThis)
+indexArray[indexArray.length]=index;}
+return indexArray;}
+Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.indices;}
+Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.unique;Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.inArray;if(window.DOMParser&&window.XMLSerializer&&window.Node&&Node.prototype&&Node.prototype.__defineGetter__){if(!Document.prototype.loadXML){Document.prototype.loadXML=function(s){var doc2=(new DOMParser()).parseFromString(s,"text/xml");while(this.hasChildNodes())
+this.removeChild(this.lastChild);for(var i=0;i<doc2.childNodes.length;i++){this.appendChild(this.importNode(doc2.childNodes[i],true));}};}
+Document.prototype.__defineGetter__("xml",function(){return(new XMLSerializer()).serializeToString(this);});}
+document.getElementsByTagAndClassName=function(tagName,className){if(tagName==null)
+tagName='*';var children=document.getElementsByTagName(tagName)||document.all;var elements=new Array();if(className==null)
+return children;for(var i=0;i<children.length;i++){var child=children[i];var classNames=child.className.split(' ');for(var j=0;j<classNames.length;j++){if(classNames[j]==className){elements.push(child);break;}}}
+return elements;}
+var RicoUtil={getElementsComputedStyle:function(htmlElement,cssProperty,mozillaEquivalentCSS){if(arguments.length==2)
+mozillaEquivalentCSS=cssProperty;var el=$(htmlElement);if(el.currentStyle)
+return el.currentStyle[cssProperty];else
+return document.defaultView.getComputedStyle(el,null).getPropertyValue(mozillaEquivalentCSS);},createXmlDocument:function(){if(document.implementation&&document.implementation.createDocument){var doc=document.implementation.createDocument("","",null);if(doc.readyState==null){doc.readyState=1;doc.addEventListener("load",function(){doc.readyState=4;if(typeof doc.onreadystatechange=="function")
+doc.onreadystatechange();},false);}
+return doc;}
+if(window.ActiveXObject)
+return Try.these(function(){return new ActiveXObject('MSXML2.DomDocument')},function(){return new ActiveXObject('Microsoft.DomDocument')},function(){return new ActiveXObject('MSXML.DomDocument')},function(){return new ActiveXObject('MSXML3.DomDocument')})||false;return null;},getContentAsString:function(parentNode){return parentNode.xml!=undefined?this._getContentAsStringIE(parentNode):this._getContentAsStringMozilla(parentNode);},_getContentAsStringIE:function(parentNode){var contentStr="";for(var i=0;i<parentNode.childNodes.length;i++){var n=parentNode.childNodes[i];if(n.nodeType==4){contentStr+=n.nodeValue;}
+else{contentStr+=n.xml;}}
+return contentStr;},_getContentAsStringMozilla:function(parentNode){var xmlSerializer=new XMLSerializer();var contentStr="";for(var i=0;i<parentNode.childNodes.length;i++){var n=parentNode.childNodes[i];if(n.nodeType==4){contentStr+=n.nodeValue;}
+else{contentStr+=xmlSerializer.serializeToString(n);}}
+return contentStr;},toViewportPosition:function(element){return this._toAbsolute(element,true);},toDocumentPosition:function(element){return this._toAbsolute(element,false);},_toAbsolute:function(element,accountForDocScroll){if(navigator.userAgent.toLowerCase().indexOf("msie")==-1)
+return this._toAbsoluteMozilla(element,accountForDocScroll);var x=0;var y=0;var parent=element;while(parent){var borderXOffset=0;var borderYOffset=0;if(parent!=element){var borderXOffset=parseInt(this.getElementsComputedStyle(parent,"borderLeftWidth"));var borderYOffset=parseInt(this.getElementsComputedStyle(parent,"borderTopWidth"));borderXOffset=isNaN(borderXOffset)?0:borderXOffset;borderYOffset=isNaN(borderYOffset)?0:borderYOffset;}
+x+=parent.offsetLeft-parent.scrollLeft+borderXOffset;y+=parent.offsetTop-parent.scrollTop+borderYOffset;parent=parent.offsetParent;}
+if(accountForDocScroll){x-=this.docScrollLeft();y-=this.docScrollTop();}
+return{x:x,y:y};},_toAbsoluteMozilla:function(element,accountForDocScroll){var x=0;var y=0;var parent=element;while(parent){x+=parent.offsetLeft;y+=parent.offsetTop;parent=parent.offsetParent;}
+parent=element;while(parent&&parent!=document.body&&parent!=document.documentElement){if(parent.scrollLeft)
+x-=parent.scrollLeft;if(parent.scrollTop)
+y-=parent.scrollTop;parent=parent.parentNode;}
+if(accountForDocScroll){x-=this.docScrollLeft();y-=this.docScrollTop();}
+return{x:x,y:y};},docScrollLeft:function(){if(window.pageXOffset)
+return window.pageXOffset;else if(document.documentElement&&document.documentElement.scrollLeft)
+return document.documentElement.scrollLeft;else if(document.body)
+return document.body.scrollLeft;else
+return 0;},docScrollTop:function(){if(window.pageYOffset)
+return window.pageYOffset;else if(document.documentElement&&document.documentElement.scrollTop)
+return document.documentElement.scrollTop;else if(document.body)
+return document.body.scrollTop;else
+return 0;}};Prado.RicoLiveGrid=Class.create();Prado.RicoLiveGrid.prototype=Object.extend(Rico.LiveGrid.prototype,{initialize:function(tableId,options)
+{this.options={tableClass:$(tableId).className||'',loadingClass:$(tableId).className||'',scrollerBorderRight:'1px solid #ababab',bufferTimeout:20000,sortAscendImg:'images/sort_asc.gif',sortDescendImg:'images/sort_desc.gif',sortImageWidth:9,sortImageHeight:5,ajaxSortURLParms:[],onRefreshComplete:null,requestParameters:null,inlineStyles:true,visibleRows:10,totalRows:0,initialOffset:0};Object.extend(this.options,options||{});this.tableId=tableId;this.table=$(tableId);this.addLiveGridHtml();var columnCount=this.table.rows[0].cells.length;this.metaData=new Rico.LiveGridMetaData(this.options.visibleRows,this.options.totalRows,columnCount,options);this.buffer=new Rico.LiveGridBuffer(this.metaData);var rowCount=this.table.rows.length;this.viewPort=new Rico.GridViewPort(this.table,this.table.offsetHeight/rowCount,this.options.visibleRows,this.buffer,this);this.scroller=new Rico.LiveGridScroller(this,this.viewPort);this.options.sortHandler=this.sortHandler.bind(this);if($(tableId+'_header'))
+this.sort=new Rico.LiveGridSort(tableId+'_header',this.options)
+this.processingRequest=null;this.unprocessedRequest=null;if(this.options.initialOffset>=0)
+{var offset=this.options.initialOffset;this.scroller.moveScroll(offset);this.viewPort.scrollTo(this.scroller.rowToPixel(offset));if(this.options.sortCol){this.sortCol=options.sortCol;this.sortDir=options.sortDir;}
+var grid=this;setTimeout(function(){grid.requestContentRefresh(offset);},100);}},fetchBuffer:function(offset)
+{if(this.buffer.isInRange(offset)&&!this.buffer.isNearingLimit(offset)){return;}
+if(this.processingRequest){this.unprocessedRequest=new Rico.LiveGridRequest(offset);return;}
+var bufferStartPos=this.buffer.getFetchOffset(offset);this.processingRequest=new Rico.LiveGridRequest(offset);this.processingRequest.bufferOffset=bufferStartPos;var fetchSize=this.buffer.getFetchSize(offset);var partialLoaded=false;var param={'page_size':fetchSize,'offset':bufferStartPos};if(this.sortCol)
+{Object.extend(param,{'sort_col':this.sortCol,'sort_dir':this.sortDir});}
+Prado.Callback(this.tableId,param,this.ajaxUpdate.bind(this),this.options);this.timeoutHandler=setTimeout(this.handleTimedOut.bind(this),this.options.bufferTimeout);},ajaxUpdate:function(result,output)
+{try{clearTimeout(this.timeoutHandler);this.buffer.update(result,this.processingRequest.bufferOffset);this.viewPort.bufferChanged();}
+catch(err){}
+finally{this.processingRequest=null;}
+this.processQueuedRequest();}});Object.extend(Rico.LiveGridBuffer.prototype,{update:function(newRows,start)
+{if(this.rows.length==0){this.rows=newRows;this.size=this.rows.length;this.startPos=start;return;}
+if(start>this.startPos){if(this.startPos+this.rows.length<start){this.rows=newRows;this.startPos=start;}else{this.rows=this.rows.concat(newRows.slice(0,newRows.length));if(this.rows.length>this.maxBufferSize){var fullSize=this.rows.length;this.rows=this.rows.slice(this.rows.length-this.maxBufferSize,this.rows.length)
+this.startPos=this.startPos+(fullSize-this.rows.length);}}}else{if(start+newRows.length<this.startPos){this.rows=newRows;}else{this.rows=newRows.slice(0,this.startPos).concat(this.rows);if(this.rows.length>this.maxBufferSize)
+this.rows=this.rows.slice(0,this.maxBufferSize)}
+this.startPos=start;}
+this.size=this.rows.length;}});Object.extend(Rico.GridViewPort.prototype,{populateRow:function(htmlRow,row)
+{if(isdef(htmlRow))
+{for(var j=0;j<row.length;j++){htmlRow.cells[j].innerHTML=row[j]}}}}); \ No newline at end of file
diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js
index 88dfb25e..66b48866 100644
--- a/framework/Web/Javascripts/js/validator.js
+++ b/framework/Web/Javascripts/js/validator.js
@@ -1,691 +1,192 @@
-Prado.Validation =Class.create();
-Object.extend(Prado.Validation,
-{
-managers : {},
-validate : function(formID, groupID, invoker)
-{
-if(this.managers[formID])
-{
-return this.managers[formID].validate(groupID, invoker);
-}
-else
-{
-throw new Error("Form '"+form+"' is not registered with Prado.Validation");
-}
-},
-isValid : function(formID, groupID)
-{
-if(this.managers[formID])
-return this.managers[formID].isValid(groupID);
-return true;
-},
-addValidator : function(formID, validator)
-{
-if(this.managers[formID])
-this.managers[formID].addValidator(validator);
-else
-throw new Error("A validation manager for form '"+formID+"' needs to be created first.");
-return this.managers[formID];
-},
-addSummary : function(formID, validator)
-{
-if(this.managers[formID])
-this.managers[formID].addSummary(validator);
-else
-throw new Error("A validation manager for form '"+formID+"' needs to be created first.");
-return this.managers[formID];
-}
-});
-Prado.ValidationManager = Class.create();
-Prado.ValidationManager.prototype =
-{
-validators : [],
-summaries : [],
-groups : [],
-options : {},
-initialize : function(options)
-{
-this.options = options;
-Prado.Validation.managers[options.FormID] = this;
-},
-validate : function(group, invoker)
-{
-if(group)
-return this._validateGroup(group, invoker);
-else
-return this._validateNonGroup(invoker);
-},
-_validateGroup: function(groupID, invoker)
-{
-var valid = true;
-if(this.groups.include(groupID))
-{
-this.validators.each(function(validator)
-{
-if(validator.group == groupID)
-valid = valid & validator.validate(invoker);
-else
-validator.hide();
-});
-}
-this.updateSummary(groupID, true);
-return valid;
-},
-_validateNonGroup : function(invoker)
-{
-var valid = true;
-this.validators.each(function(validator)
-{
-if(!validator.group)
-valid = valid & validator.validate(invoker);
-else
-validator.hide();
-});
-this.updateSummary(null, true);
-return valid;
-},
-isValid : function(group)
-{
-if(group)
-return this._isValidGroup(group);
-else
-return this._isValidNonGroup();
-},
-_isValidNonGroup : function()
-{
-var valid = true;
-this.validators.each(function(validator)
-{
-if(!validator.group)
-valid = valid & validator.isValid;
-});
-return valid;
-},
-_isValidGroup : function(groupID)
-{
-var valid = true;
-if(this.groups.include(groupID))
-{
-this.validators.each(function(validator)
-{
-if(validator.group == groupID)
-valid = valid & validator.isValid;
-});
-}
-return valid;
-},
-addValidator : function(validator)
-{
-this.validators.push(validator);
-if(validator.group && !this.groups.include(validator.group))
-this.groups.push(validator.group);
-},
-addSummary : function(summary)
-{
-this.summaries.push(summary);
-},
-getValidatorsWithError : function(group)
-{
-var validators = this.validators.findAll(function(validator)
-{
-var notValid = !validator.isValid;
-var inGroup = group && validator.group == group;
-var noGroup = validator.group == null;
-return notValid && (inGroup || noGroup);
-});
-return validators;
-},
-updateSummary : function(group, refresh)
-{
-var validators = this.getValidatorsWithError(group);
-this.summaries.each(function(summary)
-{
-var inGroup = group && summary.group == group;
-var noGroup = !group && !summary.group;
-if(inGroup || noGroup)
-summary.updateSummary(validators, refresh);
-else
-summary.hideSummary(true);
-});
-}
-};
-Prado.WebUI.TValidationSummary = Class.create();
-Prado.WebUI.TValidationSummary.prototype =
-{
-group : null,
-options : {},
-visible : false,
-messages : null,
-initialize : function(options)
-{
-this.options = options;
-this.group = options.ValidationGroup;
-this.messages = $(options.ID);
-this.visible = this.messages.style.visibility != "hidden"
-this.visible = this.visible && this.messages.style.display != "none";
-Prado.Validation.addSummary(options.FormID, this);
-},
-updateSummary : function(validators, update)
-{
-if(validators.length <= 0)
-{
-if(update || this.options.Refresh != false)
-{
-return this.hideSummary(validators);
-}
-return;
-}
-var refresh = update || this.visible == false || this.options.Refresh != false;
-if(this.options.ShowSummary != false && refresh)
-{
-this.updateHTMLMessages(this.getMessages(validators));
-this.showSummary(validators);
-}
-if(this.options.ScrollToSummary != false)
-window.scrollTo(this.messages.offsetLeft-20, this.messages.offsetTop-20);
-if(this.options.ShowMessageBox == true && refresh)
-{
-this.alertMessages(this.getMessages(validators));
-this.visible = true;
-}
-},
-updateHTMLMessages : function(messages)
-{
-while(this.messages.childNodes.length > 0)
-this.messages.removeChild(this.messages.lastChild);
-new Insertion.Bottom(this.messages, this.formatSummary(messages));
-},
-alertMessages : function(messages)
-{
-var text = this.formatMessageBox(messages);
-setTimeout(function(){ alert(text); },20);
-},
-getMessages : function(validators)
-{
-var messages = [];
-validators.each(function(validator)
-{
-var message = validator.getErrorMessage();
-if(typeof(message) == 'string' && message.length > 0)
-messages.push(message);
-})
-return messages;
-},
-hideSummary : function(validators)
-{if(typeof(this.options.OnHideSummary) == "function")
-{
-this.messages.style.visibility="visible";
-this.options.OnHideSummary(this,validators)
-}
-else
-{
-this.messages.style.visibility="hidden";
-if(this.options.Display == "None" || this.options.Display == "Dynamic")
-this.messages.hide();
-}
-this.visible = false;
-},
-showSummary : function(validators)
-{
-this.messages.style.visibility="visible";
-if(typeof(this.options.OnShowSummary) == "function")
-this.options.OnShowSummary(this,validators);
-else
-this.messages.show();
-this.visible = true;
-},
-formats : function(type)
-{
-switch(type)
-{
-case "List":
-return { header : "<br />", first : "", pre : "", post : "<br />", last : ""};
-case "SingleParagraph":
-return { header : " ", first : "", pre : "", post : " ", last : "<br />"};
-case "BulletList":
-default:
-return { header : "", first : "<ul>", pre : "<li>", post : "</li>", last : "</ul>"};
-}
-},
-formatSummary : function(messages)
-{
-var format = this.formats(this.options.DisplayMode);
-var output = this.options.HeaderText ? this.options.HeaderText + format.header : "";
-output += format.first;
-messages.each(function(message)
-{
-output += message.length > 0 ? format.pre + message + format.post : "";
-});
-output += format.last;
-return output;
-},
-formatMessageBox : function(messages)
-{
-var output = this.options.HeaderText ? this.options.HeaderText + "\n" : "";
-for(var i = 0; i < messages.length; i++)
-{
-switch(this.options.DisplayMode)
-{
-case "List":
-output += messages[i] + "\n";
-break;
-case "BulletList":
-default:
-output += "- " + messages[i] + "\n";
-break;
-case "SingleParagraph":
-output += messages[i] + " ";
-break;
-}
-}
-return output;
-}
-};
-Prado.WebUI.TBaseValidator = Class.create();
-Prado.WebUI.TBaseValidator.prototype =
-{
-enabled : true,
-visible : false,
-isValid : true,
-options : {},
-_isObserving : {},
-group : null,
-manager : null,
-message : null,
-initialize : function(options)
-{
-this.options = options;
-this.control = $(options.ControlToValidate);
-this.message = $(options.ID);
-this.group = options.ValidationGroup;
-this.manager = Prado.Validation.addValidator(options.FormID, this);
-},
-getErrorMessage : function()
-{
-return this.options.ErrorMessage;
-},
-updateControl: function()
-{
-if(this.message)
-{
-if(this.options.Display == "Dynamic")
-this.isValid ? this.message.hide() : this.message.show();
-this.message.style.visibility = this.isValid ? "hidden" : "visible";
-}
+Prado.Validation=Class.create();Object.extend(Prado.Validation,{managers:{},validate:function(formID,groupID,invoker)
+{if(this.managers[formID])
+{return this.managers[formID].validate(groupID,invoker);}
+else
+{throw new Error("Form '"+form+"' is not registered with Prado.Validation");}},isValid:function(formID,groupID)
+{if(this.managers[formID])
+return this.managers[formID].isValid(groupID);return true;},addValidator:function(formID,validator)
+{if(this.managers[formID])
+this.managers[formID].addValidator(validator);else
+throw new Error("A validation manager for form '"+formID+"' needs to be created first.");return this.managers[formID];},addSummary:function(formID,validator)
+{if(this.managers[formID])
+this.managers[formID].addSummary(validator);else
+throw new Error("A validation manager for form '"+formID+"' needs to be created first.");return this.managers[formID];}});Prado.ValidationManager=Class.create();Prado.ValidationManager.prototype={validators:[],summaries:[],groups:[],options:{},initialize:function(options)
+{this.options=options;Prado.Validation.managers[options.FormID]=this;},validate:function(group,invoker)
+{if(group)
+return this._validateGroup(group,invoker);else
+return this._validateNonGroup(invoker);},_validateGroup:function(groupID,invoker)
+{var valid=true;if(this.groups.include(groupID))
+{this.validators.each(function(validator)
+{if(validator.group==groupID)
+valid=valid&validator.validate(invoker);else
+validator.hide();});}
+this.updateSummary(groupID,true);return valid;},_validateNonGroup:function(invoker)
+{var valid=true;this.validators.each(function(validator)
+{if(!validator.group)
+valid=valid&validator.validate(invoker);else
+validator.hide();});this.updateSummary(null,true);return valid;},isValid:function(group)
+{if(group)
+return this._isValidGroup(group);else
+return this._isValidNonGroup();},_isValidNonGroup:function()
+{var valid=true;this.validators.each(function(validator)
+{if(!validator.group)
+valid=valid&validator.isValid;});return valid;},_isValidGroup:function(groupID)
+{var valid=true;if(this.groups.include(groupID))
+{this.validators.each(function(validator)
+{if(validator.group==groupID)
+valid=valid&validator.isValid;});}
+return valid;},addValidator:function(validator)
+{this.validators.push(validator);if(validator.group&&!this.groups.include(validator.group))
+this.groups.push(validator.group);},addSummary:function(summary)
+{this.summaries.push(summary);},getValidatorsWithError:function(group)
+{var validators=this.validators.findAll(function(validator)
+{var notValid=!validator.isValid;var inGroup=group&&validator.group==group;var noGroup=validator.group==null;return notValid&&(inGroup||noGroup);});return validators;},updateSummary:function(group,refresh)
+{var validators=this.getValidatorsWithError(group);this.summaries.each(function(summary)
+{var inGroup=group&&summary.group==group;var noGroup=!group&&!summary.group;if(inGroup||noGroup)
+summary.updateSummary(validators,refresh);else
+summary.hideSummary(true);});}};Prado.WebUI.TValidationSummary=Class.create();Prado.WebUI.TValidationSummary.prototype={group:null,options:{},visible:false,messages:null,initialize:function(options)
+{this.options=options;this.group=options.ValidationGroup;this.messages=$(options.ID);this.visible=this.messages.style.visibility!="hidden"
+this.visible=this.visible&&this.messages.style.display!="none";Prado.Validation.addSummary(options.FormID,this);},updateSummary:function(validators,update)
+{if(validators.length<=0)
+{if(update||this.options.Refresh!=false)
+{return this.hideSummary(validators);}
+return;}
+var refresh=update||this.visible==false||this.options.Refresh!=false;if(this.options.ShowSummary!=false&&refresh)
+{this.updateHTMLMessages(this.getMessages(validators));this.showSummary(validators);}
+if(this.options.ScrollToSummary!=false)
+window.scrollTo(this.messages.offsetLeft-20,this.messages.offsetTop-20);if(this.options.ShowMessageBox==true&&refresh)
+{this.alertMessages(this.getMessages(validators));this.visible=true;}},updateHTMLMessages:function(messages)
+{while(this.messages.childNodes.length>0)
+this.messages.removeChild(this.messages.lastChild);new Insertion.Bottom(this.messages,this.formatSummary(messages));},alertMessages:function(messages)
+{var text=this.formatMessageBox(messages);setTimeout(function(){alert(text);},20);},getMessages:function(validators)
+{var messages=[];validators.each(function(validator)
+{var message=validator.getErrorMessage();if(typeof(message)=='string'&&message.length>0)
+messages.push(message);})
+return messages;},hideSummary:function(validators)
+{if(typeof(this.options.OnHideSummary)=="function")
+{this.messages.style.visibility="visible";this.options.OnHideSummary(this,validators)}
+else
+{this.messages.style.visibility="hidden";if(this.options.Display=="None"||this.options.Display=="Dynamic")
+this.messages.hide();}
+this.visible=false;},showSummary:function(validators)
+{this.messages.style.visibility="visible";if(typeof(this.options.OnShowSummary)=="function")
+this.options.OnShowSummary(this,validators);else
+this.messages.show();this.visible=true;},formats:function(type)
+{switch(type)
+{case"List":return{header:"<br />",first:"",pre:"",post:"<br />",last:""};case"SingleParagraph":return{header:" ",first:"",pre:"",post:" ",last:"<br />"};case"BulletList":default:return{header:"",first:"<ul>",pre:"<li>",post:"</li>",last:"</ul>"};}},formatSummary:function(messages)
+{var format=this.formats(this.options.DisplayMode);var output=this.options.HeaderText?this.options.HeaderText+format.header:"";output+=format.first;messages.each(function(message)
+{output+=message.length>0?format.pre+message+format.post:"";});output+=format.last;return output;},formatMessageBox:function(messages)
+{var output=this.options.HeaderText?this.options.HeaderText+"\n":"";for(var i=0;i<messages.length;i++)
+{switch(this.options.DisplayMode)
+{case"List":output+=messages[i]+"\n";break;case"BulletList":default:output+=" - "+messages[i]+"\n";break;case"SingleParagraph":output+=messages[i]+" ";break;}}
+return output;}};Prado.WebUI.TBaseValidator=Class.create();Prado.WebUI.TBaseValidator.prototype={enabled:true,visible:false,isValid:true,options:{},_isObserving:{},group:null,manager:null,message:null,initialize:function(options)
+{this.options=options;this.control=$(options.ControlToValidate);this.message=$(options.ID);this.group=options.ValidationGroup;this.manager=Prado.Validation.addValidator(options.FormID,this);},getErrorMessage:function()
+{return this.options.ErrorMessage;},updateControl:function()
+{if(this.message)
+{if(this.options.Display=="Dynamic")
+this.isValid?this.message.hide():this.message.show();this.message.style.visibility=this.isValid?"hidden":"visible";}
if(this.control)
-this.updateControlCssClass(this.control, this.isValid);
-if(this.options.FocusOnError && !this.isValid)
-Prado.Element.focus(this.options.FocusElementID);
-this.visible = true;
-},
-updateControlCssClass : function(control, valid)
-{
-var CssClass = this.options.ControlCssClass;
-if(typeof(CssClass) == "string" && CssClass.length > 0)
-{
-if(valid)
-control.removeClassName(CssClass);
-else
-control.addClassName(CssClass);
-}
-},
-hide : function()
-{
-this.isValid = true;
-this.updateControl();
-this.visible = false;
-},
-validate : function(invoker)
-{
-if(typeof(this.options.OnValidate) == "function")
-this.options.OnValidate(this, invoker);
-if(this.enabled)
-this.isValid = this.evaluateIsValid();
-if(this.isValid)
-{
-if(typeof(this.options.OnSuccess) == "function")
-{
-this.visible = true;
-this.message.style.visibility = "visible";
-this.updateControlCssClass(this.control, this.isValid);
-this.options.OnSuccess(this, invoker);
-}
-else
-this.updateControl();
-}
-else
-{
-if(typeof(this.options.OnError) == "function")
-{
-this.visible = true;
-this.message.style.visibility = "visible";
-this.updateControlCssClass(this.control, this.isValid);
-this.options.OnError(this, invoker);
-}
-else
-this.updateControl();
-}
-this.observeChanges(this.control);
-return this.isValid;
-},
-observeChanges : function(control)
-{
-if(!control) return;
-var canObserveChanges = this.options.ObserveChanges != false;
-var currentlyObserving = this._isObserving[control.id+this.options.ID];
-if(canObserveChanges && !currentlyObserving)
-{
-var validator = this;
-Event.observe(control, 'change', function()
-{
-if(validator.visible)
-{
-validator.validate();
-validator.manager.updateSummary(validator.group);
-}
-});
-this._isObserving[control.id+this.options.ID] = true;
-}
-},
-trim : function(value)
-{
-return typeof(value) == "string" ? value.trim() : "";
-},
-convert : function(dataType, value)
-{
-if(typeof(value) == "undefined")
-value = this.getValidationValue();
-var string = new String(value);
-switch(dataType)
-{
-case "Integer":
-return string.toInteger();
-case "Double" :
-case "Float" :
-return string.toDouble(this.options.DecimalChar);
-case "Date":
-if(typeof(value) != "string")
-return value;
-else
-{
-var value = string.toDate(this.options.DateFormat);
-if(value && typeof(value.getTime) == "function")
-return value.getTime();
-else
-return null;
-}
-case "String":
-return string.toString();
-}
-return value;
-},
-getValidationValue : function(control)
- {
- if(!control)
- control = this.control
- switch(this.options.ControlType)
- {
- case 'TDatePicker':
- if(control.type == "text")
- return this.trim($F(control));
- else
- {
- this.observeDatePickerChanges();
-return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime();
- }
- case 'THtmlArea':
- if(typeof tinyMCE != "undefined")
-tinyMCE.triggerSave();
-return this.trim($F(control));
- default:
- if(this.isListControlType())
- return this.getFirstSelectedListValue();
- else
- return this.trim($F(control));
- }
- },
-observeDatePickerChanges : function()
- {
- if(Prado.Browser().ie)
- {
- var DatePicker = Prado.WebUI.TDatePicker;
- this.observeChanges(DatePicker.getDayListControl(this.control));
-this.observeChanges(DatePicker.getMonthListControl(this.control));
-this.observeChanges(DatePicker.getYearListControl(this.control));
- }
- },
-getSelectedValuesAndChecks : function(elements, initialValue)
-{
-var checked = 0;
-var values = [];
-var isSelected = this.isCheckBoxType(elements[0]) ? 'checked' : 'selected';
-elements.each(function(element)
-{
-if(element[isSelected] && element.value != initialValue)
-{
-checked++;
-values.push(element.value);
-}
-});
-return {'checks' : checked, 'values' : values};
-},
-getListElements : function()
-{
+this.updateControlCssClass(this.control,this.isValid);if(this.options.FocusOnError&&!this.isValid)
+Prado.Element.focus(this.options.FocusElementID);this.visible=true;},updateControlCssClass:function(control,valid)
+{var CssClass=this.options.ControlCssClass;if(typeof(CssClass)=="string"&&CssClass.length>0)
+{if(valid)
+control.removeClassName(CssClass);else
+control.addClassName(CssClass);}},hide:function()
+{this.isValid=true;this.updateControl();this.visible=false;},validate:function(invoker)
+{if(typeof(this.options.OnValidate)=="function")
+this.options.OnValidate(this,invoker);if(this.enabled)
+this.isValid=this.evaluateIsValid();if(this.isValid)
+{if(typeof(this.options.OnSuccess)=="function")
+{this.visible=true;this.message.style.visibility="visible";this.updateControlCssClass(this.control,this.isValid);this.options.OnSuccess(this,invoker);}
+else
+this.updateControl();}
+else
+{if(typeof(this.options.OnError)=="function")
+{this.visible=true;this.message.style.visibility="visible";this.updateControlCssClass(this.control,this.isValid);this.options.OnError(this,invoker);}
+else
+this.updateControl();}
+this.observeChanges(this.control);return this.isValid;},observeChanges:function(control)
+{if(!control)return;var canObserveChanges=this.options.ObserveChanges!=false;var currentlyObserving=this._isObserving[control.id+this.options.ID];if(canObserveChanges&&!currentlyObserving)
+{var validator=this;Event.observe(control,'change',function()
+{if(validator.visible)
+{validator.validate();validator.manager.updateSummary(validator.group);}});this._isObserving[control.id+this.options.ID]=true;}},trim:function(value)
+{return typeof(value)=="string"?value.trim():"";},convert:function(dataType,value)
+{if(typeof(value)=="undefined")
+value=this.getValidationValue();var string=new String(value);switch(dataType)
+{case"Integer":return string.toInteger();case"Double":case"Float":return string.toDouble(this.options.DecimalChar);case"Date":if(typeof(value)!="string")
+return value;else
+{var value=string.toDate(this.options.DateFormat);if(value&&typeof(value.getTime)=="function")
+return value.getTime();else
+return null;}
+case"String":return string.toString();}
+return value;},getValidationValue:function(control)
+{if(!control)
+control=this.control
switch(this.options.ControlType)
-{
-case 'TCheckBoxList': case 'TRadioButtonList':
-var elements = [];
-for(var i = 0; i < this.options.TotalItems; i++)
-{
-var element = $(this.options.ControlToValidate+"_"+i);
-if(this.isCheckBoxType(element))
-elements.push(element);
-}
-return elements;
-case 'TListBox':
-var elements = [];
-var element = $(this.options.ControlToValidate);
-if(element && (type = element.type.toLowerCase()))
-{
-if(type == "select-one" || type == "select-multiple")
-elements = $A(element.options);
-}
-return elements;
-default:
-return [];
-}
-},
-isCheckBoxType : function(element)
-{
-if(element && element.type)
-{
-var type = element.type.toLowerCase();
-return type == "checkbox" || type == "radio";
-}
-return false;
-},
-isListControlType : function()
-{
-var list = ['TCheckBoxList', 'TRadioButtonList', 'TListBox'];
-return list.include(this.options.ControlType);
-},
-getFirstSelectedListValue : function()
-{
-var initial = "";
-if(typeof(this.options.InitialValue) != "undefined")
-initial = this.options.InitialValue;
-var elements = this.getListElements();
-var selection = this.getSelectedValuesAndChecks(elements, initial);
-return selection.values.length > 0 ? selection.values[0] : initial;
-}
-}
-Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var inputType = this.control.getAttribute("type");
-if(inputType == 'file')
-{
-return true;
-}
-else
-{
-var a = this.getValidationValue();
-var b = this.trim(this.options.InitialValue);
-return(a != b);
-}
-}
-});
-Prado.WebUI.TCompareValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var value = this.getValidationValue();
-if (value.length <= 0)
-return true;
-var comparee = $(this.options.ControlToCompare);
-if(comparee)
-var compareTo = this.getValidationValue(comparee);
-else
-var compareTo = this.options.ValueToCompare || "";
-var isValid =this.compare(value, compareTo);
-if(comparee)
-{
-this.updateControlCssClass(comparee, isValid);
-this.observeChanges(comparee);
-}
-return isValid;
-},
-compare : function(operand1, operand2)
-{
-var op1, op2;
-if((op1 = this.convert(this.options.DataType, operand1)) == null)
-return false;
-if ((op2 = this.convert(this.options.DataType, operand2)) == null)
-return true;
-switch (this.options.Operator)
-{
-case "NotEqual":
-return (op1 != op2);
-case "GreaterThan":
-return (op1 > op2);
-case "GreaterThanEqual":
-return (op1 >= op2);
-case "LessThan":
-return (op1 < op2);
-case "LessThanEqual":
-return (op1 <= op2);
-default:
-return (op1 == op2);
-}
-}
-});
-Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var value = this.getValidationValue();
-var clientFunction = this.options.ClientValidationFunction;
-if(typeof(clientFunction) == "string" && clientFunction.length > 0)
-{
-validate = clientFunction.toFunction();
-return validate(this, value);
-}
-return true;
-}
-});
-Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var value = this.getValidationValue();
-if(value.length <= 0)
-return true;
-if(typeof(this.options.DataType) == "undefined")
-this.options.DataType = "String";
-var min = this.convert(this.options.DataType, this.options.MinValue || null);
-var max = this.convert(this.options.DataType, this.options.MaxValue || null);
-value = this.convert(this.options.DataType, value);
-if(value == null)
-return false;
-var valid = true;
-if(min != null)
-valid = valid && value >= min;
-if(max != null)
-valid = valid && value <= max;
-return valid;
-}
-});
-Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var value = this.getValidationValue();
-if (value.length <= 0)
-return true;
-var rx = new RegExp(this.options.ValidationExpression);
-var matches = rx.exec(value);
-return (matches != null && value == matches[0]);
-}
-});
-Prado.WebUI.TEmailAddressValidator = Prado.WebUI.TRegularExpressionValidator;
-Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var elements = this.getListElements();
-if(elements && elements.length <= 0)
-return true;
-this.observeListElements(elements);
-var selection = this.getSelectedValuesAndChecks(elements);
-return this.isValidList(selection.checks, selection.values);
-},
-observeListElements : function(elements)
- {
-if(Prado.Browser().ie && this.isCheckBoxType(elements[0]))
-{
-var validator = this;
-elements.each(function(element)
-{
-validator.observeChanges(element);
-});
-}
- },
-isValidList : function(checked, values)
-{
-var exists = true;
-var required = this.getRequiredValues();
-if(required.length > 0)
-{
-if(values.length < required.length)
-return false;
-required.each(function(requiredValue)
-{
-exists = exists && values.include(requiredValue);
-});
-}
-var min = typeof(this.options.Min) == "undefined" ?
-Number.NEGATIVE_INFINITY : this.options.Min;
-var max = typeof(this.options.Max) == "undefined" ?
-Number.POSITIVE_INFINITY : this.options.Max;
-return exists && checked >= min && checked <= max;
-},
-getRequiredValues : function()
-{
-var required = [];
-if(this.options.Required && this.options.Required.length > 0)
-required = this.options.Required.split(/,\s*/);
-return required;
-}
-});
-Prado.WebUI.TDataTypeValidator = Class.extend(Prado.WebUI.TBaseValidator,
-{
-evaluateIsValid : function()
-{
-var value = this.getValidationValue();
-if(value.length <= 0)
-return true;
-return this.convert(this.options.DataType, value) != null;
-}
-});
+{case'TDatePicker':if(control.type=="text")
+return this.trim($F(control));else
+{this.observeDatePickerChanges();return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime();}
+case'THtmlArea':if(typeof tinyMCE!="undefined")
+tinyMCE.triggerSave();return this.trim($F(control));default:if(this.isListControlType())
+return this.getFirstSelectedListValue();else
+return this.trim($F(control));}},observeDatePickerChanges:function()
+{if(Prado.Browser().ie)
+{var DatePicker=Prado.WebUI.TDatePicker;this.observeChanges(DatePicker.getDayListControl(this.control));this.observeChanges(DatePicker.getMonthListControl(this.control));this.observeChanges(DatePicker.getYearListControl(this.control));}},getSelectedValuesAndChecks:function(elements,initialValue)
+{var checked=0;var values=[];var isSelected=this.isCheckBoxType(elements[0])?'checked':'selected';elements.each(function(element)
+{if(element[isSelected]&&element.value!=initialValue)
+{checked++;values.push(element.value);}});return{'checks':checked,'values':values};},getListElements:function()
+{switch(this.options.ControlType)
+{case'TCheckBoxList':case'TRadioButtonList':var elements=[];for(var i=0;i<this.options.TotalItems;i++)
+{var element=$(this.options.ControlToValidate+"_"+i);if(this.isCheckBoxType(element))
+elements.push(element);}
+return elements;case'TListBox':var elements=[];var element=$(this.options.ControlToValidate);if(element&&(type=element.type.toLowerCase()))
+{if(type=="select-one"||type=="select-multiple")
+elements=$A(element.options);}
+return elements;default:return[];}},isCheckBoxType:function(element)
+{if(element&&element.type)
+{var type=element.type.toLowerCase();return type=="checkbox"||type=="radio";}
+return false;},isListControlType:function()
+{var list=['TCheckBoxList','TRadioButtonList','TListBox'];return list.include(this.options.ControlType);},getFirstSelectedListValue:function()
+{var initial="";if(typeof(this.options.InitialValue)!="undefined")
+initial=this.options.InitialValue;var elements=this.getListElements();var selection=this.getSelectedValuesAndChecks(elements,initial);return selection.values.length>0?selection.values[0]:initial;}}
+Prado.WebUI.TRequiredFieldValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var inputType=this.control.getAttribute("type");if(inputType=='file')
+{return true;}
+else
+{var a=this.getValidationValue();var b=this.trim(this.options.InitialValue);return(a!=b);}}});Prado.WebUI.TCompareValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var value=this.getValidationValue();if(value.length<=0)
+return true;var comparee=$(this.options.ControlToCompare);if(comparee)
+var compareTo=this.getValidationValue(comparee);else
+var compareTo=this.options.ValueToCompare||"";var isValid=this.compare(value,compareTo);if(comparee)
+{this.updateControlCssClass(comparee,isValid);this.observeChanges(comparee);}
+return isValid;},compare:function(operand1,operand2)
+{var op1,op2;if((op1=this.convert(this.options.DataType,operand1))==null)
+return false;if((op2=this.convert(this.options.DataType,operand2))==null)
+return true;switch(this.options.Operator)
+{case"NotEqual":return(op1!=op2);case"GreaterThan":return(op1>op2);case"GreaterThanEqual":return(op1>=op2);case"LessThan":return(op1<op2);case"LessThanEqual":return(op1<=op2);default:return(op1==op2);}}});Prado.WebUI.TCustomValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var value=this.getValidationValue();var clientFunction=this.options.ClientValidationFunction;if(typeof(clientFunction)=="string"&&clientFunction.length>0)
+{validate=clientFunction.toFunction();return validate(this,value);}
+return true;}});Prado.WebUI.TRangeValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var value=this.getValidationValue();if(value.length<=0)
+return true;if(typeof(this.options.DataType)=="undefined")
+this.options.DataType="String";var min=this.convert(this.options.DataType,this.options.MinValue||null);var max=this.convert(this.options.DataType,this.options.MaxValue||null);value=this.convert(this.options.DataType,value);if(value==null)
+return false;var valid=true;if(min!=null)
+valid=valid&&value>=min;if(max!=null)
+valid=valid&&value<=max;return valid;}});Prado.WebUI.TRegularExpressionValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var value=this.getValidationValue();if(value.length<=0)
+return true;var rx=new RegExp(this.options.ValidationExpression);var matches=rx.exec(value);return(matches!=null&&value==matches[0]);}});Prado.WebUI.TEmailAddressValidator=Prado.WebUI.TRegularExpressionValidator;Prado.WebUI.TListControlValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var elements=this.getListElements();if(elements&&elements.length<=0)
+return true;this.observeListElements(elements);var selection=this.getSelectedValuesAndChecks(elements);return this.isValidList(selection.checks,selection.values);},observeListElements:function(elements)
+{if(Prado.Browser().ie&&this.isCheckBoxType(elements[0]))
+{var validator=this;elements.each(function(element)
+{validator.observeChanges(element);});}},isValidList:function(checked,values)
+{var exists=true;var required=this.getRequiredValues();if(required.length>0)
+{if(values.length<required.length)
+return false;required.each(function(requiredValue)
+{exists=exists&&values.include(requiredValue);});}
+var min=typeof(this.options.Min)=="undefined"?Number.NEGATIVE_INFINITY:this.options.Min;var max=typeof(this.options.Max)=="undefined"?Number.POSITIVE_INFINITY:this.options.Max;return exists&&checked>=min&&checked<=max;},getRequiredValues:function()
+{var required=[];if(this.options.Required&&this.options.Required.length>0)
+required=this.options.Required.split(/,\s*/);return required;}});Prado.WebUI.TDataTypeValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
+{var value=this.getValidationValue();if(value.length<=0)
+return true;return this.convert(this.options.DataType,value)!=null;}}); \ No newline at end of file
diff --git a/framework/Web/THttpResponse.php b/framework/Web/THttpResponse.php
index 261c34ed..ce4bf4b1 100644
--- a/framework/Web/THttpResponse.php
+++ b/framework/Web/THttpResponse.php
@@ -285,6 +285,16 @@ class THttpResponse extends TModule implements ITextWriter
}
/**
+ * Reloads the current page.
+ * The effect of this method call is the same as user pressing the
+ * refresh button on his browser (without post data).
+ **/
+ public function reload()
+ {
+ $this->redirect($this->getRequest()->getRequestUri());
+ }
+
+ /**
* Outputs the buffered content, sends content-type and charset header.
*/
public function flush()
diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php
index 90070a5a..5f75caf3 100644
--- a/framework/Web/UI/TTemplateManager.php
+++ b/framework/Web/UI/TTemplateManager.php
@@ -151,7 +151,7 @@ class TTemplateManager extends TModule
class TTemplate extends TApplicationComponent implements ITemplate
{
/**
- * '<!.*?!>' - template comments
+ * '<!--.*?--!>' - template comments
* '<!--.*?-->' - HTML comments
* '<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>' - component tags
* '<\/?prop:([\w\.]+)\s*>' - property tags
@@ -638,17 +638,17 @@ class TTemplate extends TApplicationComponent implements ITemplate
$expectPropEnd=false;
}
}
- else if(strpos($str,'<!--')===0) // HTML comments
+ else if(strpos($str,'<!--')===0) // comments
{
- // do nothing
- }
- else if(strpos($str,'<!')===0) // template comments
- {
- if($expectPropEnd)
- throw new TConfigurationException('template_comments_forbidden');
- if($matchStart>$textStart)
- $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));
- $textStart=$matchEnd+1;
+ if(strrpos($str,'--!>')===strlen($str)-4) // template comments
+ {
+ if($expectPropEnd)
+ throw new TConfigurationException('template_comments_forbidden');
+ if($matchStart>$textStart)
+ $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));
+ $textStart=$matchEnd+1;
+ }
+ // else, HTML comments and we do nothing
}
else
throw new TConfigurationException('template_matching_unexpected',$match);