summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes25
-rw-r--r--HISTORY3
-rw-r--r--buildscripts/jsbuilder/build.php37
-rw-r--r--buildscripts/jsbuilder/custom_rhino.jarbin731885 -> 0 bytes
-rw-r--r--buildscripts/jsbuilder/packer.js539
-rw-r--r--framework/Web/Javascripts/effects/CHANGELOG1389
-rw-r--r--framework/Web/Javascripts/effects/MIT-LICENSE38
-rw-r--r--framework/Web/Javascripts/effects/README112
-rw-r--r--framework/Web/Javascripts/effects/controls.js81
-rw-r--r--framework/Web/Javascripts/effects/dragdrop.js464
-rw-r--r--framework/Web/Javascripts/effects/effects.js395
-rw-r--r--framework/Web/Javascripts/effects/slider.js4
-rw-r--r--framework/Web/Javascripts/extended/base.js43
-rw-r--r--framework/Web/Javascripts/extended/builder.js1
-rw-r--r--framework/Web/Javascripts/extended/dom.js7
-rw-r--r--framework/Web/Javascripts/extended/event.js64
-rw-r--r--framework/Web/Javascripts/extended/string.js13
-rw-r--r--framework/Web/Javascripts/extended/util.js91
-rw-r--r--framework/Web/Javascripts/extra/logger.js2
-rw-r--r--framework/Web/Javascripts/js/ajax.js3867
-rw-r--r--framework/Web/Javascripts/js/colorpicker.js984
-rw-r--r--framework/Web/Javascripts/js/datepicker.js845
-rw-r--r--framework/Web/Javascripts/js/effects.js1490
-rw-r--r--framework/Web/Javascripts/js/logger.js925
-rw-r--r--framework/Web/Javascripts/js/prado.js3939
-rw-r--r--framework/Web/Javascripts/js/rico.js2553
-rw-r--r--framework/Web/Javascripts/js/validator.js994
-rw-r--r--framework/Web/Javascripts/prado/controls.js82
-rw-r--r--framework/Web/Javascripts/prado/element.js68
-rw-r--r--framework/Web/Javascripts/prado/form.js23
-rw-r--r--framework/Web/Javascripts/prado/validation3.js918
-rw-r--r--framework/Web/Javascripts/prototype/ajax.js13
-rw-r--r--framework/Web/Javascripts/prototype/array.js18
-rw-r--r--framework/Web/Javascripts/prototype/base.js21
-rw-r--r--framework/Web/Javascripts/prototype/dom.js93
-rw-r--r--framework/Web/Javascripts/prototype/enumerable.js7
-rw-r--r--framework/Web/Javascripts/prototype/event.js3
-rw-r--r--framework/Web/Javascripts/prototype/form.js16
-rw-r--r--framework/Web/Javascripts/prototype/hash.js2
-rw-r--r--framework/Web/Javascripts/prototype/prototype.js43
-rw-r--r--framework/Web/Javascripts/prototype/selector.js110
-rw-r--r--framework/Web/Javascripts/prototype/string.js69
-rw-r--r--framework/Web/UI/WebControls/TBaseValidator.php26
-rw-r--r--framework/Web/UI/WebControls/TButton.php1
-rw-r--r--framework/Web/UI/WebControls/TCompareValidator.php13
-rw-r--r--framework/Web/UI/WebControls/TCustomValidator.php2
-rw-r--r--framework/Web/UI/WebControls/TRangeValidator.php8
-rw-r--r--framework/Web/UI/WebControls/TRegularExpressionValidator.php2
-rw-r--r--framework/Web/UI/WebControls/TRequiredFieldValidator.php2
-rw-r--r--framework/Web/UI/WebControls/TValidationSummary.php20
-rw-r--r--tests/FunctionalTests/validators/protected/pages/CausesValidation.page11
-rw-r--r--tests/FunctionalTests/validators/protected/pages/CompareValidator.page31
-rw-r--r--tests/FunctionalTests/validators/protected/pages/CustomValidator.page26
-rw-r--r--tests/FunctionalTests/validators/protected/pages/CustomValidator.php14
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page48
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page45
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page45
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page45
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page22
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page108
-rw-r--r--tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page57
-rw-r--r--tests/FunctionalTests/validators/protected/pages/ValidationSummary.page83
-rw-r--r--tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php47
-rw-r--r--tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php31
-rw-r--r--tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php167
-rw-r--r--tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php34
-rw-r--r--tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php87
-rw-r--r--tests/FunctionalTests/validators/tests/RequiredListTestCase.php40
-rw-r--r--tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php50
69 files changed, 11824 insertions, 9632 deletions
diff --git a/.gitattributes b/.gitattributes
index 72c2ee97..b674499e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,8 +5,6 @@
/build.xml -text
buildscripts/.htaccess -text
buildscripts/jsbuilder/build.php -text
-buildscripts/jsbuilder/custom_rhino.jar -text
-buildscripts/jsbuilder/packer.js -text
buildscripts/phing/style/coverage-frames.xsl -text
buildscripts/phing/style/log.xsl -text
buildscripts/phing/style/phpunit2-frames.xsl -text
@@ -689,10 +687,8 @@ framework/Web/Javascripts/effects/slider.js -text
framework/Web/Javascripts/extended/base.js -text
framework/Web/Javascripts/extended/builder.js -text
framework/Web/Javascripts/extended/date.js -text
-framework/Web/Javascripts/extended/dom.js -text
framework/Web/Javascripts/extended/event.js -text
framework/Web/Javascripts/extended/string.js -text
-framework/Web/Javascripts/extended/util.js -text
framework/Web/Javascripts/extra/behaviour.js -text
framework/Web/Javascripts/extra/getElementsBySelector.js -text
framework/Web/Javascripts/extra/json.js -text
@@ -713,6 +709,7 @@ framework/Web/Javascripts/prado/element.js -text
framework/Web/Javascripts/prado/form.js -text
framework/Web/Javascripts/prado/prado.js -text
framework/Web/Javascripts/prado/validation.js -text
+framework/Web/Javascripts/prado/validation3.js -text
framework/Web/Javascripts/prado/validators.js -text
framework/Web/Javascripts/prototype/AUTHORS -text
framework/Web/Javascripts/prototype/LICENSE -text
@@ -729,6 +726,7 @@ framework/Web/Javascripts/prototype/hash.js -text
framework/Web/Javascripts/prototype/position.js -text
framework/Web/Javascripts/prototype/prototype.js -text
framework/Web/Javascripts/prototype/range.js -text
+framework/Web/Javascripts/prototype/selector.js -text
framework/Web/Javascripts/prototype/string.js -text
framework/Web/Javascripts/ratings/blocks.css -text
framework/Web/Javascripts/ratings/blocks.png -text
@@ -987,19 +985,38 @@ tests/FunctionalTests/validators.php -text
tests/FunctionalTests/validators/index.php -text
tests/FunctionalTests/validators/protected/pages/Button.page -text
tests/FunctionalTests/validators/protected/pages/Button.php -text
+tests/FunctionalTests/validators/protected/pages/CausesValidation.page -text
tests/FunctionalTests/validators/protected/pages/CheckBox.page -text
tests/FunctionalTests/validators/protected/pages/CheckBox.php -text
+tests/FunctionalTests/validators/protected/pages/CompareValidator.page -text
+tests/FunctionalTests/validators/protected/pages/CustomValidator.page -text
+tests/FunctionalTests/validators/protected/pages/CustomValidator.php -text
tests/FunctionalTests/validators/protected/pages/ImageButton.page -text
tests/FunctionalTests/validators/protected/pages/ImageButton.php -text
tests/FunctionalTests/validators/protected/pages/Layout.php -text
tests/FunctionalTests/validators/protected/pages/Layout.tpl -text
tests/FunctionalTests/validators/protected/pages/LinkButton.page -text
tests/FunctionalTests/validators/protected/pages/LinkButton.php -text
+tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page -text
+tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page -text
+tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page -text
+tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page -text
+tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page -text
+tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page -text
+tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page -text
+tests/FunctionalTests/validators/protected/pages/ValidationSummary.page -text
tests/FunctionalTests/validators/protected/pages/config.xml -text
tests/FunctionalTests/validators/tests/ButtonTestCase.php -text
tests/FunctionalTests/validators/tests/CheckBoxTestCase.php -text
+tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php -text
+tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php -text
tests/FunctionalTests/validators/tests/ImageButtonTestCase.php -text
tests/FunctionalTests/validators/tests/LinkButtonTestCase.php -text
+tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php -text
+tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php -text
+tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php -text
+tests/FunctionalTests/validators/tests/RequiredListTestCase.php -text
+tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php -text
tests/UnitTests/TODO.txt -text
tests/UnitTests/framework/Collections/utList.php -text
tests/UnitTests/framework/Collections/utMap.php -text
diff --git a/HISTORY b/HISTORY
index cd83b634..a20dcbc6 100644
--- a/HISTORY
+++ b/HISTORY
@@ -11,6 +11,9 @@ BUG: TWizard did not stop navigation upon a validation failure (Qiang)
ENH: TButton, TImageButton and TLinkButton now implement IButtonControl interface (Qiang)
ENH: TResponse::writeFile takes two additional parameters to allow sending memory data (Qiang)
ENH: TButtonColumn can now be a column of image buttons (Qiang)
+CHG: Rewrote client-side javascript validators, check your client-side validation behaviour (Wei)
+CHG: Updated the javascript Prototype library, a few utilties functions REMOVED, may break your existing javascript code. (Wei)
+CHG: Build javascript without compression, only comments are removed. (Wei)
Version 3.0RC2 April 16, 2006
=============================
diff --git a/buildscripts/jsbuilder/build.php b/buildscripts/jsbuilder/build.php
index 6689d2c6..d5d04713 100644
--- a/buildscripts/jsbuilder/build.php
+++ b/buildscripts/jsbuilder/build.php
@@ -6,9 +6,6 @@
* This script compresses a list of javascript source files
* and merges them into a few for redistribution.
*
- * This script should be run from command line with PHP.
- * JRE 1.4 or above is required in order to run the js compression program.
- *
* By default, all libraries will be built.
* You may, however, specify one or several to be built (to save time during development).
* To do so, pass the library names (without .js) as command line arguments.
@@ -22,12 +19,6 @@
* @package Tools
*/
-//compress using a script, has more options but lesss robut
-//define('COMPRESS_COMMAND','java -jar '.dirname(__FILE__).'/custom_rhino.jar packer.js %s > %s');
-
-//compress using build-in engine, very robust.
-define('COMPRESS_COMMAND','java -jar '.dirname(__FILE__).'/custom_rhino.jar -c %s > %s');
-
/**
* The root directory for storing all source js files
*/
@@ -51,7 +42,6 @@ $libraries = array(
//base javascript functions
'prototype/prototype.js',
'prototype/base.js',
- 'extended/util.js',
'extended/base.js',
'prototype/string.js',
'extended/string.js',
@@ -62,12 +52,14 @@ $libraries = array(
//dom functions
'prototype/dom.js',
- 'extended/dom.js',
'prototype/form.js',
'prototype/event.js',
'extended/event.js',
'prototype/position.js',
+ //element selectors
+ 'prototype/selector.js',
+
//build dom elements with DIV, A, UL, etc functions
'effects/builder.js',
'extended/builder.js',
@@ -114,8 +106,8 @@ $libraries = array(
//validator
'validator.js' => array(
- 'prado/validation.js',
- 'prado/validators.js'
+ 'prado/validation3.js'
+ //'prado/validators.js'
),
//date picker
@@ -157,15 +149,24 @@ foreach($libraries as $libFile => $sourceFiles)
echo "...adding $sourceFile\n";
$contents.=file_get_contents($sourceFile)."\n\n";
}
- $tempFile=$libFile.'.tmp';
- file_put_contents($tempFile,$contents);
- $command=sprintf(COMPRESS_COMMAND,$tempFile,$libFile);
- system($command);
- @unlink($tempFile);
+
+ file_put_contents($libFile,compress_js($contents));
+ echo "Saving file {$libFile}\n";
$builds++;
}
if($builds > 0)
echo "\nJavascript build complete, {$builds} file(s) compressed.";
else
echo "No files to build.";
+
+//remove comments from javascript files.
+function compress_js($string)
+{
+ $string = preg_replace('/\/\/[^\n\r]*[\n\r]/', ' ', $string);
+ $string = preg_replace('/\/\*[^*]*\*+([^\/][^*]*\*+)*\//', ' ', $string);
+ $string = preg_replace('/ |\t|\r/', '', $string);
+ $string = preg_replace('/(\n[ \t]*){2,}/', "\n", $string);
+ return $string;
+}
+
?> \ No newline at end of file
diff --git a/buildscripts/jsbuilder/custom_rhino.jar b/buildscripts/jsbuilder/custom_rhino.jar
deleted file mode 100644
index 4a97cdeb..00000000
--- a/buildscripts/jsbuilder/custom_rhino.jar
+++ /dev/null
Binary files differ
diff --git a/buildscripts/jsbuilder/packer.js b/buildscripts/jsbuilder/packer.js
deleted file mode 100644
index d261be35..00000000
--- a/buildscripts/jsbuilder/packer.js
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- common, version 1.0.4a (2005/06/07)
- Copyright 2005, Dean Edwards
- License: http://creativecommons.org/licenses/LGPL/2.1/
-*/
-
-// this function may be used to cast any javascript object
-// to a common object
-function ICommon(that) {
- if (that != null) {
- that.inherit = Common.prototype.inherit;
- that.specialize = Common.prototype.specialize;
- }
- return that;
-};
-
-// sub-classing
-ICommon.specialize = function($prototype, $constructor) {
- // initialise class properties
- if (!$prototype) $prototype = {};
- if (!$constructor) $constructor = $prototype.constructor;
- if ($constructor == {}.constructor) $constructor = new Function;
- // build the inheritance chain
- // insert a dummy constructor between the ancestor
- // and the new constructor. this allows standard
- // prototype inheritance plus chained constructor
- // functions.
- $constructor.valueOf = new Function("return this");
- $constructor.valueOf.prototype = new this.valueOf;
- $constructor.valueOf.prototype.specialize($prototype);
- $constructor.prototype = new $constructor.valueOf;
- $constructor.valueOf.prototype.constructor = $constructor;
- $constructor.prototype.constructor = $constructor;
- $constructor.ancestor = this;
- $constructor.specialize = arguments.callee;
- $constructor.ancestorOf = this.ancestorOf;
- return $constructor;
-};
-
-// root of the inheritance chain
-ICommon.valueOf = new Function("return this");
-
-// common interface
-ICommon.valueOf.prototype = {
-constructor: ICommon,
-inherit: function() {
-//-
-// Call this method from any other method to call that method's ancestor.
-// If there is no ancestor function then this function will throw an error.
-//-
- return arguments.callee.caller.ancestor.apply(this, arguments);
-},
-specialize: function(that) {
-//-
-// Add the interface of another object to this object
-//-
- // if this object is the prototype then specialize the /real/ prototype
- if (this == this.constructor.prototype && this.constructor.specialize) {
- return this.constructor.valueOf.prototype.specialize(that);
- }
- // add each of one of the source object's properties to this object
- for (var i in that) {
- switch (i) {
- case "constructor": // don't do this one!
- case "toString": // do this one maually
- case "valueOf": // ignore this one...
- continue;
- }
- // implement inheritance
- if (typeof that[i] == "function" && that[i] != this[i]) {
- that[i].ancestor = this[i];
- }
- // add the property
- this[i] = that[i];
- }
- // do the "toString" function manually
- if (that.toString != this.toString && that.toString != {}.toString) {
- that.toString.ancestor = this.toString;
- this.toString = that.toString;
- }
- return this;
-}};
-
-// create the root
-function Common() {
-//--
-// empty constructor function
-//--
-};
-this.Common = ICommon.specialize({
-constructor: Common,
-toString: function() {
- return "[common " + (this.constructor.className || "Object") + "]";
-},
-instanceOf: function(klass) {
- return this.constructor == klass || klass.ancestorOf(this.constructor);
-}
-});
-Common.className = "Common";
-Common.ancestor = null;
-Common.ancestorOf = function(klass) {
- // Is this class an ancestor of the supplied class?
- while (klass && klass.ancestor != this) klass = klass.ancestor;
- return Boolean(klass);
-};
-
-// preserve the common prototype so that we can tell when a
-// property of the root class has changed
-Common.valueOf.ancestor = ICommon;
-
-// c'est fini!
-
-/*
- ParseMaster, version 1.0.2 (2005-08-19)
- Copyright 2005, Dean Edwards
- License: http://creativecommons.org/licenses/LGPL/2.1/
-*/
-
-/* a multi-pattern parser */
-
-// KNOWN BUG: erroneous behavior when using escapeChar with a replacement value that is a function
-
-function ParseMaster() {
- // constants
- var $EXPRESSION = 0, $REPLACEMENT = 1, $LENGTH = 2;
- // used to determine nesting levels
- var $GROUPS = /\(/g, $SUB_REPLACE = /\$\d/, $INDEXED = /^\$\d+$/,
- $TRIM = /(['"])\1\+(.*)\+\1\1$/, $$ESCAPE = /\\./g, $QUOTE = /'/,
- $$DELETED = /\x01[^\x01]*\x01/g;
- var self = this;
- // public
- this.add = function($expression, $replacement) {
- if (!$replacement) $replacement = "";
- // count the number of sub-expressions
- // - add one because each pattern is itself a sub-expression
- var $length = (_internalEscape(String($expression)).match($GROUPS) || "").length + 1;
- // does the pattern deal with sub-expressions?
- if ($SUB_REPLACE.test($replacement)) {
- // a simple lookup? (e.g. "$2")
- if ($INDEXED.test($replacement)) {
- // store the index (used for fast retrieval of matched strings)
- $replacement = parseInt($replacement.slice(1)) - 1;
- } else { // a complicated lookup (e.g. "Hello $2 $1")
- // build a function to do the lookup
- var i = $length;
- var $quote = $QUOTE.test(_internalEscape($replacement)) ? '"' : "'";
- while (i) $replacement = $replacement.split("$" + i--).join($quote + "+a[o+" + i + "]+" + $quote);
- $replacement = new Function("a,o", "return" + $quote + $replacement.replace($TRIM, "$1") + $quote);
- }
- }
- // pass the modified arguments
- _add($expression || "/^$/", $replacement, $length);
- };
- // execute the global replacement
- this.exec = function($string) {
- _escaped.length = 0;
- return _unescape(_escape($string, this.escapeChar).replace(
- new RegExp(_patterns, this.ignoreCase ? "gi" : "g"), _replacement), this.escapeChar).replace($$DELETED, "");
- };
- // clear the patterns collection so that this object may be re-used
- this.reset = function() {
- _patterns.length = 0;
- };
-
- // private
- var _escaped = []; // escaped characters
- var _patterns = []; // patterns stored by index
- var _toString = function(){return "(" + String(this[$EXPRESSION]).slice(1, -1) + ")"};
- _patterns.toString = function(){return this.join("|")};
- // create and add a new pattern to the patterns collection
- function _add() {
- arguments.toString = _toString;
- // store the pattern - as an arguments object (i think this is quicker..?)
- _patterns[_patterns.length] = arguments;
- }
- // this is the global replace function (it's quite complicated)
- function _replacement() {
- if (!arguments[0]) return "";
- var i = 1, j = 0, $pattern;
- // loop through the patterns
- while ($pattern = _patterns[j++]) {
- // do we have a result?
- if (arguments[i]) {
- var $replacement = $pattern[$REPLACEMENT];
- switch (typeof $replacement) {
- case "function": return $replacement(arguments, i);
- case "number": return arguments[$replacement + i];
- }
- var $delete = (arguments[i].indexOf(self.escapeChar) == -1) ? "" :
- "\x01" + arguments[i] + "\x01";
- return $delete + $replacement;
- // skip over references to sub-expressions
- } else i += $pattern[$LENGTH];
- }
- };
- // encode escaped characters
- function _escape($string, $escapeChar) {
- return $escapeChar ? $string.replace(new RegExp("\\" + $escapeChar + "(.)", "g"), function($match, $char) {
- _escaped[_escaped.length] = $char;
- return $escapeChar;
- }) : $string;
- };
- // decode escaped characters
- function _unescape($string, $escapeChar) {
- var i = 0;
- return $escapeChar ? $string.replace(new RegExp("\\" + $escapeChar, "g"), function() {
- return $escapeChar + (_escaped[i++] || "");
- }) : $string;
- };
- function _internalEscape($string) {
- return $string.replace($$ESCAPE, "");
- };
-};
-ParseMaster.prototype = {
- constructor: ParseMaster,
- ignoreCase: false,
- escapeChar: ""
-};
-
-
-/*
- packer, version 2.0.2 (2005-08-19)
- Copyright 2004-2005, Dean Edwards
- License: http://creativecommons.org/licenses/LGPL/2.1/
-*/
-
-function pack(_script, _encoding, _fastDecode, _specialChars) {
- // constants
- var $IGNORE = "$1";
-
- // validate parameters
- _script += "\n";
- _encoding = Math.min(parseInt(_encoding), 95);
-
- // apply all parsing routines
- function _pack($script) {
- var i, $parse;
- for (i = 0; ($parse = _parsers[i]); i++) {
- $script = $parse($script);
- }
- return $script;
- };
-
- // unpacking function - this is the boot strap function
- // data extracted from this packing routine is passed to
- // this function when decoded in the target
- var _unpack = function($packed, $ascii, $count, $keywords, $encode, $decode) {
- while ($count--)
- if ($keywords[$count])
- $packed = $packed.replace(new RegExp('\\b' + $encode($count) + '\\b', 'g'), $keywords[$count]);
- return $packed;
- };
-
- // code-snippet inserted into the unpacker to speed up decoding
- var _decode = function() {
- // does the browser support String.replace where the
- // replacement value is a function?
- if (!''.replace(/^/, String)) {
- // decode all the values we need
- while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count);
- // global replacement function
- $keywords = [function($encoded){return $decode[$encoded]}];
- // generic match
- $encode = function(){return'\\w+'};
- // reset the loop counter - we are now doing a global replace
- $count = 1;
- }
- };
-
- // keep a list of parsing functions, they'll be executed all at once
- var _parsers = [];
- function _addParser($parser) {
- _parsers[_parsers.length] = $parser;
- };
-
- // zero encoding - just removal of white space and comments
- function _basicCompression($script) {
- var $parser = new ParseMaster;
- // make safe
- $parser.escapeChar = "\\";
- // protect strings
- $parser.add(/'[^'\n\r]*'/, $IGNORE);
- $parser.add(/"[^"\n\r]*"/, $IGNORE);
- // remove comments
- $parser.add(/\/\/[^\n\r]*[\n\r]/, " ");
- $parser.add(/\/\*[^*]*\*+([^\/][^*]*\*+)*\//, " ");
- // protect regular expressions
- $parser.add(/\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)/, "$2"); // IGNORE
- $parser.add(/[^\w\x24\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?/, $IGNORE);
- // remove: ;;; doSomething();
- //if (_specialChars) $parser.add(/;;;[^\n\r]+[\n\r]/);
- // remove redundant semi-colons
- $parser.add(/\(;;\)/, $IGNORE); // protect for (;;) loops
- $parser.add(/;+\s*([};])/, "$2");
- // apply the above
- $script = $parser.exec($script);
-
- // remove white-space
- // $parser.add(/(\b|\x24)\s+(\b|\x24)/, "$2 $3");
- // $parser.add(/([+\-])\s+([+\-])/, "$2 $3");
- // $parser.add(/\s+/, "");
- // done
- return $parser.exec($script);
- };
-
- function _encodeSpecialChars($script) {
- var $parser = new ParseMaster;
- // replace: $name -> n, $$name -> na
- $parser.add(/((\x24+)([a-zA-Z$_]+))(\d*)/, function($match, $offset) {
- var $length = $match[$offset + 2].length;
- var $start = $length - Math.max($length - $match[$offset + 3].length, 0);
- return $match[$offset + 1].substr($start, $length) + $match[$offset + 4];
- });
- // replace: _name -> _0, double-underscore (__name) is ignored
- var $regexp = /\b_[A-Za-z\d]\w*/;
- // build the word list
- var $keywords = _analyze($script, _globalize($regexp), _encodePrivate);
- // quick ref
- var $encoded = $keywords.$encoded;
- $parser.add($regexp, function($match, $offset) {
- return $encoded[$match[$offset]];
- });
- return $parser.exec($script);
- };
-
- function _encodeKeywords($script) {
- // escape high-ascii values already in the script (i.e. in strings)
- if (_encoding > 62) $script = _escape95($script);
- // create the parser
- var $parser = new ParseMaster;
- var $encode = _getEncoder(_encoding);
- // for high-ascii, don't encode single character low-ascii
- var $regexp = (_encoding > 62) ? /\w\w+/ : /\w+/;
- // build the word list
- $keywords = _analyze($script, _globalize($regexp), $encode);
- var $encoded = $keywords.$encoded;
- // encode
- $parser.add($regexp, function($match, $offset) {
- return $encoded[$match[$offset]];
- });
- // if encoded, wrap the script in a decoding function
- return $script && _bootStrap($parser.exec($script), $keywords);
- };
-
- function _analyze($script, $regexp, $encode) {
- // analyse
- // retreive all words in the script
- var $all = $script.match($regexp);
- var $$sorted = []; // list of words sorted by frequency
- var $$encoded = {}; // dictionary of word->encoding
- var $$protected = {}; // instances of "protected" words
- if ($all) {
- var $unsorted = []; // same list, not sorted
- var $protected = {}; // "protected" words (dictionary of word->"word")
- var $values = {}; // dictionary of charCode->encoding (eg. 256->ff)
- var $count = {}; // word->count
- var i = $all.length, j = 0, $word;
- // count the occurrences - used for sorting later
- do {
- $word = "$" + $all[--i];
- if (!$count[$word]) {
- $count[$word] = 0;
- $unsorted[j] = $word;
- // make a dictionary of all of the protected words in this script
- // these are words that might be mistaken for encoding
- $protected["$" + ($values[j] = $encode(j))] = j++;
- }
- // increment the word counter
- $count[$word]++;
- } while (i);
- // prepare to sort the word list, first we must protect
- // words that are also used as codes. we assign them a code
- // equivalent to the word itself.
- // e.g. if "do" falls within our encoding range
- // then we store keywords["do"] = "do";
- // this avoids problems when decoding
- i = $unsorted.length;
- do {
- $word = $unsorted[--i];
- if ($protected[$word] != null) {
- $$sorted[$protected[$word]] = $word.slice(1);
- $$protected[$protected[$word]] = true;
- $count[$word] = 0;
- }
- } while (i);
- // sort the words by frequency
- $unsorted.sort(function($match1, $match2) {
- return $count[$match2] - $count[$match1];
- });
- j = 0;
- // because there are "protected" words in the list
- // we must add the sorted words around them
- do {
- if ($$sorted[i] == null) $$sorted[i] = $unsorted[j++].slice(1);
- $$encoded[$$sorted[i]] = $values[i];
- } while (++i < $unsorted.length);
- }
- return {$sorted: $$sorted, $encoded: $$encoded, $protected: $$protected};
- };
-
- // build the boot function used for loading and decoding
- function _bootStrap($packed, $keywords) {
- var $ENCODE = _safeRegExp("$encode\\($count\\)", "g");
-
- // $packed: the packed script
- $packed = "'" + _escape($packed) + "'";
-
- // $ascii: base for encoding
- var $ascii = Math.min($keywords.$sorted.length, _encoding) || 1;
-
- // $count: number of words contained in the script
- var $count = $keywords.$sorted.length;
-
- // $keywords: list of words contained in the script
- for (var i in $keywords.$protected) $keywords.$sorted[i] = "";
- // convert from a string to an array
- $keywords = "'" + $keywords.$sorted.join("|") + "'.split('|')";
-
- // $encode: encoding function (used for decoding the script)
- var $encode = _encoding > 62 ? _encode95 : _getEncoder($ascii);
- $encode = String($encode).replace(/_encoding/g, "$ascii").replace(/arguments\.callee/g, "$encode");
- var $inline = "$count" + ($ascii > 10 ? ".toString($ascii)" : "");
-
- // $decode: code snippet to speed up decoding
- if (_fastDecode) {
- // create the decoder
- var $decode = _getFunctionBody(_decode);
- if (_encoding > 62) $decode = $decode.replace(/\\\\w/g, "[\\xa1-\\xff]");
- // perform the encoding inline for lower ascii values
- else if ($ascii < 36) $decode = $decode.replace($ENCODE, $inline);
- // special case: when $count==0 there are no keywords. I want to keep
- // the basic shape of the unpacking funcion so i'll frig the code...
- if (!$count) $decode = $decode.replace(_safeRegExp("($count)\\s*=\\s*1"), "$1=0");
- }
-
- // boot function
- var $unpack = String(_unpack);
- if (_fastDecode) {
- // insert the decoder
- $unpack = $unpack.replace(/\{/, "{" + $decode + ";");
- }
- $unpack = $unpack.replace(/"/g, "'");
- if (_encoding > 62) { // high-ascii
- // get rid of the word-boundaries for regexp matches
- $unpack = $unpack.replace(/'\\\\b'\s*\+|\+\s*'\\\\b'/g, "");
- }
- if ($ascii > 36 || _encoding > 62 || _fastDecode) {
- // insert the encode function
- $unpack = $unpack.replace(/\{/, "{$encode=" + $encode + ";");
- } else {
- // perform the encoding inline
- $unpack = $unpack.replace($ENCODE, $inline);
- }
- // pack the boot function too
- $unpack = pack($unpack, 0, false, true);
-
- // arguments
- var $params = [$packed, $ascii, $count, $keywords];
- if (_fastDecode) {
- // insert placeholders for the decoder
- $params = $params.concat(0, "{}");
- }
-
- // the whole thing
- return "eval(" + $unpack + "(" + $params + "))\n";
- };
-
- // mmm.. ..which one do i need ??
- function _getEncoder($ascii) {
- return $ascii > 10 ? $ascii > 36 ? $ascii > 62 ? _encode95 : _encode62 : _encode36 : _encode10;
- };
-
- // zero encoding
- // characters: 0123456789
- var _encode10 = function($charCode) {
- return $charCode;
- };
-
- // inherent base36 support
- // characters: 0123456789abcdefghijklmnopqrstuvwxyz
- var _encode36 = function($charCode) {
- return $charCode.toString(36);
- };
-
- // hitch a ride on base36 and add the upper case alpha characters
- // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
- var _encode62 = function($charCode) {
- return ($charCode < _encoding ? '' : arguments.callee(parseInt($charCode / _encoding))) +
- (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36));
- };
-
- // use high-ascii values
- // characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ
- var _encode95 = function($charCode) {
- return ($charCode < _encoding ? '' : arguments.callee($charCode / _encoding)) +
- String.fromCharCode($charCode % _encoding + 161);
- };
-
- // special _chars
- var _encodePrivate = function($charCode) {
- return "_" + $charCode;
- };
-
- // protect characters used by the parser
- function _escape($script) {
- return $script.replace(/([\\'])/g, "\\$1");
- };
-
- // protect high-ascii characters already in the script
- function _escape95($script) {
- return $script.replace(/[\xa1-\xff]/g, function($match) {
- return "\\x" + $match.charCodeAt(0).toString(16);
- });
- };
-
- function _safeRegExp($string, $flags) {
- return new RegExp($string.replace(/\$/g, "\\$"), $flags);
- };
-
- // extract the body of a function
- function _getFunctionBody($function) {
- with (String($function)) return slice(indexOf("{") + 1, lastIndexOf("}"));
- };
-
- // set the global flag on a RegExp (you have to create a new one)
- function _globalize($regexp) {
- return new RegExp(String($regexp).slice(1, -1), "g");
- };
-
- // build the parsing routine
- _addParser(_basicCompression);
- if (_specialChars) _addParser(_encodeSpecialChars);
- if (_encoding) _addParser(_encodeKeywords);
-
- // go!
- return _pack(_script);
-};
-
-print(pack(readFile(arguments[0])));
diff --git a/framework/Web/Javascripts/effects/CHANGELOG b/framework/Web/Javascripts/effects/CHANGELOG
index 0b7687b5..ab247a37 100644
--- a/framework/Web/Javascripts/effects/CHANGELOG
+++ b/framework/Web/Javascripts/effects/CHANGELOG
@@ -1,613 +1,776 @@
-*V1.5.0*
-
-* Prepared for V1.5.0 final
-
-* Update lib/prototype.js to Prototype 1.4.0 final
-
-*V1.5.0_rc6*
-
-* Update lib/prototype.js to Prototype 1.4.0_rc4
-
-* Fix Effect.SlideDown/SlideUp on Internet Explorer, includes a change to Effect.Scale, (should) fix #2962 and others, [thx wyldeone]
-
-* Make Draggables that are reverting cancel the default revert effect when they are dragged again while reverting, fixes #3188, [thx maverick]
-
-* Fix a problem with a wrong reference in Effect.Pulsate, fixes #3184, [thx cyx_]
-
-* Fix Sortable.findElements for XHTML in Gecko, fixes #3081, [thx fgnass]
-
-* Fix a problem with the slider getting NaN results when clicking directly on the track, fixes #3020, [thx rectalogic]
-
-* Fix a problem with Safari not doing sub-pixel rendering when setting opacity to 1 with Element.setOpacity
-
-* Fix slider to make handle width/height count for track length, fixes #3040, fixes #3017, [thx buggedcom]
-
-* Added Basic unit test for Effect.inspect
-
-* Fix Effect.multiple to deal correctly with delays
-
-* Safeguard Effect.Base.render to only do updates when Effect is in running state, fixes #2912
-
-* Added inspect method to Effect.Base
-
-* Added functional test for DOM-based UL sortables #3016
-
-* Added offset option to Effect.ScrollTo
-
-* More effects.js/dragdrop.js refactoring
-
-* Refactoring and optimizations for effects (not complete yet)
-
-* Refactoring and optimizations for Draggables/Droppables/Sortables (not complete yet)
-
-*V1.5.0_rc5*
-
-* Make Droppables.remove accept DOM IDs in addition to elements
-
-* Added some unit tests for drag and drop
-
-* Update lib/prototype.js to Prototype 1.4.0_rc3
-
-* Make 'contents' a synonym for 'content' on Effect.Scale scaleMode option
-
-* Fix some possible exceptions in slider.js
-
-* Support for various snapping options on Draggables, adresses #2826, [thx saimonmoore]
-
-* Support horizontal ghostable Sortables, fixes #2794, [thx johnm]
-
-* Prevent an exception on IE with a functional test, see #2706
-
-* Add functional testing of hoverclasses for sortables
-
-* Add an assert for correct UTF-8 return chars in Autocompleter
-
-* Correct IE detection in Autocompleter for Opera, fixes #2558 [thx gary]
-
-* Add onDrag callback to Draggable observers, #2827 [thx saimonmoore]
-
-* Added Form.Element.DelayedObserver to controls.js for live-search fields
-
-* Remove Element.Class in favour of Prototype Element.ClassNames, new function Element.childrenWithClassName()
-
-* Update Copyright notice in slider.js
-
-* Fix slider firing onChange events to eagerly on dragging a handle [thx wombert]
-
-* Fix a problem with Start/End spans and single handles
-
-* Add event property to Slider object so that callbacks can determine if setValue originated from a UI event or from script
-
-* Fix Builder.node() throwing unresolved errors in IE6, #2707 [thx flwombat]
-
-* Give currently active handle on slider the "selected" CSS class
-
-* Add start and end spans to slider
-
-* Make track clickable for sliders (moves last active handle [or first handle] to nearest possible position)
-
-* Make initial values on slider work for single and multiple handle sliders
-
-*V1.5.0_rc4*
-
-* Abort Effect.Highlight on elements which have display:none set (prevents problem with Safari)
-
-* Make Effect.Queue an Enumerable, fix a problem with Effect.Grow, more unit tests
-
-* Added restricted option to prevent moved of handles prior/after adjacent handles on Sliders with multiple handles
-
-* Update lib/prototype.js to Prototype 1.4.0_rc2
-
-* Fix a bug with wrongly scrolling to the page top in Ajax.InPlaceEditor (circumvents various browser bugs) [Jon Tirsen], #2616
-
-* major slider refactoring, changed slider range to default to [0,1]. Slider Range can be set with range:$R(from,to) option. The increment option is not active for now.
-
-* Added spans support for Control.Slider to mark spans bordered by slider handles, see unit test [thx to www.bartenbach.de for sponsoring this functionality]
-
-* Added preliminary support for optional multiple handles to Control.Slider [thx to www.bartenbach.de for sponsoring this functionality]
-
-* Fixed wrong inclusion of libs in inplace editor functional test
-
-* Fixed Effect.SlideDown/SlideUp to honor refactoring of Effect.Scale, fixes #2523 [thx obiwanki]
-
-* Reset the zIndex on Draggables correctly, #2483 [thx Jon Whitcraft]
-
-* Fix onChange callback on Sortables when dragging between sortables, #2488 [thx Dylan Greene]
-
-* Removed Builder code from effects.js, removed Object.debug (implemented as Test.Unit.inspect)
-
-* Added slider unit tests, fixed handling of values to autocalculate min/max, fixed upper/lower boundaries on setting the value programmatically
-
-* Synced to Rails 1.0 release candidate, update to Prototype 1.4.0_rc1, removed util.js, merged rests of util.js into effects.js to prepare for refactoring
-
-* Give Builder it's own file
-
-* Fix a logic issue with Autocompleter [thx tshinnic], #2457
-
-*V1.5.0_rc3*
-
-* Make Effect position available to callbacks
-
-* Droppables.fire: send event to onDrop callback [François Beausoleil], #2389
-
-* InPlaceEditor: Add disabling the field while loadTextURL loads and add a class while loading, plus fix various bugs with Internet Explorer and InPlaceEditor, [Jon Tirsen] #2302, #2303
-
-* Made Droppables.remove work again [thx Mindaugas Pelionis], #2409
-
-* Fixed that IE6 would incorrectly render the "fix-windowed-elements-overlapping" IFRAME on autocompletion [thx tshinnic], #2403
-
-* Fixed Element.getOpacity throwing an error on Safari in some situations (this caused the autocompleter not to work)
-
-* Added format option to Sortable.create and Sortable.serialize to allow custom id formats. The format option takes a regular expression where the first grouping that matches is used for building the parameters. The default format is /^[^_]*_(.*)$/ which matches the string_identifier format. If you want to use the full id of the elements, use "format: /(.*)/". More examples are available in the sortable unit test file.
-
-* Started refactorings to use the new Prototype features and general code-cleanup
-
-* Update lib/prototype.js to Prototype 1.4.0_pre11
-
-* Fixed a typo breaking the up arrow key for autocompletion [thx tshinnic], #2406
-
-* Changed the handle option on Draggbles to accept classnames, or ids or elements [thx to Andrew West], #2274
-
-* Force indicator to be hidden on hiding autocompletion update element, #2342
-
-* Make Draggables honor external CSS positioning [thx to Mark Shawkey], #2359
-
-* Make zindex handling for Draggables honor external CSS styles
-
-* Fix two Sortable.serialize issues, [thx Avi, Gorou], #2339, #2357
-
-* Make Element.getOpacity work with IE, added unit tests [thx to Greg Hill]
-
-* Make Element.setOpacity honor non-alpha filters on IE (it now works with filters for alpha PNGs)
-
-* Fixed that Element.class.remove wrongly deleted spaces between class names, fixes #2311, #2313
-
-* Fixed Builder for OPTION and OPTGROUP tags on Firefox < 1.5 and Internet Explorer 6, completely fixes #2325
-
-* Improved Builder implementation to deal with Firefox-specific requirements and innerHTML parsing, partly fixes #2325
-
-*V1.5.0_rc2*
-
-* Update lib/prototype.js to corrected Prototype 1.4.0_pre7 (fixed a problem with IE)
-
-* Update lib/prototype.js to Prototype 1.4.0_pre7
-
-* Reverted to patched version of Prototype 1.4.0_pre4 for the time being (getResponseHeader problem on Mozilla)
-
-* Attempt to fix crashes in Safari 2.0.1, probably related to the event registering und unregistering in Draggables, possibly fixes #2310
-
-* Update lib/prototype.js to Prototype 1.4.0_pre6
-
-* Changed effects_test.html functional test to incoporate Firefox anti-flicker overflow:hidden CSS property
-
-*V1.5.0_rc1*
-
-* Prepared Rakefile and README for V1.5.0_rc1 release
-
-* Droppables w/greedy and hoverclass are now reverted when dragged item is no longer over them, fixes #2184
-
-* Let Effect.Highlight correctly parse IE colors, add String.prototype.parseColor() for this, fixes #2037
-
-* Fix Effect.Highlight to restore background image only if there was one
-
-* Made Effect.tagifyText work again on IE
-
-* Added String.prototype.toArray because Strings aren't iterable on IE
-
-* Fixed Element.getOpacity falsely returning 0 on IE
-
-* Some cleaning up in util.js
-
-* Cleaned up Effect.Opacity
-
-* Removed useless line in Position.page
-
-* Make scriptaculous.js work if a query strings are used when calling it
-
-* Fixed typos in slider.js and the functional test
-
-* Fixed a bug with Safari and the InPlaceEditor with form submission. Add support for interpreting simple <br>s into linebreaks. [Jon Tirsen]
-
-* New Control.Slider() for horizontal and vertical sliders [Marty Haught]
-
-* Fixed autoapplying a 'layout' on IE with Effect.Opacity not working for elements given as id string
-
-* Make Effect.Parallel render final frames and call beforeFinish/afterFinish on included effects
-
-* Make Element.setOpacity work correctly again (browser-specific extensions, except for IE, are disabled at this time)
-
-* Added focusing the text field or text area created when using Ajax.InPlaceEditor #2126 [thx to Lee Mallabone]
-
-* Fixed Element.Class.childrenWith not returning the correct elements #2120 [cmees AT rogers DOT com]
-
-* Added MIT-LICENSE header to scriptaculous.js, cut back on license info in other libs to keep files smaller
-
-* Fix issues with form elements inside draggables not clickable with Firefox #2129
-
-* Fixed an error in dragdrop.js with Draggables when no Droppables are defined
-
-* Fixed an issue with Element.makePositioned causing Effect.SlideDown to fail on Safari
-
-* Make effects "stateless" by cleaning up element.style after finish of effect #2133 [agr30 AT uni-koeln DOT de]
-
-* Add "internal" events to effects, to make them more easily extendable [Martin Bialasinski]
-
-* Set container element height to auto on finishing Effect.BlindDown und Effect.SlideDown #2123 [Tony Arnold]
-
-* Fixed a weird char in dragdrop.js
-
-* Controls.js Autocompleter.Base.updateElement() hook #2116 [Rob Wills]
-
-* Refactoring to use the Prototype enumerable extensions
-
-* Update to Prototype 1.4.0_pre4
-
-*V1.5.0_pre4*
-
-* Added a queue option to effects for easy stacking and simple timeline building. Valid values are "front", "end" and "parallel" (default), see for test/functional/effects_queue_test.html for usage
-
-* Added a setup function to the core effects that gets called by Effect.Base when first entering into running state, which allows them to query the current state of an element or other page properties when queuing and/or delays are used
-
-* Added a state instance variable to Effect.Base that indicates whether a effect that uses the queue is idle, running or finished
-
-* Fixed a flicker with Effect.Puff
-
-* General code cleaning to get rid of (legitimate) Mozilla strict javascript warnings
-
-* Changes to assertVisible in unittest.js
-
-* Slight refactoring of Effect.Text, now known as Effect.multiple(), change first parameter to also accept an array of strings or elements, or a NodeList of elements (if a single element or a string is given, defaults to $('element').childNodes)
-
-* Made tagifyText work with IE. defaults to a style of "position: relative; zoom:1;" for the created SPAN wrappers. It also replaces spaces with non-breakable spaces. These sit-ups are required to work around problems with rendering elements with the proprietary IE "layout" and non-quirksmode documents.
-
-* Add a break to scriptaculous.js when the includes are done [thx to Danilo Celic]
-
-* Fixed a problem with the Autocompleter when hitting ESC would select the entry in IE and redisplay the entries box in Safari
-
-* Fixed that the onDrop callback on Droppables didn't receive the dopped element as second parameter
-
-* Make check for correct Prototype version on loading script.aculo.us
-
-* Changed implementation of Builder to an innerHTML-based approach to make it work with IE6 (note: removed special "style" handling for now)
-
-* Changed non-sync Effects to use a common setInterval call for better timing and page update speeds. See the new Effect.Queue object.
-
-* Fixed a problem with setting opacity in Effect.Opacity to very small values
-
-* Changed the implemention of Effect.Base to use setInterval
-
-* Set version number to 1.5_pre4_trunk
-
-* Added experimental Effect.Text function that allows to start delayed text effects, see test/functional/texteffects_test.html.
-
-* Added experimental Effect.tagifyText(element) which wraps an elements text nodes characters in relatively positioned span elements
-
-* Added "delay" option to Effect.Base to start an effect only after a specified delay
-
-* Finetuning unittest.js + even more unit tests
-
-* Added support for Firefox and Konqueror automatic unit testing on Linux [Michael Schuerig]
-
-* Added basic unit test files for Effects, updated unit testing tests
-
-* Fix typo in lib/prototype.js fix in R2069 (whoops)
-
-* Added unit test for Position.clone
-
-* Made the Postition.cumulative override recognize KHTML and AppleWebKit
-
-* Fix the "hide form controls" iframe fix on the Autocompleter on Internet Explorer
-
-*V1.5.0_pre3*
-
-* More positioning fixes, expanded Element.clone [thx to Michael Schuerig]
-
-* Fixed some JavaScript warnings about redeclared vars [Courtenay]
-
-* Fixed a problem with autocompleting update divs not correctly positioned inside positioned elements [thx to Jonathan Feinberg]
-
-* Workaround for a Safari bug on absolutely positioned children of the BODY element
-
-* Added test/run_functional_test.html to more easily find your way around in the functional tests
-
-* Fixed some missing var declarations in effects.js
-
-* Support for automatic unit testing on IE/Win [Jon Tirsen]
-
-* Added loading the text for the Ajax.InPlaceEditor from the server, more CSS support [Richard Livsey, Jon Tirsen]
-
-* Made builder_test.html unit test work with Safari, fixed (one of two) caching issues with javascripttest.rb, added ajax_autocompleter_test.html to Rakefile unittests
-
-* Fixed Element.Class getting false matches on class names like classA-foobar, added unit tests [Martin Bialasinski]
-
-* Added a test to evluate the Fade/Appear effects across browsers and elements (test/functional/effects6_test.html)
-
-* Framework for completely self-running in-browser unit tests on Mac OS X (try "rake unittest") [Jon Tirsen]
-
-* Updates to Ajax.InPlaceEditor (Highlighting, Ajax options, more) [Jon Tirsen]
-
-* Made event registering on Draggables happen per drag for improved performance [thx to Cathy]
-
-* Moved Element.collectTextNodesIgnoreClass to util.js (preparation for refactoring)
-
-* Made sortable onChange option work again
-
-* Fixed a bug with Sortables resulting in wrong result when using Sortable.serialize with onUpdate on ghostly Sortables [thx Richard Livsey, Caleb Buxton]
-
-* Changed version number in scriptaculous.js to 1.5_pre3
-
-* Moved setting focus in Autocompleter to updateElement function to make it overridable [Brian Palmer]
-
-* Added special handling for style attributes to Builder [Michael Schuerig]
-
-* Changed opacity=1.0 check back to be inline with its original (pre 1.5) implementation to prevent flickering in Firefox < 1.1 on opacity-based effects (this also fixes flickering with drag-and-drop, sortable lists and autocompleting text fields). Note that this potentially breaks correct colors in some situations. [thx to David Zülke]
-
-* Automatically deactivate browser built-in autocompletion on autocompleting textfields, fixes part of Rails #1824.
-
-* Fixed a problem with Ajax.InPlaceEditor causing a JavaScript exception on Safari [thx to Patrick Lenz]
-
-*V1.5.0_pre2*
-
-* Fixed a weird character in dragdrop.js, added check to allow empty containers on Sortables (useful with dropOnEmpty option) [thx to Dave Strus]
-
-* Added unit test runner file test/run_unit_tests.html, new unit test files must be listed in test/unit/index.html
-
-* Added unit tests for Prototype string functions
-
-*V1.5.0_pre1*
-
-* Prepared README for V1.5.0_pre1
-
-* Added a main scriptaculous.js file to load in the other libraries transparently:
-
- <script src="path/to/prototype.js" type="text/javascript"></script>
- <script src="path/to/scriptaculous.js" type="text/javascript"></script>
-
- in the HEAD section of an HTML file is now all that's needed to include all of the script.aculo.us libraries,
- given that they all can be accessed by the same path as scriptaculous.js is.
-
-* Fixed possible problem with greedy Droppables when using the dropOnEmpty option on Sortable.create
-
-* Added new CSS/background color features to Ajax.InPlaceEditor [Jon Tirsen]
-
-* Added unit test for Autocompleter, first Version
-
-* Added Event.simulateKey/s to unittest.js. Note that due to a bug in Firefox this will only work with Firefox up to v1.0.4 (see https://bugzilla.mozilla.org/show_bug.cgi?id=289940)
-
-* Fixed a condition where standard a href=xxx links wouldn't work in autocomplete results. These do now, the onclick event is not cancelled. [thx to Jasper Slits]
-
-* Fix showing ghosting marker only on ghosting Sortables
-
-* Some more Builder stuff, expanded builder unit tests
-
-* Moved stuff that didn't belong into specific libs into util.js; util.js is now required for all script.aculo.us libs
-
-* Corrected weirdness in unittest.js
-
-* Added dropOnEmpty option to Sortables to allow dropping on empty lists (see test/functional/sortable3_test.html)
-
-* Changed algoritm for drag/drop position setting
-
-* Changed workaround for class attributes (fixes a Firefox 1.0 error) from klass to className to be more Javascriptesque [thx to Martin Bialasinski]
-
-* Fixed a typo in ajax_inplaceeditor_test.html
-
-* Updated Rakefile to add unittest.js and util.js to the package
-
-* Added util.js which contains various utlity functions and extensions to Prototype
-
-* Major restructuring
-
-* Added TEXTAREA support to Ajax.InPlaceEditor [Sanford Barr]
-
-* Added Ghost Train alpha 0.1.0. See ghosttrain/test.html.
-
-* More features for Ajax.InPlaceEditor [Jon Tirsen]
-
-* Tweaks to unittest.css [Thomas Fuchs]
-
-* Refactoring and new features in unittest.js [Thomas Fuchs] [Jon Tirsen]
-
-* Fixed a wrong variable reference in Effect.Scale
-
-* Fix Element.makePositioned to recognize the 'static' position
-
-* Allow to choose the parameter name for Ajax.Autocompleter [Cameron Braid]
-
-* Changed resolving indicator DOM element more flexibility [Cameron Braid]
-
-* Fixed a reference in Ajax.InPlaceEditor
-
-* Added contributors to unittest.js
-
-* Souped-up Ajax.InPlaceEditor, added support for a form id and specifying all the texts through options [Jon Tirsen]
-
-* Make unit testing look good [Michael Schuerig]
-
-* Changed default revert duration for Draggables to distance-dependent algorithm [suggested by San]
-
-* Fix double unescaping in Autocompleter
-
-* Refactoring auf Autocompleter classes to use camelCase (note: changes the syntax of some of the options)
-
-* Add updateElement option to Autocompleter [Rob Sharp]
-
-* Updated Ajax.InPlaceEditor, refactoring of unit testing [Jon Tirsen]
-
-* Added preliminary version of Ajax.InPlaceEditor to controls.js; added experimental Firefox only functional testing for it (inplaceeditor_result.html) [Jon Tirsen]
-
-* Added some addtional test files.
-
-* Fixes a bug with Droppables not recognizing a drop if no hoverclass is given [thanks drewie]
-
-* Fixes to ghosting marker, allow a predefined marker (element with id "dropmarker").
-
-* Changed Effect.Opacity to better handle 100% opacity
-
-* Various fixes to ghosting, improves compatiblity with Safari and IE. [thanks to David Zülke]
-
-* Added experimental ghosting option to Sortables. See sortable_functional_ghosting.html for usage.
-
-* Renamed the clone option on Draggables to "ghosting".
-
-* Added experimental "clone" option to Draggable to so that a "clone" stays in place while dragging a translucent version of the draggable element. Currently, this requires relatively positioned elements, and doesn't work with sortable lists (but should after some tweaking). See dragdrop_function_4.html test file for details.
-
-* Added Element.getStyle to find computed CSS styles of an element. Note: doesn't work in all cases in Safari, see my bug report at http://bugzilla.opendarwin.org/show_bug.cgi?id=4125
-
-*1.1beta1*
-
-* Fixed rendering of last frame of animation when from/to is not 0.0/1.0. [thanks to David Zülke]
-
-* Updated internal Prototype JavaScript framework to version 1.4.0_pre2 (patched w/ workaround for Ajax.Updater init bug)
-
-* Some refactoring of controls.js to get rid of "dirty" implementation detail (dont' ask)
-
-* Added returning the generated combined effects to allow for .cancel() on all effects
-
-* Updated internal Prototype JavaScript framework to version 1.4.0_pre2
-
-*Rails 0.13.1*
-
-* Updated Ajax.Autocompleter to deal with parameters options correctly [Martin Marinschek]
-
-* Updated controls.js to allow multple matches in local localcompletion [Ivan Krstic]
-
-* Make version of prototype.js in lib have a nicer Event object [David Zülke]
-
-* Added incremental and local autocompleting and loads of documentation to controls.js [Ivan Krstic]
-
-* Experimental: make version of prototype.js in lib destroy events on page unload to prevent browser memory leaks
-
-* Fixed a possible memory leak in dragdrop.js
-
-* Make version of prototype.js in lib compatible with some 3rd-party JavaScript libraries (like IE7) by refactoring to use Object.extend() for testing [David Zülke]
-
-* Make effects.js, dragdrop.js and controls.js compatible with some 3rd-party JavaScript libraries (like IE7) by refactoring to use Object.extend() [David Zülke]
-
-* Changed some tests to work better
-
-* Always reset background color on Effect.Highlight; this make change backwards-compatibility, to be sure include style="background-color:(target-color)" on your elements or else elements will fall back to their CSS rules (which is a good thing in most circumstances)
-
-* Removed a possible memory leaks with IE with sortables and droppables (removed references from elements)
-
-* Changes to class extension in effects.js
-
-* Make Effect.Highlight restore any previously set background color when finishing (makes effect work with set CSS classes)
-
-* Added capability to remove draggables/droppables and redeclare sortables in dragdrop.js
-
-* Added Effect.ScrollTo to smoothly scroll the page to an element
-
-* Better Firefox flickering handling on SlideUp/SlideDown
-
-* Some cleaning up in effects.js
-
-* Removed a possible memory leak in IE with draggables
-
-* Added support for cancelling dragging my hitting ESC
-
-* Changed logic of drag-and-drop to only include the last referenced droppable when firing a drop event. This change also offers slight performance gains. [Dominik Wagner]
-
-* Added addtional effects test page, added tests for scriptfragment matching
-
-*1.0.0*
-
-* Changed auto-hiding update div in Ajax.Autocompleter
-
-* Changed default serialization on Ajax.Autocompleter to use Form.Element.serialize
-
-* Added test file for drag/drop inside scrolled elements
-
-* Fixed dragging of unpositioned elements in Internet Explorer
-
-* Change default behaviour of Ajax.Autocompleter to do automatic overlapping, sizing and appear/fade effects
-
-* Fixed Internet Explorer hide-windowed-controls iframe handling
-
-* Changed Ajax.Autocompleter event handling
-
-* Added onShow/onHide callbacks to Ajax.Autocompleter to allow for customized handling/effects
-
-* Fixed SlideUp/SlideDown to restore the overflow CSS property (note: Firefox 1.0.X is buggy, set overflow:hidden as a workaround)
-
-* Fixed BlindUp/BlindDown to restore the overflow CSS property (note: Firefox 1.0.X is buggy, set overflow:hidden as a workaround)
-
-* Fixed draggables with revert:false on repeated drags behaving badly
-
-* Expanded the revert option on draggables to optionally take a function and revert only if it returns true
-
-* Added the dragged element as a parameter to the Draggables.notify callbacks [Michael Sokolov]
-
-* Removed a deprecated reference to Effect2 om Effect.Fold
-
-* Make the percentage on Element.setContentZoom absolute
-
-* Corrected rendering of Ajax.AutoCompleter when focus is lost while updating
-
-* Added (crude) functional tests
-
-* Some slight refactoring in controls.js
-
-* Changed dragdrop.js to use the Effect namespace for its effects
-
-* Updated to Prototype 1.3.0: removal of prototype-ext.js; refactoring.
-
-* Fixed behaviour of cursor keys in Safari on autocomplete script
-
-* Fixed Position.within_including_scrolloffsets
-
-* Fixed sortables that are absolutely positioned
-
-* Fixed unhandled whitespace in Ajax.Autocompleter
-
-* Updated prototype-ext.js to include additions for Ajax.Autocompleter
-
-* Added controls.js, contains AJAX autocompleting text fields from #960
-
-* Refactored Event object
-
-* Renamed effects2.js to effects.js
-
-* Fixed draggables on pages with no droppables
-
-* Moved Event, Position and Element.Class to prototype-ext.js in preparation to Rails 0.13
-
-* Added Effect.Transitions.pulse
-
-* Added Effect.Pulsate and Effect.Fold effect by Justin Palmer
-
-* Added transitions by Mark Pilgrim: .full, .none
-
-* Added effects by Mark Pilgrim: Effect.Grow, Effect.Shrink
-
-* Changed effects namespace to Effect. (Effect2 is deprecated, but works too)
-
-* Changed old Effect.ContentZoom class to Element.setContentZoom() function
-
-* Greatly expanded Effect.Highlight to have user-defined colors and autodetecting the background color
-
-* Converted remaining effects (Squish, Highlight) to new format
-
-* Sortable.create now passes the zindex, starteffect, reverteffect and endeffect options to the underlying Draggables
-
-* Sortable.serialize now honors the only option on Sortable.create
-
-* New overridable options on Draggables: zindex, starteffect, reverteffect, endeffect
-
-* Fix a Gecko engine flicker on Sortables in dragdrop.js
-
-* Fixed event.isLeftClick
-
-* Some small changes in effects2.js
-
-* Refactoring of dragdrop.js
-
-* Added an Object.prototype.inspect() and more verbose messages for js unit testing
-
-* Added test/unittest.js and initial tests in test/html.
-
-* Cleaning up of effects2.js (convert tabs to spaces)
-
-* Added Rakefile for distribution packaging (default task = make distribution, rake clean for cleaning up)
-
-* Initial check-in and directory layout for the script.aculo.us JavaScripts \ No newline at end of file
+*V1.6.1*
+
+* Update to Prototype 1.5.0_rc0
+
+* Add Draggable object as third parameter to snap, fixes #4074 [thx mdaines]
+
+* Fix an IE flicker with SlideUp/SlideDown, fixes #3774, [thx sbbowers]
+
+* Add parsing/setting of any currently set opacity CSS rule to default opacity effect on draggables, fixes #3682 [thx Mike A. Owens]
+
+* Added prototype $() performance patch from #4477 and updated effects.js to new Element.addMethods() syntax
+
+* Sortable trees [thx Sammi Williams, sammi@oriontransfer.co.nz]
+ - Added functional test (test/functional/sortable_tree_test.html)
+ - removed greedy option
+ - modified the way Droppables.show works - added affected list
+ - added Droppables.findDeepestChild
+ - modified Sortable.options to work for trees
+ - modified Sortable.onEmptyHover with additional logic to insert
+ the element at a certain place according to the overlap
+ - modified Sortable.onHover to avoid DOM Exceptions
+ - modified Sortable.create to support the creation of Sortable trees
+ - added two convenience functions - Sortable.findElements and
+ Sortable.findTreeElements
+ - Added Sortable.tree (and a number of private functions to facilitate it)
+ Returns a tree structure:
+ var root = {
+ id: null,
+ parent: null,
+ children: <children>,
+ container: <sortable element>,
+ }
+ var child = {
+ parent: <node>,
+ children: <array>,
+ id: <string> (as per options.format),
+ element: <element>,
+ container: <element>,
+ position: <integer>
+ }
+ This is intended to become part of the public API, and can be used to manipulate
+ the tree programatically.
+ - Modified Sortable.serialize to use Sortable.tree when set in the options.
+
+* Fix a problem with window scrolling on draggables [thx Gregory Hill]
+
+* Let the benchmark method return the time taken in ms, so it can be used for time-based assertions
+
+* Fix problem with id-based handle names and draggables
+
+* More Element.childrenWithClassName optimization
+
+* Added benchmark method to unittest.js; some cleaning up of unit tests
+
+* Add fix for IE memory leaks in included prototype.js from [4094]
+
+*V1.6.0*
+
+* Major speedup for sortable with handles initialization [thx Jamis Buck]
+
+* Update to latest Prototype 1.5.0_pre1 trunk
+
+* Add functional "random effects" test, also for browser compatibility testing
+
+* Fix two typos introduced with the 1.5 Methods syntax update
+
+* Add functional test for $$-triggered effects with .visualEffect
+
+* Fix shift-tab for autocompleter in Safari, fixes #4423 [thx matt]
+
+* Prepare for script.aculo.us 1.6, add Prototype 1.5 requirement and check that Element.Methods is available in the scriptaculous loader
+
+* Refactor effects.js to use the new Prototype 1.5 Element Methods syntax
+
+* Update to latest Prototype 1.5.0_pre0 trunk
+
+* Fix a problem with the draggable window scrolling code and scrolling inside overflow containers
+
+* Add passing through of scroll options from Sortable to Draggable [thx Gregory Hill]
+
+* Make it possible to scroll window on dragging, #3921 [thx rdmiller]
+
+* Make Element.forceRerendering give up on any exception (this fixes various problems with IE)
+
+* added visualEffect method for the Element Mixin, fixed so you can chain multiple calls. [Rick Olson]
+
+* Fix only option on Sortable.create to accept multiple class names, fixes #3427 [thx glenn nilsson]
+
+* Added workaround for a rendering bug in Safari when using floating elements with Effect.Appear
+
+* Update lib/prototype.js to Prototype 1.5.0_pre0
+
+*V1.5.3*
+
+* Change version number to V1.5.3, prepare Rakefile
+
+* Remove unneeded height restoring in Effect.BlindDown as that is handled internally by the restoreAfterFinish option to Effect.Scale, fixes #3667 [thx Ross Lawley]
+
+* Added Ajax.InPlaceCollectionEditor which uses a SELECT element instead of a text field (see test/functional/ajax_inplacecollectioneditor_test.html for usage), #3491 [thx anna]
+
+* Enable in place editor to use RJS (implements a new evalScripts option for the in place editor), #3490 [thx Richard Livsey]
+
+* Added Sortable.setSequence to programmatically reorder a Sortable, #3711 [thx Mike A. Owens]
+
+* Added unit test for #3732 (currently fails due to Prototype #3877) [thx michal]
+
+* Fix span positioning for sliders with ranges not starting at 0, fixes #3731 [thx michal]
+
+* Make name option on Sortable.serialize work again, fixes #3873
+
+* Make dragging cancel only on ESC key, not on any key, fixes #3817
+
+* Fix Rakefile for V1.5.2
+
+*V1.5.2*
+
+* Change version number to V1.5.2
+
+* Fix a wrong parameter in dragdrop.js, fixes #3555
+
+* Fix two typos in effects.js, fixes #3481 [thx jtolds]
+
+* Add assertEnumEqual for unit testing (from Prototype SVN trunk) [Sam Stephenson]
+
+* Add Sortable.sequence method to extract the current sequence of a Sortable as an array, fixes #3675 [thx sphivo]
+
+* Add limit option to effect queues to limit the maximum number of effects in a queue, new unit tests for scoped effect queues, fixes #3498 [thx Abdur-Rahman Advany]
+
+* Fix Element.collectTextNodesIgnoreClass to correctly filter child nodes, fixes #3380 [thx lam]
+
+* Fix a condition where OPTION elements could cause unwanted dragging on Draggables, fixes #3441 [thx tom]
+
+* Fix a crash because of an IE bug in Effect.SlideDown, fixes #3192 [thx Rob Mayhew]
+
+* Added experimental auto-scroll option to Draggables and Sortables, activate with scroll: 'id_of_scroll_container_element'.
+ Note: needs testing, call syntax might change
+ See test/functional/dragdrop3_test.html for usage/demo
+
+* Added activate method to Autocompleter that allows you to trigger the suggestions through other means than user input [DHH]
+
+*V1.5.1*
+
+* Add select option to Autocompleter to optionally use textnodes from elements with a specific CSS class (see test/functional/ajax_autocompleter_test.html for usage)
+
+* In-place editor: add ok/cancel visibility options and onblur() submission, fixes #3233 [thx pulsation]
+ Note: currently, blur form submission breaks the cancel link functionality, if enabled
+
+* Added Effect.toggle for slide, blind and appear/fade effects, fixes #2704 [thx Azad]
+
+* Added selective component loading to scriptaculous.js, see test/unit/loading_test.html for usage [thx David Zülke]
+
+* Added local/scoped effect queues [thx David Zülke]
+
+* New core effect Effect.Move that can do absolute/relative movement [thx David Zülke]
+
+* Make default effects options modifyable globally by setting Effect.DefaultOptions
+
+* Make Draggables recognize top/left CSS properties defined in an external stylesheet, fixes #3205 [thx ansonparker]
+
+* Fixed draggables starting to drag even if mouse button was released with no movement, [thx topfunky]
+
+* Updated the README to reflect final status
+
+*V1.5.0*
+
+* Prepared for V1.5.0 final
+
+* Update lib/prototype.js to Prototype 1.4.0 final
+
+*V1.5.0_rc6*
+
+* Update lib/prototype.js to Prototype 1.4.0_rc4
+
+* Fix Effect.SlideDown/SlideUp on Internet Explorer, includes a change to Effect.Scale, (should) fix #2962 and others, [thx wyldeone]
+
+* Make Draggables that are reverting cancel the default revert effect when they are dragged again while reverting, fixes #3188, [thx maverick]
+
+* Fix a problem with a wrong reference in Effect.Pulsate, fixes #3184, [thx cyx_]
+
+* Fix Sortable.findElements for XHTML in Gecko, fixes #3081, [thx fgnass]
+
+* Fix a problem with the slider getting NaN results when clicking directly on the track, fixes #3020, [thx rectalogic]
+
+* Fix a problem with Safari not doing sub-pixel rendering when setting opacity to 1 with Element.setOpacity
+
+* Fix slider to make handle width/height count for track length, fixes #3040, fixes #3017, [thx buggedcom]
+
+* Added Basic unit test for Effect.inspect
+
+* Fix Effect.multiple to deal correctly with delays
+
+* Safeguard Effect.Base.render to only do updates when Effect is in running state, fixes #2912
+
+* Added inspect method to Effect.Base
+
+* Added functional test for DOM-based UL sortables #3016
+
+* Added offset option to Effect.ScrollTo
+
+* More effects.js/dragdrop.js refactoring
+
+* Refactoring and optimizations for effects (not complete yet)
+
+* Refactoring and optimizations for Draggables/Droppables/Sortables (not complete yet)
+
+*V1.5.0_rc5*
+
+* Make Droppables.remove accept DOM IDs in addition to elements
+
+* Added some unit tests for drag and drop
+
+* Update lib/prototype.js to Prototype 1.4.0_rc3
+
+* Make 'contents' a synonym for 'content' on Effect.Scale scaleMode option
+
+* Fix some possible exceptions in slider.js
+
+* Support for various snapping options on Draggables, adresses #2826, [thx saimonmoore]
+
+* Support horizontal ghostable Sortables, fixes #2794, [thx johnm]
+
+* Prevent an exception on IE with a functional test, see #2706
+
+* Add functional testing of hoverclasses for sortables
+
+* Add an assert for correct UTF-8 return chars in Autocompleter
+
+* Correct IE detection in Autocompleter for Opera, fixes #2558 [thx gary]
+
+* Add onDrag callback to Draggable observers, #2827 [thx saimonmoore]
+
+* Added Form.Element.DelayedObserver to controls.js for live-search fields
+
+* Remove Element.Class in favour of Prototype Element.ClassNames, new function Element.childrenWithClassName()
+
+* Update Copyright notice in slider.js
+
+* Fix slider firing onChange events to eagerly on dragging a handle [thx wombert]
+
+* Fix a problem with Start/End spans and single handles
+
+* Add event property to Slider object so that callbacks can determine if setValue originated from a UI event or from script
+
+* Fix Builder.node() throwing unresolved errors in IE6, #2707 [thx flwombat]
+
+* Give currently active handle on slider the "selected" CSS class
+
+* Add start and end spans to slider
+
+* Make track clickable for sliders (moves last active handle [or first handle] to nearest possible position)
+
+* Make initial values on slider work for single and multiple handle sliders
+
+*V1.5.0_rc4*
+
+* Abort Effect.Highlight on elements which have display:none set (prevents problem with Safari)
+
+* Make Effect.Queue an Enumerable, fix a problem with Effect.Grow, more unit tests
+
+* Added restricted option to prevent moved of handles prior/after adjacent handles on Sliders with multiple handles
+
+* Update lib/prototype.js to Prototype 1.4.0_rc2
+
+* Fix a bug with wrongly scrolling to the page top in Ajax.InPlaceEditor (circumvents various browser bugs) [Jon Tirsen], #2616
+
+* major slider refactoring, changed slider range to default to [0,1]. Slider Range can be set with range:$R(from,to) option. The increment option is not active for now.
+
+* Added spans support for Control.Slider to mark spans bordered by slider handles, see unit test [thx to www.bartenbach.de for sponsoring this functionality]
+
+* Added preliminary support for optional multiple handles to Control.Slider [thx to www.bartenbach.de for sponsoring this functionality]
+
+* Fixed wrong inclusion of libs in inplace editor functional test
+
+* Fixed Effect.SlideDown/SlideUp to honor refactoring of Effect.Scale, fixes #2523 [thx obiwanki]
+
+* Reset the zIndex on Draggables correctly, #2483 [thx Jon Whitcraft]
+
+* Fix onChange callback on Sortables when dragging between sortables, #2488 [thx Dylan Greene]
+
+* Removed Builder code from effects.js, removed Object.debug (implemented as Test.Unit.inspect)
+
+* Added slider unit tests, fixed handling of values to autocalculate min/max, fixed upper/lower boundaries on setting the value programmatically
+
+* Synced to Rails 1.0 release candidate, update to Prototype 1.4.0_rc1, removed util.js, merged rests of util.js into effects.js to prepare for refactoring
+
+* Give Builder it's own file
+
+* Fix a logic issue with Autocompleter [thx tshinnic], #2457
+
+*V1.5.0_rc3*
+
+* Make Effect position available to callbacks
+
+* Droppables.fire: send event to onDrop callback [François Beausoleil], #2389
+
+* InPlaceEditor: Add disabling the field while loadTextURL loads and add a class while loading, plus fix various bugs with Internet Explorer and InPlaceEditor, [Jon Tirsen] #2302, #2303
+
+* Made Droppables.remove work again [thx Mindaugas Pelionis], #2409
+
+* Fixed that IE6 would incorrectly render the "fix-windowed-elements-overlapping" IFRAME on autocompletion [thx tshinnic], #2403
+
+* Fixed Element.getOpacity throwing an error on Safari in some situations (this caused the autocompleter not to work)
+
+* Added format option to Sortable.create and Sortable.serialize to allow custom id formats. The format option takes a regular expression where the first grouping that matches is used for building the parameters. The default format is /^[^_]*_(.*)$/ which matches the string_identifier format. If you want to use the full id of the elements, use "format: /(.*)/". More examples are available in the sortable unit test file.
+
+* Started refactorings to use the new Prototype features and general code-cleanup
+
+* Update lib/prototype.js to Prototype 1.4.0_pre11
+
+* Fixed a typo breaking the up arrow key for autocompletion [thx tshinnic], #2406
+
+* Changed the handle option on Draggbles to accept classnames, or ids or elements [thx to Andrew West], #2274
+
+* Force indicator to be hidden on hiding autocompletion update element, #2342
+
+* Make Draggables honor external CSS positioning [thx to Mark Shawkey], #2359
+
+* Make zindex handling for Draggables honor external CSS styles
+
+* Fix two Sortable.serialize issues, [thx Avi, Gorou], #2339, #2357
+
+* Make Element.getOpacity work with IE, added unit tests [thx to Greg Hill]
+
+* Make Element.setOpacity honor non-alpha filters on IE (it now works with filters for alpha PNGs)
+
+* Fixed that Element.class.remove wrongly deleted spaces between class names, fixes #2311, #2313
+
+* Fixed Builder for OPTION and OPTGROUP tags on Firefox < 1.5 and Internet Explorer 6, completely fixes #2325
+
+* Improved Builder implementation to deal with Firefox-specific requirements and innerHTML parsing, partly fixes #2325
+
+*V1.5.0_rc2*
+
+* Update lib/prototype.js to corrected Prototype 1.4.0_pre7 (fixed a problem with IE)
+
+* Update lib/prototype.js to Prototype 1.4.0_pre7
+
+* Reverted to patched version of Prototype 1.4.0_pre4 for the time being (getResponseHeader problem on Mozilla)
+
+* Attempt to fix crashes in Safari 2.0.1, probably related to the event registering und unregistering in Draggables, possibly fixes #2310
+
+* Update lib/prototype.js to Prototype 1.4.0_pre6
+
+* Changed effects_test.html functional test to incoporate Firefox anti-flicker overflow:hidden CSS property
+
+*V1.5.0_rc1*
+
+* Prepared Rakefile and README for V1.5.0_rc1 release
+
+* Droppables w/greedy and hoverclass are now reverted when dragged item is no longer over them, fixes #2184
+
+* Let Effect.Highlight correctly parse IE colors, add String.prototype.parseColor() for this, fixes #2037
+
+* Fix Effect.Highlight to restore background image only if there was one
+
+* Made Effect.tagifyText work again on IE
+
+* Added String.prototype.toArray because Strings aren't iterable on IE
+
+* Fixed Element.getOpacity falsely returning 0 on IE
+
+* Some cleaning up in util.js
+
+* Cleaned up Effect.Opacity
+
+* Removed useless line in Position.page
+
+* Make scriptaculous.js work if a query strings are used when calling it
+
+* Fixed typos in slider.js and the functional test
+
+* Fixed a bug with Safari and the InPlaceEditor with form submission. Add support for interpreting simple <br>s into linebreaks. [Jon Tirsen]
+
+* New Control.Slider() for horizontal and vertical sliders [Marty Haught]
+
+* Fixed autoapplying a 'layout' on IE with Effect.Opacity not working for elements given as id string
+
+* Make Effect.Parallel render final frames and call beforeFinish/afterFinish on included effects
+
+* Make Element.setOpacity work correctly again (browser-specific extensions, except for IE, are disabled at this time)
+
+* Added focusing the text field or text area created when using Ajax.InPlaceEditor #2126 [thx to Lee Mallabone]
+
+* Fixed Element.Class.childrenWith not returning the correct elements #2120 [cmees AT rogers DOT com]
+
+* Added MIT-LICENSE header to scriptaculous.js, cut back on license info in other libs to keep files smaller
+
+* Fix issues with form elements inside draggables not clickable with Firefox #2129
+
+* Fixed an error in dragdrop.js with Draggables when no Droppables are defined
+
+* Fixed an issue with Element.makePositioned causing Effect.SlideDown to fail on Safari
+
+* Make effects "stateless" by cleaning up element.style after finish of effect #2133 [agr30 AT uni-koeln DOT de]
+
+* Add "internal" events to effects, to make them more easily extendable [Martin Bialasinski]
+
+* Set container element height to auto on finishing Effect.BlindDown und Effect.SlideDown #2123 [Tony Arnold]
+
+* Fixed a weird char in dragdrop.js
+
+* Controls.js Autocompleter.Base.updateElement() hook #2116 [Rob Wills]
+
+* Refactoring to use the Prototype enumerable extensions
+
+* Update to Prototype 1.4.0_pre4
+
+*V1.5.0_pre4*
+
+* Added a queue option to effects for easy stacking and simple timeline building. Valid values are "front", "end" and "parallel" (default), see for test/functional/effects_queue_test.html for usage
+
+* Added a setup function to the core effects that gets called by Effect.Base when first entering into running state, which allows them to query the current state of an element or other page properties when queuing and/or delays are used
+
+* Added a state instance variable to Effect.Base that indicates whether a effect that uses the queue is idle, running or finished
+
+* Fixed a flicker with Effect.Puff
+
+* General code cleaning to get rid of (legitimate) Mozilla strict javascript warnings
+
+* Changes to assertVisible in unittest.js
+
+* Slight refactoring of Effect.Text, now known as Effect.multiple(), change first parameter to also accept an array of strings or elements, or a NodeList of elements (if a single element or a string is given, defaults to $('element').childNodes)
+
+* Made tagifyText work with IE. defaults to a style of "position: relative; zoom:1;" for the created SPAN wrappers. It also replaces spaces with non-breakable spaces. These sit-ups are required to work around problems with rendering elements with the proprietary IE "layout" and non-quirksmode documents.
+
+* Add a break to scriptaculous.js when the includes are done [thx to Danilo Celic]
+
+* Fixed a problem with the Autocompleter when hitting ESC would select the entry in IE and redisplay the entries box in Safari
+
+* Fixed that the onDrop callback on Droppables didn't receive the dopped element as second parameter
+
+* Make check for correct Prototype version on loading script.aculo.us
+
+* Changed implementation of Builder to an innerHTML-based approach to make it work with IE6 (note: removed special "style" handling for now)
+
+* Changed non-sync Effects to use a common setInterval call for better timing and page update speeds. See the new Effect.Queue object.
+
+* Fixed a problem with setting opacity in Effect.Opacity to very small values
+
+* Changed the implemention of Effect.Base to use setInterval
+
+* Set version number to 1.5_pre4_trunk
+
+* Added experimental Effect.Text function that allows to start delayed text effects, see test/functional/texteffects_test.html.
+
+* Added experimental Effect.tagifyText(element) which wraps an elements text nodes characters in relatively positioned span elements
+
+* Added "delay" option to Effect.Base to start an effect only after a specified delay
+
+* Finetuning unittest.js + even more unit tests
+
+* Added support for Firefox and Konqueror automatic unit testing on Linux [Michael Schuerig]
+
+* Added basic unit test files for Effects, updated unit testing tests
+
+* Fix typo in lib/prototype.js fix in R2069 (whoops)
+
+* Added unit test for Position.clone
+
+* Made the Postition.cumulative override recognize KHTML and AppleWebKit
+
+* Fix the "hide form controls" iframe fix on the Autocompleter on Internet Explorer
+
+*V1.5.0_pre3*
+
+* More positioning fixes, expanded Element.clone [thx to Michael Schuerig]
+
+* Fixed some JavaScript warnings about redeclared vars [Courtenay]
+
+* Fixed a problem with autocompleting update divs not correctly positioned inside positioned elements [thx to Jonathan Feinberg]
+
+* Workaround for a Safari bug on absolutely positioned children of the BODY element
+
+* Added test/run_functional_test.html to more easily find your way around in the functional tests
+
+* Fixed some missing var declarations in effects.js
+
+* Support for automatic unit testing on IE/Win [Jon Tirsen]
+
+* Added loading the text for the Ajax.InPlaceEditor from the server, more CSS support [Richard Livsey, Jon Tirsen]
+
+* Made builder_test.html unit test work with Safari, fixed (one of two) caching issues with javascripttest.rb, added ajax_autocompleter_test.html to Rakefile unittests
+
+* Fixed Element.Class getting false matches on class names like classA-foobar, added unit tests [Martin Bialasinski]
+
+* Added a test to evluate the Fade/Appear effects across browsers and elements (test/functional/effects6_test.html)
+
+* Framework for completely self-running in-browser unit tests on Mac OS X (try "rake unittest") [Jon Tirsen]
+
+* Updates to Ajax.InPlaceEditor (Highlighting, Ajax options, more) [Jon Tirsen]
+
+* Made event registering on Draggables happen per drag for improved performance [thx to Cathy]
+
+* Moved Element.collectTextNodesIgnoreClass to util.js (preparation for refactoring)
+
+* Made sortable onChange option work again
+
+* Fixed a bug with Sortables resulting in wrong result when using Sortable.serialize with onUpdate on ghostly Sortables [thx Richard Livsey, Caleb Buxton]
+
+* Changed version number in scriptaculous.js to 1.5_pre3
+
+* Moved setting focus in Autocompleter to updateElement function to make it overridable [Brian Palmer]
+
+* Added special handling for style attributes to Builder [Michael Schuerig]
+
+* Changed opacity=1.0 check back to be inline with its original (pre 1.5) implementation to prevent flickering in Firefox < 1.1 on opacity-based effects (this also fixes flickering with drag-and-drop, sortable lists and autocompleting text fields). Note that this potentially breaks correct colors in some situations. [thx to David Zülke]
+
+* Automatically deactivate browser built-in autocompletion on autocompleting textfields, fixes part of Rails #1824.
+
+* Fixed a problem with Ajax.InPlaceEditor causing a JavaScript exception on Safari [thx to Patrick Lenz]
+
+*V1.5.0_pre2*
+
+* Fixed a weird character in dragdrop.js, added check to allow empty containers on Sortables (useful with dropOnEmpty option) [thx to Dave Strus]
+
+* Added unit test runner file test/run_unit_tests.html, new unit test files must be listed in test/unit/index.html
+
+* Added unit tests for Prototype string functions
+
+*V1.5.0_pre1*
+
+* Prepared README for V1.5.0_pre1
+
+* Added a main scriptaculous.js file to load in the other libraries transparently:
+
+ <script src="path/to/prototype.js" type="text/javascript"></script>
+ <script src="path/to/scriptaculous.js" type="text/javascript"></script>
+
+ in the HEAD section of an HTML file is now all that's needed to include all of the script.aculo.us libraries,
+ given that they all can be accessed by the same path as scriptaculous.js is.
+
+* Fixed possible problem with greedy Droppables when using the dropOnEmpty option on Sortable.create
+
+* Added new CSS/background color features to Ajax.InPlaceEditor [Jon Tirsen]
+
+* Added unit test for Autocompleter, first Version
+
+* Added Event.simulateKey/s to unittest.js. Note that due to a bug in Firefox this will only work with Firefox up to v1.0.4 (see https://bugzilla.mozilla.org/show_bug.cgi?id=289940)
+
+* Fixed a condition where standard a href=xxx links wouldn't work in autocomplete results. These do now, the onclick event is not cancelled. [thx to Jasper Slits]
+
+* Fix showing ghosting marker only on ghosting Sortables
+
+* Some more Builder stuff, expanded builder unit tests
+
+* Moved stuff that didn't belong into specific libs into util.js; util.js is now required for all script.aculo.us libs
+
+* Corrected weirdness in unittest.js
+
+* Added dropOnEmpty option to Sortables to allow dropping on empty lists (see test/functional/sortable3_test.html)
+
+* Changed algoritm for drag/drop position setting
+
+* Changed workaround for class attributes (fixes a Firefox 1.0 error) from klass to className to be more Javascriptesque [thx to Martin Bialasinski]
+
+* Fixed a typo in ajax_inplaceeditor_test.html
+
+* Updated Rakefile to add unittest.js and util.js to the package
+
+* Added util.js which contains various utlity functions and extensions to Prototype
+
+* Major restructuring
+
+* Added TEXTAREA support to Ajax.InPlaceEditor [Sanford Barr]
+
+* Added Ghost Train alpha 0.1.0. See ghosttrain/test.html.
+
+* More features for Ajax.InPlaceEditor [Jon Tirsen]
+
+* Tweaks to unittest.css [Thomas Fuchs]
+
+* Refactoring and new features in unittest.js [Thomas Fuchs] [Jon Tirsen]
+
+* Fixed a wrong variable reference in Effect.Scale
+
+* Fix Element.makePositioned to recognize the 'static' position
+
+* Allow to choose the parameter name for Ajax.Autocompleter [Cameron Braid]
+
+* Changed resolving indicator DOM element more flexibility [Cameron Braid]
+
+* Fixed a reference in Ajax.InPlaceEditor
+
+* Added contributors to unittest.js
+
+* Souped-up Ajax.InPlaceEditor, added support for a form id and specifying all the texts through options [Jon Tirsen]
+
+* Make unit testing look good [Michael Schuerig]
+
+* Changed default revert duration for Draggables to distance-dependent algorithm [suggested by San]
+
+* Fix double unescaping in Autocompleter
+
+* Refactoring auf Autocompleter classes to use camelCase (note: changes the syntax of some of the options)
+
+* Add updateElement option to Autocompleter [Rob Sharp]
+
+* Updated Ajax.InPlaceEditor, refactoring of unit testing [Jon Tirsen]
+
+* Added preliminary version of Ajax.InPlaceEditor to controls.js; added experimental Firefox only functional testing for it (inplaceeditor_result.html) [Jon Tirsen]
+
+* Added some addtional test files.
+
+* Fixes a bug with Droppables not recognizing a drop if no hoverclass is given [thanks drewie]
+
+* Fixes to ghosting marker, allow a predefined marker (element with id "dropmarker").
+
+* Changed Effect.Opacity to better handle 100% opacity
+
+* Various fixes to ghosting, improves compatiblity with Safari and IE. [thanks to David Zülke]
+
+* Added experimental ghosting option to Sortables. See sortable_functional_ghosting.html for usage.
+
+* Renamed the clone option on Draggables to "ghosting".
+
+* Added experimental "clone" option to Draggable to so that a "clone" stays in place while dragging a translucent version of the draggable element. Currently, this requires relatively positioned elements, and doesn't work with sortable lists (but should after some tweaking). See dragdrop_function_4.html test file for details.
+
+* Added Element.getStyle to find computed CSS styles of an element. Note: doesn't work in all cases in Safari, see my bug report at http://bugzilla.opendarwin.org/show_bug.cgi?id=4125
+
+*1.1beta1*
+
+* Fixed rendering of last frame of animation when from/to is not 0.0/1.0. [thanks to David Zülke]
+
+* Updated internal Prototype JavaScript framework to version 1.4.0_pre2 (patched w/ workaround for Ajax.Updater init bug)
+
+* Some refactoring of controls.js to get rid of "dirty" implementation detail (dont' ask)
+
+* Added returning the generated combined effects to allow for .cancel() on all effects
+
+* Updated internal Prototype JavaScript framework to version 1.4.0_pre2
+
+*Rails 0.13.1*
+
+* Updated Ajax.Autocompleter to deal with parameters options correctly [Martin Marinschek]
+
+* Updated controls.js to allow multple matches in local localcompletion [Ivan Krstic]
+
+* Make version of prototype.js in lib have a nicer Event object [David Zülke]
+
+* Added incremental and local autocompleting and loads of documentation to controls.js [Ivan Krstic]
+
+* Experimental: make version of prototype.js in lib destroy events on page unload to prevent browser memory leaks
+
+* Fixed a possible memory leak in dragdrop.js
+
+* Make version of prototype.js in lib compatible with some 3rd-party JavaScript libraries (like IE7) by refactoring to use Object.extend() for testing [David Zülke]
+
+* Make effects.js, dragdrop.js and controls.js compatible with some 3rd-party JavaScript libraries (like IE7) by refactoring to use Object.extend() [David Zülke]
+
+* Changed some tests to work better
+
+* Always reset background color on Effect.Highlight; this make change backwards-compatibility, to be sure include style="background-color:(target-color)" on your elements or else elements will fall back to their CSS rules (which is a good thing in most circumstances)
+
+* Removed a possible memory leaks with IE with sortables and droppables (removed references from elements)
+
+* Changes to class extension in effects.js
+
+* Make Effect.Highlight restore any previously set background color when finishing (makes effect work with set CSS classes)
+
+* Added capability to remove draggables/droppables and redeclare sortables in dragdrop.js
+
+* Added Effect.ScrollTo to smoothly scroll the page to an element
+
+* Better Firefox flickering handling on SlideUp/SlideDown
+
+* Some cleaning up in effects.js
+
+* Removed a possible memory leak in IE with draggables
+
+* Added support for cancelling dragging my hitting ESC
+
+* Changed logic of drag-and-drop to only include the last referenced droppable when firing a drop event. This change also offers slight performance gains. [Dominik Wagner]
+
+* Added addtional effects test page, added tests for scriptfragment matching
+
+*1.0.0*
+
+* Changed auto-hiding update div in Ajax.Autocompleter
+
+* Changed default serialization on Ajax.Autocompleter to use Form.Element.serialize
+
+* Added test file for drag/drop inside scrolled elements
+
+* Fixed dragging of unpositioned elements in Internet Explorer
+
+* Change default behaviour of Ajax.Autocompleter to do automatic overlapping, sizing and appear/fade effects
+
+* Fixed Internet Explorer hide-windowed-controls iframe handling
+
+* Changed Ajax.Autocompleter event handling
+
+* Added onShow/onHide callbacks to Ajax.Autocompleter to allow for customized handling/effects
+
+* Fixed SlideUp/SlideDown to restore the overflow CSS property (note: Firefox 1.0.X is buggy, set overflow:hidden as a workaround)
+
+* Fixed BlindUp/BlindDown to restore the overflow CSS property (note: Firefox 1.0.X is buggy, set overflow:hidden as a workaround)
+
+* Fixed draggables with revert:false on repeated drags behaving badly
+
+* Expanded the revert option on draggables to optionally take a function and revert only if it returns true
+
+* Added the dragged element as a parameter to the Draggables.notify callbacks [Michael Sokolov]
+
+* Removed a deprecated reference to Effect2 om Effect.Fold
+
+* Make the percentage on Element.setContentZoom absolute
+
+* Corrected rendering of Ajax.AutoCompleter when focus is lost while updating
+
+* Added (crude) functional tests
+
+* Some slight refactoring in controls.js
+
+* Changed dragdrop.js to use the Effect namespace for its effects
+
+* Updated to Prototype 1.3.0: removal of prototype-ext.js; refactoring.
+
+* Fixed behaviour of cursor keys in Safari on autocomplete script
+
+* Fixed Position.within_including_scrolloffsets
+
+* Fixed sortables that are absolutely positioned
+
+* Fixed unhandled whitespace in Ajax.Autocompleter
+
+* Updated prototype-ext.js to include additions for Ajax.Autocompleter
+
+* Added controls.js, contains AJAX autocompleting text fields from #960
+
+* Refactored Event object
+
+* Renamed effects2.js to effects.js
+
+* Fixed draggables on pages with no droppables
+
+* Moved Event, Position and Element.Class to prototype-ext.js in preparation to Rails 0.13
+
+* Added Effect.Transitions.pulse
+
+* Added Effect.Pulsate and Effect.Fold effect by Justin Palmer
+
+* Added transitions by Mark Pilgrim: .full, .none
+
+* Added effects by Mark Pilgrim: Effect.Grow, Effect.Shrink
+
+* Changed effects namespace to Effect. (Effect2 is deprecated, but works too)
+
+* Changed old Effect.ContentZoom class to Element.setContentZoom() function
+
+* Greatly expanded Effect.Highlight to have user-defined colors and autodetecting the background color
+
+* Converted remaining effects (Squish, Highlight) to new format
+
+* Sortable.create now passes the zindex, starteffect, reverteffect and endeffect options to the underlying Draggables
+
+* Sortable.serialize now honors the only option on Sortable.create
+
+* New overridable options on Draggables: zindex, starteffect, reverteffect, endeffect
+
+* Fix a Gecko engine flicker on Sortables in dragdrop.js
+
+* Fixed event.isLeftClick
+
+* Some small changes in effects2.js
+
+* Refactoring of dragdrop.js
+
+* Added an Object.prototype.inspect() and more verbose messages for js unit testing
+
+* Added test/unittest.js and initial tests in test/html.
+
+* Cleaning up of effects2.js (convert tabs to spaces)
+
+* Added Rakefile for distribution packaging (default task = make distribution, rake clean for cleaning up)
+
+* Initial check-in and directory layout for the script.aculo.us JavaScripts
diff --git a/framework/Web/Javascripts/effects/MIT-LICENSE b/framework/Web/Javascripts/effects/MIT-LICENSE
index 27a25f8c..36af55c2 100644
--- a/framework/Web/Javascripts/effects/MIT-LICENSE
+++ b/framework/Web/Javascripts/effects/MIT-LICENSE
@@ -1,20 +1,20 @@
-Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/framework/Web/Javascripts/effects/README b/framework/Web/Javascripts/effects/README
index 7141a34a..94ff1307 100644
--- a/framework/Web/Javascripts/effects/README
+++ b/framework/Web/Javascripts/effects/README
@@ -1,57 +1,57 @@
-== script.aculo.us web 2.0 javascript
-
-The Web is changing. The 30-year-old terminal-like technology it was originally
-is gradually giving way to new ways of doing things. The power of AJAX allows
-for rich user interaction without the trouble that has bugged traditional
-web applications.
-
-Building upon the wonderful Prototype JavaScript library, script.aculo.us
-provides you with some great additional ingredients to mix in.
-
-For more information, see http://script.aculo.us/
-
-== What's new in this release?
-
-See the CHANGELOG file for information on what's new.
-
-== Installation/Usage
-
-This pre-release version of script.aculo.us includes the
-Prototype framework 1.4.0_rc3. You can use later versions,
-as they become available (see http://prototype.conio.net).
-
-Put prototype.js, and the six files scriptaculous.js,
-builder.js, effects.js, dragdrop.js, controls.js and slider.js
-in a directory of your website, e.g. /javascripts.
-
-(The unittest.js file is optional and is only needed if you
-want to do unit testing on your own javascripts).
-
-Now, you can include the scripts by adding the following
-tags to the HEAD section of your HTML pages:
-
- <script src="/javascripts/prototype.js" type="text/javascript"></script>
- <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
-
-scriptaculous.js will automatically load the other files of the
-script.aculo.us distribution in, provided they are accessible
-via the same path.
-
-See http://wiki.script.aculo.us/scriptaculous/show/Usage for detailed
-usage instructions.
-
-== The distribution
-
-Besides the script.aculo.us files in src, there's a complete
-test tree included which holds functional and unit tests for
-script.aculo.us.
-
-If you need examples on how to implement things, the best place to
-start is by opening test/run_functional_tests.html or
-test/run_unit_tests.html in your browser, and looking at
-the sources of the examples provided.
-
-== License
-
-script.aculo.us is licensed under the terms of the MIT License,
+== script.aculo.us web 2.0 javascript
+
+The Web is changing. The 30-year-old terminal-like technology it was originally
+is gradually giving way to new ways of doing things. The power of AJAX allows
+for rich user interaction without the trouble that has bugged traditional
+web applications.
+
+Building upon the wonderful Prototype JavaScript library, script.aculo.us
+provides you with some great additional ingredients to mix in.
+
+For more information, see http://script.aculo.us/
+
+== What's new in this release?
+
+See the CHANGELOG file for information on what's new.
+
+== Installation/Usage
+
+script.aculo.us includes the Prototype JavaScript Framework
+V1.5.0. You can use later versions, as they become available
+(see http://prototype.conio.net).
+
+Put prototype.js, and the six files scriptaculous.js,
+builder.js, effects.js, dragdrop.js, controls.js and slider.js
+in a directory of your website, e.g. /javascripts.
+
+(The unittest.js file is optional and is only needed if you
+want to do unit testing on your own javascripts).
+
+Now, you can include the scripts by adding the following
+tags to the HEAD section of your HTML pages:
+
+ <script src="/javascripts/prototype.js" type="text/javascript"></script>
+ <script src="/javascripts/scriptaculous.js" type="text/javascript"></script>
+
+scriptaculous.js will automatically load the other files of the
+script.aculo.us distribution in, provided they are accessible
+via the same path.
+
+See http://wiki.script.aculo.us/scriptaculous/show/Usage for detailed
+usage instructions.
+
+== The distribution
+
+Besides the script.aculo.us files in src, there's a complete
+test tree included which holds functional and unit tests for
+script.aculo.us.
+
+If you need examples on how to implement things, the best place to
+start is by opening test/run_functional_tests.html or
+test/run_unit_tests.html in your browser, and looking at
+the sources of the examples provided.
+
+== License
+
+script.aculo.us is licensed under the terms of the MIT License,
see the included MIT-LICENSE file. \ No newline at end of file
diff --git a/framework/Web/Javascripts/effects/controls.js b/framework/Web/Javascripts/effects/controls.js
index 3307f2e2..de0261ed 100644
--- a/framework/Web/Javascripts/effects/controls.js
+++ b/framework/Web/Javascripts/effects/controls.js
@@ -141,8 +141,8 @@ Autocompleter.Base.prototype = {
return;
}
else
- if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN)
- return;
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+ (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
this.changed = true;
this.hasFocus = true;
@@ -152,6 +152,12 @@ Autocompleter.Base.prototype = {
setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
},
+ activate: function() {
+ this.changed = false;
+ this.hasFocus = true;
+ this.getUpdatedChoices();
+ },
+
onHover: function(event) {
var element = Event.findElement(event, 'LI');
if(this.index != element.autocompleteIndex)
@@ -310,7 +316,7 @@ Autocompleter.Base.prototype = {
Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
initialize: function(element, update, url, options) {
- this.baseInitialize(element, update, options);
+ this.baseInitialize(element, update, options);
this.options.asynchronous = true;
this.options.onComplete = this.onComplete.bind(this);
this.options.defaultParams = this.options.parameters || null;
@@ -477,9 +483,10 @@ Ajax.InPlaceEditor.prototype = {
formClassName: 'inplaceeditor-form',
highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
highlightendcolor: "#FFFFFF",
- externalControl: null,
+ externalControl: null,
submitOnBlur: false,
- ajaxOptions: {}
+ ajaxOptions: {},
+ evalScripts: false
}, options || {});
if(!this.options.formId && this.element.id) {
@@ -548,6 +555,7 @@ Ajax.InPlaceEditor.prototype = {
okButton = document.createElement("input");
okButton.type = "submit";
okButton.value = this.options.okText;
+ okButton.className = 'editor_ok_button';
this.form.appendChild(okButton);
}
@@ -556,6 +564,7 @@ Ajax.InPlaceEditor.prototype = {
cancelLink.href = "#";
cancelLink.appendChild(document.createTextNode(this.options.cancelText));
cancelLink.onclick = this.onclickCancel.bind(this);
+ cancelLink.className = 'editor_cancel';
this.form.appendChild(cancelLink);
}
},
@@ -584,6 +593,7 @@ Ajax.InPlaceEditor.prototype = {
textField.name = "value";
textField.value = text;
textField.style.backgroundColor = this.options.highlightcolor;
+ textField.className = 'editor_field';
var size = this.options.size || this.options.cols || 0;
if (size != 0) textField.size = size;
if (this.options.submitOnBlur)
@@ -597,6 +607,7 @@ Ajax.InPlaceEditor.prototype = {
textArea.value = this.convertHTMLLineBreaks(text);
textArea.rows = this.options.rows;
textArea.cols = this.options.cols || 40;
+ textArea.className = 'editor_field';
if (this.options.submitOnBlur)
textArea.onblur = this.onSubmit.bind(this);
this.editField = textArea;
@@ -649,19 +660,26 @@ Ajax.InPlaceEditor.prototype = {
// to be displayed indefinitely
this.onLoading();
- new Ajax.Updater(
- {
- success: this.element,
- // don't update on failure (this could be an option)
- failure: null
- },
- this.url,
- Object.extend({
- parameters: this.options.callback(form, value),
- onComplete: this.onComplete.bind(this),
- onFailure: this.onFailure.bind(this)
- }, this.options.ajaxOptions)
- );
+ if (this.options.evalScripts) {
+ new Ajax.Request(
+ this.url, Object.extend({
+ parameters: this.options.callback(form, value),
+ onComplete: this.onComplete.bind(this),
+ onFailure: this.onFailure.bind(this),
+ asynchronous:true,
+ evalScripts:true
+ }, this.options.ajaxOptions));
+ } else {
+ new Ajax.Updater(
+ { success: this.element,
+ // don't update on failure (this could be an option)
+ failure: null },
+ this.url, Object.extend({
+ parameters: this.options.callback(form, value),
+ onComplete: this.onComplete.bind(this),
+ onFailure: this.onFailure.bind(this)
+ }, this.options.ajaxOptions));
+ }
// stop the event to avoid a page refresh in Safari
if (arguments.length > 1) {
Event.stop(arguments[0]);
@@ -743,6 +761,33 @@ Ajax.InPlaceEditor.prototype = {
}
};
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+ createEditField: function() {
+ if (!this.cached_selectTag) {
+ var selectTag = document.createElement("select");
+ var collection = this.options.collection || [];
+ var optionTag;
+ collection.each(function(e,i) {
+ optionTag = document.createElement("option");
+ optionTag.value = (e instanceof Array) ? e[0] : e;
+ if(this.options.value==optionTag.value) optionTag.selected = true;
+ optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+ selectTag.appendChild(optionTag);
+ }.bind(this));
+ this.cached_selectTag = selectTag;
+ }
+
+ this.editField = this.cached_selectTag;
+ if(this.options.loadTextURL) this.loadExternalText();
+ this.form.appendChild(this.editField);
+ this.options.callback = function(form, value) {
+ return "value=" + encodeURIComponent(value);
+ }
+ }
+});
+
// Delayed observer, like Form.Element.Observer,
// but waits for delay after last key input
// Ideal for live-search fields
diff --git a/framework/Web/Javascripts/effects/dragdrop.js b/framework/Web/Javascripts/effects/dragdrop.js
index 818ef5e0..be2a30f5 100644
--- a/framework/Web/Javascripts/effects/dragdrop.js
+++ b/framework/Web/Javascripts/effects/dragdrop.js
@@ -1,4 +1,5 @@
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
//
// See scriptaculous.js for full license.
@@ -15,7 +16,8 @@ var Droppables = {
element = $(element);
var options = Object.extend({
greedy: true,
- hoverclass: null
+ hoverclass: null,
+ tree: false
}, arguments[1] || {});
// cache containers
@@ -37,12 +39,27 @@ var Droppables = {
this.drops.push(options);
},
+
+ findDeepestChild: function(drops) {
+ deepest = drops[0];
+
+ for (i = 1; i < drops.length; ++i)
+ if (Element.isParent(drops[i].element, deepest.element))
+ deepest = drops[i];
+
+ return deepest;
+ },
isContained: function(element, drop) {
- var parentNode = element.parentNode;
- return drop._containers.detect(function(c) { return parentNode == c });
+ var containmentNode;
+ if(drop.tree) {
+ containmentNode = element.treeNode;
+ } else {
+ containmentNode = element.parentNode;
+ }
+ return drop._containers.detect(function(c) { return containmentNode == c });
},
-
+
isAffected: function(point, element, drop) {
return (
(drop.element!=element) &&
@@ -68,18 +85,22 @@ var Droppables = {
show: function(point, element) {
if(!this.drops.length) return;
+ var affected = [];
if(this.last_active) this.deactivate(this.last_active);
this.drops.each( function(drop) {
- if(Droppables.isAffected(point, element, drop)) {
- if(drop.onHover)
- drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
- if(drop.greedy) {
- Droppables.activate(drop);
- throw $break;
- }
- }
+ if(Droppables.isAffected(point, element, drop))
+ affected.push(drop);
});
+
+ if(affected.length>0) {
+ drop = Droppables.findDeepestChild(affected);
+ Position.within(drop.element, point[0], point[1]);
+ if(drop.onHover)
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+
+ Droppables.activate(drop);
+ }
},
fire: function(event, element) {
@@ -128,7 +149,7 @@ var Draggables = {
this.activeDraggable = draggable;
},
- deactivate: function(draggbale) {
+ deactivate: function() {
this.activeDraggable = null;
},
@@ -187,27 +208,37 @@ Draggable.prototype = {
initialize: function(element) {
var options = Object.extend({
handle: false,
- starteffect: function(element) {
- new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7});
+ starteffect: function(element) {
+ element._opacity = Element.getOpacity(element);
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
},
reverteffect: function(element, top_offset, left_offset) {
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
},
- endeffect: function(element) {
- new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0});
+ endeffect: function(element) {
+ var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity});
},
zindex: 1000,
revert: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] }
}, arguments[1] || {});
this.element = $(element);
- if(options.handle && (typeof options.handle == 'string'))
- this.handle = Element.childrenWithClassName(this.element, options.handle)[0];
+ if(options.handle && (typeof options.handle == 'string')) {
+ var h = Element.childrenWithClassName(this.element, options.handle, true);
+ if(h.length>0) this.handle = h[0];
+ }
if(!this.handle) this.handle = $(options.handle);
if(!this.handle) this.handle = this.element;
+
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML)
+ options.scroll = $(options.scroll);
Element.makePositioned(this.element); // fix IE
@@ -239,6 +270,7 @@ Draggable.prototype = {
if(src.tagName && (
src.tagName=='INPUT' ||
src.tagName=='SELECT' ||
+ src.tagName=='OPTION' ||
src.tagName=='BUTTON' ||
src.tagName=='TEXTAREA')) return;
@@ -270,6 +302,17 @@ Draggable.prototype = {
this.element.parentNode.insertBefore(this._clone, this.element);
}
+ if(this.options.scroll) {
+ if (this.options.scroll == window) {
+ var where = this._getWindowScroll(this.options.scroll);
+ this.originalScrollLeft = where.left;
+ this.originalScrollTop = where.top;
+ } else {
+ this.originalScrollLeft = this.options.scroll.scrollLeft;
+ this.originalScrollTop = this.options.scroll.scrollTop;
+ }
+ }
+
Draggables.notify('onStart', this, event);
if(this.options.starteffect) this.options.starteffect(this.element);
},
@@ -282,8 +325,30 @@ Draggable.prototype = {
this.draw(pointer);
if(this.options.change) this.options.change(this);
+ if(this.options.scroll) {
+ this.stopScrolling();
+
+ var p;
+ if (this.options.scroll == window) {
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+ } else {
+ p = Position.page(this.options.scroll);
+ p[0] += this.options.scroll.scrollLeft;
+ p[1] += this.options.scroll.scrollTop;
+ p.push(p[0]+this.options.scroll.offsetWidth);
+ p.push(p[1]+this.options.scroll.offsetHeight);
+ }
+ var speed = [0,0];
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+ this.startScrolling(speed);
+ }
+
// fix AppleWebKit rendering
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+
Event.stop(event);
},
@@ -321,13 +386,14 @@ Draggable.prototype = {
},
keyPress: function(event) {
- if(!event.keyCode==Event.KEY_ESC) return;
+ if(event.keyCode!=Event.KEY_ESC) return;
this.finishDrag(event, false);
Event.stop(event);
},
endDrag: function(event) {
if(!this.dragging) return;
+ this.stopScrolling();
this.finishDrag(event, true);
Event.stop(event);
},
@@ -337,11 +403,18 @@ Draggable.prototype = {
var d = this.currentDelta();
pos[0] -= d[0]; pos[1] -= d[1];
- var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this));
+ if(this.options.scroll && (this.options.scroll != window)) {
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+ }
+
+ var p = [0,1].map(function(i){
+ return (point[i]-pos[i]-this.offset[i])
+ }.bind(this));
if(this.options.snap) {
if(typeof this.options.snap == 'function') {
- p = this.options.snap(p[0],p[1]);
+ p = this.options.snap(p[0],p[1],this);
} else {
if(this.options.snap instanceof Array) {
p = p.map( function(v, i) {
@@ -358,6 +431,75 @@ Draggable.prototype = {
if((!this.options.constraint) || (this.options.constraint=='vertical'))
style.top = p[1] + "px";
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+ },
+
+ stopScrolling: function() {
+ if(this.scrollInterval) {
+ clearInterval(this.scrollInterval);
+ this.scrollInterval = null;
+ Draggables._lastScrollPointer = null;
+ }
+ },
+
+ startScrolling: function(speed) {
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+ this.lastScrolled = new Date();
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+ },
+
+ scroll: function() {
+ var current = new Date();
+ var delta = current - this.lastScrolled;
+ this.lastScrolled = current;
+ if(this.options.scroll == window) {
+ with (this._getWindowScroll(this.options.scroll)) {
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+ var d = delta / 1000;
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+ }
+ }
+ } else {
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
+ }
+
+ Position.prepare();
+ Droppables.show(Draggables._lastPointer, this.element);
+ Draggables.notify('onDrag', this);
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+ if (Draggables._lastScrollPointer[0] < 0)
+ Draggables._lastScrollPointer[0] = 0;
+ if (Draggables._lastScrollPointer[1] < 0)
+ Draggables._lastScrollPointer[1] = 0;
+ this.draw(Draggables._lastScrollPointer);
+
+ if(this.options.change) this.options.change(this);
+ },
+
+ _getWindowScroll: function(w) {
+ var T, L, W, H;
+ with (w.document) {
+ if (w.document.documentElement && documentElement.scrollTop) {
+ T = documentElement.scrollTop;
+ L = documentElement.scrollLeft;
+ } else if (w.document.body) {
+ T = body.scrollTop;
+ L = body.scrollLeft;
+ }
+ if (w.innerWidth) {
+ W = w.innerWidth;
+ H = w.innerHeight;
+ } else if (w.document.documentElement && documentElement.clientWidth) {
+ W = documentElement.clientWidth;
+ H = documentElement.clientHeight;
+ } else {
+ W = body.offsetWidth;
+ H = body.offsetHeight
+ }
+ }
+ return { top: T, left: L, width: W, height: H };
}
}
@@ -383,30 +525,41 @@ SortableObserver.prototype = {
}
var Sortable = {
- sortables: new Array(),
+ sortables: {},
- options: function(element){
- element = $(element);
- return this.sortables.detect(function(s) { return s.element == element });
+ _findRootElement: function(element) {
+ while (element.tagName != "BODY") {
+ if(element.id && Sortable.sortables[element.id]) return element;
+ element = element.parentNode;
+ }
+ },
+
+ options: function(element) {
+ element = Sortable._findRootElement($(element));
+ if(!element) return;
+ return Sortable.sortables[element.id];
},
destroy: function(element){
- element = $(element);
- this.sortables.findAll(function(s) { return s.element == element }).each(function(s){
+ var s = Sortable.options(element);
+
+ if(s) {
Draggables.removeObserver(s.element);
s.droppables.each(function(d){ Droppables.remove(d) });
s.draggables.invoke('destroy');
- });
- this.sortables = this.sortables.reject(function(s) { return s.element == element });
+
+ delete Sortable.sortables[s.element.id];
+ }
},
-
+
create: function(element) {
element = $(element);
var options = Object.extend({
element: element,
tag: 'li', // assumes li children, override with tag: 'tagname'
dropOnEmpty: false,
- tree: false, // fixme: unimplemented
+ tree: false,
+ treeTag: 'ul',
overlap: 'vertical', // one of 'vertical', 'horizontal'
constraint: 'vertical', // one of 'vertical', 'horizontal', false
containment: element, // also takes array of elements (or id's); or false
@@ -414,7 +567,10 @@ var Sortable = {
only: false,
hoverclass: null,
ghosting: false,
- format: null,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ format: /^[^_]*_(.*)$/,
onChange: Prototype.emptyFunction,
onUpdate: Prototype.emptyFunction
}, arguments[1] || {});
@@ -425,6 +581,9 @@ var Sortable = {
// build options for the draggables
var options_for_draggable = {
revert: true,
+ scroll: options.scroll,
+ scrollSpeed: options.scrollSpeed,
+ scrollSensitivity: options.scrollSensitivity,
ghosting: options.ghosting,
constraint: options.constraint,
handle: options.handle };
@@ -450,9 +609,17 @@ var Sortable = {
var options_for_droppable = {
overlap: options.overlap,
containment: options.containment,
+ tree: options.tree,
hoverclass: options.hoverclass,
- onHover: Sortable.onHover,
- greedy: !options.dropOnEmpty
+ onHover: Sortable.onHover
+ //greedy: !options.dropOnEmpty
+ }
+
+ var options_for_tree = {
+ onHover: Sortable.onEmptyHover,
+ overlap: options.overlap,
+ containment: options.containment,
+ hoverclass: options.hoverclass
}
// fix for gecko engine
@@ -461,12 +628,9 @@ var Sortable = {
options.draggables = [];
options.droppables = [];
- // make it so
-
// drop on empty handling
- if(options.dropOnEmpty) {
- Droppables.add(element,
- {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});
+ if(options.dropOnEmpty || options.tree) {
+ Droppables.add(element, options_for_tree);
options.droppables.push(element);
}
@@ -477,11 +641,20 @@ var Sortable = {
options.draggables.push(
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
Droppables.add(e, options_for_droppable);
+ if(options.tree) e.treeNode = element;
options.droppables.push(e);
});
+
+ if(options.tree) {
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {
+ Droppables.add(e, options_for_tree);
+ e.treeNode = element;
+ options.droppables.push(e);
+ });
+ }
// keep reference
- this.sortables.push(options);
+ this.sortables[element.id] = options;
// for onupdate
Draggables.addObserver(new SortableObserver(element, options.onUpdate));
@@ -490,23 +663,21 @@ var Sortable = {
// return all suitable-for-sortable elements in a guaranteed order
findElements: function(element, options) {
- if(!element.hasChildNodes()) return null;
- var elements = [];
- $A(element.childNodes).each( function(e) {
- if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() &&
- (!options.only || (Element.hasClassName(e, options.only))))
- elements.push(e);
- if(options.tree) {
- var grandchildren = this.findElements(e, options);
- if(grandchildren) elements.push(grandchildren);
- }
- });
-
- return (elements.length>0 ? elements.flatten() : null);
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.tag);
+ },
+
+ findTreeElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.treeTag);
},
onHover: function(element, dropon, overlap) {
- if(overlap>0.5) {
+ if(Element.isParent(dropon, element)) return;
+
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+ return;
+ } else if(overlap>0.5) {
Sortable.mark(dropon, 'before');
if(dropon.previousSibling != element) {
var oldParentNode = element.parentNode;
@@ -529,13 +700,37 @@ var Sortable = {
}
}
},
-
- onEmptyHover: function(element, dropon) {
- if(element.parentNode!=dropon) {
- var oldParentNode = element.parentNode;
- dropon.appendChild(element);
+
+ onEmptyHover: function(element, dropon, overlap) {
+ var oldParentNode = element.parentNode;
+ var droponOptions = Sortable.options(dropon);
+
+ if(!Element.isParent(dropon, element)) {
+ var index;
+
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag});
+ var child = null;
+
+ if(children) {
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+
+ for (index = 0; index < children.length; index += 1) {
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+ child = index + 1 < children.length ? children[index + 1] : null;
+ break;
+ } else {
+ child = children[index];
+ break;
+ }
+ }
+ }
+
+ dropon.insertBefore(element, child);
+
Sortable.options(oldParentNode).onChange(element);
- Sortable.options(dropon).onChange(element);
+ droponOptions.onChange(element);
}
},
@@ -567,19 +762,154 @@ var Sortable = {
Element.show(Sortable._marker);
},
+
+ _tree: function(element, options, parent) {
+ var children = Sortable.findElements(element, options) || [];
+
+ for (var i = 0; i < children.length; ++i) {
+ var match = children[i].id.match(options.format);
- serialize: function(element) {
+ if (!match) continue;
+
+ var child = {
+ id: encodeURIComponent(match ? match[1] : null),
+ element: element,
+ parent: parent,
+ children: new Array,
+ position: parent.children.length,
+ container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
+ }
+
+ /* Get the element containing the children and recurse over it */
+ if (child.container)
+ this._tree(child.container, options, child)
+
+ parent.children.push (child);
+ }
+
+ return parent;
+ },
+
+ /* Finds the first element of the given tag type within a parent element.
+ Used for finding the first LI[ST] within a L[IST]I[TEM].*/
+ _findChildrenElement: function (element, containerTag) {
+ if (element && element.hasChildNodes)
+ for (var i = 0; i < element.childNodes.length; ++i)
+ if (element.childNodes[i].tagName == containerTag)
+ return element.childNodes[i];
+
+ return null;
+ },
+
+ tree: function(element) {
element = $(element);
var sortableOptions = this.options(element);
var options = Object.extend({
- tag: sortableOptions.tag,
+ tag: sortableOptions.tag,
+ treeTag: sortableOptions.treeTag,
only: sortableOptions.only,
name: element.id,
- format: sortableOptions.format || /^[^_]*_(.*)$/
+ format: sortableOptions.format
}, arguments[1] || {});
+
+ var root = {
+ id: null,
+ parent: null,
+ children: new Array,
+ container: element,
+ position: 0
+ }
+
+ return Sortable._tree (element, options, root);
+ },
+
+ /* Construct a [i] index for a particular node */
+ _constructIndex: function(node) {
+ var index = '';
+ do {
+ if (node.id) index = '[' + node.position + ']' + index;
+ } while ((node = node.parent) != null);
+ return index;
+ },
+
+ sequence: function(element) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[1] || {});
+
return $(this.findElements(element, options) || []).map( function(item) {
- return (encodeURIComponent(options.name) + "[]=" +
- encodeURIComponent(item.id.match(options.format) ? item.id.match(options.format)[1] : ''));
- }).join("&");
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+ });
+ },
+
+ setSequence: function(element, new_sequence) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[2] || {});
+
+ var nodeMap = {};
+ this.findElements(element, options).each( function(n) {
+ if (n.id.match(options.format))
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+ n.parentNode.removeChild(n);
+ });
+
+ new_sequence.each(function(ident) {
+ var n = nodeMap[ident];
+ if (n) {
+ n[1].appendChild(n[0]);
+ delete nodeMap[ident];
+ }
+ });
+ },
+
+ serialize: function(element) {
+ element = $(element);
+ var options = Object.extend(Sortable.options(element), arguments[1] || {});
+ var name = encodeURIComponent(
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+
+ if (options.tree) {
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {
+ return [name + Sortable._constructIndex(item) + "=" +
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+ }).flatten().join('&');
+ } else {
+ return Sortable.sequence(element, arguments[1]).map( function(item) {
+ return name + "[]=" + encodeURIComponent(item);
+ }).join('&');
+ }
}
+}
+
+/* Returns true if child is contained within element */
+Element.isParent = function(child, element) {
+ if (!child.parentNode || child == element) return false;
+
+ if (child.parentNode == element) return true;
+
+ return Element.isParent(child.parentNode, element);
+}
+
+Element.findChildren = function(element, only, recursive, tagName) {
+ if(!element.hasChildNodes()) return null;
+ tagName = tagName.toUpperCase();
+ if(only) only = [only].flatten();
+ var elements = [];
+ $A(element.childNodes).each( function(e) {
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+ elements.push(e);
+ if(recursive) {
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);
+ if(grandchildren) elements.push(grandchildren);
+ }
+ });
+
+ return (elements.length>0 ? elements.flatten() : []);
+}
+
+Element.offsetSize = function (element, type) {
+ if (type == 'vertical' || type == 'height')
+ return element.offsetHeight;
+ else
+ return element.offsetWidth;
} \ No newline at end of file
diff --git a/framework/Web/Javascripts/effects/effects.js b/framework/Web/Javascripts/effects/effects.js
index d3940a82..0864323e 100644
--- a/framework/Web/Javascripts/effects/effects.js
+++ b/framework/Web/Javascripts/effects/effects.js
@@ -6,8 +6,6 @@
//
// See scriptaculous.js for full license.
-/* ------------- element ext -------------- */
-
// converts rgb() and #xxx to #xxxxxx format,
// returns self (or first argument) if not convertable
String.prototype.parseColor = function() {
@@ -24,6 +22,8 @@ String.prototype.parseColor = function() {
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 :
@@ -35,18 +35,14 @@ 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.collectTextNodes(node) : ''));
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
}).flatten().join('');
}
-Element.setStyle = function(element, style) {
- element = $(element);
- for(k in style) element.style[k.camelize()] = style[k];
-}
-
-Element.setContentZoom = function(element, percent) {
+Element.setContentZoom = function(element, percent) {
+ element = $(element);
Element.setStyle(element, {fontSize: (percent/100) + 'em'});
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
}
Element.getOpacity = function(element){
@@ -73,18 +69,33 @@ Element.setOpacity = function(element, value){
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) {
- return $A($(element).getElementsByTagName('*')).select(
- function(c) { return Element.hasClassName(c, className) });
+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) });
@@ -137,9 +148,9 @@ var Effect = {
element = $(element);
effect = (effect || 'appear').toLowerCase();
var options = Object.extend({
- queue: { position:'end', scope:(element.id || 'global') }
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
}, arguments[2] || {});
- Effect[Element.visible(element) ?
+ Effect[element.visible() ?
Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
}
};
@@ -209,7 +220,10 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
effect.startOn += timestamp;
effect.finishOn += timestamp;
- this.effects.push(effect);
+
+ 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);
},
@@ -340,15 +354,15 @@ Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
this.element = $(element);
// make this work on IE on elements without 'layout'
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
- Element.setStyle(this.element, {zoom: 1});
+ this.element.setStyle({zoom: 1});
var options = Object.extend({
- from: Element.getOpacity(this.element) || 0.0,
+ from: this.element.getOpacity() || 0.0,
to: 1.0
}, arguments[1] || {});
this.start(options);
},
update: function(position) {
- Element.setOpacity(this.element, position);
+ this.element.setOpacity(position);
}
});
@@ -368,9 +382,9 @@ Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
// relative element that does not have top/left explicitly set.
// ==> Always set top and left for position relative elements in your stylesheets
// (to 0 if you do not need them)
- Element.makePositioned(this.element);
- this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
- this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0');
+ this.element.makePositioned();
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
if(this.options.mode == 'absolute') {
// absolute movement, so we need to calc deltaX and deltaY
this.options.x = this.options.x - this.originalLeft;
@@ -378,7 +392,7 @@ Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
}
},
update: function(position) {
- Element.setStyle(this.element, {
+ this.element.setStyle({
left: this.options.x * position + this.originalLeft + 'px',
top: this.options.y * position + this.originalTop + 'px'
});
@@ -408,7 +422,7 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
},
setup: function() {
this.restoreAfterFinish = this.options.restoreAfterFinish || false;
- this.elementPositioning = Element.getStyle(this.element,'position');
+ this.elementPositioning = this.element.getStyle('position');
this.originalStyle = {};
['top','left','width','height','fontSize'].each( function(k) {
@@ -418,7 +432,7 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
this.originalTop = this.element.offsetTop;
this.originalLeft = this.element.offsetLeft;
- var fontSize = Element.getStyle(this.element,'font-size') || '100%';
+ var fontSize = this.element.getStyle('font-size') || '100%';
['em','px','%'].each( function(fontSizeType) {
if(fontSize.indexOf(fontSizeType)>0) {
this.fontSize = parseFloat(fontSize);
@@ -440,11 +454,11 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
update: function(position) {
var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
if(this.options.scaleContent && this.fontSize)
- Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
+ 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) Element.setStyle(this.element, this.originalStyle);
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
},
setDimensions: function(height, width) {
var d = {};
@@ -461,7 +475,7 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
if(this.options.scaleX) d.left = -leftd + 'px';
}
}
- Element.setStyle(this.element, d);
+ this.element.setStyle(d);
}
});
@@ -474,25 +488,25 @@ Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype),
},
setup: function() {
// Prevent executing on elements not in the layout flow
- if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; }
+ if(this.element.getStyle('display')=='none') { this.cancel(); return; }
// Disable background image during the effect
this.oldStyle = {
- backgroundImage: Element.getStyle(this.element, 'background-image') };
- Element.setStyle(this.element, {backgroundImage: 'none'});
+ backgroundImage: this.element.getStyle('background-image') };
+ this.element.setStyle({backgroundImage: 'none'});
if(!this.options.endcolor)
- this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff');
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
if(!this.options.restorecolor)
- this.options.restorecolor = Element.getStyle(this.element, 'background-color');
+ this.options.restorecolor = this.element.getStyle('background-color');
// init color calculations
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) {
- Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){
+ 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() {
- Element.setStyle(this.element, Object.extend(this.oldStyle, {
+ this.element.setStyle(Object.extend(this.oldStyle, {
backgroundColor: this.options.restorecolor
}));
}
@@ -526,85 +540,91 @@ Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
/* ------------- combination effects ------------- */
Effect.Fade = function(element) {
- var oldOpacity = Element.getInlineOpacity(element);
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
var options = Object.extend({
- from: Element.getOpacity(element) || 1.0,
+ from: element.getOpacity() || 1.0,
to: 0.0,
- afterFinishInternal: function(effect) { with(Element) {
+ afterFinishInternal: function(effect) {
if(effect.options.to!=0) return;
- hide(effect.element);
- setStyle(effect.element, {opacity: oldOpacity}); }}
- }, arguments[1] || {});
+ 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(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
to: 1.0,
- beforeSetup: function(effect) { with(Element) {
- setOpacity(effect.element, effect.options.from);
- show(effect.element); }}
- }, arguments[1] || {});
+ // force Safari to render floated elements properly
+ 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(element), position: Element.getStyle(element, 'position') };
+ 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) { with(Element) {
- setStyle(effect.effects[0].element, {position: 'absolute'}); }},
- afterFinishInternal: function(effect) { with(Element) {
- hide(effect.effects[0].element);
- setStyle(effect.effects[0].element, oldStyle); }}
+ 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(element);
+ element.makeClipping();
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleX: false,
restoreAfterFinish: true,
- afterFinishInternal: function(effect) { with(Element) {
- [hide, undoClipping].call(effect.element); }}
+ afterFinishInternal: function(effect) {
+ effect.element.hide();
+ effect.element.undoClipping();
+ }
}, arguments[1] || {})
);
}
Effect.BlindDown = function(element) {
element = $(element);
- var oldHeight = Element.getStyle(element, 'height');
- var elementDimensions = Element.getDimensions(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) { with(Element) {
- makeClipping(effect.element);
- setStyle(effect.element, {height: '0px'});
- show(effect.element);
- }},
- afterFinishInternal: function(effect) { with(Element) {
- undoClipping(effect.element);
- setStyle(effect.element, {height: oldHeight});
- }}
+ 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(element);
+ var oldOpacity = element.getInlineOpacity();
return new Effect.Appear(element, {
duration: 0.4,
from: 0,
@@ -613,13 +633,16 @@ Effect.SwitchOff = function(element) {
new Effect.Scale(effect.element, 1, {
duration: 0.3, scaleFromCenter: true,
scaleX: false, scaleContent: false, restoreAfterFinish: true,
- beforeSetup: function(effect) { with(Element) {
- [makePositioned,makeClipping].call(effect.element);
- }},
- afterFinishInternal: function(effect) { with(Element) {
- [hide,undoClipping,undoPositioned].call(effect.element);
- setStyle(effect.element, {opacity: oldOpacity});
- }}
+ 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});
+ }
})
}
});
@@ -628,99 +651,110 @@ Effect.SwitchOff = function(element) {
Effect.DropOut = function(element) {
element = $(element);
var oldStyle = {
- top: Element.getStyle(element, 'top'),
- left: Element.getStyle(element, 'left'),
- opacity: Element.getInlineOpacity(element) };
+ 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) { with(Element) {
- makePositioned(effect.effects[0].element); }},
- afterFinishInternal: function(effect) { with(Element) {
- [hide, undoPositioned].call(effect.effects[0].element);
- setStyle(effect.effects[0].element, oldStyle); }}
+ 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(element, 'top'),
- left: Element.getStyle(element, '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) { with(Element) {
- undoPositioned(effect.element);
- setStyle(effect.element, 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(element);
+ element.cleanWhitespace();
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
- var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
- var elementDimensions = Element.getDimensions(element);
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');
+ var elementDimensions = element.getDimensions();
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
- scaleFrom: 0,
+ scaleFrom: window.opera ? 0 : 1,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
- afterSetup: function(effect) { with(Element) {
- makePositioned(effect.element);
- makePositioned(effect.element.firstChild);
- if(window.opera) setStyle(effect.element, {top: ''});
- makeClipping(effect.element);
- setStyle(effect.element, {height: '0px'});
- show(element); }},
- afterUpdateInternal: function(effect) { with(Element) {
- setStyle(effect.element.firstChild, {bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
- afterFinishInternal: function(effect) { with(Element) {
- undoClipping(effect.element);
- undoPositioned(effect.element.firstChild);
- undoPositioned(effect.element);
- setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
+ 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();
+ // IE will crash if child is undoPositioned first
+ 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(element);
- var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
- return new Effect.Scale(element, 0,
+ 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) { with(Element) {
- makePositioned(effect.element);
- makePositioned(effect.element.firstChild);
- if(window.opera) setStyle(effect.element, {top: ''});
- makeClipping(effect.element);
- show(element); }},
- afterUpdateInternal: function(effect) { with(Element) {
- setStyle(effect.element.firstChild, {bottom:
- (effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
- afterFinishInternal: function(effect) { with(Element) {
- [hide, undoClipping].call(effect.element);
- undoPositioned(effect.element.firstChild);
- undoPositioned(effect.element);
- setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
+ 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] || {})
);
}
@@ -729,11 +763,11 @@ Effect.SlideUp = function(element) {
Effect.Squish = function(element) {
return new Effect.Scale(element, window.opera ? 1 : 0,
{ restoreAfterFinish: true,
- beforeSetup: function(effect) { with(Element) {
- makeClipping(effect.element); }},
- afterFinishInternal: function(effect) { with(Element) {
- hide(effect.element);
- undoClipping(effect.element); }}
+ beforeSetup: function(effect) {
+ effect.element.makeClipping(effect.element); },
+ afterFinishInternal: function(effect) {
+ effect.element.hide(effect.element);
+ effect.element.undoClipping(effect.element); }
});
}
@@ -741,7 +775,7 @@ Effect.Grow = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
- moveTransistion: Effect.Transitions.sinoidal,
+ moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.full
}, arguments[1] || {});
@@ -750,9 +784,9 @@ Effect.Grow = function(element) {
left: element.style.left,
height: element.style.height,
width: element.style.width,
- opacity: Element.getInlineOpacity(element) };
+ opacity: element.getInlineOpacity() };
- var dims = Element.getDimensions(element);
+ var dims = element.getDimensions();
var initialMoveX, initialMoveY;
var moveX, moveY;
@@ -788,11 +822,11 @@ Effect.Grow = function(element) {
x: initialMoveX,
y: initialMoveY,
duration: 0.01,
- beforeSetup: function(effect) { with(Element) {
- hide(effect.element);
- makeClipping(effect.element);
- makePositioned(effect.element);
- }},
+ 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 }),
@@ -801,12 +835,15 @@ Effect.Grow = function(element) {
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
], Object.extend({
- beforeSetup: function(effect) { with(Element) {
- setStyle(effect.effects[0].element, {height: '0px'});
- show(effect.effects[0].element); }},
- afterFinishInternal: function(effect) { with(Element) {
- [undoClipping, undoPositioned].call(effect.effects[0].element);
- setStyle(effect.effects[0].element, oldStyle); }}
+ 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)
)
}
@@ -817,7 +854,7 @@ Effect.Shrink = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
- moveTransistion: Effect.Transitions.sinoidal,
+ moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.none
}, arguments[1] || {});
@@ -826,9 +863,9 @@ Effect.Shrink = function(element) {
left: element.style.left,
height: element.style.height,
width: element.style.width,
- opacity: Element.getInlineOpacity(element) };
+ opacity: element.getInlineOpacity() };
- var dims = Element.getDimensions(element);
+ var dims = element.getDimensions();
var moveX, moveY;
switch (options.direction) {
@@ -858,11 +895,14 @@ Effect.Shrink = function(element) {
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) { with(Element) {
- [makePositioned, makeClipping].call(effect.effects[0].element) }},
- afterFinishInternal: function(effect) { with(Element) {
- [hide, undoClipping, undoPositioned].call(effect.effects[0].element);
- setStyle(effect.effects[0].element, oldStyle); }}
+ 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)
);
}
@@ -870,13 +910,13 @@ Effect.Shrink = function(element) {
Effect.Pulsate = function(element) {
element = $(element);
var options = arguments[1] || {};
- var oldOpacity = Element.getInlineOpacity(element);
+ 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) { Element.setStyle(effect.element, {opacity: oldOpacity}); }
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
}, options), {transition: reverser}));
}
@@ -895,9 +935,24 @@ Effect.Fold = function(element) {
new Effect.Scale(element, 1, {
scaleContent: false,
scaleY: false,
- afterFinishInternal: function(effect) { with(Element) {
- [hide, undoClipping].call(effect.element);
- setStyle(effect.element, oldStyle);
- }} });
+ 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/effects/slider.js b/framework/Web/Javascripts/effects/slider.js
index fdd0bcca..c0f1fc01 100644
--- a/framework/Web/Javascripts/effects/slider.js
+++ b/framework/Web/Javascripts/effects/slider.js
@@ -200,10 +200,10 @@ Control.Slider.prototype = {
setSpan: function(span, range) {
if(this.isVertical()) {
span.style.top = this.translateToPx(range.start);
- span.style.height = this.translateToPx(range.end - range.start);
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);
} else {
span.style.left = this.translateToPx(range.start);
- span.style.width = this.translateToPx(range.end - range.start);
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);
}
},
updateStyles: function() {
diff --git a/framework/Web/Javascripts/extended/base.js b/framework/Web/Javascripts/extended/base.js
index 06a916d6..53856684 100644
--- a/framework/Web/Javascripts/extended/base.js
+++ b/framework/Web/Javascripts/extended/base.js
@@ -1,26 +1,29 @@
-/**
- * get element
- @ @param element or element id string
- @ returns element
+/**
+ * Similar to bindAsEventLister, but takes additional arguments.
*/
-function $(n,d) {
- if(isElement(n)) return n;
- if(isString(n)==false) return null;
- var p,i,x;
- if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
- d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
- if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
- for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=DOM.find(n,d.layers[i].document);
- if(!x && d.getElementById) x=d.getElementById(n); return x;
+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));
+ }
}
/**
- * Similar to bindAsEventLister, but takes additional arguments.
+ * Creates a new function by copying function definition from
+ * the <tt>base</tt> and optional <tt>definition</tt>.
+ * @param function a base function to copy from.
+ * @param array additional definition
+ * @param function return a new function with definition from both
+ * <tt>base</tt> and <tt>definition</tt>.
*/
-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;
+} \ No newline at end of file
diff --git a/framework/Web/Javascripts/extended/builder.js b/framework/Web/Javascripts/extended/builder.js
index 141eab51..c50fc6c6 100644
--- a/framework/Web/Javascripts/extended/builder.js
+++ b/framework/Web/Javascripts/extended/builder.js
@@ -1,3 +1,4 @@
+
Object.extend(Builder,
{
exportTags:function()
diff --git a/framework/Web/Javascripts/extended/dom.js b/framework/Web/Javascripts/extended/dom.js
deleted file mode 100644
index 21016b03..00000000
--- a/framework/Web/Javascripts/extended/dom.js
+++ /dev/null
@@ -1,7 +0,0 @@
-Object.extend(Element, {
- condClassName : function (element, className, cond)
- {
- (cond?Element.addClassName:Element.removeClassName)(element,className);
- }
-});
-
diff --git a/framework/Web/Javascripts/extended/event.js b/framework/Web/Javascripts/extended/event.js
index fc1c447b..40cf60a1 100644
--- a/framework/Web/Javascripts/extended/event.js
+++ b/framework/Web/Javascripts/extended/event.js
@@ -21,72 +21,10 @@ Object.extend(Event,
// opera onload is in document, not window
var w = document.addEventListener &&
!window.addEventListener ? document : window;
- Event.__observe(w,'load',fn);
+ Event.observe(w,'load',fn);
},
/**
- * Adds the specified event listener function to the set of
- * listeners registered on given element to handle events of the
- * specified type. If <tt>useCapture</tt> is <tt>true</tt>, the
- * listener is registered as a capturing event listener. If
- * <tt>useCapture</tt> is <tt>false</tt>, it is registered as a
- * normal event listener.
- *
- * <tt>Event.observe</tt> may be called multiple times to register
- * multiple event handlers for the same type of event on the
- * same nodes. Note, however, that the DOM makes no guarantees
- * about the order in which multiple event handlers will be invoked.
- *
- * Example: Show an alert box with message "Clicked!" when a link
- * with ID "link1" is clicked.
- * <code>
- * var link1_clicked = function()
- * {
- * alert("Clicked!");
- * };
- * Event.observe("link1", "click", link1_clicked);
- * </code>
- *
- * @param {Object} element id string, DOM Element, or an Array
- * of element ids or elements.
- * @param {String} The type of event for which the event listener
- * is to be invoked. For example, "load", "click", or "mousedown".
- * @param {Function} The event listener function that will be
- * invoked when an event of the specified type is dispatched to
- * this Document node.
- * @param {Boolean} If true, the specified listener is to be
- * invoked only during the capturing phase of event propagation.
- * The more common value of <tt>false</tt> means that the listener
- * will not be invoked during the capturing phase but instead will
- * be invoked when this node is the actual event target or when the
- * event bubbles up to this node from its original target.
- */
- observe: function(elements, name, observer, useCapture)
- {
- if(!isList(elements))
- return this.__observe(elements, name, observer, useCapture);
- for(var i=0; i<elements.length; i++)
- this.__observe(elements[i], name, observer, useCapture);
- },
-
- /**
- * Register event listeners.
- * @private
- */
- __observe: function(element, name, observer, useCapture)
- {
- var element = $(element);
- useCapture = useCapture || false;
-
- if (name == 'keypress' &&
- ((navigator.appVersion.indexOf('AppleWebKit') > 0)
- || element.attachEvent))
- name = 'keydown';
-
- this._observeAndCache(element, name, observer, useCapture);
- },
-
- /**
* @param {Event} a keyboard event
* @return {Number} the Unicode character code generated by the key
* that was struck.
diff --git a/framework/Web/Javascripts/extended/string.js b/framework/Web/Javascripts/extended/string.js
index 46274256..5cd1bd8e 100644
--- a/framework/Web/Javascripts/extended/string.js
+++ b/framework/Web/Javascripts/extended/string.js
@@ -79,13 +79,14 @@ Object.extend(String.prototype, {
if(command[new String(action)])
command=command[new String(action)];
});
- if(isFunction(command))
+ if(typeof(command) == "function")
return command;
else
{
if(typeof Logger != "undefined")
Logger.error("Missing function", this);
- return Prototype.emptyFunction;
+
+ throw new Error ("Missing function '"+this+"'");
}
},
@@ -110,11 +111,17 @@ Object.extend(String.prototype, {
*/
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);
@@ -161,4 +168,4 @@ Object.extend(String.prototype, {
{
return Date.SimpleParse(this, format);
}
-});
+}); \ No newline at end of file
diff --git a/framework/Web/Javascripts/extended/util.js b/framework/Web/Javascripts/extended/util.js
deleted file mode 100644
index 86f2ae90..00000000
--- a/framework/Web/Javascripts/extended/util.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * @return {Boolean} true if is an object and has no constructors.
- */
-function isAlien(a) { return isObject(a) && typeof a.constructor != 'function' }
-
-/**
- * @return {Boolean}
- */
-function isArray(a) { return isObject(a) && a.constructor == Array }
-
-/**
- * isBoolean?
- */
-function isBoolean(a) { return typeof a == 'boolean' }
-
-/**
- * isFunction?
- */
-function isFunction(a) { return typeof a == 'function' }
-
-/**
- * isNull?
- */
-function isNull(a) { return typeof a == 'object' && !a }
-
-/**
- * isNumber?
- */
-function isNumber(a) { return typeof a == 'number' && isFinite(a) }
-
-/**
- * isObject?
- */
-function isObject(a) { return (a && typeof a == 'object') || isFunction(a) }
-
-/**
- * isRegexp?
- * we would prefer to use instanceof, but IE/mac is crippled and will choke at it
- */
-function isRegexp(a) { return a && a.constructor == RegExp }
-
-/**
- * isString?
- */
-function isString(a) { return typeof a == 'string' }
-
-/**
- * isUndefined?
- */
-function isUndefined(a) { return typeof a == 'undefined' }
-
-/**
- * isEmpty?
- */
-function isEmpty(o) {
- var i, v;
- if (isObject(o)) {
- for (i in o) {
- v = o[i];
- if (isUndefined(v) && isFunction(v)) {
- return false;
- }
- }
- }
- return true;
-}
-
-/**
- * alias for isUndefined
- */
-function undef(v) { return isUndefined(v) }
-
-/**
- * alias for !isUndefined
- */
-function isdef(v) { return !isUndefined(v) }
-
-/**
- * true if o is an Element Node or document or window. The last two because it's used for onload events
- if you specify strict as true, return false for document or window
- */
-function isElement(o, strict) {
- return o && isObject(o) && ((!strict && (o==window || o==document)) || o.nodeType == 1)
-}
-
-/**
- * true if o is an Array or a NodeList, (NodeList in Opera returns a type of function)
- */
-function isList(o) { return o && isObject(o) && isArray(o) }
-
-
diff --git a/framework/Web/Javascripts/extra/logger.js b/framework/Web/Javascripts/extra/logger.js
index 6500d79f..063e883a 100644
--- a/framework/Web/Javascripts/extra/logger.js
+++ b/framework/Web/Javascripts/extra/logger.js
@@ -704,7 +704,7 @@ Prado.Inspector =
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, <a target=\"_blank\" href=\"http://slayeroffice.com/?c=/content/tools/js_tree.html\">more info</a>.";
+ cObj.innerHTML = "<b>[esc] to <a href=\"javascript:Prado.Inspector.cleanUp();\">close</a></b><br />Javascript Object Tree V2.0.";
window.scrollTo(0,0);
},
diff --git a/framework/Web/Javascripts/js/ajax.js b/framework/Web/Javascripts/js/ajax.js
index 8e655fae..62c08d4f 100644
--- a/framework/Web/Javascripts/js/ajax.js
+++ b/framework/Web/Javascripts/js/ajax.js
@@ -1,516 +1,614 @@
-var Ajax={getTransport:function(){
-return Try.these(function(){
-return new ActiveXObject("Msxml2.XMLHTTP");
-},function(){
-return new ActiveXObject("Microsoft.XMLHTTP");
-},function(){
-return new XMLHttpRequest();
-})||false;
-},activeRequestCount:0};
-Ajax.Responders={responders:[],_each:function(_1){
-this.responders._each(_1);
-},register:function(_2){
-if(!this.include(_2)){
-this.responders.push(_2);
-}
-},unregister:function(_3){
-this.responders=this.responders.without(_3);
-},dispatch:function(_4,_5,_6,_7){
-this.each(function(_8){
-if(_8[_4]&&typeof _8[_4]=="function"){
-try{
-_8[_4].apply(_8,[_5,_6,_7]);
-}
-catch(e){
-}
+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(){
+}
+};
+Object.extend(Ajax.Responders, Enumerable);
+Ajax.Responders.register({
+onCreate: function() {
Ajax.activeRequestCount++;
-},onComplete:function(){
+},
+onComplete: function() {
Ajax.activeRequestCount--;
-}});
-Ajax.Base=function(){
-};
-Ajax.Base.prototype={setOptions:function(_9){
-this.options={method:"post",asynchronous:true,parameters:""};
-Object.extend(this.options,_9||{});
-},responseIsSuccess:function(){
-return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);
-},responseIsFailure:function(){
+}
+});
+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,_11){
-this.transport=Ajax.getTransport();
-this.setOptions(_11);
+}
+}
+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 _12=this.options.parameters||"";
-if(_12.length>0){
-_12+="&_=";
-}
-try{
-this.url=url;
-if(this.options.method=="get"&&_12.length>0){
-this.url+=(this.url.match(/\?/)?"&":"?")+_12;
-}
-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);
+},
+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 _13=this.options.postBody?this.options.postBody:_12;
-this.transport.send(this.options.method=="post"?_13:null);
-}
-catch(e){
+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 _14=["X-Requested-With","XMLHttpRequest","X-Prototype-Version",Prototype.Version];
-if(this.options.method=="post"){
-_14.push("Content-type","application/x-www-form-urlencoded");
-if(this.transport.overrideMimeType){
-_14.push("Connection","close");
-}
-}
-if(this.options.requestHeaders){
-_14.push.apply(_14,this.options.requestHeaders);
-}
-for(var i=0;i<_14.length;i+=2){
-this.transport.setRequestHeader(_14[i],_14[i+1]);
-}
-},onStateChange:function(){
-var _16=this.transport.readyState;
-if(_16!=1){
+},
+setRequestHeaders: function() {
+var requestHeaders =
+['X-Requested-With', 'XMLHttpRequest',
+ 'X-Prototype-Version', Prototype.Version,
+ 'Accept', 'text/javascript, text/html, application/xml, text/xml, *
+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(_17){
-try{
-return this.transport.getResponseHeader(_17);
-}
-catch(e){
-}
-},evalJSON:function(){
-try{
-return eval(this.header("X-JSON"));
-}
-catch(e){
-}
-},evalResponse:function(){
-try{
+},
+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){
+} catch (e) {
this.dispatchException(e);
}
-},respondToReadyState:function(_18){
-var _19=Ajax.Request.Events[_18];
-var _20=this.transport,json=this.evalJSON();
-if(_19=="Complete"){
-try{
-(this.options["on"+this.transport.status]||this.options["on"+(this.responseIsSuccess()?"Success":"Failure")]||Prototype.emptyFunction)(_20,json);
-}
-catch(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)){
+if ((this.header('Content-type') || '').match(/^text\/javascript/i))
this.evalResponse();
}
-}
-try{
-(this.options["on"+_19]||Prototype.emptyFunction)(_20,json);
-Ajax.Responders.dispatch("on"+_19,this,_20,json);
-}
-catch(e){
+try {
+(this.options['on' + event] || Prototype.emptyFunction)(transport, json);
+Ajax.Responders.dispatch('on' + event, this, transport, json);
+} catch (e) {
this.dispatchException(e);
}
-if(_19=="Complete"){
-this.transport.onreadystatechange=Prototype.emptyFunction;
-}
-},dispatchException:function(_21){
-(this.options.onException||Prototype.emptyFunction)(this,_21);
-Ajax.Responders.dispatch("onException",this,_21);
-}});
-Ajax.Updater=Class.create();
-Object.extend(Object.extend(Ajax.Updater.prototype,Ajax.Request.prototype),{initialize:function(_22,url,_23){
-this.containers={success:_22.success?$(_22.success):$(_22),failure:_22.failure?$(_22.failure):(_22.success?null:$(_22))};
-this.transport=Ajax.getTransport();
-this.setOptions(_23);
-var _24=this.options.onComplete||Prototype.emptyFunction;
-this.options.onComplete=(function(_25,_26){
+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();
-_24(_25,_26);
+onComplete(transport, object);
}).bind(this);
this.request(url);
-},updateContent:function(){
-var _27=this.responseIsSuccess()?this.containers.success:this.containers.failure;
-var _28=this.transport.responseText;
-if(!this.options.evalScripts){
-_28=_28.stripScripts();
-}
-if(_27){
-if(this.options.insertion){
-new this.options.insertion(_27,_28);
-}else{
-Element.update(_27,_28);
-}
-}
-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(_29,url,_30){
-this.setOptions(_30);
-this.onComplete=this.options.onComplete;
-this.frequency=(this.options.frequency||2);
-this.decay=(this.options.decay||1);
-this.updater={};
-this.container=_29;
-this.url=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);
+},
+start: function() {
+this.options.onComplete = this.updateComplete.bind(this);
this.onTimerEvent();
-},stop:function(){
-this.updater.onComplete=undefined;
+},
+stop: function() {
+this.updater.onComplete = undefined;
clearTimeout(this.timer);
-(this.onComplete||Prototype.emptyFunction).apply(this,arguments);
-},updateComplete:function(_31){
-if(this.options.decay){
-this.decay=(_31.responseText==this.lastText?this.decay*this.options.decay:1);
-this.lastText=_31.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.AJAX={Service:"Prototype"};
-Prado.AJAX.EvalScript=function(_32){
-var _33=new RegExp(Ajax.Updater.ScriptFragment,"img");
-var _34=_32.match(_33);
-if(_34){
-_33=new RegExp(Ajax.Updater.ScriptFragment,"im");
-setTimeout((function(){
-for(var i=0;i<_34.length;i++){
-eval(_34[i].match(_33)[1]);
-}
-}).bind(this),50);
+(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.AJAX.Request=Class.create();
-Prado.AJAX.Request.prototype=Object.extend(Ajax.Request.prototype,{evalJSON:function(){
-try{
-var _35=this.transport.getResponseHeader("X-JSON"),object;
-object=eval(_35);
+});
+Prado.AJAX = { Service : 'Prototype' };
+Prado.AJAX.EvalScript = function(output)
+{
+var match = new RegExp(Ajax.Updater.ScriptFragment, 'img');
+var scripts= output.match(match);
+if (scripts)
+{
+match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
+setTimeout((function()
+{
+for (var i = 0; i < scripts.length; i++)
+eval(scripts[i].match(match)[1]);
+}).bind(this), 50);
+}
+}
+Prado.AJAX.Request = Class.create();
+Prado.AJAX.Request.prototype = Object.extend(Ajax.Request.prototype,
+{
+evalJSON: function()
+{
+try
+{
+var json = this.transport.getResponseHeader('X-JSON'), object;
+object = eval(json);
return object;
+}
+catch (e)
+{
+if(isString(json))
+{
+return Prado.AJAX.JSON.parse(json);
+}
+}
+},
+respondToReadyState: function(readyState) {
+var event = Ajax.Request.Events[readyState];
+var transport = this.transport, json = this.evalJSON();
+if(event == 'Complete' && transport.status)
+Ajax.Responders.dispatch('on' + transport.status, this, transport, json);
+(this.options['on' + event] || Prototype.emptyFunction)(transport, json);
+Ajax.Responders.dispatch('on' + event, this, transport, json);
+if (event == 'Complete')
+(this.options['on' + this.transport.status]
+ || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+ || Prototype.emptyFunction)(transport, json);
+if (event == 'Complete')
+this.transport.onreadystatechange = Prototype.emptyFunction;
}
-catch(e){
-if(isString(_35)){
-return Prado.AJAX.JSON.parse(_35);
+});
+Prado.AJAX.Error = function(e, code)
+{
+e.name = 'Prado.AJAX.Error';
+e.code = code;
+return e;
}
+Prado.AJAX.RequestBuilder = Class.create();
+Prado.AJAX.RequestBuilder.prototype =
+{
+initialize : function()
+{
+this.body = '';
+this.data = [];
+},
+encode : function(data)
+{
+return Prado.AJAX.JSON.stringify(data);
+},
+build : function(data)
+{
+var sep = '';
+for ( var argName in data)
+{
+if(isFunction(data[argName])) continue;
+try
+{
+this.body += sep + argName + '=';
+this.body += encodeURIComponent(this.encode(data[argName]));
+} catch (e) {
+throw Prado.AJAX.Error(e, 1006);
+}
+sep = '&';
+}
+},
+getAll : function()
+{
+this.build(this.data);
+return this.body;
}
-},respondToReadyState:function(_36){
-var _37=Ajax.Request.Events[_36];
-var _38=this.transport,json=this.evalJSON();
-if(_37=="Complete"&&_38.status){
-Ajax.Responders.dispatch("on"+_38.status,this,_38,json);
}
-(this.options["on"+_37]||Prototype.emptyFunction)(_38,json);
-Ajax.Responders.dispatch("on"+_37,this,_38,json);
-if(_37=="Complete"){
-(this.options["on"+this.transport.status]||this.options["on"+(this.responseIsSuccess()?"Success":"Failure")]||Prototype.emptyFunction)(_38,json);
+Prado.AJAX.RemoteObject = function(){};
+Prado.AJAX.RemoteObject.Request = Class.create();
+Prado.AJAX.RemoteObject.Request.prototype = Object.extend(Prado.AJAX.Request.prototype,
+{
+initialize : function(options)
+{
+this.transport = Ajax.getTransport();
+this.setOptions(options);
+this.post = new Prado.AJAX.RequestBuilder();
+},
+invokeRemoteObject : function(url, args)
+{
+this.initParameters(args);
+this.options.postBody = this.post.getAll();
+this.request(url);
+},
+initParameters : function(args)
+{
+this.post.data['__parameters'] = [];
+for(var i = 0; i<args.length; i++)
+this.post.data['__parameters'][i] = args[i];
}
-if(_37=="Complete"){
-this.transport.onreadystatechange=Prototype.emptyFunction;
+});
+Prado.AJAX.RemoteObject.prototype =
+{
+baseInitialize : function(handlers, options)
+{
+this.__handlers = handlers || {};
+this.__service = new Prado.AJAX.RemoteObject.Request(options);
+},
+__call : function(url, method, args)
+{
+this.__service.options.onSuccess = this.__onSuccess.bind(this);
+this.__callback = method;
+return this.__service.invokeRemoteObject(url+"/"+method, args);
+},
+__onSuccess : function(transport, json)
+{
+if(this.__handlers[this.__callback])
+this.__handlers[this.__callback](json, transport.responseText);
}
-}});
-Prado.AJAX.Error=function(e,_40){
-e.name="Prado.AJAX.Error";
-e.code=_40;
-return e;
-};
-Prado.AJAX.RequestBuilder=Class.create();
-Prado.AJAX.RequestBuilder.prototype={initialize:function(){
-this.body="";
-this.data=[];
-},encode:function(_41){
-return Prado.AJAX.JSON.stringify(_41);
-},build:function(_42){
-var sep="";
-for(var _44 in _42){
-if(isFunction(_42[_44])){
-continue;
-}
-try{
-this.body+=sep+_44+"=";
-this.body+=encodeURIComponent(this.encode(_42[_44]));
-}
-catch(e){
-throw Prado.AJAX.Error(e,1006);
-}
-sep="&";
-}
-},getAll:function(){
-this.build(this.data);
-return this.body;
-}};
-Prado.AJAX.RemoteObject=function(){
};
-Prado.AJAX.RemoteObject.Request=Class.create();
-Prado.AJAX.RemoteObject.Request.prototype=Object.extend(Prado.AJAX.Request.prototype,{initialize:function(_45){
-this.transport=Ajax.getTransport();
-this.setOptions(_45);
-this.post=new Prado.AJAX.RequestBuilder();
-},invokeRemoteObject:function(url,_46){
-this.initParameters(_46);
-this.options.postBody=this.post.getAll();
-this.request(url);
-},initParameters:function(_47){
-this.post.data["__parameters"]=[];
-for(var i=0;i<_47.length;i++){
-this.post.data["__parameters"][i]=_47[i];
-}
-}});
-Prado.AJAX.RemoteObject.prototype={baseInitialize:function(_48,_49){
-this.__handlers=_48||{};
-this.__service=new Prado.AJAX.RemoteObject.Request(_49);
-},__call:function(url,_50,_51){
-this.__service.options.onSuccess=this.__onSuccess.bind(this);
-this.__callback=_50;
-return this.__service.invokeRemoteObject(url+"/"+_50,_51);
-},__onSuccess:function(_52,_53){
-if(this.__handlers[this.__callback]){
-this.__handlers[this.__callback](_53,_52.responseText);
-}
-}};
-Prado.AJAX.Exception={"on505":function(_54,_55,e){
-var msg="HTTP "+_55.status+" with response";
-Logger.error(msg,_55.responseText);
+Prado.AJAX.Exception =
+{
+"on505" : function(request, transport, e)
+{
+var msg = 'HTTP '+transport.status+" with response";
+Logger.error(msg, transport.responseText);
Logger.exception(e);
-},onComplete:function(_57,_58,e){
-if(_58.status!=505){
-var msg="HTTP "+_58.status+" with response : \n";
-msg+=_58.responseText+"\n";
-msg+="Data : \n"+inspect(e);
+},
+onComplete : function(request, transport, e)
+{
+if(transport.status != 505)
+{
+var msg = 'HTTP '+transport.status+" with response : \n";
+msg += transport.responseText + "\n";
+msg += "Data : \n"+inspect(e);
Logger.warn(msg);
}
-},format:function(e){
-var msg=e.type+" with message \""+e.message+"\"";
-msg+=" in "+e.file+"("+e.line+")\n";
-msg+="Stack trace:\n";
-var _59=e.trace;
-for(var i=0;i<_59.length;i++){
-msg+=" #"+i+" "+_59[i].file;
-msg+="("+_59[i].line+"): ";
-msg+=_59[i]["class"]+"->"+_59[i]["function"]+"()"+"\n";
+},
+format : 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){
-var msg=Prado.AJAX.Exception.format(e);
-Logger.error("Server Error "+e.code,msg);
-}};
-Event.OnLoad(function(){
-if(typeof Logger!="undefined"){
-Logger.exception=Prado.AJAX.Exception.logException;
+},
+logException : function(e)
+{
+var msg = Prado.AJAX.Exception.format(e);
+Logger.error("Server Error "+e.code, msg);
+}
+}
+Event.OnLoad(function()
+{
+if(typeof Logger != "undefined")
+{
+Logger.exception = Prado.AJAX.Exception.logException;
Ajax.Responders.register(Prado.AJAX.Exception);
}
});
-Prado.AJAX.Callback=Class.create();
-Prado.AJAX.Callback.prototype=Object.extend(new Prado.AJAX.RemoteObject(),{initialize:function(ID,_61){
-if(!isString(ID)&&typeof (ID.id)!="undefined"){
-ID=ID.id;
-}
-if(!isString(ID)){
-throw new Error("A Control ID must be specified");
-}
-this.baseInitialize(this,_61);
-this.options=_61||[];
-this.__service.post.data["__ID"]=ID;
+Prado.AJAX.Callback = Class.create();
+Prado.AJAX.Callback.prototype = Object.extend(new Prado.AJAX.RemoteObject(),
+{
+initialize : function(ID, options)
+{
+if(!isString(ID) && typeof(ID.id) != "undefined")
+ID = ID.id;
+if(!isString(ID))
+throw new Error('A Control ID must be specified');
+this.baseInitialize(this, options);
+this.options = options || [];
+this.__service.post.data['__ID'] = ID;
this.requestCallback();
-},collectPostData:function(){
-var IDs=Prado.AJAX.Callback.IDs;
-this.__service.post.data["__data"]={};
-for(var i=0;i<IDs.length;i++){
-var id=IDs[i];
-if(id.indexOf("[]")>-1){
-this.__service.post.data["__data"][id]=this.collectArrayPostData(id);
-}else{
-if(isObject($(id))){
-this.__service.post.data["__data"][id]=$F(id);
-}
-}
-}
-},collectArrayPostData:function(_64){
-var _65=document.getElementsByName(_64);
-var _66=[];
-$A(_65).each(function(el){
-if($F(el)){
-_66.push($F(el));
-}
+},
+collectPostData : function()
+{
+var IDs = Prado.AJAX.Callback.IDs;
+this.__service.post.data['__data'] = {};
+for(var i = 0; i<IDs.length; i++)
+{
+var id = IDs[i];
+if(id.indexOf("[]") > -1)
+this.__service.post.data['__data'][id] =
+this.collectArrayPostData(id);
+else if(isObject($(id)))
+this.__service.post.data['__data'][id] = $F(id);
+}
+},
+collectArrayPostData : function(name)
+{
+var elements = document.getElementsByName(name);
+var data = [];
+$A(elements).each(function(el)
+{
+if($F(el)) data.push($F(el));
});
-return _66;
-},requestCallback:function(){
+return data;
+},
+requestCallback : function()
+{
this.collectPostData();
-if(Prado.AJAX.Validate(this.options)){
-return this.__call(Prado.AJAX.Callback.Server,"handleCallback",this.options.params);
-}
-},handleCallback:function(_68,_69){
-if(typeof (_68)!="undefined"&&!isNull(_68)){
-this.options.onSuccess(_68["data"],_69);
-if(_68["actions"]){
-_68.actions.each(Prado.AJAX.Callback.Action.__run);
-}
+if(Prado.AJAX.Validate(this.options))
+return this.__call(Prado.AJAX.Callback.Server, 'handleCallback', this.options.params);
+},
+handleCallback : function(result, output)
+{
+if(typeof(result) != "undefined" && !isNull(result))
+{
+this.options.onSuccess(result['data'], output);
+if(result['actions'])
+result.actions.each(Prado.AJAX.Callback.Action.__run);
}
-}});
-Prado.AJAX.Callback.Action={__run:function(_70){
-for(var _71 in _70){
-if(_70[_71][0]&&($(_70[_71][0])||_70[_71][0].indexOf("[]")>-1)){
-_71.toFunction().apply(this,_70[_71]);
}
+});
+Prado.AJAX.Callback.Action =
+{
+__run : function(command)
+{
+for(var name in command)
+{
+if(command[name][0] && ($(command[name][0]) || command[name][0].indexOf("[]") > -1))
+{
+name.toFunction().apply(this,command[name]);
}
-}};
-Prado.AJAX.Validate=function(_72){
-if(_72.CausesValidation){
-if(_72.ValidatorGroup){
-return Prado.Validation.ValidateValidatorGroup(_72.ValidatorGroup);
-}else{
-if(_72.ValidationGroup){
-return Prado.Validation.ValidateValidationGroup(_72.ValidationGroup);
-}else{
-return Prado.Validation.ValidateNonGroup(_72.ValidationForm);
}
}
-}else{
+};
+Prado.AJAX.Validate = function(options)
+{
+if(options.CausesValidation)
+{
+if(options.ValidatorGroup)
+return Prado.Validation.ValidateValidatorGroup(options.ValidatorGroup);
+else if(options.ValidationGroup)
+return Prado.Validation.ValidateValidationGroup(options.ValidationGroup);
+else
+return Prado.Validation.ValidateNonGroup(options.ValidationForm);
+}
+else
return true;
-}
};
-Prado.AJAX.Callback.Server="";
-Prado.AJAX.Callback.IDs=[];
-Prado.Callback=function(ID,_73,_74,_75){
-var _76={"params":[_73]||[],"onSuccess":_74||Prototype.emptyFunction,"CausesValidation":true};
-Object.extend(_76,_75||{});
-new Prado.AJAX.Callback(ID,_76);
-return false;
+Prado.AJAX.Callback.Server = '';
+Prado.AJAX.Callback.IDs = [];
+Prado.Callback = function(ID, params, onSuccess, options)
+{
+var callback =
+{
+'params' : [params] || [],
+'onSuccess' : onSuccess || Prototype.emptyFunction,
+'CausesValidation' : true
};
-Array.prototype.______array="______array";
-Prado.AJAX.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";
+Object.extend(callback, options || {});
+new Prado.AJAX.Callback(ID, callback);
+return false;
+}
+Array.prototype.______array = '______array';
+Prado.AJAX.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";
+case '\f':
+s += '\\f';
break;
-case "\n":
-s+="\\n";
+case '\n':
+s += '\\n';
break;
-case "\r":
-s+="\\r";
+case '\r':
+s += '\\r';
break;
-case "\t":
-s+="\\t";
+case '\t':
+s += '\\t';
break;
default:
-c=c.charCodeAt();
-s+="\\u00"+Math.floor(c/16).toString(16)+(c%16).toString(16);
+c = c.charCodeAt();
+s += '\\u00' + Math.floor(c / 16).toString(16) +
+(c % 16).toString(16);
}
}
}
-return s+"\"";
-case "boolean":
+return s + '"';
+case 'boolean':
return String(arg);
default:
-return "null";
-}
-},parse:function(_79){
-var at=0;
-var ch=" ";
-function error(m){
-throw {name:"JSONError",message:m,at:at-1,text:_79};
+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=_79.charAt(at);
-at+=1;
+function next() {
+ch = text.charAt(at);
+at += 1;
return ch;
}
-function white(){
-while(ch){
-if(ch<=" "){
+function white() {
+while (ch) {
+if (ch <= ' ') {
next();
-}else{
-if(ch=="/"){
-switch(next()){
-case "/":
-while(next()&&ch!="\n"&&ch!="\r"){
-}
+} else if (ch == '/') {
+switch (next()) {
+case '/':
+while (next() && ch != '\n' && ch != '\r') {}
break;
-case "*":
+case '*':
next();
-for(;;){
-if(ch){
-if(ch=="*"){
-if(next()=="/"){
+for (;;) {
+if (ch) {
+if (ch == '*') {
+if (next() == '/') {
next();
break;
}
-}else{
+} else {
next();
}
-}else{
+} else {
error("Unterminated comment");
}
}
@@ -518,168 +616,161 @@ break;
default:
error("Syntax error");
}
-}else{
+} else {
break;
}
}
}
-}
-function string(){
-var i,s="",t,u;
-if(ch=="\""){
-outer:
-while(next()){
-if(ch=="\""){
+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";
+} else if (ch == '\\') {
+switch (next()) {
+case 'b':
+s += '\b';
break;
-case "f":
-s+="\f";
+case 'f':
+s += '\f';
break;
-case "n":
-s+="\n";
+case 'n':
+s += '\n';
break;
-case "r":
-s+="\r";
+case 'r':
+s += '\r';
break;
-case "t":
-s+="\t";
+case 't':
+s += '\t';
break;
-case "u":
-u=0;
-for(i=0;i<4;i+=1){
-t=parseInt(next(),16);
-if(!isFinite(t)){
+case 'u':
+u = 0;
+for (i = 0; i < 4; i += 1) {
+t = parseInt(next(), 16);
+if (!isFinite(t)) {
break outer;
}
-u=u*16+t;
+u = u * 16 + t;
}
-s+=String.fromCharCode(u);
+s += String.fromCharCode(u);
break;
default:
-s+=ch;
-}
-}else{
-s+=ch;
+s += ch;
}
+} else {
+s += ch;
}
}
}
error("Bad string");
}
-function array(){
-var a=[];
-if(ch=="["){
+function array() {
+var a = [];
+if (ch == '[') {
next();
white();
-if(ch=="]"){
+if (ch == ']') {
next();
return a;
}
-while(ch){
+while (ch) {
a.push(value());
white();
-if(ch=="]"){
+if (ch == ']') {
next();
return a;
-}else{
-if(ch!=","){
+} else if (ch != ',') {
break;
}
-}
next();
white();
}
}
error("Bad array");
}
-function object(){
-var k,o={};
-if(ch=="{"){
+function object() {
+var k, o = {};
+if (ch == '{') {
next();
white();
-if(ch=="}"){
+if (ch == '}') {
next();
return o;
}
-while(ch){
-k=string();
+while (ch) {
+k = string();
white();
-if(ch!=":"){
+if (ch != ':') {
break;
}
next();
-o[k]=value();
+o[k] = value();
white();
-if(ch=="}"){
+if (ch == '}') {
next();
return o;
-}else{
-if(ch!=","){
+} else if (ch != ',') {
break;
}
-}
next();
white();
}
}
error("Bad object");
}
-function number(){
-var n="",v;
-if(ch=="-"){
-n="-";
+function number() {
+var n = '', v;
+if (ch == '-') {
+n = '-';
next();
}
-while(ch>="0"&&ch<="9"){
-n+=ch;
+while (ch >= '0' && ch <= '9') {
+n += ch;
next();
}
-if(ch=="."){
-n+=".";
-while(next()&&ch>="0"&&ch<="9"){
-n+=ch;
+if (ch == '.') {
+n += '.';
+while (next() && ch >= '0' && ch <= '9') {
+n += ch;
}
}
-if(ch=="e"||ch=="E"){
-n+="e";
+if (ch == 'e' || ch == 'E') {
+n += 'e';
next();
-if(ch=="-"||ch=="+"){
-n+=ch;
+if (ch == '-' || ch == '+') {
+n += ch;
next();
}
-while(ch>="0"&&ch<="9"){
-n+=ch;
+while (ch >= '0' && ch <= '9') {
+n += ch;
next();
}
}
-v=+n;
-if(!isFinite(v)){
-}else{
+v = +n;
+if (!isFinite(v)) {
+} else {
return v;
}
}
-function word(){
-switch(ch){
-case "t":
-if(next()=="r"&&next()=="u"&&next()=="e"){
+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"){
+case 'f':
+if (next() == 'a' && next() == 'l' && next() == 's' &&
+next() == 'e') {
next();
return false;
}
break;
-case "n":
-if(next()=="u"&&next()=="l"&&next()=="l"){
+case 'n':
+if (next() == 'u' && next() == 'l' && next() == 'l') {
next();
return null;
}
@@ -687,1325 +778,1745 @@ break;
}
error("Syntax error");
}
-function value(){
+function value() {
white();
-switch(ch){
-case "{":
+switch (ch) {
+case '{':
return object();
-case "[":
+case '[':
return array();
-case "\"":
+case '"':
return string();
-case "-":
+case '-':
return number();
default:
-return ch>="0"&&ch<="9"?number():word();
+return ch >= '0' && ch <= '9' ? number() : word();
}
}
return value();
-}};
-var Autocompleter={};
-Autocompleter.Base=function(){
-};
-Autocompleter.Base.prototype={baseInitialize:function(_86,_87,_88){
-this.element=$(_86);
-this.update=$(_87);
-this.hasFocus=false;
-this.changed=false;
-this.active=false;
-this.index=0;
-this.entryCount=0;
-if(this.setOptions){
-this.setOptions(_88);
-}else{
-this.options=_88||{};
-}
-this.options.paramName=this.options.paramName||this.element.name;
-this.options.tokens=this.options.tokens||[];
-this.options.frequency=this.options.frequency||0.4;
-this.options.minChars=this.options.minChars||1;
-this.options.onShow=this.options.onShow||function(_86,_87){
-if(!_87.style.position||_87.style.position=="absolute"){
-_87.style.position="absolute";
-Position.clone(_86,_87,{setHeight:false,offsetTop:_86.offsetHeight});
-}
-Effect.Appear(_87,{duration:0.15});
+}
};
-this.options.onHide=this.options.onHide||function(_89,_90){
-new Effect.Fade(_90,{duration:0.15});
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+baseInitialize: function(element, update, options) {
+this.element = $(element);
+this.update= $(update);
+this.hasFocus= false;
+this.changed = false;
+this.active= false;
+this.index = 0;
+this.entryCount= 0;
+if (this.setOptions)
+this.setOptions(options);
+else
+this.options = options || {};
+this.options.paramName= this.options.paramName || this.element.name;
+this.options.tokens = this.options.tokens || [];
+this.options.frequency= this.options.frequency || 0.4;
+this.options.minChars = this.options.minChars || 1;
+this.options.onShow = this.options.onShow ||
+function(element, update){
+if(!update.style.position || update.style.position=='absolute') {
+update.style.position = 'absolute';
+Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight});
+}
+Effect.Appear(update,{duration:0.15});
};
-if(typeof (this.options.tokens)=="string"){
-this.options.tokens=new Array(this.options.tokens);
-}
-this.observer=null;
-this.element.setAttribute("autocomplete","off");
+this.options.onHide = this.options.onHide ||
+function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+if (typeof(this.options.tokens) == 'string')
+this.options.tokens = new Array(this.options.tokens);
+this.observer = null;
+this.element.setAttribute('autocomplete','off');
Element.hide(this.update);
-Event.observe(this.element,"blur",this.onBlur.bindAsEventListener(this));
-Event.observe(this.element,"keypress",this.onKeyPress.bindAsEventListener(this));
-},show:function(){
-if(Element.getStyle(this.update,"display")=="none"){
-this.options.onShow(this.element,this.update);
-}
-if(!this.iefix&&(navigator.appVersion.indexOf("MSIE")>0)&&(navigator.userAgent.indexOf("Opera")<0)&&(Element.getStyle(this.update,"position")=="absolute")){
-new Insertion.After(this.update,"<iframe id=\""+this.update.id+"_iefix\" "+"style=\"display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);\" "+"src=\"javascript:false;\" frameborder=\"0\" scrolling=\"no\"></iframe>");
-this.iefix=$(this.update.id+"_iefix");
-}
-if(this.iefix){
-setTimeout(this.fixIEOverlapping.bind(this),50);
-}
-},fixIEOverlapping:function(){
-Position.clone(this.update,this.iefix);
-this.iefix.style.zIndex=1;
-this.update.style.zIndex=2;
+Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+},
+show: function() {
+if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+if(!this.iefix &&
+(navigator.appVersion.indexOf('MSIE')>0) &&
+(navigator.userAgent.indexOf('Opera')<0) &&
+(Element.getStyle(this.update, 'position')=='absolute')) {
+new Insertion.After(this.update,
+ '<iframe id="' + this.update.id + '_iefix" '+
+ 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
+ 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
+this.iefix = $(this.update.id+'_iefix');
+}
+if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+},
+fixIEOverlapping: function() {
+Position.clone(this.update, this.iefix);
+this.iefix.style.zIndex = 1;
+this.update.style.zIndex = 2;
Element.show(this.iefix);
-},hide:function(){
+},
+hide: function() {
this.stopIndicator();
-if(Element.getStyle(this.update,"display")!="none"){
-this.options.onHide(this.element,this.update);
-}
-if(this.iefix){
-Element.hide(this.iefix);
-}
-},startIndicator:function(){
-if(this.options.indicator){
-Element.show(this.options.indicator);
-}
-},stopIndicator:function(){
-if(this.options.indicator){
-Element.hide(this.options.indicator);
-}
-},onKeyPress:function(_91){
-if(this.active){
-switch(_91.keyCode){
-case Event.KEY_TAB:
-case Event.KEY_RETURN:
-this.selectEntry();
-Event.stop(_91);
-case Event.KEY_ESC:
-this.hide();
-this.active=false;
-Event.stop(_91);
-return;
-case Event.KEY_LEFT:
-case Event.KEY_RIGHT:
-return;
-case Event.KEY_UP:
-this.markPrevious();
-this.render();
-if(navigator.appVersion.indexOf("AppleWebKit")>0){
-Event.stop(_91);
-}
-return;
-case Event.KEY_DOWN:
-this.markNext();
-this.render();
-if(navigator.appVersion.indexOf("AppleWebKit")>0){
-Event.stop(_91);
-}
-return;
-}
-}else{
-if(_91.keyCode==Event.KEY_TAB||_91.keyCode==Event.KEY_RETURN){
-return;
-}
-}
-this.changed=true;
-this.hasFocus=true;
-if(this.observer){
-clearTimeout(this.observer);
-}
-this.observer=setTimeout(this.onObserverEvent.bind(this),this.options.frequency*1000);
-},onHover:function(_92){
-var _93=Event.findElement(_92,"LI");
-if(this.index!=_93.autocompleteIndex){
-this.index=_93.autocompleteIndex;
+if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+if(this.iefix) Element.hide(this.iefix);
+},
+startIndicator: function() {
+if(this.options.indicator) Element.show(this.options.indicator);
+},
+stopIndicator: function() {
+if(this.options.indicator) Element.hide(this.options.indicator);
+},
+onKeyPress: function(event) {
+if(this.active)
+switch(event.keyCode) {
+ case Event.KEY_TAB:
+ case Event.KEY_RETURN:
+ this.selectEntry();
+ Event.stop(event);
+ case Event.KEY_ESC:
+ this.hide();
+ this.active = false;
+ Event.stop(event);
+ return;
+ case Event.KEY_LEFT:
+ case Event.KEY_RIGHT:
+ return;
+ case Event.KEY_UP:
+ this.markPrevious();
+ this.render();
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+ return;
+ case Event.KEY_DOWN:
+ this.markNext();
+ this.render();
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+ return;
+}
+ else
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+ (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+this.changed = true;
+this.hasFocus = true;
+if(this.observer) clearTimeout(this.observer);
+this.observer =
+setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+},
+activate: function() {
+this.changed = false;
+this.hasFocus = true;
+this.getUpdatedChoices();
+},
+onHover: function(event) {
+var element = Event.findElement(event, 'LI');
+if(this.index != element.autocompleteIndex)
+{
+this.index = element.autocompleteIndex;
this.render();
}
-Event.stop(_92);
-},onClick:function(_94){
-var _95=Event.findElement(_94,"LI");
-this.index=_95.autocompleteIndex;
+Event.stop(event);
+},
+onClick: function(event) {
+var element = Event.findElement(event, 'LI');
+this.index = element.autocompleteIndex;
this.selectEntry();
this.hide();
-},onBlur:function(_96){
-setTimeout(this.hide.bind(this),250);
-this.hasFocus=false;
-this.active=false;
-},render:function(){
-if(this.entryCount>0){
-for(var i=0;i<this.entryCount;i++){
-this.index==i?Element.addClassName(this.getEntry(i),"selected"):Element.removeClassName(this.getEntry(i),"selected");
-}
-if(this.hasFocus){
+},
+onBlur: function(event) {
+ setTimeout(this.hide.bind(this), 250);
+this.hasFocus = false;
+this.active = false;
+},
+render: function() {
+if(this.entryCount > 0) {
+for (var i = 0; i < this.entryCount; i++)
+this.index==i ?
+Element.addClassName(this.getEntry(i),"selected") :
+Element.removeClassName(this.getEntry(i),"selected");
+if(this.hasFocus) {
this.show();
-this.active=true;
+this.active = true;
}
-}else{
-this.active=false;
+} else {
+this.active = false;
this.hide();
}
-},markPrevious:function(){
-if(this.index>0){
-this.index--;
-}else{
-this.index=this.entryCount-1;
-}
-},markNext:function(){
-if(this.index<this.entryCount-1){
-this.index++;
-}else{
-this.index=0;
-}
-},getEntry:function(_97){
-return this.update.firstChild.childNodes[_97];
-},getCurrentEntry:function(){
+},
+markPrevious: function() {
+if(this.index > 0) this.index--
+else this.index = this.entryCount-1;
+},
+markNext: function() {
+if(this.index < this.entryCount-1) this.index++
+else this.index = 0;
+},
+getEntry: function(index) {
+return this.update.firstChild.childNodes[index];
+},
+getCurrentEntry: function() {
return this.getEntry(this.index);
-},selectEntry:function(){
-this.active=false;
+},
+selectEntry: function() {
+this.active = false;
this.updateElement(this.getCurrentEntry());
-},updateElement:function(_98){
-if(this.options.updateElement){
-this.options.updateElement(_98);
+},
+updateElement: function(selectedElement) {
+if (this.options.updateElement) {
+this.options.updateElement(selectedElement);
return;
}
-var _99="";
-if(this.options.select){
-var _100=document.getElementsByClassName(this.options.select,_98)||[];
-if(_100.length>0){
-_99=Element.collectTextNodes(_100[0],this.options.select);
-}
-}else{
-_99=Element.collectTextNodesIgnoreClass(_98,"informal");
-}
-var _101=this.findLastToken();
-if(_101!=-1){
-var _102=this.element.value.substr(0,_101+1);
-var _103=this.element.value.substr(_101+1).match(/^\s+/);
-if(_103){
-_102+=_103[0];
-}
-this.element.value=_102+_99;
-}else{
-this.element.value=_99;
+var value = '';
+if (this.options.select) {
+var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+} else
+value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+var lastTokenPos = this.findLastToken();
+if (lastTokenPos != -1) {
+var newValue = this.element.value.substr(0, lastTokenPos + 1);
+var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+if (whitespace)
+newValue += whitespace[0];
+this.element.value = newValue + value;
+} else {
+this.element.value = value;
}
this.element.focus();
-if(this.options.afterUpdateElement){
-this.options.afterUpdateElement(this.element,_98);
-}
-},updateChoices:function(_104){
-if(!this.changed&&this.hasFocus){
-this.update.innerHTML=_104;
+if (this.options.afterUpdateElement)
+this.options.afterUpdateElement(this.element, selectedElement);
+},
+updateChoices: function(choices) {
+if(!this.changed && this.hasFocus) {
+this.update.innerHTML = choices;
Element.cleanWhitespace(this.update);
Element.cleanWhitespace(this.update.firstChild);
-if(this.update.firstChild&&this.update.firstChild.childNodes){
-this.entryCount=this.update.firstChild.childNodes.length;
-for(var i=0;i<this.entryCount;i++){
-var _105=this.getEntry(i);
-_105.autocompleteIndex=i;
-this.addObservers(_105);
+if(this.update.firstChild && this.update.firstChild.childNodes) {
+this.entryCount =
+this.update.firstChild.childNodes.length;
+for (var i = 0; i < this.entryCount; i++) {
+var entry = this.getEntry(i);
+entry.autocompleteIndex = i;
+this.addObservers(entry);
}
-}else{
-this.entryCount=0;
+} else {
+this.entryCount = 0;
}
this.stopIndicator();
-this.index=0;
+this.index = 0;
this.render();
}
-},addObservers:function(_106){
-Event.observe(_106,"mouseover",this.onHover.bindAsEventListener(this));
-Event.observe(_106,"click",this.onClick.bindAsEventListener(this));
-},onObserverEvent:function(){
-this.changed=false;
-if(this.getToken().length>=this.options.minChars){
+},
+addObservers: function(element) {
+Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+},
+onObserverEvent: function() {
+this.changed = false;
+if(this.getToken().length>=this.options.minChars) {
this.startIndicator();
this.getUpdatedChoices();
-}else{
-this.active=false;
+} else {
+this.active = false;
this.hide();
}
-},getToken:function(){
-var _107=this.findLastToken();
-if(_107!=-1){
-var ret=this.element.value.substr(_107+1).replace(/^\s+/,"").replace(/\s+$/,"");
-}else{
-var ret=this.element.value;
-}
-return /\n/.test(ret)?"":ret;
-},findLastToken:function(){
-var _109=-1;
-for(var i=0;i<this.options.tokens.length;i++){
-var _110=this.element.value.lastIndexOf(this.options.tokens[i]);
-if(_110>_109){
-_109=_110;
-}
-}
-return _109;
-}};
-Ajax.Autocompleter=Class.create();
-Object.extend(Object.extend(Ajax.Autocompleter.prototype,Autocompleter.Base.prototype),{initialize:function(_111,_112,url,_113){
-this.baseInitialize(_111,_112,_113);
-this.options.asynchronous=true;
-this.options.onComplete=this.onComplete.bind(this);
-this.options.defaultParams=this.options.parameters||null;
-this.url=url;
-},getUpdatedChoices:function(){
-entry=encodeURIComponent(this.options.paramName)+"="+encodeURIComponent(this.getToken());
-this.options.parameters=this.options.callback?this.options.callback(this.element,entry):entry;
-if(this.options.defaultParams){
-this.options.parameters+="&"+this.options.defaultParams;
-}
-new Ajax.Request(this.url,this.options);
-},onComplete:function(_114){
-this.updateChoices(_114.responseText);
-}});
-Autocompleter.Local=Class.create();
-Autocompleter.Local.prototype=Object.extend(new Autocompleter.Base(),{initialize:function(_115,_116,_117,_118){
-this.baseInitialize(_115,_116,_118);
-this.options.array=_117;
-},getUpdatedChoices:function(){
+},
+getToken: function() {
+var tokenPos = this.findLastToken();
+if (tokenPos != -1)
+var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+else
+var ret = this.element.value;
+return /\n/.test(ret) ? '' : ret;
+},
+findLastToken: function() {
+var lastTokenPos = -1;
+for (var i=0; i<this.options.tokens.length; i++) {
+var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+if (thisTokenPos > lastTokenPos)
+lastTokenPos = thisTokenPos;
+}
+return lastTokenPos;
+}
+}
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+initialize: function(element, update, url, options) {
+this.baseInitialize(element, update, options);
+this.options.asynchronous= true;
+this.options.onComplete= this.onComplete.bind(this);
+this.options.defaultParams = this.options.parameters || null;
+this.url = url;
+},
+getUpdatedChoices: function() {
+entry = encodeURIComponent(this.options.paramName) + '=' +
+encodeURIComponent(this.getToken());
+this.options.parameters = this.options.callback ?
+this.options.callback(this.element, entry) : entry;
+if(this.options.defaultParams)
+this.options.parameters += '&' + this.options.defaultParams;
+new Ajax.Request(this.url, this.options);
+},
+onComplete: function(request) {
+this.updateChoices(request.responseText);
+}
+});
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+initialize: function(element, update, array, options) {
+this.baseInitialize(element, update, options);
+this.options.array = array;
+},
+getUpdatedChoices: function() {
this.updateChoices(this.options.selector(this));
-},setOptions:function(_119){
-this.options=Object.extend({choices:10,partialSearch:true,partialChars:2,ignoreCase:true,fullSearch:false,selector:function(_120){
-var ret=[];
-var _121=[];
-var _122=_120.getToken();
-var _123=0;
-for(var i=0;i<_120.options.array.length&&ret.length<_120.options.choices;i++){
-var elem=_120.options.array[i];
-var _125=_120.options.ignoreCase?elem.toLowerCase().indexOf(_122.toLowerCase()):elem.indexOf(_122);
-while(_125!=-1){
-if(_125==0&&elem.length!=_122.length){
-ret.push("<li><strong>"+elem.substr(0,_122.length)+"</strong>"+elem.substr(_122.length)+"</li>");
+},
+setOptions: function(options) {
+this.options = Object.extend({
+choices: 10,
+partialSearch: true,
+partialChars: 2,
+ignoreCase: true,
+fullSearch: false,
+selector: function(instance) {
+var ret = [];var partial = [];var entry = instance.getToken();
+var count = 0;
+for (var i = 0; i < instance.options.array.length &&
+ret.length < instance.options.choices ; i++) {
+var elem = instance.options.array[i];
+var foundPos = instance.options.ignoreCase ?
+elem.toLowerCase().indexOf(entry.toLowerCase()) :
+elem.indexOf(entry);
+while (foundPos != -1) {
+if (foundPos == 0 && elem.length != entry.length) {
+ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
+elem.substr(entry.length) + "</li>");
break;
-}else{
-if(_122.length>=_120.options.partialChars&&_120.options.partialSearch&&_125!=-1){
-if(_120.options.fullSearch||/\s/.test(elem.substr(_125-1,1))){
-_121.push("<li>"+elem.substr(0,_125)+"<strong>"+elem.substr(_125,_122.length)+"</strong>"+elem.substr(_125+_122.length)+"</li>");
+} else if (entry.length >= instance.options.partialChars &&
+instance.options.partialSearch && foundPos != -1) {
+if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
+elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
+foundPos + entry.length) + "</li>");
break;
}
}
+foundPos = instance.options.ignoreCase ?
+elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
+elem.indexOf(entry, foundPos + 1);
}
-_125=_120.options.ignoreCase?elem.toLowerCase().indexOf(_122.toLowerCase(),_125+1):elem.indexOf(_122,_125+1);
}
+if (partial.length)
+ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+return "<ul>" + ret.join('') + "</ul>";
}
-if(_121.length){
-ret=ret.concat(_121.slice(0,_120.options.choices-ret.length));
+}, options || {});
}
-return "<ul>"+ret.join("")+"</ul>";
-}},_119||{});
-}});
-Field.scrollFreeActivate=function(_126){
-setTimeout(function(){
-Field.activate(_126);
-},1);
-};
-Ajax.InPlaceEditor=Class.create();
-Ajax.InPlaceEditor.defaultHighlightColor="#FFFF99";
-Ajax.InPlaceEditor.prototype={initialize:function(_127,url,_128){
-this.url=url;
-this.element=$(_127);
-this.options=Object.extend({okButton:true,okText:"ok",cancelLink:true,cancelText:"cancel",savingText:"Saving...",clickToEditText:"Click to edit",okText:"ok",rows:1,onComplete:function(_129,_127){
-new Effect.Highlight(_127,{startcolor:this.options.highlightcolor});
-},onFailure:function(_130){
-alert("Error communicating with the server: "+_130.responseText.stripTags());
-},callback:function(form){
+});
+Field.scrollFreeActivate = function(field) {
+setTimeout(function() {
+Field.activate(field);
+}, 1);
+}
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+initialize: function(element, url, options) {
+this.url = url;
+this.element = $(element);
+this.options = Object.extend({
+okButton: true,
+okText: "ok",
+cancelLink: true,
+cancelText: "cancel",
+savingText: "Saving...",
+clickToEditText: "Click to edit",
+okText: "ok",
+rows: 1,
+onComplete: function(transport, element) {
+new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+},
+onFailure: function(transport) {
+alert("Error communicating with the server: " + transport.responseText.stripTags());
+},
+callback: function(form) {
return Form.serialize(form);
-},handleLineBreaks:true,loadingText:"Loading...",savingClassName:"inplaceeditor-saving",loadingClassName:"inplaceeditor-loading",formClassName:"inplaceeditor-form",highlightcolor:Ajax.InPlaceEditor.defaultHighlightColor,highlightendcolor:"#FFFFFF",externalControl:null,submitOnBlur:false,ajaxOptions:{}},_128||{});
-if(!this.options.formId&&this.element.id){
-this.options.formId=this.element.id+"-inplaceeditor";
-if($(this.options.formId)){
-this.options.formId=null;
-}
-}
-if(this.options.externalControl){
-this.options.externalControl=$(this.options.externalControl);
-}
-this.originalBackground=Element.getStyle(this.element,"background-color");
-if(!this.originalBackground){
-this.originalBackground="transparent";
-}
-this.element.title=this.options.clickToEditText;
-this.onclickListener=this.enterEditMode.bindAsEventListener(this);
-this.mouseoverListener=this.enterHover.bindAsEventListener(this);
-this.mouseoutListener=this.leaveHover.bindAsEventListener(this);
-Event.observe(this.element,"click",this.onclickListener);
-Event.observe(this.element,"mouseover",this.mouseoverListener);
-Event.observe(this.element,"mouseout",this.mouseoutListener);
-if(this.options.externalControl){
-Event.observe(this.options.externalControl,"click",this.onclickListener);
-Event.observe(this.options.externalControl,"mouseover",this.mouseoverListener);
-Event.observe(this.options.externalControl,"mouseout",this.mouseoutListener);
-}
-},enterEditMode:function(evt){
-if(this.saving){
-return;
-}
-if(this.editing){
-return;
-}
-this.editing=true;
+},
+handleLineBreaks: true,
+loadingText: 'Loading...',
+savingClassName: 'inplaceeditor-saving',
+loadingClassName: 'inplaceeditor-loading',
+formClassName: 'inplaceeditor-form',
+highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+highlightendcolor: "#FFFFFF",
+externalControl: null,
+submitOnBlur: false,
+ajaxOptions: {},
+evalScripts: false
+}, options || {});
+if(!this.options.formId && this.element.id) {
+this.options.formId = this.element.id + "-inplaceeditor";
+if ($(this.options.formId)) {
+ this.options.formId = null;
+}
+}
+if (this.options.externalControl) {
+this.options.externalControl = $(this.options.externalControl);
+}
+this.originalBackground = Element.getStyle(this.element, 'background-color');
+if (!this.originalBackground) {
+this.originalBackground = "transparent";
+}
+this.element.title = this.options.clickToEditText;
+this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+Event.observe(this.element, 'click', this.onclickListener);
+Event.observe(this.element, 'mouseover', this.mouseoverListener);
+Event.observe(this.element, 'mouseout', this.mouseoutListener);
+if (this.options.externalControl) {
+Event.observe(this.options.externalControl, 'click', this.onclickListener);
+Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+}
+},
+enterEditMode: function(evt) {
+if (this.saving) return;
+if (this.editing) return;
+this.editing = true;
this.onEnterEditMode();
-if(this.options.externalControl){
+if (this.options.externalControl) {
Element.hide(this.options.externalControl);
}
Element.hide(this.element);
this.createForm();
-this.element.parentNode.insertBefore(this.form,this.element);
+this.element.parentNode.insertBefore(this.form, this.element);
Field.scrollFreeActivate(this.editField);
-if(evt){
+ if (evt) {
Event.stop(evt);
}
return false;
-},createForm:function(){
-this.form=document.createElement("form");
-this.form.id=this.options.formId;
-Element.addClassName(this.form,this.options.formClassName);
-this.form.onsubmit=this.onSubmit.bind(this);
+},
+createForm: function() {
+this.form = document.createElement("form");
+this.form.id = this.options.formId;
+Element.addClassName(this.form, this.options.formClassName)
+this.form.onsubmit = this.onSubmit.bind(this);
this.createEditField();
-if(this.options.textarea){
-var br=document.createElement("br");
+if (this.options.textarea) {
+var br = document.createElement("br");
this.form.appendChild(br);
}
-if(this.options.okButton){
-okButton=document.createElement("input");
-okButton.type="submit";
-okButton.value=this.options.okText;
+if (this.options.okButton) {
+okButton = document.createElement("input");
+okButton.type = "submit";
+okButton.value = this.options.okText;
+okButton.className = 'editor_ok_button';
this.form.appendChild(okButton);
}
-if(this.options.cancelLink){
-cancelLink=document.createElement("a");
-cancelLink.href="#";
+if (this.options.cancelLink) {
+cancelLink = document.createElement("a");
+cancelLink.href = "#";
cancelLink.appendChild(document.createTextNode(this.options.cancelText));
-cancelLink.onclick=this.onclickCancel.bind(this);
+cancelLink.onclick = this.onclickCancel.bind(this);
+cancelLink.className = 'editor_cancel';
this.form.appendChild(cancelLink);
}
-},hasHTMLLineBreaks:function(_134){
-if(!this.options.handleLineBreaks){
-return false;
-}
-return _134.match(/<br/i)||_134.match(/<p>/i);
-},convertHTMLLineBreaks:function(_135){
-return _135.replace(/<br>/gi,"\n").replace(/<br\/>/gi,"\n").replace(/<\/p>/gi,"\n").replace(/<p>/gi,"");
-},createEditField:function(){
+},
+hasHTMLLineBreaks: function(string) {
+if (!this.options.handleLineBreaks) return false;
+return string.match(/<br/i) || string.match(/<p>/i);
+},
+convertHTMLLineBreaks: function(string) {
+return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
+},
+createEditField: function() {
var text;
-if(this.options.loadTextURL){
-text=this.options.loadingText;
-}else{
-text=this.getText();
-}
-var obj=this;
-if(this.options.rows==1&&!this.hasHTMLLineBreaks(text)){
-this.options.textarea=false;
-var _138=document.createElement("input");
-_138.obj=this;
-_138.type="text";
-_138.name="value";
-_138.value=text;
-_138.style.backgroundColor=this.options.highlightcolor;
-var size=this.options.size||this.options.cols||0;
-if(size!=0){
-_138.size=size;
-}
-if(this.options.submitOnBlur){
-_138.onblur=this.onSubmit.bind(this);
-}
-this.editField=_138;
-}else{
-this.options.textarea=true;
-var _140=document.createElement("textarea");
-_140.obj=this;
-_140.name="value";
-_140.value=this.convertHTMLLineBreaks(text);
-_140.rows=this.options.rows;
-_140.cols=this.options.cols||40;
-if(this.options.submitOnBlur){
-_140.onblur=this.onSubmit.bind(this);
-}
-this.editField=_140;
-}
-if(this.options.loadTextURL){
+if(this.options.loadTextURL) {
+text = this.options.loadingText;
+} else {
+text = this.getText();
+}
+var obj = this;
+if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+this.options.textarea = false;
+var textField = document.createElement("input");
+textField.obj = this;
+textField.type = "text";
+textField.name = "value";
+textField.value = text;
+textField.style.backgroundColor = this.options.highlightcolor;
+textField.className = 'editor_field';
+var size = this.options.size || this.options.cols || 0;
+if (size != 0) textField.size = size;
+if (this.options.submitOnBlur)
+textField.onblur = this.onSubmit.bind(this);
+this.editField = textField;
+} else {
+this.options.textarea = true;
+var textArea = document.createElement("textarea");
+textArea.obj = this;
+textArea.name = "value";
+textArea.value = this.convertHTMLLineBreaks(text);
+textArea.rows = this.options.rows;
+textArea.cols = this.options.cols || 40;
+textArea.className = 'editor_field';
+if (this.options.submitOnBlur)
+textArea.onblur = this.onSubmit.bind(this);
+this.editField = textArea;
+}
+if(this.options.loadTextURL) {
this.loadExternalText();
}
this.form.appendChild(this.editField);
-},getText:function(){
+},
+getText: function() {
return this.element.innerHTML;
-},loadExternalText:function(){
-Element.addClassName(this.form,this.options.loadingClassName);
-this.editField.disabled=true;
-new Ajax.Request(this.options.loadTextURL,Object.extend({asynchronous:true,onComplete:this.onLoadedExternalText.bind(this)},this.options.ajaxOptions));
-},onLoadedExternalText:function(_141){
-Element.removeClassName(this.form,this.options.loadingClassName);
-this.editField.disabled=false;
-this.editField.value=_141.responseText.stripTags();
-},onclickCancel:function(){
+},
+loadExternalText: function() {
+Element.addClassName(this.form, this.options.loadingClassName);
+this.editField.disabled = true;
+new Ajax.Request(
+this.options.loadTextURL,
+Object.extend({
+asynchronous: true,
+onComplete: this.onLoadedExternalText.bind(this)
+}, this.options.ajaxOptions)
+);
+},
+onLoadedExternalText: function(transport) {
+Element.removeClassName(this.form, this.options.loadingClassName);
+this.editField.disabled = false;
+this.editField.value = transport.responseText.stripTags();
+},
+onclickCancel: function() {
this.onComplete();
this.leaveEditMode();
return false;
-},onFailure:function(_142){
-this.options.onFailure(_142);
-if(this.oldInnerHTML){
-this.element.innerHTML=this.oldInnerHTML;
-this.oldInnerHTML=null;
+},
+onFailure: function(transport) {
+this.options.onFailure(transport);
+if (this.oldInnerHTML) {
+this.element.innerHTML = this.oldInnerHTML;
+this.oldInnerHTML = null;
}
return false;
-},onSubmit:function(){
-var form=this.form;
-var _143=this.editField.value;
+},
+onSubmit: function() {
+ var form = this.form;
+var value = this.editField.value;
this.onLoading();
-new Ajax.Updater({success:this.element,failure:null},this.url,Object.extend({parameters:this.options.callback(form,_143),onComplete:this.onComplete.bind(this),onFailure:this.onFailure.bind(this)},this.options.ajaxOptions));
-if(arguments.length>1){
+if (this.options.evalScripts) {
+new Ajax.Request(
+this.url, Object.extend({
+parameters: this.options.callback(form, value),
+onComplete: this.onComplete.bind(this),
+onFailure: this.onFailure.bind(this),
+asynchronous:true,
+evalScripts:true
+}, this.options.ajaxOptions));
+} else{
+new Ajax.Updater(
+{ success: this.element,
+ failure: null },
+this.url, Object.extend({
+parameters: this.options.callback(form, value),
+onComplete: this.onComplete.bind(this),
+onFailure: this.onFailure.bind(this)
+}, this.options.ajaxOptions));
+}
+ if (arguments.length > 1) {
Event.stop(arguments[0]);
}
return false;
-},onLoading:function(){
-this.saving=true;
+},
+onLoading: function() {
+this.saving = true;
this.removeForm();
this.leaveHover();
this.showSaving();
-},showSaving:function(){
-this.oldInnerHTML=this.element.innerHTML;
-this.element.innerHTML=this.options.savingText;
-Element.addClassName(this.element,this.options.savingClassName);
-this.element.style.backgroundColor=this.originalBackground;
+},
+showSaving: function() {
+this.oldInnerHTML = this.element.innerHTML;
+this.element.innerHTML = this.options.savingText;
+Element.addClassName(this.element, this.options.savingClassName);
+this.element.style.backgroundColor = this.originalBackground;
Element.show(this.element);
-},removeForm:function(){
-if(this.form){
-if(this.form.parentNode){
-Element.remove(this.form);
-}
-this.form=null;
-}
-},enterHover:function(){
-if(this.saving){
-return;
-}
-this.element.style.backgroundColor=this.options.highlightcolor;
-if(this.effect){
+},
+removeForm: function() {
+if(this.form) {
+if (this.form.parentNode) Element.remove(this.form);
+this.form = null;
+}
+},
+enterHover: function() {
+if (this.saving) return;
+this.element.style.backgroundColor = this.options.highlightcolor;
+if (this.effect) {
this.effect.cancel();
}
-Element.addClassName(this.element,this.options.hoverClassName);
-},leaveHover:function(){
-if(this.options.backgroundColor){
-this.element.style.backgroundColor=this.oldBackground;
-}
-Element.removeClassName(this.element,this.options.hoverClassName);
-if(this.saving){
-return;
-}
-this.effect=new Effect.Highlight(this.element,{startcolor:this.options.highlightcolor,endcolor:this.options.highlightendcolor,restorecolor:this.originalBackground});
-},leaveEditMode:function(){
-Element.removeClassName(this.element,this.options.savingClassName);
+Element.addClassName(this.element, this.options.hoverClassName)
+},
+leaveHover: function() {
+if (this.options.backgroundColor) {
+this.element.style.backgroundColor = this.oldBackground;
+}
+Element.removeClassName(this.element, this.options.hoverClassName)
+if (this.saving) return;
+this.effect = new Effect.Highlight(this.element, {
+startcolor: this.options.highlightcolor,
+endcolor: this.options.highlightendcolor,
+restorecolor: this.originalBackground
+});
+},
+leaveEditMode: function() {
+Element.removeClassName(this.element, this.options.savingClassName);
this.removeForm();
this.leaveHover();
-this.element.style.backgroundColor=this.originalBackground;
+this.element.style.backgroundColor = this.originalBackground;
Element.show(this.element);
-if(this.options.externalControl){
+if (this.options.externalControl) {
Element.show(this.options.externalControl);
}
-this.editing=false;
-this.saving=false;
-this.oldInnerHTML=null;
+this.editing = false;
+this.saving = false;
+this.oldInnerHTML = null;
this.onLeaveEditMode();
-},onComplete:function(_144){
+},
+onComplete: function(transport) {
this.leaveEditMode();
-this.options.onComplete.bind(this)(_144,this.element);
-},onEnterEditMode:function(){
-},onLeaveEditMode:function(){
-},dispose:function(){
-if(this.oldInnerHTML){
-this.element.innerHTML=this.oldInnerHTML;
+this.options.onComplete.bind(this)(transport, this.element);
+},
+onEnterEditMode: function() {},
+onLeaveEditMode: function() {},
+dispose: function() {
+if (this.oldInnerHTML) {
+this.element.innerHTML = this.oldInnerHTML;
}
this.leaveEditMode();
-Event.stopObserving(this.element,"click",this.onclickListener);
-Event.stopObserving(this.element,"mouseover",this.mouseoverListener);
-Event.stopObserving(this.element,"mouseout",this.mouseoutListener);
-if(this.options.externalControl){
-Event.stopObserving(this.options.externalControl,"click",this.onclickListener);
-Event.stopObserving(this.options.externalControl,"mouseover",this.mouseoverListener);
-Event.stopObserving(this.options.externalControl,"mouseout",this.mouseoutListener);
-}
-}};
-Form.Element.DelayedObserver=Class.create();
-Form.Element.DelayedObserver.prototype={initialize:function(_145,_146,_147){
-this.delay=_146||0.5;
-this.element=$(_145);
-this.callback=_147;
-this.timer=null;
-this.lastValue=$F(this.element);
-Event.observe(this.element,"keyup",this.delayedListener.bindAsEventListener(this));
-},delayedListener:function(_148){
-if(this.lastValue==$F(this.element)){
-return;
+Event.stopObserving(this.element, 'click', this.onclickListener);
+Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+if (this.options.externalControl) {
+Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
}
-if(this.timer){
-clearTimeout(this.timer);
}
-this.timer=setTimeout(this.onTimerEvent.bind(this),this.delay*1000);
-this.lastValue=$F(this.element);
-},onTimerEvent:function(){
-this.timer=null;
-this.callback(this.element,$F(this.element));
-}};
-var Droppables={drops:[],remove:function(_149){
-this.drops=this.drops.reject(function(d){
-return d.element==$(_149);
-});
-},add:function(_151){
-_151=$(_151);
-var _152=Object.extend({greedy:true,hoverclass:null},arguments[1]||{});
-if(_152.containment){
-_152._containers=[];
-var _153=_152.containment;
-if((typeof _153=="object")&&(_153.constructor==Array)){
-_153.each(function(c){
-_152._containers.push($(c));
-});
-}else{
-_152._containers.push($(_153));
+};
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+createEditField: function() {
+if (!this.cached_selectTag) {
+var selectTag = document.createElement("select");
+var collection = this.options.collection || [];
+var optionTag;
+collection.each(function(e,i) {
+optionTag = document.createElement("option");
+optionTag.value = (e instanceof Array) ? e[0] : e;
+if(this.options.value==optionTag.value) optionTag.selected = true;
+optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+selectTag.appendChild(optionTag);
+}.bind(this));
+this.cached_selectTag = selectTag;
}
+this.editField = this.cached_selectTag;
+if(this.options.loadTextURL) this.loadExternalText();
+this.form.appendChild(this.editField);
+this.options.callback = function(form, value) {
+return "value=" + encodeURIComponent(value);
}
-if(_152.accept){
-_152.accept=[_152.accept].flatten();
}
-Element.makePositioned(_151);
-_152.element=_151;
-this.drops.push(_152);
-},isContained:function(_154,drop){
-var _156=_154.parentNode;
-return drop._containers.detect(function(c){
-return _156==c;
});
-},isAffected:function(_157,_158,drop){
-return ((drop.element!=_158)&&((!drop._containers)||this.isContained(_158,drop))&&((!drop.accept)||(Element.classNames(_158).detect(function(v){
-return drop.accept.include(v);
-})))&&Position.within(drop.element,_157[0],_157[1]));
-},deactivate:function(drop){
-if(drop.hoverclass){
-Element.removeClassName(drop.element,drop.hoverclass);
-}
-this.last_active=null;
-},activate:function(drop){
-if(drop.hoverclass){
-Element.addClassName(drop.element,drop.hoverclass);
-}
-this.last_active=drop;
-},show:function(_160,_161){
-if(!this.drops.length){
-return;
-}
-if(this.last_active){
-this.deactivate(this.last_active);
-}
-this.drops.each(function(drop){
-if(Droppables.isAffected(_160,_161,drop)){
-if(drop.onHover){
-drop.onHover(_161,drop.element,Position.overlap(drop.overlap,drop.element));
-}
-if(drop.greedy){
-Droppables.activate(drop);
-throw $break;
-}
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+initialize: function(element, delay, callback) {
+this.delay = delay || 0.5;
+this.element = $(element);
+this.callback= callback;
+this.timer = null;
+this.lastValue = $F(this.element);
+Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+},
+delayedListener: function(event) {
+if(this.lastValue == $F(this.element)) return;
+if(this.timer) clearTimeout(this.timer);
+this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+this.lastValue = $F(this.element);
+},
+onTimerEvent: function() {
+this.timer = null;
+this.callback(this.element, $F(this.element));
}
+};
+var Droppables = {
+drops: [],
+remove: function(element) {
+this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+},
+add: function(element) {
+element = $(element);
+var options = Object.extend({
+greedy: true,
+hoverclass: null,
+tree: false
+}, arguments[1] || {});
+if(options.containment) {
+options._containers = [];
+var containment = options.containment;
+if((typeof containment == 'object') &&
+(containment.constructor == Array)) {
+containment.each( function(c) { options._containers.push($(c)) });
+} else {
+options._containers.push($(containment));
+}
+}
+if(options.accept) options.accept = [options.accept].flatten();
+Element.makePositioned(element);options.element = element;
+this.drops.push(options);
+},
+findDeepestChild: function(drops) {
+deepest = drops[0];
+for (i = 1; i < drops.length; ++i)
+if (Element.isParent(drops[i].element, deepest.element))
+deepest = drops[i];
+return deepest;
+},
+isContained: function(element, drop) {
+var containmentNode;
+if(drop.tree) {
+containmentNode = element.treeNode;
+} else {
+containmentNode = element.parentNode;
+}
+return drop._containers.detect(function(c) { return containmentNode == c });
+},
+isAffected: function(point, element, drop) {
+return (
+(drop.element!=element) &&
+((!drop._containers) ||
+this.isContained(element, drop)) &&
+((!drop.accept) ||
+(Element.classNames(element).detect(
+function(v) { return drop.accept.include(v) } ) )) &&
+Position.within(drop.element, point[0], point[1]) );
+},
+deactivate: function(drop) {
+if(drop.hoverclass)
+Element.removeClassName(drop.element, drop.hoverclass);
+this.last_active = null;
+},
+activate: function(drop) {
+if(drop.hoverclass)
+Element.addClassName(drop.element, drop.hoverclass);
+this.last_active = drop;
+},
+show: function(point, element) {
+if(!this.drops.length) return;
+var affected = [];
+if(this.last_active) this.deactivate(this.last_active);
+this.drops.each( function(drop) {
+if(Droppables.isAffected(point, element, drop))
+affected.push(drop);
});
-},fire:function(_162,_163){
-if(!this.last_active){
-return;
+if(affected.length>0) {
+drop = Droppables.findDeepestChild(affected);
+Position.within(drop.element, point[0], point[1]);
+if(drop.onHover)
+drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+Droppables.activate(drop);
}
+},
+fire: function(event, element) {
+if(!this.last_active) return;
Position.prepare();
-if(this.isAffected([Event.pointerX(_162),Event.pointerY(_162)],_163,this.last_active)){
-if(this.last_active.onDrop){
-this.last_active.onDrop(_163,this.last_active.element,_162);
-}
-}
-},reset:function(){
-if(this.last_active){
+if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+if (this.last_active.onDrop)
+this.last_active.onDrop(element, this.last_active.element, event);
+},
+reset: function() {
+if(this.last_active)
this.deactivate(this.last_active);
}
-}};
-var Draggables={drags:[],observers:[],register:function(_164){
-if(this.drags.length==0){
-this.eventMouseUp=this.endDrag.bindAsEventListener(this);
-this.eventMouseMove=this.updateDrag.bindAsEventListener(this);
-this.eventKeypress=this.keyPress.bindAsEventListener(this);
-Event.observe(document,"mouseup",this.eventMouseUp);
-Event.observe(document,"mousemove",this.eventMouseMove);
-Event.observe(document,"keypress",this.eventKeypress);
-}
-this.drags.push(_164);
-},unregister:function(_165){
-this.drags=this.drags.reject(function(d){
-return d==_165;
-});
-if(this.drags.length==0){
-Event.stopObserving(document,"mouseup",this.eventMouseUp);
-Event.stopObserving(document,"mousemove",this.eventMouseMove);
-Event.stopObserving(document,"keypress",this.eventKeypress);
-}
-},activate:function(_166){
-window.focus();
-this.activeDraggable=_166;
-},deactivate:function(_167){
-this.activeDraggable=null;
-},updateDrag:function(_168){
-if(!this.activeDraggable){
-return;
}
-var _169=[Event.pointerX(_168),Event.pointerY(_168)];
-if(this._lastPointer&&(this._lastPointer.inspect()==_169.inspect())){
-return;
-}
-this._lastPointer=_169;
-this.activeDraggable.updateDrag(_168,_169);
-},endDrag:function(_170){
-if(!this.activeDraggable){
-return;
-}
-this._lastPointer=null;
-this.activeDraggable.endDrag(_170);
-this.activeDraggable=null;
-},keyPress:function(_171){
-if(this.activeDraggable){
-this.activeDraggable.keyPress(_171);
-}
-},addObserver:function(_172){
-this.observers.push(_172);
+var Draggables = {
+drags: [],
+observers: [],
+register: function(draggable) {
+if(this.drags.length == 0) {
+this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+this.eventKeypress= this.keyPress.bindAsEventListener(this);
+Event.observe(document, "mouseup", this.eventMouseUp);
+Event.observe(document, "mousemove", this.eventMouseMove);
+Event.observe(document, "keypress", this.eventKeypress);
+}
+this.drags.push(draggable);
+},
+unregister: function(draggable) {
+this.drags = this.drags.reject(function(d) { return d==draggable });
+if(this.drags.length == 0) {
+Event.stopObserving(document, "mouseup", this.eventMouseUp);
+Event.stopObserving(document, "mousemove", this.eventMouseMove);
+Event.stopObserving(document, "keypress", this.eventKeypress);
+}
+},
+activate: function(draggable) {
+window.focus();this.activeDraggable = draggable;
+},
+deactivate: function() {
+this.activeDraggable = null;
+},
+updateDrag: function(event) {
+if(!this.activeDraggable) return;
+var pointer = [Event.pointerX(event), Event.pointerY(event)];
+if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+this._lastPointer = pointer;
+this.activeDraggable.updateDrag(event, pointer);
+},
+endDrag: function(event) {
+if(!this.activeDraggable) return;
+this._lastPointer = null;
+this.activeDraggable.endDrag(event);
+this.activeDraggable = null;
+},
+keyPress: function(event) {
+if(this.activeDraggable)
+this.activeDraggable.keyPress(event);
+},
+addObserver: function(observer) {
+this.observers.push(observer);
this._cacheObserverCallbacks();
-},removeObserver:function(_173){
-this.observers=this.observers.reject(function(o){
-return o.element==_173;
-});
+},
+removeObserver: function(element) { this.observers = this.observers.reject( function(o) { return o.element==element });
this._cacheObserverCallbacks();
-},notify:function(_175,_176,_177){
-if(this[_175+"Count"]>0){
-this.observers.each(function(o){
-if(o[_175]){
-o[_175](_175,_176,_177);
-}
+},
+notify: function(eventName, draggable, event) { if(this[eventName+'Count'] > 0)
+this.observers.each( function(o) {
+if(o[eventName]) o[eventName](eventName, draggable, event);
});
-}
-},_cacheObserverCallbacks:function(){
-["onStart","onEnd","onDrag"].each(function(_178){
-Draggables[_178+"Count"]=Draggables.observers.select(function(o){
-return o[_178];
-}).length;
+},
+_cacheObserverCallbacks: function() {
+['onStart','onEnd','onDrag'].each( function(eventName) {
+Draggables[eventName+'Count'] = Draggables.observers.select(
+function(o) { return o[eventName]; }
+).length;
});
-}};
-var Draggable=Class.create();
-Draggable.prototype={initialize:function(_179){
-var _180=Object.extend({handle:false,starteffect:function(_179){
-new Effect.Opacity(_179,{duration:0.2,from:1,to:0.7});
-},reverteffect:function(_181,_182,_183){
-var dur=Math.sqrt(Math.abs(_182^2)+Math.abs(_183^2))*0.02;
-_181._revert=new Effect.Move(_181,{x:-_183,y:-_182,duration:dur});
-},endeffect:function(_185){
-new Effect.Opacity(_185,{duration:0.2,from:0.7,to:1});
-},zindex:1000,revert:false,snap:false},arguments[1]||{});
-this.element=$(element);
-if(_180.handle&&(typeof _180.handle=="string")){
-this.handle=Element.childrenWithClassName(this.element,_180.handle)[0];
-}
-if(!this.handle){
-this.handle=$(_180.handle);
-}
-if(!this.handle){
-this.handle=this.element;
}
+}
+var Draggable = Class.create();
+Draggable.prototype = {
+initialize: function(element) {
+var options = Object.extend({
+handle: false,
+starteffect: function(element) {
+element._opacity = Element.getOpacity(element);
+new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
+},
+reverteffect: function(element, top_offset, left_offset) {
+var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
+},
+endeffect: function(element) {
+var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0
+new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity});
+},
+zindex: 1000,
+revert: false,
+scroll: false,
+scrollSensitivity: 20,
+scrollSpeed: 15,
+snap: false}, arguments[1] || {});
+this.element = $(element);
+if(options.handle && (typeof options.handle == 'string')) {
+var h = Element.childrenWithClassName(this.element, options.handle, true);
+if(h.length>0) this.handle = h[0];
+}
+if(!this.handle) this.handle = $(options.handle);
+if(!this.handle) this.handle = this.element;
+if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML)
+options.scroll = $(options.scroll);
Element.makePositioned(this.element);
-this.delta=this.currentDelta();
-this.options=_180;
-this.dragging=false;
-this.eventMouseDown=this.initDrag.bindAsEventListener(this);
-Event.observe(this.handle,"mousedown",this.eventMouseDown);
+this.delta= this.currentDelta();
+this.options= options;
+this.dragging = false;
+this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+Event.observe(this.handle, "mousedown", this.eventMouseDown);
Draggables.register(this);
-},destroy:function(){
-Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);
+},
+destroy: function() {
+Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
Draggables.unregister(this);
-},currentDelta:function(){
-return ([parseInt(Element.getStyle(this.element,"left")||"0"),parseInt(Element.getStyle(this.element,"top")||"0")]);
-},initDrag:function(_186){
-if(Event.isLeftClick(_186)){
-var src=Event.element(_186);
-if(src.tagName&&(src.tagName=="INPUT"||src.tagName=="SELECT"||src.tagName=="BUTTON"||src.tagName=="TEXTAREA")){
-return;
-}
-if(this.element._revert){
+},
+currentDelta: function() {
+return([
+parseInt(Element.getStyle(this.element,'left') || '0'),
+parseInt(Element.getStyle(this.element,'top') || '0')]);
+},
+initDrag: function(event) {
+if(Event.isLeftClick(event)) {
+ var src = Event.element(event);
+if(src.tagName && (
+src.tagName=='INPUT' ||
+src.tagName=='SELECT' ||
+src.tagName=='OPTION' ||
+src.tagName=='BUTTON' ||
+src.tagName=='TEXTAREA')) return;
+if(this.element._revert) {
this.element._revert.cancel();
-this.element._revert=null;
+this.element._revert = null;
}
-var _188=[Event.pointerX(_186),Event.pointerY(_186)];
-var pos=Position.cumulativeOffset(this.element);
-this.offset=[0,1].map(function(i){
-return (_188[i]-pos[i]);
-});
+var pointer = [Event.pointerX(event), Event.pointerY(event)];
+var pos = Position.cumulativeOffset(this.element);
+this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
Draggables.activate(this);
-Event.stop(_186);
+Event.stop(event);
}
-},startDrag:function(_190){
-this.dragging=true;
-if(this.options.zindex){
-this.originalZ=parseInt(Element.getStyle(this.element,"z-index")||0);
-this.element.style.zIndex=this.options.zindex;
+},
+startDrag: function(event) {
+this.dragging = true;
+if(this.options.zindex) {
+this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+this.element.style.zIndex = this.options.zindex;
}
-if(this.options.ghosting){
-this._clone=this.element.cloneNode(true);
+if(this.options.ghosting) {
+this._clone = this.element.cloneNode(true);
Position.absolutize(this.element);
-this.element.parentNode.insertBefore(this._clone,this.element);
-}
-Draggables.notify("onStart",this,_190);
-if(this.options.starteffect){
-this.options.starteffect(this.element);
-}
-},updateDrag:function(_191,_192){
-if(!this.dragging){
-this.startDrag(_191);
-}
+this.element.parentNode.insertBefore(this._clone, this.element);
+}
+if(this.options.scroll) {
+if (this.options.scroll == window) {
+var where = this._getWindowScroll(this.options.scroll);
+this.originalScrollLeft = where.left;
+this.originalScrollTop = where.top;
+} else {
+this.originalScrollLeft = this.options.scroll.scrollLeft;
+this.originalScrollTop = this.options.scroll.scrollTop;
+}
+}
+Draggables.notify('onStart', this, event);
+if(this.options.starteffect) this.options.starteffect(this.element);
+},
+updateDrag: function(event, pointer) {
+if(!this.dragging) this.startDrag(event);
Position.prepare();
-Droppables.show(_192,this.element);
-Draggables.notify("onDrag",this,_191);
-this.draw(_192);
-if(this.options.change){
-this.options.change(this);
-}
-if(navigator.appVersion.indexOf("AppleWebKit")>0){
-window.scrollBy(0,0);
-}
-Event.stop(_191);
-},finishDrag:function(_193,_194){
-this.dragging=false;
-if(this.options.ghosting){
+Droppables.show(pointer, this.element);
+Draggables.notify('onDrag', this, event);
+this.draw(pointer);
+if(this.options.change) this.options.change(this);
+if(this.options.scroll) {
+this.stopScrolling();
+var p;
+if (this.options.scroll == window) {
+with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+} else {
+p = Position.page(this.options.scroll);
+p[0] += this.options.scroll.scrollLeft;
+p[1] += this.options.scroll.scrollTop;
+p.push(p[0]+this.options.scroll.offsetWidth);
+p.push(p[1]+this.options.scroll.offsetHeight);
+}
+var speed = [0,0];
+if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+this.startScrolling(speed);
+}
+if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+Event.stop(event);
+},
+finishDrag: function(event, success) {
+this.dragging = false;
+if(this.options.ghosting) {
Position.relativize(this.element);
Element.remove(this._clone);
-this._clone=null;
-}
-if(_194){
-Droppables.fire(_193,this.element);
-}
-Draggables.notify("onEnd",this,_193);
-var _195=this.options.revert;
-if(_195&&typeof _195=="function"){
-_195=_195(this.element);
-}
-var d=this.currentDelta();
-if(_195&&this.options.reverteffect){
-this.options.reverteffect(this.element,d[1]-this.delta[1],d[0]-this.delta[0]);
-}else{
-this.delta=d;
-}
-if(this.options.zindex){
-this.element.style.zIndex=this.originalZ;
-}
-if(this.options.endeffect){
+this._clone = null;
+}
+if(success) Droppables.fire(event, this.element);
+Draggables.notify('onEnd', this, event);
+var revert = this.options.revert;
+if(revert && typeof revert == 'function') revert = revert(this.element);
+var d = this.currentDelta();
+if(revert && this.options.reverteffect) {
+this.options.reverteffect(this.element,
+d[1]-this.delta[1], d[0]-this.delta[0]);
+} else {
+this.delta = d;
+}
+if(this.options.zindex)
+this.element.style.zIndex = this.originalZ;
+if(this.options.endeffect)
this.options.endeffect(this.element);
-}
Draggables.deactivate(this);
Droppables.reset();
-},keyPress:function(_196){
-if(!_196.keyCode==Event.KEY_ESC){
-return;
-}
-this.finishDrag(_196,false);
-Event.stop(_196);
-},endDrag:function(_197){
-if(!this.dragging){
-return;
-}
-this.finishDrag(_197,true);
-Event.stop(_197);
-},draw:function(_198){
-var pos=Position.cumulativeOffset(this.element);
-var d=this.currentDelta();
-pos[0]-=d[0];
-pos[1]-=d[1];
-var p=[0,1].map(function(i){
-return (_198[i]-pos[i]-this.offset[i]);
-}.bind(this));
-if(this.options.snap){
-if(typeof this.options.snap=="function"){
-p=this.options.snap(p[0],p[1]);
-}else{
-if(this.options.snap instanceof Array){
-p=p.map(function(v,i){
-return Math.round(v/this.options.snap[i])*this.options.snap[i];
-}.bind(this));
-}else{
-p=p.map(function(v){
-return Math.round(v/this.options.snap)*this.options.snap;
+},
+keyPress: function(event) {
+if(event.keyCode!=Event.KEY_ESC) return;
+this.finishDrag(event, false);
+Event.stop(event);
+},
+endDrag: function(event) {
+if(!this.dragging) return;
+this.stopScrolling();
+this.finishDrag(event, true);
+Event.stop(event);
+},
+draw: function(point) {
+var pos = Position.cumulativeOffset(this.element);
+var d = this.currentDelta();
+pos[0] -= d[0]; pos[1] -= d[1];
+if(this.options.scroll && (this.options.scroll != window)) {
+pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+}
+var p = [0,1].map(function(i){
+return (point[i]-pos[i]-this.offset[i])
}.bind(this));
+if(this.options.snap) {
+if(typeof this.options.snap == 'function') {
+p = this.options.snap(p[0],p[1],this);
+} else {
+if(this.options.snap instanceof Array) {
+p = p.map( function(v, i) {
+return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+} else {
+p = p.map( function(v) {
+return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+}
+}}
+var style = this.element.style;
+if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+style.left = p[0] + "px";
+if((!this.options.constraint) || (this.options.constraint=='vertical'))
+style.top= p[1] + "px";
+if(style.visibility=="hidden") style.visibility = "";},
+stopScrolling: function() {
+if(this.scrollInterval) {
+clearInterval(this.scrollInterval);
+this.scrollInterval = null;
+Draggables._lastScrollPointer = null;
+}
+},
+startScrolling: function(speed) {
+this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+this.lastScrolled = new Date();
+this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+},
+scroll: function() {
+var current = new Date();
+var delta = current - this.lastScrolled;
+this.lastScrolled = current;
+if(this.options.scroll == window) {
+with (this._getWindowScroll(this.options.scroll)) {
+if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+var d = delta / 1000;
+this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+}
+}
+} else {
+this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+this.options.scroll.scrollTop+= this.scrollSpeed[1] * delta / 1000;
}
-}
-}
-var _200=this.element.style;
-if((!this.options.constraint)||(this.options.constraint=="horizontal")){
-_200.left=p[0]+"px";
-}
-if((!this.options.constraint)||(this.options.constraint=="vertical")){
-_200.top=p[1]+"px";
-}
-if(_200.visibility=="hidden"){
-_200.visibility="";
-}
-}};
-var SortableObserver=Class.create();
-SortableObserver.prototype={initialize:function(_201,_202){
-this.element=$(_201);
-this.observer=_202;
-this.lastValue=Sortable.serialize(this.element);
-},onStart:function(){
-this.lastValue=Sortable.serialize(this.element);
-},onEnd:function(){
+Position.prepare();
+Droppables.show(Draggables._lastPointer, this.element);
+Draggables.notify('onDrag', this);
+Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+if (Draggables._lastScrollPointer[0] < 0)
+Draggables._lastScrollPointer[0] = 0;
+if (Draggables._lastScrollPointer[1] < 0)
+Draggables._lastScrollPointer[1] = 0;
+this.draw(Draggables._lastScrollPointer);
+if(this.options.change) this.options.change(this);
+},
+_getWindowScroll: function(w) {
+var T, L, W, H;
+with (w.document) {
+if (w.document.documentElement && documentElement.scrollTop) {
+T = documentElement.scrollTop;
+L = documentElement.scrollLeft;
+} else if (w.document.body) {
+T = body.scrollTop;
+L = body.scrollLeft;
+}
+if (w.innerWidth) {
+W = w.innerWidth;
+H = w.innerHeight;
+} else if (w.document.documentElement && documentElement.clientWidth) {
+W = documentElement.clientWidth;
+H = documentElement.clientHeight;
+} else {
+W = body.offsetWidth;
+H = body.offsetHeight
+}
+}
+return { top: T, left: L, width: W, height: H };
+}
+}
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+initialize: function(element, observer) {
+this.element = $(element);
+this.observer= observer;
+this.lastValue = Sortable.serialize(this.element);
+},
+onStart: function() {
+this.lastValue = Sortable.serialize(this.element);
+},
+onEnd: function() {
Sortable.unmark();
-if(this.lastValue!=Sortable.serialize(this.element)){
-this.observer(this.element);
-}
-}};
-var Sortable={sortables:new Array(),options:function(_203){
-_203=$(_203);
-return this.sortables.detect(function(s){
-return s.element==_203;
-});
-},destroy:function(_205){
-_205=$(_205);
-this.sortables.findAll(function(s){
-return s.element==_205;
-}).each(function(s){
+if(this.lastValue != Sortable.serialize(this.element))
+this.observer(this.element)
+}
+}
+var Sortable = {
+sortables: {},
+_findRootElement: function(element) {
+while (element.tagName != "BODY") {
+if(element.id && Sortable.sortables[element.id]) return element;
+element = element.parentNode;
+}
+},
+options: function(element) {
+element = Sortable._findRootElement($(element));
+if(!element) return;
+return Sortable.sortables[element.id];
+},
+destroy: function(element){
+var s = Sortable.options(element);
+if(s) {
Draggables.removeObserver(s.element);
-s.droppables.each(function(d){
-Droppables.remove(d);
-});
-s.draggables.invoke("destroy");
-});
-this.sortables=this.sortables.reject(function(s){
-return s.element==_205;
-});
-},create:function(_206){
-_206=$(_206);
-var _207=Object.extend({element:_206,tag:"li",dropOnEmpty:false,tree:false,overlap:"vertical",constraint:"vertical",containment:_206,handle:false,only:false,hoverclass:null,ghosting:false,format:null,onChange:Prototype.emptyFunction,onUpdate:Prototype.emptyFunction},arguments[1]||{});
-this.destroy(_206);
-var _208={revert:true,ghosting:_207.ghosting,constraint:_207.constraint,handle:_207.handle};
-if(_207.starteffect){
-_208.starteffect=_207.starteffect;
-}
-if(_207.reverteffect){
-_208.reverteffect=_207.reverteffect;
-}else{
-if(_207.ghosting){
-_208.reverteffect=function(_206){
-_206.style.top=0;
-_206.style.left=0;
+s.droppables.each(function(d){ Droppables.remove(d) });
+s.draggables.invoke('destroy');
+delete Sortable.sortables[s.element.id];
+}
+},
+create: function(element) {
+element = $(element);
+var options = Object.extend({
+element: element,
+tag: 'li',dropOnEmpty: false,
+tree:false,
+treeTag: 'ul',
+overlap: 'vertical',constraint:'vertical',containment: element, handle:false, only:false,
+hoverclass:null,
+ghosting:false,
+scroll:false,
+scrollSensitivity: 20,
+scrollSpeed: 15,
+format:/^[^_]*_(.*)$/,
+onChange:Prototype.emptyFunction,
+onUpdate:Prototype.emptyFunction
+}, arguments[1] || {});
+this.destroy(element);
+var options_for_draggable = {
+revert:true,
+scroll:options.scroll,
+scrollSpeed: options.scrollSpeed,
+scrollSensitivity: options.scrollSensitivity,
+ghosting:options.ghosting,
+constraint:options.constraint,
+handle:options.handle };
+if(options.starteffect)
+options_for_draggable.starteffect = options.starteffect;
+if(options.reverteffect)
+options_for_draggable.reverteffect = options.reverteffect;
+else
+if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+element.style.top= 0;
+element.style.left = 0;
};
-}
-}
-if(_207.endeffect){
-_208.endeffect=_207.endeffect;
-}
-if(_207.zindex){
-_208.zindex=_207.zindex;
-}
-var _209={overlap:_207.overlap,containment:_207.containment,hoverclass:_207.hoverclass,onHover:Sortable.onHover,greedy:!_207.dropOnEmpty};
-Element.cleanWhitespace(element);
-_207.draggables=[];
-_207.droppables=[];
-if(_207.dropOnEmpty){
-Droppables.add(element,{containment:_207.containment,onHover:Sortable.onEmptyHover,greedy:false});
-_207.droppables.push(element);
-}
-(this.findElements(element,_207)||[]).each(function(e){
-var _210=_207.handle?Element.childrenWithClassName(e,_207.handle)[0]:e;
-_207.draggables.push(new Draggable(e,Object.extend(_208,{handle:_210})));
-Droppables.add(e,_209);
-_207.droppables.push(e);
+if(options.endeffect)
+options_for_draggable.endeffect = options.endeffect;
+if(options.zindex)
+options_for_draggable.zindex = options.zindex;
+var options_for_droppable = {
+overlap: options.overlap,
+containment: options.containment,
+tree:options.tree,
+hoverclass:options.hoverclass,
+onHover: Sortable.onHover
+ }
+var options_for_tree = {
+onHover:Sortable.onEmptyHover,
+overlap:options.overlap,
+containment:options.containment,
+hoverclass: options.hoverclass
+}
+Element.cleanWhitespace(element);
+options.draggables = [];
+options.droppables = [];
+if(options.dropOnEmpty || options.tree) {
+Droppables.add(element, options_for_tree);
+options.droppables.push(element);
+}
+(this.findElements(element, options) || []).each( function(e) {
+ var handle = options.handle ?
+Element.childrenWithClassName(e, options.handle)[0] : e;
+options.draggables.push(
+new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+Droppables.add(e, options_for_droppable);
+if(options.tree) e.treeNode = element;
+options.droppables.push(e);
+});
+if(options.tree) {
+(Sortable.findTreeElements(element, options) || []).each( function(e) {
+Droppables.add(e, options_for_tree);
+e.treeNode = element;
+options.droppables.push(e);
});
-this.sortables.push(_207);
-Draggables.addObserver(new SortableObserver(element,_207.onUpdate));
-},findElements:function(_211,_212){
-if(!_211.hasChildNodes()){
-return null;
-}
-var _213=[];
-$A(_211.childNodes).each(function(e){
-if(e.tagName&&e.tagName.toUpperCase()==_212.tag.toUpperCase()&&(!_212.only||(Element.hasClassName(e,_212.only)))){
-_213.push(e);
}
-if(_212.tree){
-var _214=this.findElements(e,_212);
-if(_214){
-_213.push(_214);
+this.sortables[element.id] = options;
+Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+},
+findElements: function(element, options) {
+return Element.findChildren(
+element, options.only, options.tree ? true : false, options.tag);
+},
+findTreeElements: function(element, options) {
+return Element.findChildren(
+element, options.only, options.tree ? true : false, options.treeTag);
+},
+onHover: function(element, dropon, overlap) {
+if(Element.isParent(dropon, element)) return;
+if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+return;
+} else if(overlap>0.5) {
+Sortable.mark(dropon, 'before');
+if(dropon.previousSibling != element) {
+var oldParentNode = element.parentNode;
+element.style.visibility = "hidden";dropon.parentNode.insertBefore(element, dropon);
+if(dropon.parentNode!=oldParentNode)
+Sortable.options(oldParentNode).onChange(element);
+Sortable.options(dropon.parentNode).onChange(element);
+}
+} else {
+Sortable.mark(dropon, 'after');
+var nextElement = dropon.nextSibling || null;
+if(nextElement != element) {
+var oldParentNode = element.parentNode;
+element.style.visibility = "hidden";dropon.parentNode.insertBefore(element, nextElement);
+if(dropon.parentNode!=oldParentNode)
+Sortable.options(oldParentNode).onChange(element);
+Sortable.options(dropon.parentNode).onChange(element);
+}
+}
+},
+onEmptyHover: function(element, dropon, overlap) {
+var oldParentNode = element.parentNode;
+var droponOptions = Sortable.options(dropon);
+if(!Element.isParent(dropon, element)) {
+var index;
+var children = Sortable.findElements(dropon, {tag: droponOptions.tag});
+var child = null;
+if(children) {
+var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+for (index = 0; index < children.length; index += 1) {
+if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+offset -= Element.offsetSize (children[index], droponOptions.overlap);
+} else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+child = index + 1 < children.length ? children[index + 1] : null;
+break;
+} else {
+child = children[index];
+break;
}
}
-});
-return (_213.length>0?_213.flatten():null);
-},onHover:function(_215,_216,_217){
-if(_217>0.5){
-Sortable.mark(_216,"before");
-if(_216.previousSibling!=_215){
-var _218=_215.parentNode;
-_215.style.visibility="hidden";
-_216.parentNode.insertBefore(_215,_216);
-if(_216.parentNode!=_218){
-Sortable.options(_218).onChange(_215);
-}
-Sortable.options(_216.parentNode).onChange(_215);
-}
-}else{
-Sortable.mark(_216,"after");
-var _219=_216.nextSibling||null;
-if(_219!=_215){
-var _218=_215.parentNode;
-_215.style.visibility="hidden";
-_216.parentNode.insertBefore(_215,_219);
-if(_216.parentNode!=_218){
-Sortable.options(_218).onChange(_215);
-}
-Sortable.options(_216.parentNode).onChange(_215);
-}
-}
-},onEmptyHover:function(_220,_221){
-if(_220.parentNode!=_221){
-var _222=_220.parentNode;
-_221.appendChild(_220);
-Sortable.options(_222).onChange(_220);
-Sortable.options(_221).onChange(_220);
-}
-},unmark:function(){
-if(Sortable._marker){
-Element.hide(Sortable._marker);
}
-},mark:function(_223,_224){
-var _225=Sortable.options(_223.parentNode);
-if(_225&&!_225.ghosting){
-return;
+dropon.insertBefore(element, child);
+Sortable.options(oldParentNode).onChange(element);
+droponOptions.onChange(element);
}
-if(!Sortable._marker){
-Sortable._marker=$("dropmarker")||document.createElement("DIV");
+},
+unmark: function() {
+if(Sortable._marker) Element.hide(Sortable._marker);
+},
+mark: function(dropon, position) {
+ var sortable = Sortable.options(dropon.parentNode);
+if(sortable && !sortable.ghosting) return;
+if(!Sortable._marker) {
+Sortable._marker = $('dropmarker') || document.createElement('DIV');
Element.hide(Sortable._marker);
-Element.addClassName(Sortable._marker,"dropmarker");
-Sortable._marker.style.position="absolute";
+Element.addClassName(Sortable._marker, 'dropmarker');
+Sortable._marker.style.position = 'absolute';
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
}
-var _226=Position.cumulativeOffset(_223);
-Sortable._marker.style.left=_226[0]+"px";
-Sortable._marker.style.top=_226[1]+"px";
-if(_224=="after"){
-if(_225.overlap=="horizontal"){
-Sortable._marker.style.left=(_226[0]+_223.clientWidth)+"px";
-}else{
-Sortable._marker.style.top=(_226[1]+_223.clientHeight)+"px";
-}
-}
+var offsets = Position.cumulativeOffset(dropon);
+Sortable._marker.style.left = offsets[0] + 'px';
+Sortable._marker.style.top = offsets[1] + 'px';
+if(position=='after')
+if(sortable.overlap == 'horizontal')
+Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
+else
+Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
Element.show(Sortable._marker);
-},serialize:function(_227){
-_227=$(_227);
-var _228=this.options(_227);
-var _229=Object.extend({tag:_228.tag,only:_228.only,name:_227.id,format:_228.format||/^[^_]*_(.*)$/},arguments[1]||{});
-return $(this.findElements(_227,_229)||[]).map(function(item){
-return (encodeURIComponent(_229.name)+"[]="+encodeURIComponent(item.id.match(_229.format)?item.id.match(_229.format)[1]:""));
-}).join("&");
-}};
-if(!Control){
-var Control={};
-}
-Control.Slider=Class.create();
-Control.Slider.prototype={initialize:function(_231,_232,_233){
-var _234=this;
-if(_231 instanceof Array){
-this.handles=_231.collect(function(e){
-return $(e);
+},
+_tree: function(element, options, parent) {
+var children = Sortable.findElements(element, options) || [];
+for (var i = 0; i < children.length; ++i) {
+var match = children[i].id.match(options.format);
+if (!match) continue;
+var child = {
+id: encodeURIComponent(match ? match[1] : null),
+element: element,
+parent: parent,
+children: new Array,
+position: parent.children.length,
+container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
+}
+if (child.container)
+this._tree(child.container, options, child)
+parent.children.push (child);
+}
+return parent;
+},
+_findChildrenElement: function (element, containerTag) {
+if (element && element.hasChildNodes)
+for (var i = 0; i < element.childNodes.length; ++i)
+if (element.childNodes[i].tagName == containerTag)
+return element.childNodes[i];
+return null;
+},
+tree: function(element) {
+element = $(element);
+var sortableOptions = this.options(element);
+var options = Object.extend({
+tag: sortableOptions.tag,
+treeTag: sortableOptions.treeTag,
+only: sortableOptions.only,
+name: element.id,
+format: sortableOptions.format
+}, arguments[1] || {});
+var root = {
+id: null,
+parent: null,
+children: new Array,
+container: element,
+position: 0
+}
+return Sortable._tree (element, options, root);
+},
+_constructIndex: function(node) {
+var index = '';
+do {
+if (node.id) index = '[' + node.position + ']' + index;
+} while ((node = node.parent) != null);
+return index;
+},
+sequence: function(element) {
+element = $(element);
+var options = Object.extend(this.options(element), arguments[1] || {});
+return $(this.findElements(element, options) || []).map( function(item) {
+return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
});
-}else{
-this.handles=[$(_231)];
-}
-this.track=$(_232);
-this.options=_233||{};
-this.axis=this.options.axis||"horizontal";
-this.increment=this.options.increment||1;
-this.step=parseInt(this.options.step||"1");
-this.range=this.options.range||$R(0,1);
-this.value=0;
-this.values=this.handles.map(function(){
-return 0;
+},
+setSequence: function(element, new_sequence) {
+element = $(element);
+var options = Object.extend(this.options(element), arguments[2] || {});
+var nodeMap = {};
+this.findElements(element, options).each( function(n) {
+if (n.id.match(options.format))
+nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+n.parentNode.removeChild(n);
});
-this.spans=this.options.spans?this.options.spans.map(function(s){
-return $(s);
-}):false;
-this.options.startSpan=$(this.options.startSpan||null);
-this.options.endSpan=$(this.options.endSpan||null);
-this.restricted=this.options.restricted||false;
-this.maximum=this.options.maximum||this.range.end;
-this.minimum=this.options.minimum||this.range.start;
-this.alignX=parseInt(this.options.alignX||"0");
-this.alignY=parseInt(this.options.alignY||"0");
-this.trackLength=this.maximumOffset()-this.minimumOffset();
-this.handleLength=this.isVertical()?this.handles[0].offsetHeight:this.handles[0].offsetWidth;
-this.active=false;
-this.dragging=false;
-this.disabled=false;
-if(this.options.disabled){
-this.setDisabled();
-}
-this.allowedValues=this.options.values?this.options.values.sortBy(Prototype.K):false;
-if(this.allowedValues){
-this.minimum=this.allowedValues.min();
-this.maximum=this.allowedValues.max();
-}
-this.eventMouseDown=this.startDrag.bindAsEventListener(this);
-this.eventMouseUp=this.endDrag.bindAsEventListener(this);
-this.eventMouseMove=this.update.bindAsEventListener(this);
-this.handles.each(function(h,i){
-i=_234.handles.length-1-i;
-_234.setValue(parseFloat((_234.options.sliderValue instanceof Array?_234.options.sliderValue[i]:_234.options.sliderValue)||_234.range.start),i);
-Element.makePositioned(h);
-Event.observe(h,"mousedown",_234.eventMouseDown);
+new_sequence.each(function(ident) {
+var n = nodeMap[ident];
+if (n) {
+n[1].appendChild(n[0]);
+delete nodeMap[ident];
+}
+});
+},
+serialize: function(element) {
+element = $(element);
+var options = Object.extend(Sortable.options(element), arguments[1] || {});
+var name = encodeURIComponent(
+(arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+if (options.tree) {
+return Sortable.tree(element, arguments[1]).children.map( function (item) {
+return [name + Sortable._constructIndex(item) + "=" +
+encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+}).flatten().join('&');
+} else {
+return Sortable.sequence(element, arguments[1]).map( function(item) {
+return name + "[]=" + encodeURIComponent(item);
+}).join('&');
+}
+}
+}
+Element.isParent = function(child, element) {
+if (!child.parentNode || child == element) return false;
+if (child.parentNode == element) return true;
+return Element.isParent(child.parentNode, element);
+}
+Element.findChildren = function(element, only, recursive, tagName) {
+if(!element.hasChildNodes()) return null;
+tagName = tagName.toUpperCase();
+if(only) only = [only].flatten();
+var elements = [];
+$A(element.childNodes).each( function(e) {
+if(e.tagName && e.tagName.toUpperCase()==tagName &&
+(!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+elements.push(e);
+if(recursive) {
+var grandchildren = Element.findChildren(e, only, recursive, tagName);
+if(grandchildren) elements.push(grandchildren);
+}
+});
+return (elements.length>0 ? elements.flatten() : []);
+}
+Element.offsetSize = function (element, type) {
+if (type == 'vertical' || type == 'height')
+return element.offsetHeight;
+else
+return element.offsetWidth;
+}
+if(!Control) var Control = {};
+Control.Slider = Class.create();
+Control.Slider.prototype = {
+initialize: function(handle, track, options) {
+var slider = this;
+if(handle instanceof Array) {
+this.handles = handle.collect( function(e) { return $(e) });
+} else {
+this.handles = [$(handle)];
+}
+this.track = $(track);
+this.options = options || {};
+this.axis= this.options.axis || 'horizontal';
+this.increment = this.options.increment || 1;
+this.step= parseInt(this.options.step || '1');
+this.range = this.options.range || $R(0,1);
+this.value = 0;this.values= this.handles.map( function() { return 0 });
+this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+this.options.startSpan = $(this.options.startSpan || null);
+this.options.endSpan = $(this.options.endSpan || null);
+this.restricted = this.options.restricted || false;
+this.maximum = this.options.maximum || this.range.end;
+this.minimum = this.options.minimum || this.range.start;
+this.alignX = parseInt(this.options.alignX || '0');
+this.alignY = parseInt(this.options.alignY || '0');
+this.trackLength = this.maximumOffset() - this.minimumOffset();
+this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
+this.active = false;
+this.dragging = false;
+this.disabled = false;
+if(this.options.disabled) this.setDisabled();
+this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+if(this.allowedValues) {
+this.minimum = this.allowedValues.min();
+this.maximum = this.allowedValues.max();
+}
+this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+this.eventMouseMove = this.update.bindAsEventListener(this);
+this.handles.each( function(h,i) {
+i = slider.handles.length-1-i;
+slider.setValue(parseFloat(
+(slider.options.sliderValue instanceof Array ?
+slider.options.sliderValue[i] : slider.options.sliderValue) ||
+ slider.range.start), i);
+Element.makePositioned(h);Event.observe(h, "mousedown", slider.eventMouseDown);
});
-Event.observe(this.track,"mousedown",this.eventMouseDown);
-Event.observe(document,"mouseup",this.eventMouseUp);
-Event.observe(document,"mousemove",this.eventMouseMove);
-this.initialized=true;
-},dispose:function(){
-var _236=this;
-Event.stopObserving(this.track,"mousedown",this.eventMouseDown);
-Event.stopObserving(document,"mouseup",this.eventMouseUp);
-Event.stopObserving(document,"mousemove",this.eventMouseMove);
-this.handles.each(function(h){
-Event.stopObserving(h,"mousedown",_236.eventMouseDown);
+Event.observe(this.track, "mousedown", this.eventMouseDown);
+Event.observe(document, "mouseup", this.eventMouseUp);
+Event.observe(document, "mousemove", this.eventMouseMove);
+this.initialized = true;
+},
+dispose: function() {
+var slider = this;
+Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+Event.stopObserving(document, "mouseup", this.eventMouseUp);
+Event.stopObserving(document, "mousemove", this.eventMouseMove);
+this.handles.each( function(h) {
+Event.stopObserving(h, "mousedown", slider.eventMouseDown);
});
-},setDisabled:function(){
-this.disabled=true;
-},setEnabled:function(){
-this.disabled=false;
-},getNearestValue:function(_237){
+},
+setDisabled: function(){
+this.disabled = true;
+},
+setEnabled: function(){
+this.disabled = false;
+},
+getNearestValue: function(value){
if(this.allowedValues){
-if(_237>=this.allowedValues.max()){
-return (this.allowedValues.max());
-}
-if(_237<=this.allowedValues.min()){
-return (this.allowedValues.min());
-}
-var _238=Math.abs(this.allowedValues[0]-_237);
-var _239=this.allowedValues[0];
-this.allowedValues.each(function(v){
-var _240=Math.abs(v-_237);
-if(_240<=_238){
-_239=v;
-_238=_240;
-}
+if(value >= this.allowedValues.max()) return(this.allowedValues.max());
+if(value <= this.allowedValues.min()) return(this.allowedValues.min());
+var offset = Math.abs(this.allowedValues[0] - value);
+var newValue = this.allowedValues[0];
+this.allowedValues.each( function(v) {
+var currentOffset = Math.abs(v - value);
+if(currentOffset <= offset){
+newValue = v;
+offset = currentOffset;
+}
});
-return _239;
-}
-if(_237>this.range.end){
-return this.range.end;
-}
-if(_237<this.range.start){
-return this.range.start;
-}
-return _237;
-},setValue:function(_241,_242){
-if(!this.active){
-this.activeHandle=this.handles[_242];
-this.activeHandleIdx=_242;
+return newValue;
+}
+if(value > this.range.end) return this.range.end;
+if(value < this.range.start) return this.range.start;
+return value;
+},
+setValue: function(sliderValue, handleIdx){
+if(!this.active) {
+this.activeHandle= this.handles[handleIdx];
+this.activeHandleIdx = handleIdx;
this.updateStyles();
}
-_242=_242||this.activeHandleIdx||0;
-if(this.initialized&&this.restricted){
-if((_242>0)&&(_241<this.values[_242-1])){
-_241=this.values[_242-1];
-}
-if((_242<(this.handles.length-1))&&(_241>this.values[_242+1])){
-_241=this.values[_242+1];
-}
-}
-_241=this.getNearestValue(_241);
-this.values[_242]=_241;
-this.value=this.values[0];
-this.handles[_242].style[this.isVertical()?"top":"left"]=this.translateToPx(_241);
+handleIdx = handleIdx || this.activeHandleIdx || 0;
+if(this.initialized && this.restricted) {
+if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
+sliderValue = this.values[handleIdx-1];
+if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
+sliderValue = this.values[handleIdx+1];
+}
+sliderValue = this.getNearestValue(sliderValue);
+this.values[handleIdx] = sliderValue;
+this.value = this.values[0];
+this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
+this.translateToPx(sliderValue);
this.drawSpans();
-if(!this.dragging||!this.event){
+if(!this.dragging || !this.event) this.updateFinished();
+},
+setValueBy: function(delta, handleIdx) {
+this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
+handleIdx || this.activeHandleIdx || 0);
+},
+translateToPx: function(value) {
+return Math.round(
+((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
+(value - this.range.start)) + "px";
+},
+translateToValue: function(offset) {
+return ((offset/(this.trackLength-this.handleLength) *
+(this.range.end-this.range.start)) + this.range.start);
+},
+getRange: function(range) {
+var v = this.values.sortBy(Prototype.K);
+range = range || 0;
+return $R(v[range],v[range+1]);
+},
+minimumOffset: function(){
+return(this.isVertical() ? this.alignY : this.alignX);
+},
+maximumOffset: function(){
+return(this.isVertical() ?
+this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
+},
+isVertical:function(){
+return (this.axis == 'vertical');
+},
+drawSpans: function() {
+var slider = this;
+if(this.spans)
+$R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+if(this.options.startSpan)
+this.setSpan(this.options.startSpan,
+$R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+if(this.options.endSpan)
+this.setSpan(this.options.endSpan,
+$R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+},
+setSpan: function(span, range) {
+if(this.isVertical()) {
+span.style.top = this.translateToPx(range.start);
+span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+} else {
+span.style.left = this.translateToPx(range.start);
+span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+}
+},
+updateStyles: function() {
+this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+Element.addClassName(this.activeHandle, 'selected');
+},
+startDrag: function(event) {
+if(Event.isLeftClick(event)) {
+if(!this.disabled){
+this.active = true;
+var handle = Event.element(event);
+var pointer= [Event.pointerX(event), Event.pointerY(event)];
+if(handle==this.track) {
+var offsets= Position.cumulativeOffset(this.track);
+this.event = event;
+this.setValue(this.translateToValue(
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+));
+var offsets= Position.cumulativeOffset(this.activeHandle);
+this.offsetX = (pointer[0] - offsets[0]);
+this.offsetY = (pointer[1] - offsets[1]);
+} else {
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode)
+handle = handle.parentNode;
+this.activeHandle= handle;
+this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+this.updateStyles();
+var offsets= Position.cumulativeOffset(this.activeHandle);
+this.offsetX = (pointer[0] - offsets[0]);
+this.offsetY = (pointer[1] - offsets[1]);
+}
+}
+Event.stop(event);
+}
+},
+update: function(event) {
+ if(this.active) {
+if(!this.dragging) this.dragging = true;
+this.draw(event);
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+Event.stop(event);
+ }
+},
+draw: function(event) {
+var pointer = [Event.pointerX(event), Event.pointerY(event)];
+var offsets = Position.cumulativeOffset(this.track);
+pointer[0] -= this.offsetX + offsets[0];
+pointer[1] -= this.offsetY + offsets[1];
+this.event = event;
+this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+if(this.initialized && this.options.onSlide)
+this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+},
+endDrag: function(event) {
+if(this.active && this.dragging) {
+this.finishDrag(event, true);
+Event.stop(event);
+}
+this.active = false;
+this.dragging = false;
+},
+finishDrag: function(event, success) {
+this.active = false;
+this.dragging = false;
this.updateFinished();
+},
+updateFinished: function() {
+if(this.initialized && this.options.onChange)
+this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+this.event = null;
+}
+}
+Prado.AutoCompleter = Class.create();
+Prado.AutoCompleter.Base = function(){};
+Prado.AutoCompleter.Base.prototype = Object.extend(Autocompleter.Base.prototype,
+{
+updateElement: function(selectedElement)
+{
+if (this.options.updateElement) {
+this.options.updateElement(selectedElement);
+return;
}
-},setValueBy:function(_243,_244){
-this.setValue(this.values[_244||this.activeHandleIdx||0]+_243,_244||this.activeHandleIdx||0);
-},translateToPx:function(_245){
-return Math.round(((this.trackLength-this.handleLength)/(this.range.end-this.range.start))*(_245-this.range.start))+"px";
-},translateToValue:function(_246){
-return ((_246/(this.trackLength-this.handleLength)*(this.range.end-this.range.start))+this.range.start);
-},getRange:function(_247){
-var v=this.values.sortBy(Prototype.K);
-_247=_247||0;
-return $R(v[_247],v[_247+1]);
-},minimumOffset:function(){
-return (this.isVertical()?this.alignY:this.alignX);
-},maximumOffset:function(){
-return (this.isVertical()?this.track.offsetHeight-this.alignY:this.track.offsetWidth-this.alignX);
-},isVertical:function(){
-return (this.axis=="vertical");
-},drawSpans:function(){
-var _248=this;
-if(this.spans){
-$R(0,this.spans.length-1).each(function(r){
-_248.setSpan(_248.spans[r],_248.getRange(r));
-});
-}
-if(this.options.startSpan){
-this.setSpan(this.options.startSpan,$R(0,this.values.length>1?this.getRange(0).min():this.value));
+var value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+var lastTokenPos = this.findLastToken();
+if (lastTokenPos != -1) {
+var newValue = this.element.value.substr(0, lastTokenPos + 1);
+var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+if (whitespace)
+newValue += whitespace[0];
+this.element.value = (newValue + value).trim();
+} else {
+this.element.value = value.trim();
}
-if(this.options.endSpan){
-this.setSpan(this.options.endSpan,$R(this.values.length>1?this.getRange(this.spans.length-1).max():this.value,this.maximum));
+this.element.focus();
+if (this.options.afterUpdateElement)
+this.options.afterUpdateElement(this.element, selectedElement);
}
-},setSpan:function(span,_251){
-if(this.isVertical()){
-span.style.top=this.translateToPx(_251.start);
-span.style.height=this.translateToPx(_251.end-_251.start);
-}else{
-span.style.left=this.translateToPx(_251.start);
-span.style.width=this.translateToPx(_251.end-_251.start);
+});
+Prado.AutoCompleter.prototype = Object.extend(new Autocompleter.Base(),
+{
+initialize : function(element, update, options)
+{
+this.baseInitialize(element, update, options);
+},
+onUpdateReturn : function(result)
+{
+if(isString(result) && result.length > 0)
+this.updateChoices(result);
+},
+getUpdatedChoices : function()
+{
+Prado.Callback(this.element.id, this.getToken(), this.onUpdateReturn.bind(this));
}
-},updateStyles:function(){
-this.handles.each(function(h){
-Element.removeClassName(h,"selected");
});
-Element.addClassName(this.activeHandle,"selected");
-},startDrag:function(_252){
-if(Event.isLeftClick(_252)){
-if(!this.disabled){
-this.active=true;
-var _253=Event.element(_252);
-var _254=[Event.pointerX(_252),Event.pointerY(_252)];
-if(_253==this.track){
-var _255=Position.cumulativeOffset(this.track);
-this.event=_252;
-this.setValue(this.translateToValue((this.isVertical()?_254[1]-_255[1]:_254[0]-_255[0])-(this.handleLength/2)));
-var _255=Position.cumulativeOffset(this.activeHandle);
-this.offsetX=(_254[0]-_255[0]);
-this.offsetY=(_254[1]-_255[1]);
-}else{
-while((this.handles.indexOf(_253)==-1)&&_253.parentNode){
-_253=_253.parentNode;
-}
-this.activeHandle=_253;
-this.activeHandleIdx=this.handles.indexOf(this.activeHandle);
-this.updateStyles();
-var _255=Position.cumulativeOffset(this.activeHandle);
-this.offsetX=(_254[0]-_255[0]);
-this.offsetY=(_254[1]-_255[1]);
-}
-}
-Event.stop(_252);
-}
-},update:function(_256){
-if(this.active){
-if(!this.dragging){
-this.dragging=true;
-}
-this.draw(_256);
-if(navigator.appVersion.indexOf("AppleWebKit")>0){
-window.scrollBy(0,0);
-}
-Event.stop(_256);
-}
-},draw:function(_257){
-var _258=[Event.pointerX(_257),Event.pointerY(_257)];
-var _259=Position.cumulativeOffset(this.track);
-_258[0]-=this.offsetX+_259[0];
-_258[1]-=this.offsetY+_259[1];
-this.event=_257;
-this.setValue(this.translateToValue(this.isVertical()?_258[1]:_258[0]));
-if(this.initialized&&this.options.onSlide){
-this.options.onSlide(this.values.length>1?this.values:this.value,this);
-}
-},endDrag:function(_260){
-if(this.active&&this.dragging){
-this.finishDrag(_260,true);
-Event.stop(_260);
-}
-this.active=false;
-this.dragging=false;
-},finishDrag:function(_261,_262){
-this.active=false;
-this.dragging=false;
-this.updateFinished();
-},updateFinished:function(){
-if(this.initialized&&this.options.onChange){
-this.options.onChange(this.values.length>1?this.values:this.value,this);
-}
-this.event=null;
-}};
-Prado.AutoCompleter=Class.create();
-Prado.AutoCompleter.Base=function(){
-};
-Prado.AutoCompleter.Base.prototype=Object.extend(Autocompleter.Base.prototype,{updateElement:function(_263){
-if(this.options.updateElement){
-this.options.updateElement(_263);
-return;
+Prado.ActivePanel =
+{
+callbacks : {},
+register : function(id, options)
+{
+Prado.ActivePanel.callbacks[id] = options;
+},
+update : function(id, param)
+{
+var request = new Prado.ActivePanel.Request(id,
+Prado.ActivePanel.callbacks[id]);
+request.callback(param);
+}
+}
+Prado.ActivePanel.Request = Class.create();
+Prado.ActivePanel.Request.prototype =
+{
+initialize : function(element, options)
+{
+this.element = element;
+this.setOptions(options);
+},
+setOptions : function(options)
+{
+this.options =
+{
+onSuccess : this.onSuccess.bind(this)
+}
+Object.extend(this.options, options || {});
+},
+callback : function(param)
+{
+this.options.params = [param];
+new Prado.AJAX.Callback(this.element, this.options);
+},
+onSuccess : function(result, output)
+{
+if(this.options.update)
+{
+if (!this.options.evalScripts)
+output = output.stripScripts();
+Element.update(this.options.update, output);
+}
+}
+}
+Prado.DropContainer = Class.create();
+Prado.DropContainer.prototype = Object.extend(new Prado.ActivePanel.Request(),
+{
+initialize : function(element, options)
+{
+this.element = element;
+this.setOptions(options);
+Object.extend(this.options,
+{
+onDrop : this.onDrop.bind(this),
+evalScripts : true,
+onSuccess : options.onSuccess || this.onSuccess.bind(this)
+});
+Droppables.add(element, this.options);
+},
+onDrop : function(draggable, droppable)
+{
+this.callback(draggable.id)
}
-var _264=Element.collectTextNodesIgnoreClass(_263,"informal");
-var _265=this.findLastToken();
-if(_265!=-1){
-var _266=this.element.value.substr(0,_265+1);
-var _267=this.element.value.substr(_265+1).match(/^\s+/);
-if(_267){
-_266+=_267[0];
+});
+Prado.ActiveImageButton = Class.create();
+Prado.ActiveImageButton.prototype =
+{
+initialize : function(element, options)
+{
+this.element = $(element);
+this.options = options;
+Event.observe(this.element, "click", this.click.bind(this));
+},
+click : function(e)
+{
+var el = $('{$this->ClientID}');
+var imagePos = Position.cumulativeOffset(this.element);
+var clickedPos = [e.clientX, e.clientY];
+var param = (clickedPos[0]-imagePos[0]+1)+","+(clickedPos[1]-imagePos[1]+1);
+Prado.Callback(this.element, param, null, this.options);
+Event.stop(e);
}
-this.element.value=(_266+_264).trim();
-}else{
-this.element.value=_264.trim();
}
-this.element.focus();
-if(this.options.afterUpdateElement){
-this.options.afterUpdateElement(this.element,_263);
-}
-}});
-Prado.AutoCompleter.prototype=Object.extend(new Autocompleter.Base(),{initialize:function(_268,_269,_270){
-this.baseInitialize(_268,_269,_270);
-},onUpdateReturn:function(_271){
-if(isString(_271)&&_271.length>0){
-this.updateChoices(_271);
-}
-},getUpdatedChoices:function(){
-Prado.Callback(this.element.id,this.getToken(),this.onUpdateReturn.bind(this));
-}});
-Prado.ActivePanel={callbacks:{},register:function(id,_272){
-Prado.ActivePanel.callbacks[id]=_272;
-},update:function(id,_273){
-var _274=new Prado.ActivePanel.Request(id,Prado.ActivePanel.callbacks[id]);
-_274.callback(_273);
-}};
-Prado.ActivePanel.Request=Class.create();
-Prado.ActivePanel.Request.prototype={initialize:function(_275,_276){
-this.element=_275;
-this.setOptions(_276);
-},setOptions:function(_277){
-this.options={onSuccess:this.onSuccess.bind(this)};
-Object.extend(this.options,_277||{});
-},callback:function(_278){
-this.options.params=[_278];
-new Prado.AJAX.Callback(this.element,this.options);
-},onSuccess:function(_279,_280){
-if(this.options.update){
-if(!this.options.evalScripts){
-_280=_280.stripScripts();
-}
-Element.update(this.options.update,_280);
-}
-}};
-Prado.DropContainer=Class.create();
-Prado.DropContainer.prototype=Object.extend(new Prado.ActivePanel.Request(),{initialize:function(_281,_282){
-this.element=_281;
-this.setOptions(_282);
-Object.extend(this.options,{onDrop:this.onDrop.bind(this),evalScripts:true,onSuccess:_282.onSuccess||this.onSuccess.bind(this)});
-Droppables.add(_281,this.options);
-},onDrop:function(_283,_284){
-this.callback(_283.id);
-}});
-Prado.ActiveImageButton=Class.create();
-Prado.ActiveImageButton.prototype={initialize:function(_285,_286){
-this.element=$(_285);
-this.options=_286;
-Event.observe(this.element,"click",this.click.bind(this));
-},click:function(e){
-var el=$("{$this->ClientID}");
-var _287=Position.cumulativeOffset(this.element);
-var _288=[e.clientX,e.clientY];
-var _289=(_288[0]-_287[0]+1)+","+(_288[1]-_287[1]+1);
-Prado.Callback(this.element,_289,null,this.options);
-Event.stop(e);
-}};
-
diff --git a/framework/Web/Javascripts/js/colorpicker.js b/framework/Web/Javascripts/js/colorpicker.js
index 3dde7692..27e180b0 100644
--- a/framework/Web/Javascripts/js/colorpicker.js
+++ b/framework/Web/Javascripts/js/colorpicker.js
@@ -1,467 +1,595 @@
-if(typeof (Rico)=="undefined"){
-Rico={};
-}
-Rico.Color=Class.create();
-Rico.Color.prototype={initialize:function(_1,_2,_3){
-this.rgb={r:_1,g:_2,b:_3};
-},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 _8=this.asHSB();
-_8.h=h;
-this.rgb=Rico.Color.HSBtoRGB(_8.h,_8.s,_8.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(_11){
-var hsb=this.asHSB();
-this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.max(hsb.b-_11,0));
-},brighten:function(_12){
-var hsb=this.asHSB();
-this.rgb=Rico.Color.HSBtoRGB(hsb.h,hsb.s,Math.min(hsb.b+_12,1));
-},blend:function(_13){
-this.rgb.r=Math.floor((this.rgb.r+_13.rgb.r)/2);
-this.rgb.g=Math.floor((this.rgb.g+_13.rgb.g)/2);
-this.rgb.b=Math.floor((this.rgb.b+_13.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(){
+
+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(_14){
-if(_14.indexOf("#")==0){
-_14=_14.substring(1);
-}
-var red="ff",green="ff",blue="ff";
-if(_14.length>4){
-red=_14.substring(0,2);
-green=_14.substring(2,4);
-blue=_14.substring(4,6);
-}else{
-if(_14.length>0&_14.length<4){
-var r=_14.substring(0,1);
-var g=_14.substring(1,2);
-var b=_14.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(_16){
-var _17=Element.getStyle($(_16),"background-color");
-if(_17=="transparent"&&_16.parent){
-return Rico.Color.createColorFromBackground(_16.parent);
-}
-if(_17==null){
+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(_17.indexOf("rgb(")==0){
-var _18=_17.substring(4,_17.length-1);
-var _19=_18.split(",");
-return new Rico.Color(parseInt(_19[0]),parseInt(_19[1]),parseInt(_19[2]));
-}else{
-if(_17.indexOf("#")==0){
-return Rico.Color.createFromHex(_17);
-}else{
+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,_21,_22){
-var red=0;
-var _23=0;
-var _24=0;
-if(_21==0){
-red=parseInt(_22*255+0.5);
-_23=red;
-_24=red;
-}else{
-var h=(hue-Math.floor(hue))*6;
-var f=h-Math.floor(h);
-var p=_22*(1-_21);
-var q=_22*(1-_21*f);
-var t=_22*(1-(_21*(1-f)));
-switch(parseInt(h)){
-case 0:
-red=(_22*255+0.5);
-_23=(t*255+0.5);
-_24=(p*255+0.5);
+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.5);
-_23=(_22*255+0.5);
-_24=(p*255+0.5);
+ 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.5);
-_23=(_22*255+0.5);
-_24=(t*255+0.5);
+ 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.5);
-_23=(q*255+0.5);
-_24=(_22*255+0.5);
+ 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.5);
-_23=(p*255+0.5);
-_24=(_22*255+0.5);
+ case 4:
+red = (t * 255.0 + 0.5);
+green = (p * 255.0 + 0.5);
+blue= (brightness * 255.0 + 0.5);
break;
case 5:
-red=(_22*255+0.5);
-_23=(p*255+0.5);
-_24=(q*255+0.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(_23),b:parseInt(_24)};
-};
-Rico.Color.RGBtoHSB=function(r,g,b){
-var hue;
-var _29;
-var _30;
-var _31=(r>g)?r:g;
-if(b>_31){
-_31=b;
-}
-var _32=(r<g)?r:g;
-if(b<_32){
-_32=b;
-}
-_30=_31/255;
-if(_31!=0){
-saturation=(_31-_32)/_31;
-}else{
-saturation=0;
-}
-if(saturation==0){
-hue=0;
-}else{
-var _33=(_31-r)/(_31-_32);
-var _34=(_31-g)/(_31-_32);
-var _35=(_31-b)/(_31-_32);
-if(r==_31){
-hue=_35-_34;
-}else{
-if(g==_31){
-hue=2+_33-_35;
-}else{
-hue=4+_34-_33;
-}
+return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) };
}
-hue=hue/6;
-if(hue<0){
-hue=hue+1;
-}
-}
-return {h:hue,s:saturation,b:_30};
-};
-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(_36){
-var _37={Palette:"Small",ClassName:"TColorPicker",Mode:"Basic",OKButtonText:"OK",CancelButtonText:"Cancel",ShowColorPicker:true};
-this.element=null;
-this.showing=false;
-_36=Object.extend(_37,_36);
-this.options=_36;
-this.input=$(_36["ID"]);
-this.button=$(_36["ID"]+"_button");
-this._buttonOnClick=this.buttonOnClick.bind(this);
-if(_36["ShowColorPicker"]){
-Event.observe(this.button,"click",this._buttonOnClick);
+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'
}
-Event.observe(this.input,"change",this.updatePicker.bind(this));
-},updatePicker:function(e){
-var _39=Rico.Color.createFromHex(this.input.value);
-this.button.style.backgroundColor=_39.toString();
-},buttonOnClick:function(_40){
-var _41=this.options["Mode"];
-if(this.element==null){
-var _42=_41=="Basic"?"getBasicPickerContainer":"getFullPickerContainer";
-this.element=this[_42](this.options["ID"],this.options["Palette"]);
+});
+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.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(_41=="Full"){
+if(mode == "Full")
this.initializeFullPicker();
}
-}
this.show();
-},show:function(_43){
-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(_43);
-this._documentClickEvent=this.hideOnClick.bindEvent(this,_43);
-this._documentKeyDownEvent=this.keyPressed.bindEvent(this,_43);
-Event.observe(document.body,"click",this._documentClickEvent);
-Event.observe(document,"keydown",this._documentKeyDownEvent);
-this.showing=true;
-if(_43=="Full"){
-var _45=Rico.Color.createFromHex(this.input.value);
-this.inputs.oldColor.style.backgroundColor=_45.asHex();
-this.setColor(_45,true);
-}
-}
-},hide:function(_46){
-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);
-}
-},keyPressed:function(_47,_48){
-if(Event.keyCode(_47)==Event.KEY_ESC){
-this.hide(_47,_48);
-}
-},hideOnClick:function(ev){
-if(!this.showing){
-return;
-}
-var el=Event.element(ev);
-var _51=false;
-do{
-_51=_51||String(el.className).indexOf("FullColorPicker")>-1;
-_51=_51||el==this.button;
-_51=_51||el==this.input;
-if(_51){
-break;
-}
-el=el.parentNode;
-}while(el);
-if(!_51){
-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(_52,_53){
-var _54=TABLE({className:"basic_colors palette_"+_53},TBODY());
-var _55=Prado.WebUI.TColorPicker.palettes[_53];
-var _56=this.cellOnClick.bind(this);
-_55.each(function(_57){
-var row=document.createElement("tr");
-_57.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",_56);
-Event.observe(img,"mouseover",function(e){
-Element.addClassName(Event.element(e),"pickerhover");
+},
+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")
+{
+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);
+}
+},
+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");
+Event.observe(img,"mouseout", function(e)
+{
+Element.removeClassName(Event.element(e), "pickerhover");
});
td.appendChild(img);
row.appendChild(td);
});
-_54.childNodes[0].appendChild(row);
+table.childNodes[0].appendChild(row);
});
-return DIV({className:this.options["ClassName"]+" BasicColorPicker",id:_52+"_picker"},_54);
-},cellOnClick:function(e){
-var el=Event.element(e);
-if(el.tagName.toLowerCase()!="img"){
+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 _62=Rico.Color.createColorFromBackground(el);
-this.updateColor(_62);
-},updateColor:function(_63){
-this.input.value=_63.toString().toUpperCase();
-this.button.style.backgroundColor=_63.toString();
-if(isFunction(this.onChange)){
-this.onChange(_63);
-}
-},getFullPickerContainer:function(_64){
-this.buttons={OK:INPUT({value:this.options.OKButtonText,className:"button",type:"button"}),Cancel:INPUT({value:this.options.CancelButtonText,className:"button",type:"button"})};
-var _65={};
-["H","S","V","R","G","B"].each(function(_66){
-_65[_66]=INPUT({type:"text",size:"3",maxlength:"3"});
+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(isFunction(this.onChange))
+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'});
});
-_65["HEX"]=INPUT({className:"hex",type:"text",size:"6",maxlength:"6"});
-this.inputs=_65;
-var _67=Prado.WebUI.TColorPicker.UIImages;
-this.inputs["currentColor"]=SPAN({className:"currentColor"});
-this.inputs["oldColor"]=SPAN({className:"oldColor"});
-var _68=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"],"\xc2\xb0")),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 _69={selector:SPAN({className:"selector"}),background:SPAN({className:"colorpanel"}),slider:SPAN({className:"slider"}),hue:SPAN({className:"strip"})};
-if(Prado.Browser().ie){
-var _70="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader";
-_69["background"]=SPAN({className:"colorpanel",style:_70+"(src='"+_67["background.png"]+"' sizingMethod=scale);"});
-}
-this.inputs=Object.extend(this.inputs,_69);
-var _71=TABLE(null,TBODY(null,TR({className:"selection"},TD({className:"colors"},_69["selector"],_69["background"]),TD({className:"hue"},_69["slider"],_69["hue"]),TD({className:"inputs"},_68)),TR({className:"options"},TD({colSpan:3},this.buttons["OK"],this.buttons["Cancel"]))));
-return DIV({className:this.options["ClassName"]+" FullColorPicker",id:_64+"_picker"},_71);
-},initializeFullPicker:function(){
-var _72=Rico.Color.createFromHex(this.input.value);
-this.inputs.oldColor.style.backgroundColor=_72.asHex();
-this.setColor(_72,true);
-var i=0;
-for(var _74 in this.inputs){
-Event.observe(this.inputs[_74],"change",this.onInputChanged.bindEvent(this,_74));
+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.hue,"mousedown",this._onHueMouseDown);
-Event.observe(document.body,"mouseup",this._onMouseUp);
-Event.observe(document.body,"mousemove",this._onMouseMove);
-Event.observe(this.buttons.Cancel,"click",this.hide.bindEvent(this,this.options["Mode"]));
-Event.observe(this.buttons.OK,"click",this.onOKClicked.bind(this));
-},onColorMouseDown:function(ev){
-this.isMouseDownOnColor=true;
+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.hue, "mousedown", this._onHueMouseDown);
+Event.observe(document.body, "mouseup", this._onMouseUp);
+Event.observe(document.body, "mousemove", this._onMouseMove);
+Event.observe(this.buttons.Cancel, "click", this.hide.bindEvent(this,this.options['Mode']));
+Event.observe(this.buttons.OK, "click", this.onOKClicked.bind(this));
+},
+onColorMouseDown : function(ev)
+{
+this.isMouseDownOnColor = true;
this.onMouseMove(ev);
-},onHueMouseDown:function(ev){
-this.isMouseDownOnHue=true;
+},
+onHueMouseDown : function(ev)
+{
+this.isMouseDownOnHue = true;
this.onMouseMove(ev);
-},onMouseUp:function(ev){
-this.isMouseDownOnColor=false;
-this.isMouseDownOnHue=false;
-},onMouseMove:function(ev){
-if(this.isMouseDownOnColor){
+},
+onMouseUp : function(ev)
+{
+this.isMouseDownOnColor = false;
+this.isMouseDownOnHue = false;
+},
+onMouseMove : function(ev)
+{
+if(this.isMouseDownOnColor)
this.changeSV(ev);
-}
-if(this.isMouseDownOnHue){
+if(this.isMouseDownOnHue)
this.changeH(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 h=this.truncate(this.inputs.H.value,0,360)/360;
-var s=x/255;
-var b=(255-y)/255;
-var _79=new Rico.Color();
-_79.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=_79.asHex();
-return this.setColor(_79);
-},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 s=parseInt(this.inputs.S.value)/100;
-var b=parseInt(this.inputs.V.value)/100;
-var _80=new Rico.Color();
-_80.rgb=Rico.Color.HSBtoRGB(h,s,b);
-var hue=new Rico.Color(_80.rgb.r,_80.rgb.g,_80.rgb.b);
-hue.setSaturation(1);
-hue.setBrightness(1);
-this.inputs.background.style.backgroundColor=hue.asHex();
-this.inputs.currentColor.style.backgroundColor=_80.asHex();
-this.inputs.slider.style.top=this.truncate(y,0,255)+"px";
-return this.setColor(_80);
-},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 _81=new Rico.Color(r,g,b);
-this.updateColor(_81);
-this.inputs.oldColor.style.backgroundColor=_81.asHex();
+},
+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 h = this.truncate(this.inputs.H.value,0,360)/360;
+var s = x/255;
+var b = (255-y)/255;
+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 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,_82){
-if(this.isMouseDownOnColor||isMouseDownOnHue){
+},
+onInputChanged : function(ev, type)
+{
+if(this.isMouseDownOnColor || isMouseDownOnHue)
return;
-}
-switch(_82){
-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 _83=new Rico.Color();
-_83.rgb=Rico.Color.HSBtoRGB(h,s,b);
-return this.setColor(_83,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 _83=new Rico.Color(r,g,b);
-return this.setColor(_83,true);
+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 _83=Rico.Color.createFromHex(this.inputs.HEX.value);
-return this.setColor(_83,true);
+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;
}
-},setColor:function(_84,_85){
-var hsb=_84.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=_84.rgb.r;
-this.inputs.G.value=_84.rgb.g;
-this.inputs.B.value=_84.rgb.b;
-this.inputs.HEX.value=_84.asHex().substring(1).toUpperCase();
-var _86=Prado.WebUI.TColorPicker.UIImages;
-var _87=_84.isBright()?"removeClassName":"addClassName";
-Element[_87](this.inputs.selector,"target_white");
-if(_85){
-this.updateSelectors(_84);
-}
-},updateSelectors:function(_88){
-var hsb=_88.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(_88.rgb.r,_88.rgb.g,_88.rgb.b);
-hue.setSaturation(1);
-hue.setBrightness(1);
-this.inputs.background.style.backgroundColor=hue.asHex();
-this.inputs.currentColor.style.backgroundColor=_88.asHex();
-},truncate:function(_89,min,max){
-_89=parseInt(_89);
-return _89<min?min:_89>max?max:_89;
-}});
-
+});
diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js
index 7cfad904..e82507ea 100644
--- a/framework/Web/Javascripts/js/datepicker.js
+++ b/framework/Web/Javascripts/js/datepicker.js
@@ -1,458 +1,507 @@
-Prado.WebUI.TDatePicker=Class.create();
-Prado.WebUI.TDatePicker.prototype={MonthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],ShortWeekDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Format:"yyyy-MM-dd",FirstDayOfWeek:1,ClassName:"TDatePicker",FromYear:2000,UpToYear:2015,initialize:function(_1){
-this.options=_1||[];
-this.control=$(_1.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 _2=this.options.TriggerEvent||"click";
-}else{
-this.trigger=this.control;
-var _2=this.options.TriggerEvent||"focus";
-}
-Object.extend(this,_1);
-Event.observe(this.trigger,_2,this.show.bindEvent(this));
+Prado.WebUI.TDatePicker = Class.create();
+Prado.WebUI.TDatePicker.prototype =
+{
+MonthNames : ["January","February","March","April",
+"May","June","July","August",
+"September","October","November","December"
+],
+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 _3;
-var _4;
-var _5;
+},
+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";
-_3=document.createElement("div");
-_3.className="calendarHeader";
-this._calDiv.appendChild(_3);
-_4=document.createElement("table");
-_4.style.cellSpacing=0;
-_3.appendChild(_4);
-_5=document.createElement("tbody");
-_4.appendChild(_5);
-tr=document.createElement("tr");
-_5.appendChild(tr);
-td=document.createElement("td");
-var _8=document.createElement("button");
-_8.className="prevMonthButton";
-_8.appendChild(document.createTextNode("<<"));
-td.appendChild(_8);
+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");
+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 = 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";
+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 = 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 _11=document.createElement("button");
-_11.appendChild(document.createTextNode(">>"));
-td.appendChild(_11);
+td = document.createElement("td");
+td.className = "nextMonthButton";
+var nextMonth = document.createElement("button");
+nextMonth.appendChild(document.createTextNode(">>"));
+td.appendChild(nextMonth);
tr.appendChild(td);
-_3=document.createElement("div");
-_3.className="calendarBody";
-this._calDiv.appendChild(_3);
-var _12=_3;
-var _13;
-_4=document.createElement("table");
-_4.className="grid";
-_3.appendChild(_4);
-var _14=document.createElement("thead");
-_4.appendChild(_14);
-tr=document.createElement("tr");
-_14.appendChild(tr);
-for(i=0;i<7;++i){
-td=document.createElement("th");
-_13=document.createTextNode(this.ShortWeekDayNames[(i+this.FirstDayOfWeek)%7]);
-td.appendChild(_13);
-td.className="weekDayHead";
+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);
}
-_5=document.createElement("tbody");
-_4.appendChild(_5);
-for(week=0;week<6;++week){
-tr=document.createElement("tr");
-_5.appendChild(tr);
-for(day=0;day<7;++day){
-td=document.createElement("td");
-td.className="calendarDate";
-_13=document.createTextNode(String.fromCharCode(160));
-td.appendChild(_13);
+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=_13;
-this.dateSlot[(week*7)+day]=tmp;
-Event.observe(td,"mouseover",this.hover.bindEvent(this));
-Event.observe(td,"mouseout",this.hover.bindEvent(this));
-}
-}
-_3=document.createElement("div");
-_3.className="calendarFooter";
-this._calDiv.appendChild(_3);
-var _16=document.createElement("button");
-_16.className="todayButton";
-var _17=this.newDate();
-var _18=_17.SimpleFormat(this.Format);
-_16.appendChild(document.createTextNode(_18));
-_3.appendChild(_16);
-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";
+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);
+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);
-_8.hideFocus=true;
-_11.hideFocus=true;
-_16.hideFocus=true;
-Event.observe(_8,"click",this.prevMonth.bindEvent(this));
-Event.observe(_11,"click",this.nextMonth.bindEvent(this));
-Event.observe(_16,"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(_12,"click",this.selectDate.bindEvent(this));
-},ieHack:function(_19){
-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(_19){
-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){
+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 _22=function(_23,_24){
-_23=(_23+12)%12;
-var _25=[31,28,31,30,31,30,31,31,30,31,30,31];
-var res=_25[_23];
-if(_23==1){
-res+=_24%4==0&&!(_24%400==0)?1:0;
-}
+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 _27=this.selectedDate;
-var d=_27.valueOf();
-if(kc==Event.KEY_LEFT){
-if(ev.ctrlKey||ev.shiftKey){
-_27.setDate(Math.min(_27.getDate(),_22(_27.getMonth()-1,_27.getFullYear())));
-d=_27.setMonth(_27.getMonth()-1);
-}else{
-d-=86400000;
-}
-}else{
-if(kc==Event.KEY_RIGHT){
-if(ev.ctrlKey||ev.shiftKey){
-_27.setDate(Math.min(_27.getDate(),_22(_27.getMonth()+1,_27.getFullYear())));
-d=_27.setMonth(_27.getMonth()+1);
-}else{
-d+=86400000;
-}
-}else{
-if(kc==Event.KEY_UP){
-if(ev.ctrlKey||ev.shiftKey){
-_27.setDate(Math.min(_27.getDate(),_22(_27.getMonth(),_27.getFullYear()-1)));
-d=_27.setFullYear(_27.getFullYear()-1);
-}else{
-d-=604800000;
-}
-}else{
-if(kc==Event.KEY_DOWN){
-if(ev.ctrlKey||ev.shiftKey){
-_27.setDate(Math.min(_27.getDate(),_22(_27.getMonth(),_27.getFullYear()+1)));
-d=_27.setFullYear(_27.getFullYear()+1);
-}else{
-d+=7*24*61*60*1000;
-}
-}
-}
}
+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 );
+}
+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 );
+}
+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"){
+},
+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){
+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()){
+},
+selectToday : function()
+{
+if(this.selectedDate.toISODate() == this.newDate().toISODate())
this.hide();
-}
this.setSelectedDate(this.newDate());
-},clearSelection:function(){
+},
+clearSelection : function()
+{
this.setSelectedDate(this.newDate());
this.hide();
-},monthSelect:function(ev){
+},
+monthSelect : function(ev)
+{
this.setMonth(Form.Element.getValue(Event.element(ev)));
-},yearSelect:function(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;
+},
+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();
-}else{
-var day=$(this.options.ID+"_day");
-var _34=$(this.options.ID+"_month");
-var _35=$(this.options.ID+"_year");
-var _36=this.selectedDate;
-if(day){
-day.selectedIndex=_36.getDate()-1;
-}
-if(_34){
-_34.selectedIndex=_36.getMonth();
-}
-if(_35){
-var _37=_35.options;
-var _38=_36.getFullYear();
-for(var i=0;i<_37.length;i++){
-_37[i].selected=_37[i].value.toInteger()==_38;
-}
-}
-}
-},formatDate:function(){
-return this.selectedDate?this.selectedDate.SimpleFormat(this.Format):"";
-},newDate:function(_39){
-if(!_39){
-_39=new Date();
-}
-if(isString(_39)||isNumber(_39)){
-_39=new Date(_39);
-}
-return new Date(_39.getFullYear(),_39.getMonth(),_39.getDate(),0,0,0);
-},setSelectedDate:function(_40){
-if(_40==null){
+},
+onchange : function()
+{
+if(this.options.InputMode == "TextBox")
+this.control.value = this.formatDate();
+else
+{
+var day = $(this.options.ID+"_day");
+var month = $(this.options.ID+"_month");
+var year = $(this.options.ID+"_year");
+var date = this.selectedDate;
+if(day)
+day.selectedIndex = date.getDate()-1;
+if(month)
+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;
+}
+}
+},
+formatDate : function()
+{
+return this.selectedDate ? this.selectedDate.SimpleFormat(this.Format) : '';
+},
+newDate : function(date)
+{
+if(!date)
+date = new Date();
+if(isString(date)|| isNumber(date))
+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(_40);
+this.selectedDate = this.newDate(date);
this.updateHeader();
this.update();
-if(isFunction(this.onchange)){
+if (isFunction(this.onchange))
this.onchange();
-}
-},getElement:function(){
+},
+getElement : function()
+{
return this._calDiv;
-},getSelectedDate:function(){
-return isNull(this.selectedDate)?null:this.newDate(this.selectedDate);
-},setYear:function(_41){
-var d=this.newDate(this.selectedDate);
-d.setFullYear(_41);
+},
+getSelectedDate : function ()
+{
+return isNull(this.selectedDate) ? null : this.newDate(this.selectedDate);
+},
+setYear : function(year)
+{
+var d = this.newDate(this.selectedDate);
+d.setFullYear(year);
this.setSelectedDate(d);
-},setMonth:function(_42){
-var d=this.newDate(this.selectedDate);
-d.setMonth(_42);
+},
+setMonth : function (month)
+{
+var d = this.newDate(this.selectedDate);
+d.setMonth(month);
this.setSelectedDate(d);
-},nextMonth:function(){
+},
+nextMonth : function ()
+{
this.setMonth(this.selectedDate.getMonth()+1);
-},prevMonth:function(){
+},
+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{
-if($(this.options.ID+"_day")){
-pos[1]+=$(this.options.ID+"_day").offsetHeight-1;
-}
-}
-this._calDiv.style.display="block";
-this._calDiv.style.top=(pos[1]-1)+"px";
-this._calDiv.style.left=pos[0]+"px";
+},
+show : function()
+{
+if(!this.showing)
+{
+var pos = Position.cumulativeOffset(this.control);
+if(this.options.InputMode == "TextBox")
+pos[1] += this.control.offsetHeight;
+else
+{
+if($(this.options.ID+"_day"))
+pos[1] += $(this.options.ID+"_day").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 _44=this.getDateFromInput();
-if(!isNull(_44)){
-this.selectedDate=_44;
-this.setSelectedDate(_44);
-}
-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{
+this.documentClickEvent = this.hideOnClick.bindEvent(this);
+this.documentKeyDownEvent = this.keyPressed.bindEvent(this);
+Event.observe(document.body, "click", this.documentClickEvent);
+var date = this.getDateFromInput();
+if(!isNull(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
+{
var now=new Date();
-var _46=now.getFullYear();
-var _47=now.getMonth();
-var _48=1;
-if($(this.options.ID+"_day")){
-day=$F(this.options.ID+"_day");
+var year=now.getFullYear();
+var month=now.getMonth();
+var date=1;
+if($(this.options.ID+"_day"))
+day = $F(this.options.ID+"_day");
+if($(this.options.ID+"_month"))
+month = $F(this.options.ID+"_month");
+if($(this.options.ID+"_year"))
+year = $F(this.options.ID+"_year");
+var newdate=new Date(year,month,day, 0, 0, 0);
+return newdate;
+}
+},
+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)
+{
+Element.condClassName(Event.element(ev), "hover", ev.type=="mouseover");
+},
+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;
}
-if($(this.options.ID+"_month")){
-_47=$F(this.options.ID+"_month");
}
-if($(this.options.ID+"_year")){
-_46=$F(this.options.ID+"_year");
}
-var _49=new Date(_46,_47,day,0,0,0);
-return _49;
-}
-},hideOnClick:function(ev){
-if(!this.showing){
-return;
-}
-var el=Event.element(ev);
-var _50=false;
-do{
-_50=_50||el.className==this.ClassName;
-_50=_50||el==this.trigger;
-_50=_50||el==this.control;
-if(_50){
-break;
-}
-el=el.parentNode;
-}while(el);
-if(!_50){
-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 _51=this.selectedDate;
-var _52=(this.newDate()).toISODate();
-var _53=_51.toISODate();
-var d1=new Date(_51.getFullYear(),_51.getMonth(),1);
-var d2=new Date(_51.getFullYear(),_51.getMonth()+1,1);
-var _56=Math.round((d2-d1)/(24*60*60*1000));
-var _57=(d1.getDay()-this.FirstDayOfWeek)%7;
-if(_57<0){
-_57+=7;
-}
-var _58=0;
-while(_58<_57){
-this.dateSlot[_58].value=-1;
-this.dateSlot[_58].data.data=String.fromCharCode(160);
-this.dateSlot[_58].data.parentNode.className="empty";
-_58++;
-}
-for(i=1;i<=_56;i++,_58++){
-var _59=this.dateSlot[_58];
-var _60=_59.data.parentNode;
-_59.value=i;
-_59.data.data=i;
-_60.className="date";
-if(d1.toISODate()==_52){
-_60.className+=" today";
-}
-if(d1.toISODate()==_53){
-_60.className+=" selected";
-}
-d1=new Date(d1.getFullYear(),d1.getMonth(),d1.getDate()+1);
-}
-var _61=_58;
-while(_58<42){
-this.dateSlot[_58].value=-1;
-this.dateSlot[_58].data.data=String.fromCharCode(160);
-this.dateSlot[_58].data.parentNode.className="empty";
-++_58;
-}
-},hover:function(ev){
-Element.condClassName(Event.element(ev),"hover",ev.type=="mouseover");
-},updateHeader:function(){
-var _62=this._monthSelect.options;
-var m=this.selectedDate.getMonth();
-for(var i=0;i<_62.length;++i){
-_62[i].selected=false;
-if(_62[i].value==m){
-_62[i].selected=true;
-}
-}
-_62=this._yearSelect.options;
-var _63=this.selectedDate.getFullYear();
-for(var i=0;i<_62.length;++i){
-_62[i].selected=false;
-if(_62[i].value==_63){
-_62[i].selected=true;
-}
-}
-}};
-
+};
diff --git a/framework/Web/Javascripts/js/effects.js b/framework/Web/Javascripts/js/effects.js
index d72e3eba..24aea4f9 100644
--- a/framework/Web/Javascripts/js/effects.js
+++ b/framework/Web/Javascripts/js/effects.js
@@ -1,729 +1,855 @@
-String.prototype.parseColor=function(){
-var _1="#";
-if(this.slice(0,4)=="rgb("){
-var _2=this.slice(4,this.length-1).split(",");
-var i=0;
-do{
-_1+=parseInt(_2[i]).toColorPart();
-}while(++i<3);
-}else{
-if(this.slice(0,1)=="#"){
-if(this.length==4){
-for(var i=1;i<4;i++){
-_1+=(this.charAt(i)+this.charAt(i)).toLowerCase();
-}
-}
-if(this.length==7){
-_1=this.toLowerCase();
+
+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;
}
-return (_1.length==7?_1:(arguments[0]||this));
-};
-Element.collectTextNodes=function(_4){
-return $A($(_4).childNodes).collect(function(_5){
-return (_5.nodeType==3?_5.nodeValue:(_5.hasChildNodes()?Element.collectTextNodes(_5):""));
-}).flatten().join("");
-};
-Element.collectTextNodesIgnoreClass=function(_6,_7){
-return $A($(_6).childNodes).collect(function(_8){
-return (_8.nodeType==3?_8.nodeValue:((_8.hasChildNodes()&&!Element.hasClassName(_8,_7))?Element.collectTextNodes(_8):""));
-}).flatten().join("");
-};
-Element.setStyle=function(_9,_10){
-_9=$(_9);
-for(k in _10){
-_9.style[k.camelize()]=_10[k];
+Effect.Transitions.reverse= function(pos) {
+return 1-pos;
}
-};
-Element.setContentZoom=function(_11,_12){
-Element.setStyle(_11,{fontSize:(_12/100)+"em"});
-if(navigator.appVersion.indexOf("AppleWebKit")>0){
-window.scrollBy(0,0);
+Effect.Transitions.flicker = function(pos) {
+return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
}
-};
-Element.getOpacity=function(_13){
-var _14;
-if(_14=Element.getStyle(_13,"opacity")){
-return parseFloat(_14);
+Effect.Transitions.wobble = function(pos) {
+return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
}
-if(_14=(Element.getStyle(_13,"filter")||"").match(/alpha\(opacity=(.*)\)/)){
-if(_14[1]){
-return parseFloat(_14[1])/100;
+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;
-};
-Element.setOpacity=function(_15,_16){
-_15=$(_15);
-if(_16==1){
-Element.setStyle(_15,{opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?0.999999:null});
-if(/MSIE/.test(navigator.userAgent)){
-Element.setStyle(_15,{filter:Element.getStyle(_15,"filter").replace(/alpha\([^\)]*\)/gi,"")});
-}
-}else{
-if(_16<0.00001){
-_16=0;
-}
-Element.setStyle(_15,{opacity:_16});
-if(/MSIE/.test(navigator.userAgent)){
-Element.setStyle(_15,{filter:Element.getStyle(_15,"filter").replace(/alpha\([^\)]*\)/gi,"")+"alpha(opacity="+_16*100+")"});
-}
-}
-};
-Element.getInlineOpacity=function(_17){
-return $(_17).style.opacity||"";
-};
-Element.childrenWithClassName=function(_18,_19){
-return $A($(_18).getElementsByTagName("*")).select(function(c){
-return Element.hasClassName(c,_19);
-});
-};
-Array.prototype.call=function(){
-var _21=arguments;
-this.each(function(f){
-f.apply(this,_21);
-});
-};
-var Effect={tagifyText:function(_23){
-var _24="position:relative";
-if(/MSIE/.test(navigator.userAgent)){
-_24+=";zoom:1";
-}
-_23=$(_23);
-$A(_23.childNodes).each(function(_25){
-if(_25.nodeType==3){
-_25.nodeValue.toArray().each(function(_26){
-_23.insertBefore(Builder.node("span",{style:_24},_26==" "?String.fromCharCode(160):_26),_25);
-});
-Element.remove(_25);
}
-});
-},multiple:function(_27,_28){
-var _29;
-if(((typeof _27=="object")||(typeof _27=="function"))&&(_27.length)){
-_29=_27;
-}else{
-_29=$(_27).childNodes;
-}
-var _30=Object.extend({speed:0.1,delay:0},arguments[2]||{});
-var _31=_30.delay;
-$A(_29).each(function(_27,_32){
-new _28(_27,Object.extend(_30,{delay:_32*_30.speed+_31}));
-});
-},PAIRS:{"slide":["SlideDown","SlideUp"],"blind":["BlindDown","BlindUp"],"appear":["Appear","Fade"]},toggle:function(_33,_34){
-_33=$(_33);
-_34=(_34||"appear").toLowerCase();
-var _35=Object.extend({queue:{position:"end",scope:(_33.id||"global")}},arguments[2]||{});
-Effect[Element.visible(_33)?Effect.PAIRS[_34][1]:Effect.PAIRS[_34][0]](_33,_35);
-}};
-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(_37){
-this.effects._each(_37);
-},add:function(_38){
-var _39=new Date().getTime();
-var _40=(typeof _38.options.queue=="string")?_38.options.queue:_38.options.queue.position;
-switch(_40){
-case "front":
-this.effects.findAll(function(e){
-return e.state=="idle";
-}).each(function(e){
-e.startOn+=_38.finishOn;
-e.finishOn+=_38.finishOn;
+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":
-_39=this.effects.pluck("finishOn").max()||_39;
+case 'end':
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
break;
}
-_38.startOn+=_39;
-_38.finishOn+=_39;
-this.effects.push(_38);
-if(!this.interval){
-this.interval=setInterval(this.loop.bind(this),40);
+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);
}
-},remove:function(_42){
-this.effects=this.effects.reject(function(e){
-return e==_42;
});
-if(this.effects.length==0){
-clearInterval(this.interval);
-this.interval=null;
-}
-},loop:function(){
-var _43=new Date().getTime();
-this.effects.invoke("loop",_43);
-}});
-Effect.Queues={instances:$H(),get:function(_44){
-if(typeof _44!="string"){
-return _44;
-}
-if(!this.instances[_44]){
-this.instances[_44]=new Effect.ScopedQueue();
-}
-return this.instances[_44];
-}};
-Effect.Queue=Effect.Queues.get("global");
-Effect.DefaultOptions={transition:Effect.Transitions.sinoidal,duration:1,fps:25,sync:false,from:0,to:1,delay:0,queue:"parallel"};
-Effect.Base=function(){
-};
-Effect.Base.prototype={position:null,start:function(_45){
-this.options=Object.extend(Object.extend({},Effect.DefaultOptions),_45||{});
-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(_46){
-if(_46>=this.startOn){
-if(_46>=this.finishOn){
-this.render(1);
+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");
+this.event('beforeFinish');
+if(this.finish) this.finish();
+this.event('afterFinish');
return;
}
-var pos=(_46-this.startOn)/(this.finishOn-this.startOn);
-var _47=Math.round(pos*this.options.fps*this.options.duration);
-if(_47>this.currentFrame){
+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=_47;
-}
-}
-},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.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');
+});
}
-this.state="finished";
-},event:function(_48){
-if(this.options[_48+"Internal"]){
-this.options[_48+"Internal"](this);
+});
+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);
}
-if(this.options[_48]){
-this.options[_48](this);
+});
+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'
+});
}
-},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(_49){
-this.effects=_49||[];
-this.start(arguments[1]);
-},update:function(_50){
-this.effects.invoke("render",_50);
-},finish:function(_51){
-this.effects.each(function(_52){
-_52.render(1);
-_52.cancel();
-_52.event("beforeFinish");
-if(_52.finish){
-_52.finish(_51);
-}
-_52.event("afterFinish");
});
-}});
-Effect.Opacity=Class.create();
-Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{initialize:function(_53){
-this.element=$(_53);
-if(/MSIE/.test(navigator.userAgent)&&(!this.element.hasLayout)){
-Element.setStyle(this.element,{zoom:1});
-}
-var _54=Object.extend({from:Element.getOpacity(this.element)||0,to:1},arguments[1]||{});
-this.start(_54);
-},update:function(_55){
-Element.setOpacity(this.element,_55);
-}});
-Effect.Move=Class.create();
-Object.extend(Object.extend(Effect.Move.prototype,Effect.Base.prototype),{initialize:function(_56){
-this.element=$(_56);
-var _57=Object.extend({x:0,y:0,mode:"relative"},arguments[1]||{});
-this.start(_57);
-},setup:function(){
-Element.makePositioned(this.element);
-this.originalLeft=parseFloat(Element.getStyle(this.element,"left")||"0");
-this.originalTop=parseFloat(Element.getStyle(this.element,"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(_58){
-Element.setStyle(this.element,{left:this.options.x*_58+this.originalLeft+"px",top:this.options.y*_58+this.originalTop+"px"});
-}});
-Effect.MoveBy=function(_59,_60,_61){
-return new Effect.Move(_59,Object.extend({x:_61,y:_60},arguments[3]||{}));
-};
-Effect.Scale=Class.create();
-Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{initialize:function(_62,_63){
-this.element=$(_62);
-var _64=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:"box",scaleFrom:100,scaleTo:_63},arguments[2]||{});
-this.start(_64);
-},setup:function(){
-this.restoreAfterFinish=this.options.restoreAfterFinish||false;
-this.elementPositioning=Element.getStyle(this.element,"position");
-this.originalStyle={};
-["top","left","width","height","fontSize"].each(function(k){
-this.originalStyle[k]=this.element.style[k];
+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 _66=Element.getStyle(this.element,"font-size")||"100%";
-["em","px","%"].each(function(_67){
-if(_66.indexOf(_67)>0){
-this.fontSize=parseFloat(_66);
-this.fontSizeType=_67;
+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(_68){
-var _69=(this.options.scaleFrom/100)+(this.factor*_68);
-if(this.options.scaleContent&&this.fontSize){
-Element.setStyle(this.element,{fontSize:this.fontSize*_69+this.fontSizeType});
-}
-this.setDimensions(this.dims[0]*_69,this.dims[1]*_69);
-},finish:function(_70){
-if(this.restoreAfterFinish){
-Element.setStyle(this.element,this.originalStyle);
-}
-},setDimensions:function(_71,_72){
-var d={};
-if(this.options.scaleX){
-d.width=_72+"px";
-}
-if(this.options.scaleY){
-d.height=_71+"px";
+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);
}
-if(this.options.scaleFromCenter){
-var _74=(_71-this.dims[0])/2;
-var _75=(_72-this.dims[1])/2;
-if(this.elementPositioning=="absolute"){
-if(this.options.scaleY){
-d.top=this.originalTop-_74+"px";
-}
-if(this.options.scaleX){
-d.left=this.originalLeft-_75+"px";
-}
-}else{
-if(this.options.scaleY){
-d.top=-_74+"px";
-}
-if(this.options.scaleX){
-d.left=-_75+"px";
-}
-}
-}
-Element.setStyle(this.element,d);
-}});
-Effect.Highlight=Class.create();
-Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{initialize:function(_76){
-this.element=$(_76);
-var _77=Object.extend({startcolor:"#ffff99"},arguments[1]||{});
-this.start(_77);
-},setup:function(){
-if(Element.getStyle(this.element,"display")=="none"){
-this.cancel();
-return;
-}
-this.oldStyle={backgroundImage:Element.getStyle(this.element,"background-image")};
-Element.setStyle(this.element,{backgroundImage:"none"});
-if(!this.options.endcolor){
-this.options.endcolor=Element.getStyle(this.element,"background-color").parseColor("#ffffff");
-}
-if(!this.options.restorecolor){
-this.options.restorecolor=Element.getStyle(this.element,"background-color");
+});
+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
+}));
}
-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(_78){
-Element.setStyle(this.element,{backgroundColor:$R(0,2).inject("#",function(m,v,i){
-return m+(Math.round(this._base[i]+(this._delta[i]*_78)).toColorPart());
-}.bind(this))});
-},finish:function(){
-Element.setStyle(this.element,Object.extend(this.oldStyle,{backgroundColor:this.options.restorecolor}));
-}});
-Effect.ScrollTo=Class.create();
-Object.extend(Object.extend(Effect.ScrollTo.prototype,Effect.Base.prototype),{initialize:function(_81){
-this.element=$(_81);
-this.start(arguments[1]||{});
-},setup:function(){
+});
+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 _82=Position.cumulativeOffset(this.element);
-if(this.options.offset){
-_82[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=(_82[1]>max?max:_82[1])-this.scrollStart;
-},update:function(_84){
+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+(_84*this.delta));
-}});
-Effect.Fade=function(_85){
-var _86=Element.getInlineOpacity(_85);
-var _87=Object.extend({from:Element.getOpacity(_85)||1,to:0,afterFinishInternal:function(_88){
-with(Element){
-if(_88.options.to!=0){
-return;
+window.scrollTo(Position.deltaX,
+this.scrollStart + (position*this.delta));
}
-hide(_88.element);
-setStyle(_88.element,{opacity:_86});
+});
+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});
+}
+})
}
-}},arguments[1]||{});
-return new Effect.Opacity(_85,_87);
-};
-Effect.Appear=function(_89){
-var _90=Object.extend({from:(Element.getStyle(_89,"display")=="none"?0:Element.getOpacity(_89)||0),to:1,beforeSetup:function(_91){
-with(Element){
-setOpacity(_91.element,_91.options.from);
-show(_91.element);
-}
-}},arguments[1]||{});
-return new Effect.Opacity(_89,_90);
-};
-Effect.Puff=function(_92){
-_92=$(_92);
-var _93={opacity:Element.getInlineOpacity(_92),position:Element.getStyle(_92,"position")};
-return new Effect.Parallel([new Effect.Scale(_92,200,{sync:true,scaleFromCenter:true,scaleContent:true,restoreAfterFinish:true}),new Effect.Opacity(_92,{sync:true,to:0})],Object.extend({duration:1,beforeSetupInternal:function(_94){
-with(Element){
-setStyle(_94.effects[0].element,{position:"absolute"});
-}
-},afterFinishInternal:function(_95){
-with(Element){
-hide(_95.effects[0].element);
-setStyle(_95.effects[0].element,_93);
-}
-}},arguments[1]||{}));
-};
-Effect.BlindUp=function(_96){
-_96=$(_96);
-Element.makeClipping(_96);
-return new Effect.Scale(_96,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(_97){
-with(Element){
-[hide,undoClipping].call(_97.element);
-}
-}},arguments[1]||{}));
-};
-Effect.BlindDown=function(_98){
-_98=$(_98);
-var _99=Element.getStyle(_98,"height");
-var _100=Element.getDimensions(_98);
-return new Effect.Scale(_98,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_100.height,originalWidth:_100.width},restoreAfterFinish:true,afterSetup:function(_101){
-with(Element){
-makeClipping(_101.element);
-setStyle(_101.element,{height:"0px"});
-show(_101.element);
-}
-},afterFinishInternal:function(_102){
-with(Element){
-undoClipping(_102.element);
-setStyle(_102.element,{height:_99});
-}
-}},arguments[1]||{}));
-};
-Effect.SwitchOff=function(_103){
-_103=$(_103);
-var _104=Element.getInlineOpacity(_103);
-return new Effect.Appear(_103,{duration:0.4,from:0,transition:Effect.Transitions.flicker,afterFinishInternal:function(_105){
-new Effect.Scale(_105.element,1,{duration:0.3,scaleFromCenter:true,scaleX:false,scaleContent:false,restoreAfterFinish:true,beforeSetup:function(_105){
-with(Element){
-[makePositioned,makeClipping].call(_105.element);
-}
-},afterFinishInternal:function(_106){
-with(Element){
-[hide,undoClipping,undoPositioned].call(_106.element);
-setStyle(_106.element,{opacity:_104});
-}
-}});
-}});
-};
-Effect.DropOut=function(_107){
-_107=$(_107);
-var _108={top:Element.getStyle(_107,"top"),left:Element.getStyle(_107,"left"),opacity:Element.getInlineOpacity(_107)};
-return new Effect.Parallel([new Effect.Move(_107,{x:0,y:100,sync:true}),new Effect.Opacity(_107,{sync:true,to:0})],Object.extend({duration:0.5,beforeSetup:function(_109){
-with(Element){
-makePositioned(_109.effects[0].element);
-}
-},afterFinishInternal:function(_110){
-with(Element){
-[hide,undoPositioned].call(_110.effects[0].element);
-setStyle(_110.effects[0].element,_108);
-}
-}},arguments[1]||{}));
-};
-Effect.Shake=function(_111){
-_111=$(_111);
-var _112={top:Element.getStyle(_111,"top"),left:Element.getStyle(_111,"left")};
-return new Effect.Move(_111,{x:20,y:0,duration:0.05,afterFinishInternal:function(_113){
-new Effect.Move(_113.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_113){
-new Effect.Move(_113.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_113){
-new Effect.Move(_113.element,{x:-40,y:0,duration:0.1,afterFinishInternal:function(_113){
-new Effect.Move(_113.element,{x:40,y:0,duration:0.1,afterFinishInternal:function(_113){
-new Effect.Move(_113.element,{x:-20,y:0,duration:0.05,afterFinishInternal:function(_113){
-with(Element){
-undoPositioned(_113.element);
-setStyle(_113.element,_112);
-}
-}});
-}});
-}});
-}});
-}});
-}});
-};
-Effect.SlideDown=function(_114){
-_114=$(_114);
-Element.cleanWhitespace(_114);
-var _115=Element.getStyle(_114.firstChild,"bottom");
-var _116=Element.getDimensions(_114);
-return new Effect.Scale(_114,100,Object.extend({scaleContent:false,scaleX:false,scaleFrom:0,scaleMode:{originalHeight:_116.height,originalWidth:_116.width},restoreAfterFinish:true,afterSetup:function(_117){
-with(Element){
-makePositioned(_117.element);
-makePositioned(_117.element.firstChild);
-if(window.opera){
-setStyle(_117.element,{top:""});
-}
-makeClipping(_117.element);
-setStyle(_117.element,{height:"0px"});
-show(_114);
-}
-},afterUpdateInternal:function(_118){
-with(Element){
-setStyle(_118.element.firstChild,{bottom:(_118.dims[0]-_118.element.clientHeight)+"px"});
-}
-},afterFinishInternal:function(_119){
-with(Element){
-undoClipping(_119.element);
-undoPositioned(_119.element.firstChild);
-undoPositioned(_119.element);
-setStyle(_119.element.firstChild,{bottom:_115});
-}
-}},arguments[1]||{}));
-};
-Effect.SlideUp=function(_120){
-_120=$(_120);
-Element.cleanWhitespace(_120);
-var _121=Element.getStyle(_120.firstChild,"bottom");
-return new Effect.Scale(_120,0,Object.extend({scaleContent:false,scaleX:false,scaleMode:"box",scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(_122){
-with(Element){
-makePositioned(_122.element);
-makePositioned(_122.element.firstChild);
-if(window.opera){
-setStyle(_122.element,{top:""});
-}
-makeClipping(_122.element);
-show(_120);
-}
-},afterUpdateInternal:function(_123){
-with(Element){
-setStyle(_123.element.firstChild,{bottom:(_123.dims[0]-_123.element.clientHeight)+"px"});
-}
-},afterFinishInternal:function(_124){
-with(Element){
-[hide,undoClipping].call(_124.element);
-undoPositioned(_124.element.firstChild);
-undoPositioned(_124.element);
-setStyle(_124.element.firstChild,{bottom:_121});
-}
-}},arguments[1]||{}));
-};
-Effect.Squish=function(_125){
-return new Effect.Scale(_125,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(_126){
-with(Element){
-makeClipping(_126.element);
+});
}
-},afterFinishInternal:function(_127){
-with(Element){
-hide(_127.element);
-undoClipping(_127.element);
+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(_128){
-_128=$(_128);
-var _129=Object.extend({direction:"center",moveTransistion:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.full},arguments[1]||{});
-var _130={top:_128.style.top,left:_128.style.left,height:_128.style.height,width:_128.style.width,opacity:Element.getInlineOpacity(_128)};
-var dims=Element.getDimensions(_128);
-var _132,initialMoveY;
-var _133,moveY;
-switch(_129.direction){
-case "top-left":
-_132=initialMoveY=_133=moveY=0;
+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":
-_132=dims.width;
-initialMoveY=moveY=0;
-_133=-dims.width;
+case 'top-right':
+initialMoveX = dims.width;
+initialMoveY = moveY = 0;
+moveX = -dims.width;
break;
-case "bottom-left":
-_132=_133=0;
-initialMoveY=dims.height;
-moveY=-dims.height;
+case 'bottom-left':
+initialMoveX = moveX = 0;
+initialMoveY = dims.height;
+moveY = -dims.height;
break;
-case "bottom-right":
-_132=dims.width;
-initialMoveY=dims.height;
-_133=-dims.width;
-moveY=-dims.height;
+case 'bottom-right':
+initialMoveX = dims.width;
+initialMoveY = dims.height;
+moveX = -dims.width;
+moveY = -dims.height;
break;
-case "center":
-_132=dims.width/2;
-initialMoveY=dims.height/2;
-_133=-dims.width/2;
-moveY=-dims.height/2;
+case 'center':
+initialMoveX = dims.width / 2;
+initialMoveY = dims.height / 2;
+moveX = -dims.width / 2;
+moveY = -dims.height / 2;
break;
}
-return new Effect.Move(_128,{x:_132,y:initialMoveY,duration:0.01,beforeSetup:function(_134){
-with(Element){
-hide(_134.element);
-makeClipping(_134.element);
-makePositioned(_134.element);
-}
-},afterFinishInternal:function(_135){
-new Effect.Parallel([new Effect.Opacity(_135.element,{sync:true,to:1,from:0,transition:_129.opacityTransition}),new Effect.Move(_135.element,{x:_133,y:moveY,sync:true,transition:_129.moveTransition}),new Effect.Scale(_135.element,100,{scaleMode:{originalHeight:dims.height,originalWidth:dims.width},sync:true,scaleFrom:window.opera?1:0,transition:_129.scaleTransition,restoreAfterFinish:true})],Object.extend({beforeSetup:function(_135){
-with(Element){
-setStyle(_135.effects[0].element,{height:"0px"});
-show(_135.effects[0].element);
-}
-},afterFinishInternal:function(_136){
-with(Element){
-[undoClipping,undoPositioned].call(_136.effects[0].element);
-setStyle(_136.effects[0].element,_130);
-}
-}},_129));
-}});
-};
-Effect.Shrink=function(_137){
-_137=$(_137);
-var _138=Object.extend({direction:"center",moveTransistion:Effect.Transitions.sinoidal,scaleTransition:Effect.Transitions.sinoidal,opacityTransition:Effect.Transitions.none},arguments[1]||{});
-var _139={top:_137.style.top,left:_137.style.left,height:_137.style.height,width:_137.style.width,opacity:Element.getInlineOpacity(_137)};
-var dims=Element.getDimensions(_137);
-var _140,moveY;
-switch(_138.direction){
-case "top-left":
-_140=moveY=0;
+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":
-_140=dims.width;
-moveY=0;
+case 'top-right':
+moveX = dims.width;
+moveY = 0;
break;
-case "bottom-left":
-_140=0;
-moveY=dims.height;
+case 'bottom-left':
+moveX = 0;
+moveY = dims.height;
break;
-case "bottom-right":
-_140=dims.width;
-moveY=dims.height;
+case 'bottom-right':
+moveX = dims.width;
+moveY = dims.height;
break;
-case "center":
-_140=dims.width/2;
-moveY=dims.height/2;
+case 'center':
+moveX = dims.width / 2;
+moveY = dims.height / 2;
break;
}
-return new Effect.Parallel([new Effect.Opacity(_137,{sync:true,to:0,from:1,transition:_138.opacityTransition}),new Effect.Scale(_137,window.opera?1:0,{sync:true,transition:_138.scaleTransition,restoreAfterFinish:true}),new Effect.Move(_137,{x:_140,y:moveY,sync:true,transition:_138.moveTransition})],Object.extend({beforeStartInternal:function(_141){
-with(Element){
-[makePositioned,makeClipping].call(_141.effects[0].element);
-}
-},afterFinishInternal:function(_142){
-with(Element){
-[hide,undoClipping,undoPositioned].call(_142.effects[0].element);
-setStyle(_142.effects[0].element,_139);
-}
-}},_138));
-};
-Effect.Pulsate=function(_143){
-_143=$(_143);
-var _144=arguments[1]||{};
-var _145=Element.getInlineOpacity(_143);
-var _146=_144.transition||Effect.Transitions.sinoidal;
-var _147=function(pos){
-return _146(1-Effect.Transitions.pulse(pos));
-};
-_147.bind(_146);
-return new Effect.Opacity(_143,Object.extend(Object.extend({duration:3,from:0,afterFinishInternal:function(_148){
-Element.setStyle(_148.element,{opacity:_145});
-}},_144),{transition:_147}));
-};
-Effect.Fold=function(_149){
-_149=$(_149);
-var _150={top:_149.style.top,left:_149.style.left,width:_149.style.width,height:_149.style.height};
-Element.makeClipping(_149);
-return new Effect.Scale(_149,5,Object.extend({scaleContent:false,scaleX:false,afterFinishInternal:function(_151){
-new Effect.Scale(_149,1,{scaleContent:false,scaleY:false,afterFinishInternal:function(_151){
-with(Element){
-[hide,undoClipping].call(_151.element);
-setStyle(_151.element,_150);
-}
-}});
-}},arguments[1]||{}));
-};
-
+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();
diff --git a/framework/Web/Javascripts/js/logger.js b/framework/Web/Javascripts/js/logger.js
index afb4fd3b..924f6323 100644
--- a/framework/Web/Javascripts/js/logger.js
+++ b/framework/Web/Javascripts/js/logger.js
@@ -1,514 +1,539 @@
-CustomEvent=Class.create();
-CustomEvent.prototype={initialize:function(){
-this.listeners=[];
-},addListener:function(_1){
-this.listeners.push(_1);
-},removeListener:function(_2){
-var _3=this._findListenerIndexes(_2);
-for(var i=0;i<_3.length;i++){
-this.listeners.splice(_3[i],1);
-}
-},dispatch:function(_5){
-for(var i=0;i<this.listeners.length;i++){
-try{
-this.listeners[i](_5);
-}
-catch(e){
-alert("Could not run the listener "+this.listeners[i]+". "+e);
-}
-}
-},_findListenerIndexes:function(_6){
-var _7=[];
-for(var i=0;i<this.listeners.length;i++){
-if(this.listeners[i]==_6){
-_7.push(i);
-}
-}
-return _7;
-}};
-var Cookie={set:function(_8,_9,_10,_11){
-var _12=escape(_8)+"="+escape(_9);
-if(_10){
-var _13=new Date();
-_13.setDate(_13.getDate()+_10);
-_12+="; expires="+_13.toGMTString();
-}
-if(_11){
-_12+=";path="+_11;
-}
-document.cookie=_12;
-if(_9&&(_10==undefined||_10>0)&&!this.get(_8)){
-Logger.error("Cookie ("+_8+") was not set correctly... The value was "+_9.toString().length+" charachters long (This may be over the cookie limit)");
-}
-},get:function(_14){
-var _15="(^|;)\\s*"+escape(_14)+"=([^;]+)";
-var m=document.cookie.match(_15);
-if(m&&m[2]){
-return unescape(m[2]);
-}else{
-return null;
-}
-},getAll:function(){
-var _17=document.cookie.split(";");
-var _18=[];
-for(var i=0;i<_17.length;i++){
-try{
-var _19=unescape(_17[i].match(/^\s*([^=]+)/m)[1]);
-var _20=unescape(_17[i].match(/=(.*$)/m)[1]);
-}
-catch(e){
-continue;
-}
-_18.push({name:_19,value:_20});
-if(_18[_19]!=undefined){
-Logger.waring("Trying to retrieve cookie named("+_19+"). There appears to be another property with this name though.");
-}
-_18[_19]=_20;
-}
-return _18;
-},clear:function(_21){
-this.set(_21,"",-1);
-},clearAll:function(){
-var _22=this.getAll();
-for(var i=0;i<_22.length;i++){
-this.clear(_22[i].name);
-}
-}};
-Logger={logEntries:[],onupdate:new CustomEvent(),onclear:new CustomEvent(),log:function(_23,tag){
-var _25=new LogEntry(_23,tag||"info");
-this.logEntries.push(_25);
-this.onupdate.dispatch(_25);
-},info:function(_26){
-this.log(_26,"info");
-},debug:function(_27){
-this.log(_27,"debug");
-},warn:function(_28){
-this.log(_28,"warning");
-},error:function(_29,_30){
-this.log(_29+": \n"+_30,"error");
-},clear:function(){
-this.logEntries=[];
-this.onclear.dispatch();
-}};
-LogEntry=Class.create();
-LogEntry.prototype={initialize:function(_31,tag){
-this.message=_31;
-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>";
-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.tagFilterContainerElement.appendChild(document.createTextNode("Log Filter"));
-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.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.logElement.appendChild(this.inputContainerElement);
-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.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,_34){
-Logger.error("Error in ("+(url||location)+") on line "+_34+"",msg);
-});
-var _35=document.createElement("span");
-_35.innerHTML="<button style=\"position:absolute;top:-100px\" onclick=\"javascript:logConsole.toggle()\" accesskey=\"d\"></button>";
-document.body.appendChild(_35);
-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(_36,_37){
-var _38=(this.outputElement.scrollTop+(2*this.outputElement.clientHeight))>=this.outputElement.scrollHeight;
-this.outputCount++;
-_37=(_37?_37+=";":"");
-_37+="padding:1px;margin:0 0 5px 0";
-if(this.outputCount%2==0){
-_37+=";background-color:#101010";
-}
-_36=_36||"undefined";
-_36=_36.toString().escapeHTML();
-this.outputElement.innerHTML+="<pre style='"+_37+"'>"+_36+"</pre>";
-if(_38){
-this.outputElement.scrollTop=this.outputElement.scrollHeight;
-}
-},updateTags:function(){
-var _39=this.tagFilterElement.value;
-if(this.tagPattern==_39){
-return;
-}
-try{
-new RegExp(_39);
-}
-catch(e){
-return;
-}
-this.tagPattern=_39;
-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 _40=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop;
-var _41=self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;
-this.logElement.style.top=(_40+_41-Element.getHeight(this.logElement))+"px";
-},logUpdate:function(_42){
-if(_42.tag.search(new RegExp(this.tagPattern,"igm"))==-1){
-return;
-}
-var _43="";
-if(_42.tag.search(/error/)!=-1){
-_43+="color:red";
-}else{
-if(_42.tag.search(/warning/)!=-1){
-_43+="color:orange";
-}else{
-if(_42.tag.search(/debug/)!=-1){
-_43+="color:green";
-}else{
-if(_42.tag.search(/info/)!=-1){
-_43+="color:white";
-}else{
-_43+="color:yellow";
-}
-}
-}
-}
-this.output(_42.message,_43);
-},clear:function(e){
-this.outputElement.innerHTML="";
-},handleInput:function(e){
-if(e.keyCode==Event.KEY_RETURN){
-var _45=this.inputElement.value;
-switch(_45){
+
+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')
+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>'
+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.tagFilterContainerElement.appendChild(document.createTextNode("Log Filter"))
+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.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.logElement.appendChild(this.inputContainerElement)
+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.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>'
+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
+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;
+Logger.clear()
+break
default:
-var _46="";
-try{
-_46=eval(this.inputElement.value);
+var consoleOutput = ""
+try {
+consoleOutput = eval(this.inputElement.value)
}
-catch(e){
-Logger.error("Problem parsing input <"+_45+">",e);
-break;
+catch (e) {
+Logger.error("Problem parsing input <" + command + ">", e)
+break
}
-Logger.log(_46);
-break;
+Logger.log(consoleOutput)
+break
}
-if(this.inputElement.value!=""&&this.inputElement.value!=this.commandHistory[0]){
-this.commandHistory.unshift(this.inputElement.value);
+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;
+this.commandIndex = 0
+this.inputElement.value = ""
}
-}else{
-if(e.keyCode==Event.KEY_DOWN&&this.commandHistory.length>0){
-if(this.commandIndex>0){
-this.commandIndex-=1;
+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
}
-this.inputElement.value=this.commandHistory[this.commandIndex];
-}else{
-this.commandIndex=0;
+}
+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 _48=typeof (o);
-if(_48=="undefined"){
+Event.OnLoad(function() { logConsole = new LogConsole()});
+function inspect(o)
+{
+var objtype = typeof(o);
+if (objtype == "undefined") {
return "undefined";
-}else{
-if(_48=="number"||_48=="boolean"){
-return o+"";
-}else{
-if(o===null){
+} else if (objtype == "number" || objtype == "boolean") {
+return o + "";
+} else if (o === null) {
return "null";
}
+try {
+var ostring = (o + "");
+} catch (e) {
+return "[" + typeof(o) + "]";
}
-}
-try{
-var _49=(o+"");
-}
-catch(e){
-return "["+typeof (o)+"]";
-}
-if(typeof (o)=="function"){
-o=_49.replace(/^\s+/,"");
-var idx=o.indexOf("{");
-if(idx!=-1){
-o=o.substr(0,idx)+"{...}";
+if (typeof(o) == "function")
+{
+o = ostring.replace(/^\s+/, "");
+var idx = o.indexOf("{");
+if (idx != -1) {
+o = o.substr(0, idx) + "{...}";
}
return o;
-}
-var _51=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");
+ }
+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(_48=="string"){
-return _51(o);
+if (objtype == "string") {
+return reprString(o);
}
-var me=arguments.callee;
-var _53;
-if(typeof (o.__json__)=="function"){
-_53=o.__json__();
-if(o!==_53){
-return me(_53);
+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"){
-_53=o.json();
-if(o!==_53){
-return me(_53);
+if (typeof(o.json) == "function") {
+newObj = o.json();
+if (o !== newObj) {
+return me(newObj);
}
}
-if(_48!="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";
+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 _57;
-if(typeof (k)=="number"){
-_57="\""+k+"\"";
-}else{
-if(typeof (k)=="string"){
-_57=_51(k);
-}else{
-continue;
-}
+return "[" + res.join(", ") + "]";
}
-val=me(o[k]);
-if(typeof (val)!="string"){
+res = [];
+for (var k in o) {
+var useKey;
+if (typeof(k) == "number") {
+useKey = '"' + k + '"';
+} else if (typeof(k) == "string") {
+useKey = reprString(k);
+} else {
continue;
}
-res.push(_57+":"+val);
-}
-return "{"+res.join(", ")+"}";
-}
-Array.prototype.contains=function(_58){
-for(var i=0;i<this.length;i++){
-if(_58==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;
+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 _61;
-if(typeof obj=="string"){
-_61=obj;
-obj=eval(obj);
-}
-win=typeof obj=="undefined"?window:obj;
-this.displaying=_61?_61: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()]){
+},
+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] = new Array();
}
this.nameList[t].push(js);
-this.objs[t][js]=this.format(win[js]+"");
+this.objs[t][js] = this.format(win[js]+"");
}
+} catch(err) { }
}
-catch(err){
-}
-}
-for(i=0;i<this.types.length;i++){
+for(i=0;i<this.types.length;i++)
this.nameList[this.types[i]].sort();
-}
-},show:function(_62){
-this.d.getElementById(_62).style.display=this.hidden[_62]?"none":"block";
-this.hidden[_62]=this.hidden[_62]?0:1;
-},changeSpan:function(_63){
-if(this.d.getElementById(_63).innerHTML.indexOf("+")>-1){
-this.d.getElementById(_63).innerHTML="[-]";
-}else{
-this.d.getElementById(_63).innerHTML="[+]";
-}
-},buildInspectionLevel:function(){
-var _64=this.displaying;
-var _65=_64.split(".");
-var _66=["<a href=\"javascript:var_dump()\">[object Window]</a>"];
-var _67="";
-if(_64.indexOf("[object ")>=0){
-return _66.join(".");
-}
-for(var i=0;i<_65.length;i++){
-_67+=(_67.length?".":"")+_65[i];
-_66[i+1]="<a href=\"javascript:var_dump('"+_67+"')\">"+_65[i]+"</a>";
-}
-return _66.join(".");
-},buildTree:function(){
-mHTML="<div>Inspecting "+this.buildInspectionLevel()+"</div>";
-mHTML+="<ul class=\"topLevel\">";
+},
+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 _68=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+"\">";
+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 _69=this.nameList[this.types[i]][e];
-var _70=this.objs[this.types[i]][_69];
-var _71="";
-if(_70.indexOf("[object ")>=0&&/^[a-zA-Z_]/.test(_69)){
-if(this.displaying.indexOf("[object ")<0){
-_71=" <a href=\"javascript:var_dump('"+this.displaying+"."+_69+"')\"><b>more</b></a>";
-}else{
-if(this.displaying.indexOf("[object Window]")>=0){
-_71=" <a href=\"javascript:var_dump('"+_69+"')\"><b>more</b></a>";
-}
-}
-}
-mHTML+="<li style=\"cursor:pointer;\" onclick=\"Prado.Inspector.show('mul"+_68+"');Prado.Inspector.changeSpan('sk"+_68+"')\"><span id=\"sk"+_68+"\">[+]</span>"+_69+"</li><ul id=\"mul"+_68+"\" style=\"display:none;\"><li style=\"list-style-type:none;\"><pre>"+_70+_71+"</pre></li></ul>";
-this.hidden["mul"+_68]=0;
-_68++;
+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){
+this.d.getElementById("so_mContainer").innerHTML =mHTML;
+},
+handleKeyEvent : function(e) {
keyCode=document.all?window.event.keyCode:e.keyCode;
-if(keyCode==27){
+if(keyCode==27) {
this.cleanUp();
}
-},cleanUp:function(){
-if(this.d.getElementById("so_mContainer")){
+},
+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.");
-}
+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);
-}
+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, <a target=\"_blank\" href=\"http://slayeroffice.com/?c=/content/tools/js_tree.html\">more info</a>.";
+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){
+},
+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;
-
+var print_r = inspect;
diff --git a/framework/Web/Javascripts/js/prado.js b/framework/Web/Javascripts/js/prado.js
index 794114d9..6737d4ce 100644
--- a/framework/Web/Javascripts/js/prado.js
+++ b/framework/Web/Javascripts/js/prado.js
@@ -1,2016 +1,2259 @@
-var Prototype={Version:"1.4.0",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(_2,_3){
-for(property in _3){
-_2[property]=_3[property];
+
+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;
}
-return _2;
-};
-Object.inspect=function(_4){
-try{
-if(_4==undefined){
-return "undefined";
}
-if(_4==null){
-return "null";
+Function.prototype.bind = function() {
+var __method = this, args = $A(arguments), object = args.shift();
+return function() {
+return __method.apply(object, args.concat($A(arguments)));
}
-return _4.inspect?_4.inspect():_4.toString();
}
-catch(e){
-if(e instanceof RangeError){
-return "...";
+Function.prototype.bindAsEventListener = function(object) {
+var __method = this;
+return function(event) {
+return __method.call(object, event || window.event);
}
-throw e;
}
-};
-Function.prototype.bind=function(){
-var _5=this,args=$A(arguments),object=args.shift();
-return function(){
-return _5.apply(object,args.concat($A(arguments)));
-};
-};
-Function.prototype.bindAsEventListener=function(_6){
-var _7=this;
-return function(_8){
-return _7.call(_6,_8||window.event);
-};
-};
-Object.extend(Number.prototype,{toColorPart:function(){
-var _9=this.toString(16);
-if(this<16){
-return "0"+_9;
-}
-return _9;
-},succ:function(){
-return this+1;
-},times:function(_10){
-$R(0,this,true).each(_10);
+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 _11;
-for(var i=0;i<arguments.length;i++){
-var _13=arguments[i];
-try{
-_11=_13();
+}
+});
+var Try = {
+these: function() {
+var returnValue;
+for (var i = 0; i < arguments.length; i++) {
+var lambda = arguments[i];
+try {
+returnValue = lambda();
break;
+} catch (e) {}
}
-catch(e){
+return returnValue;
}
}
-return _11;
-}};
-var PeriodicalExecuter=Class.create();
-PeriodicalExecuter.prototype={initialize:function(_14,_15){
-this.callback=_14;
-this.frequency=_15;
-this.currentlyExecuting=false;
+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 $(){
-var _16=new Array();
-for(var i=0;i<arguments.length;i++){
-var _17=arguments[i];
-if(typeof _17=="string"){
-_17=document.getElementById(_17);
-}
-if(arguments.length==1){
-return _17;
-}
-_16.push(_17);
-}
-return _16;
-}
-function isAlien(a){
-return isObject(a)&&typeof a.constructor!="function";
-}
-function isArray(a){
-return isObject(a)&&a.constructor==Array;
-}
-function isBoolean(a){
-return typeof a=="boolean";
-}
-function isFunction(a){
-return typeof a=="function";
-}
-function isNull(a){
-return typeof a=="object"&&!a;
-}
-function isNumber(a){
-return typeof a=="number"&&isFinite(a);
-}
-function isObject(a){
-return (a&&typeof a=="object")||isFunction(a);
-}
-function isRegexp(a){
-return a&&a.constructor==RegExp;
-}
-function isString(a){
-return typeof a=="string";
-}
-function isUndefined(a){
-return typeof a=="undefined";
-}
-function isEmpty(o){
-var i,v;
-if(isObject(o)){
-for(i in o){
-v=o[i];
-if(isUndefined(v)&&isFunction(v)){
-return false;
-}
-}
-}
-return true;
-}
-function undef(v){
-return isUndefined(v);
-}
-function isdef(v){
-return !isUndefined(v);
-}
-function isElement(o,_21){
-return o&&isObject(o)&&((!_21&&(o==window||o==document))||o.nodeType==1);
-}
-function isList(o){
-return o&&isObject(o)&&isArray(o);
-}
-function $(n,d){
-if(isElement(n)){
-return n;
-}
-if(isString(n)==false){
-return null;
-}
-var p,i,x;
-if(!d){
-d=document;
-}
-if((p=n.indexOf("?"))>0&&parent.frames.length){
-d=parent.frames[n.substring(p+1)].document;
-n=n.substring(0,p);
-}
-if(!(x=d[n])&&d.all){
-x=d.all[n];
-}
-for(i=0;!x&&i<d.forms.length;i++){
-x=d.forms[i][n];
-}
-for(i=0;!x&&d.layers&&i<d.layers.length;i++){
-x=DOM.find(n,d.layers[i].document);
-}
-if(!x&&d.getElementById){
-x=d.getElementById(n);
-}
-return x;
-}
-Function.prototype.bindEvent=function(){
-var _25=this,args=$A(arguments),object=args.shift();
-return function(_26){
-return _25.apply(object,[_26||window.event].concat(args));
-};
-};
-Object.extend(String.prototype,{stripTags:function(){
-return this.replace(/<\/?[^>]+>/gi,"");
-},stripScripts:function(){
-return this.replace(new RegExp(Prototype.ScriptFragment,"img"),"");
-},extractScripts:function(){
-var _27=new RegExp(Prototype.ScriptFragment,"img");
-var _28=new RegExp(Prototype.ScriptFragment,"im");
-return (this.match(_27)||[]).map(function(_29){
-return (_29.match(_28)||["",""])[1];
+},
+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);
});
-},evalScripts:function(){
-return this.extractScripts().map(eval);
-},escapeHTML:function(){
-var div=document.createElement("div");
-var _31=document.createTextNode(this);
-div.appendChild(_31);
+},
+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 _32=this.match(/^\??(.*)$/)[1].split("&");
-return _32.inject({},function(_33,_34){
-var _35=_34.split("=");
-_33[_35[0]]=_35[1];
-return _33;
+},
+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 _36=this.split("-");
-if(_36.length==1){
-return _36[0];
-}
-var _37=this.indexOf("-")==0?_36[0].charAt(0).toUpperCase()+_36[0].substring(1):_36[0];
-for(var i=1,len=_36.length;i<len;i++){
-var s=_36[i];
-_37+=s.charAt(0).toUpperCase()+s.substring(1);
-}
-return _37;
-},inspect:function(){
-return "'"+this.replace("\\","\\\\").replace("'","\\'")+"'";
-}});
-String.prototype.parseQuery=String.prototype.toQueryParams;
-Object.extend(String.prototype,{pad:function(_39,len,chr){
-if(!chr){
-chr=" ";
-}
-var s=this;
-var _42=_39.toLowerCase()=="left";
-while(s.length<len){
-s=_42?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 _43=this.split(/\./);
-var _44=window;
-_43.each(function(_45){
-if(_44[new String(_45)]){
-_44=_44[new String(_45)];
+},
+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, '\\\'') + "'";
}
});
-if(isFunction(_44)){
-return _44;
-}else{
-if(typeof Logger!="undefined"){
-Logger.error("Missing function",this);
+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();
+});
}
-return Prototype.emptyFunction;
}
-},toInteger:function(){
-var exp=/^\s*[-\+]?\d+\s*$/;
-if(this.match(exp)==null){
+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(_48){
-_48=_48||".";
-var exp=new RegExp("^\\s*([-\\+])?(\\d+)?(\\"+_48+"(\\d+))?\\s*$");
-var m=this.match(exp);
-if(m==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;
-}
-var _50=m[1]+(m[2].length>0?m[2]:"0")+"."+m[4];
-var num=parseFloat(_50);
-return (isNaN(num)?null:num);
-},toCurrency:function(_51,_52,_53){
-_51=_51||",";
-_53=_53||".";
-_52=typeof (_52)=="undefined"?2:_52;
-var exp=new RegExp("^\\s*([-\\+])?(((\\d+)\\"+_51+")*)(\\d+)"+((_52>0)?"(\\"+_53+"(\\d{1,"+_52+"}))?":"")+"\\s*$");
-var m=this.match(exp);
-if(m==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 _54=m[2]+m[5];
-var _55=m[1]+_54.replace(new RegExp("(\\"+_51+")","g"),"")+((_52>0)?"."+m[7]:"");
-var num=parseFloat(_55);
-return (isNaN(num)?null:num);
-},toDate:function(_56){
-return Date.SimpleParse(this,_56);
-}});
-var $break=new Object();
-var $continue=new Object();
-var Enumerable={each:function(_57){
-var _58=0;
-try{
-this._each(function(_59){
-try{
-_57(_59,_58++);
-}
-catch(e){
-if(e!=$continue){
-throw e;
-}
+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);
}
});
-}
-catch(e){
-if(e!=$break){
-throw e;
-}
-}
-},all:function(_60){
-var _61=true;
-this.each(function(_62,_63){
-_61=_61&&!!(_60||Prototype.K)(_62,_63);
-if(!_61){
-throw $break;
+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;
}
});
-return _61;
-},any:function(_64){
-var _65=true;
-this.each(function(_66,_67){
-if(_65=!!(_64||Prototype.K)(_66,_67)){
+} 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 _65;
-},collect:function(_68){
-var _69=[];
-this.each(function(_70,_71){
-_69.push(_68(_70,_71));
+return result;
+},
+collect: function(iterator) {
+var results = [];
+this.each(function(value, index) {
+results.push(iterator(value, index));
});
-return _69;
-},detect:function(_72){
-var _73;
-this.each(function(_74,_75){
-if(_72(_74,_75)){
-_73=_74;
+return results;
+},
+detect: function (iterator) {
+var result;
+this.each(function(value, index) {
+if (iterator(value, index)) {
+result = value;
throw $break;
}
});
-return _73;
-},findAll:function(_76){
-var _77=[];
-this.each(function(_78,_79){
-if(_76(_78,_79)){
-_77.push(_78);
-}
+return result;
+},
+findAll: function(iterator) {
+var results = [];
+this.each(function(value, index) {
+if (iterator(value, index))
+results.push(value);
});
-return _77;
-},grep:function(_80,_81){
-var _82=[];
-this.each(function(_83,_84){
-var _85=_83.toString();
-if(_85.match(_80)){
-_82.push((_81||Prototype.K)(_83,_84));
-}
-});
-return _82;
-},include:function(_86){
-var _87=false;
-this.each(function(_88){
-if(_88==_86){
-_87=true;
+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 _87;
-},inject:function(_89,_90){
-this.each(function(_91,_92){
-_89=_90(_89,_91,_92);
+return found;
+},
+inject: function(memo, iterator) {
+this.each(function(value, index) {
+memo = iterator(memo, value, index);
});
-return _89;
-},invoke:function(_93){
-var _94=$A(arguments).slice(1);
-return this.collect(function(_95){
-return _95[_93].apply(_95,_94);
+return memo;
+},
+invoke: function(method) {
+var args = $A(arguments).slice(1);
+return this.collect(function(value) {
+return value[method].apply(value, args);
});
-},max:function(_96){
-var _97;
-this.each(function(_98,_99){
-_98=(_96||Prototype.K)(_98,_99);
-if(_98>=(_97||_98)){
-_97=_98;
-}
+},
+max: function(iterator) {
+var result;
+this.each(function(value, index) {
+value = (iterator || Prototype.K)(value, index);
+if (result == undefined || value >= result)
+result = value;
});
-return _97;
-},min:function(_100){
-var _101;
-this.each(function(_102,_103){
-_102=(_100||Prototype.K)(_102,_103);
-if(_102<=(_101||_102)){
-_101=_102;
-}
+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 _101;
-},partition:function(_104){
-var _105=[],falses=[];
-this.each(function(_106,_107){
-((_104||Prototype.K)(_106,_107)?_105:falses).push(_106);
+return result;
+},
+partition: function(iterator) {
+var trues = [], falses = [];
+this.each(function(value, index) {
+((iterator || Prototype.K)(value, index) ?
+trues : falses).push(value);
});
-return [_105,falses];
-},pluck:function(_108){
-var _109=[];
-this.each(function(_110,_111){
-_109.push(_110[_108]);
+return [trues, falses];
+},
+pluck: function(property) {
+var results = [];
+this.each(function(value, index) {
+results.push(value[property]);
});
-return _109;
-},reject:function(_112){
-var _113=[];
-this.each(function(_114,_115){
-if(!_112(_114,_115)){
-_113.push(_114);
-}
+return results;
+},
+reject: function(iterator) {
+var results = [];
+this.each(function(value, index) {
+if (!iterator(value, index))
+results.push(value);
});
-return _113;
-},sortBy:function(_116){
-return this.collect(function(_117,_118){
-return {value:_117,criteria:_116(_117,_118)};
-}).sort(function(left,_120){
-var a=left.criteria,b=_120.criteria;
-return a<b?-1:a>b?1:0;
-}).pluck("value");
-},toArray:function(){
+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 _121=Prototype.K,args=$A(arguments);
-if(typeof args.last()=="function"){
-_121=args.pop();
-}
-var _122=[this].concat(args).map($A);
-return this.map(function(_123,_124){
-_121(_123=_122.pluck(_124));
-return _123;
+},
+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(_125){
-if(!_125){
-return [];
-}
-if(_125.toArray){
-return _125.toArray();
-}else{
-var _126=[];
-for(var i=0;i<_125.length;i++){
-_126.push(_125[i]);
-}
-return _126;
+},
+inspect: function() {
+return '#<Enumerable:' + this.toArray().inspect() + '>';
}
-};
-Object.extend(Array.prototype,Enumerable);
-Object.extend(Array.prototype,{_each:function(_127){
-for(var i=0;i<this.length;i++){
-_127(this[i]);
}
-},clear:function(){
-this.length=0;
+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(){
+},
+first: function() {
return this[0];
-},last:function(){
-return this[this.length-1];
-},compact:function(){
-return this.select(function(_128){
-return _128!=undefined||_128!=null;
+},
+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(_129,_130){
-return _129.concat(_130.constructor==Array?_130.flatten():[_130]);
+},
+flatten: function() {
+return this.inject([], function(array, value) {
+return array.concat(value && value.constructor == Array ?
+value.flatten() : [value]);
});
-},without:function(){
-var _131=$A(arguments);
-return this.select(function(_132){
-return !_131.include(_132);
+},
+without: function() {
+var values = $A(arguments);
+return this.select(function(value) {
+return !values.include(value);
});
-},indexOf:function(_133){
-for(var i=0;i<this.length;i++){
-if(this[i]==_133){
-return i;
-}
-}
+},
+indexOf: function(object) {
+for (var i = 0; i < this.length; i++)
+if (this[i] == object) return i;
return -1;
-},shift:function(){
-var _134=this[0];
-for(var i=0;i<this.length-1;i++){
-this[i]=this[i+1];
-}
-this.length--;
-return _134;
-},inspect:function(){
-return "["+this.map(Object.inspect).join(", ")+"]";
-}});
-var Hash={_each:function(_135){
-for(key in this){
-var _136=this[key];
-if(typeof _136=="function"){
-continue;
+},
+reverse: function(inline) {
+return (inline !== false ? this : this.toArray())._reverse();
+},
+inspect: function() {
+return '[' + this.map(Object.inspect).join(', ') + ']';
}
-var pair=[key,_136];
-pair.key=key;
-pair.value=_136;
-_135(pair);
-}
-},keys:function(){
-return this.pluck("key");
-},values:function(){
-return this.pluck("value");
-},merge:function(hash){
-return $H(hash).inject($H(this),function(_139,pair){
-_139[pair.key]=pair.value;
-return _139;
});
-},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(_140){
-var hash=Object.extend({},_140||{});
-Object.extend(hash,Enumerable);
-Object.extend(hash,Hash);
+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(_141,end,_143){
-this.start=_141;
-this.end=end;
-this.exclusive=_143;
-},_each:function(_144){
-var _145=this.start;
-do{
-_144(_145);
-_145=_145.succ();
-}while(this.include(_145));
-},include:function(_146){
-if(_146<this.start){
+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;
}
-if(this.exclusive){
-return _146<this.end;
-}
-return _146<=this.end;
-}});
-var $R=function(_147,end,_148){
-return new ObjectRange(_147,end,_148);
-};
-document.getElementsByClassName=function(_149,_150){
-var _151=($(_150)||document.body).getElementsByTagName("*");
-return $A(_151).inject([],function(_152,_153){
-if(_153.className.match(new RegExp("(^|\\s)"+_149+"(\\s|$)"))){
-_152.push(_153);
-}
-return _152;
});
-};
-if(!window.Element){
-var Element=new Object();
-}
-Object.extend(Element,{visible:function(_154){
-return $(_154).style.display!="none";
-},toggle:function(){
-for(var i=0;i<arguments.length;i++){
-var _155=$(arguments[i]);
-Element[Element.visible(_155)?"hide":"show"](_155);
-}
-},hide:function(){
-for(var i=0;i<arguments.length;i++){
-var _156=$(arguments[i]);
-_156.style.display="none";
-}
-},show:function(){
-for(var i=0;i<arguments.length;i++){
-var _157=$(arguments[i]);
-_157.style.display="";
-}
-},remove:function(_158){
-_158=$(_158);
-_158.parentNode.removeChild(_158);
-},update:function(_159,html){
-$(_159).innerHTML=html.stripScripts();
-setTimeout(function(){
-html.evalScripts();
-},10);
-},getHeight:function(_161){
-_161=$(_161);
-return _161.offsetHeight;
-},classNames:function(_162){
-return new Element.ClassNames(_162);
-},hasClassName:function(_163,_164){
-if(!(_163=$(_163))){
-return;
-}
-return Element.classNames(_163).include(_164);
-},addClassName:function(_165,_166){
-if(!(_165=$(_165))){
-return;
-}
-return Element.classNames(_165).add(_166);
-},removeClassName:function(_167,_168){
-if(!(_167=$(_167))){
-return;
+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;
+});
}
-return Element.classNames(_167).remove(_168);
-},cleanWhitespace:function(_169){
-_169=$(_169);
-for(var i=0;i<_169.childNodes.length;i++){
-var node=_169.childNodes[i];
-if(node.nodeType==3&&!/\S/.test(node.nodeValue)){
+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(_171){
-return $(_171).innerHTML.match(/^\s*$/);
-},scrollTo:function(_172){
-_172=$(_172);
-var x=_172.x?_172.x:_172.offsetLeft,y=_172.y?_172.y:_172.offsetTop;
-window.scrollTo(x,y);
-},getStyle:function(_173,_174){
-_173=$(_173);
-var _175=_173.style[_174.camelize()];
-if(!_175){
-if(document.defaultView&&document.defaultView.getComputedStyle){
-var css=document.defaultView.getComputedStyle(_173,null);
-_175=css?css.getPropertyValue(_174):null;
-}else{
-if(_173.currentStyle){
-_175=_173.currentStyle[_174.camelize()];
-}
-}
-}
-if(window.opera&&["left","top","right","bottom"].include(_174)){
-if(Element.getStyle(_173,"position")=="static"){
-_175="auto";
-}
-}
-return _175=="auto"?null:_175;
-},setStyle:function(_177,_178){
-_177=$(_177);
-for(name in _178){
-_177.style[name.camelize()]=_178[name];
-}
-},getDimensions:function(_179){
-_179=$(_179);
-if(Element.getStyle(_179,"display")!="none"){
-return {width:_179.offsetWidth,height:_179.offsetHeight};
-}
-var els=_179.style;
-var _181=els.visibility;
-var _182=els.position;
-els.visibility="hidden";
-els.position="absolute";
-els.display="";
-var _183=_179.clientWidth;
-var _184=_179.clientHeight;
-els.display="none";
-els.position=_182;
-els.visibility=_181;
-return {width:_183,height:_184};
-},makePositioned:function(_185){
-_185=$(_185);
-var pos=Element.getStyle(_185,"position");
-if(pos=="static"||!pos){
-_185._madePositioned=true;
-_185.style.position="relative";
-if(window.opera){
-_185.style.top=0;
-_185.style.left=0;
-}
-}
-},undoPositioned:function(_187){
-_187=$(_187);
-if(_187._madePositioned){
-_187._madePositioned=undefined;
-_187.style.position=_187.style.top=_187.style.left=_187.style.bottom=_187.style.right="";
-}
-},makeClipping:function(_188){
-_188=$(_188);
-if(_188._overflow){
-return;
-}
-_188._overflow=_188.style.overflow;
-if((Element.getStyle(_188,"overflow")||"visible")!="hidden"){
-_188.style.overflow="hidden";
-}
-},undoClipping:function(_189){
-_189=$(_189);
-if(_189._overflow){
-return;
-}
-_189.style.overflow=_189._overflow;
-_189._overflow=undefined;
-}});
-var Toggle=new Object();
-Toggle.display=Element.toggle;
-Abstract.Insertion=function(_190){
-this.adjacency=_190;
-};
-Abstract.Insertion.prototype={initialize:function(_191,_192){
-this.element=$(_191);
-this.content=_192.stripScripts();
-if(this.adjacency&&this.element.insertAdjacentHTML){
-try{
-this.element.insertAdjacentHTML(this.adjacency,this.content);
-}
-catch(e){
-if(this.element.tagName.toLowerCase()=="tbody"){
+},
+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{
+} else {
throw e;
}
}
-}else{
-this.range=this.element.ownerDocument.createRange();
-if(this.initializeRange){
-this.initializeRange();
-}
+} else {
+this.range = this.element.ownerDocument.createRange();
+if (this.initializeRange) this.initializeRange();
this.insertContent([this.range.createContextualFragment(this.content)]);
}
-setTimeout(function(){
-_192.evalScripts();
-},10);
-},contentFromAnonymousTable:function(){
-var div=document.createElement("div");
-div.innerHTML="<table><tbody>"+this.content+"</tbody></table>";
+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(){
+}
+}
+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(_193){
-_193.each((function(_194){
-this.element.parentNode.insertBefore(_194,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(){
+}
+});
+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(_195){
-_195.reverse(false).each((function(_196){
-this.element.insertBefore(_196,this.element.firstChild);
+},
+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(){
+}
+});
+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(_197){
-_197.each((function(_198){
-this.element.appendChild(_198);
+},
+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(){
+}
+});
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+initializeRange: function() {
this.range.setStartAfter(this.element);
-},insertContent:function(_199){
-_199.each((function(_200){
-this.element.parentNode.insertBefore(_200,this.element.nextSibling);
+},
+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(_201){
-this.element=$(_201);
-},_each:function(_202){
-this.element.className.split(/\s+/).select(function(name){
-return name.length>0;
-})._each(_202);
-},set:function(_204){
-this.element.className=_204;
-},add:function(_205){
-if(this.include(_205)){
-return;
-}
-this.set(this.toArray().concat(_205).join(" "));
-},remove:function(_206){
-if(!this.include(_206)){
-return;
-}
-this.set(this.select(function(_207){
-return _207!=_206;
-}).join(" "));
-},toString:function(){
-return this.toArray().join(" ");
-}};
-Object.extend(Element.ClassNames.prototype,Enumerable);
-Object.extend(Element,{condClassName:function(_208,_209,cond){
-(cond?Element.addClassName:Element.removeClassName)(_208,_209);
-}});
-var Field={clear:function(){
-for(var i=0;i<arguments.length;i++){
-$(arguments[i]).value="";
-}
-},focus:function(_211){
-$(_211).focus();
-},present:function(){
-for(var i=0;i<arguments.length;i++){
-if($(arguments[i]).value==""){
-return false;
-}
}
+});
+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(_212){
-$(_212).select();
-},activate:function(_213){
-_213=$(_213);
-_213.focus();
-if(_213.select){
-_213.select();
-}
-}};
-var Form={serialize:function(form){
-var _215=Form.getElements($(form));
-var _216=new Array();
-for(var i=0;i<_215.length;i++){
-var _217=Form.Element.serialize(_215[i]);
-if(_217){
-_216.push(_217);
-}
-}
-return _216.join("&");
-},getElements:function(form){
-form=$(form);
-var _218=new Array();
-for(tagName in Form.Element.Serializers){
-var _219=form.getElementsByTagName(tagName);
-for(var j=0;j<_219.length;j++){
-_218.push(_219[j]);
-}
-}
-return _218;
-},getInputs:function(form,_221,name){
-form=$(form);
-var _222=form.getElementsByTagName("input");
-if(!_221&&!name){
-return _222;
-}
-var _223=new Array();
-for(var i=0;i<_222.length;i++){
-var _224=_222[i];
-if((_221&&_224.type!=_221)||(name&&_224.name!=name)){
+},
+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;
-}
-_223.push(_224);
-}
-return _223;
-},disable:function(form){
-var _225=Form.getElements(form);
-for(var i=0;i<_225.length;i++){
-var _226=_225[i];
-_226.blur();
-_226.disabled="true";
-}
-},enable:function(form){
-var _227=Form.getElements(form);
-for(var i=0;i<_227.length;i++){
-var _228=_227[i];
-_228.disabled="";
-}
-},findFirstElement:function(form){
-return Form.getElements(form).find(function(_229){
-return _229.type!="hidden"&&!_229.disabled&&["input","select","textarea"].include(_229.tagName.toLowerCase());
+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){
+},
+focusFirstElement: function(form) {
Field.activate(Form.findFirstElement(form));
-},reset:function(form){
+},
+reset: function(form) {
$(form).reset();
-}};
-Form.Element={serialize:function(_230){
-_230=$(_230);
-var _231=_230.tagName.toLowerCase();
-var _232=Form.Element.Serializers[_231](_230);
-if(_232){
-var key=encodeURIComponent(_232[0]);
-if(key.length==0){
-return;
}
-if(_232[1].constructor!=Array){
-_232[1]=[_232[1]];
-}
-return _232[1].map(function(_234){
-return key+"="+encodeURIComponent(_234);
-}).join("&");
-}
-},getValue:function(_235){
-_235=$(_235);
-var _236=_235.tagName.toLowerCase();
-var _237=Form.Element.Serializers[_236](_235);
-if(_237){
-return _237[1];
-}
-}};
-Form.Element.Serializers={input:function(_238){
-switch(_238.type.toLowerCase()){
-case "submit":
-case "hidden":
-case "password":
-case "text":
-return Form.Element.Serializers.textarea(_238);
-case "checkbox":
-case "radio":
-return Form.Element.Serializers.inputSelector(_238);
+}
+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(_239){
-if(_239.checked){
-return [_239.name,_239.value];
-}
-},textarea:function(_240){
-return [_240.name,_240.value];
-},select:function(_241){
-return Form.Element.Serializers[_241.type=="select-one"?"selectOne":"selectMany"](_241);
-},selectOne:function(_242){
-var _243="",opt,index=_242.selectedIndex;
-if(index>=0){
-opt=_242.options[index];
-_243=opt.value;
-if(!_243&&!("value" in opt)){
-_243=opt.text;
-}
-}
-return [_242.name,_243];
-},selectMany:function(_244){
-var _245=new Array();
-for(var i=0;i<_244.length;i++){
-var opt=_244.options[i];
-if(opt.selected){
-var _247=opt.value;
-if(!_247&&!("value" in opt)){
-_247=opt.text;
-}
-_245.push(_247);
-}
-}
-return [_244.name,_245];
-}};
-var $F=Form.Element.getValue;
-Abstract.TimedObserver=function(){
-};
-Abstract.TimedObserver.prototype={initialize:function(_248,_249,_250){
-this.frequency=_249;
-this.element=$(_248);
-this.callback=_250;
-this.lastValue=this.getValue();
+},
+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 _251=this.getValue();
-if(this.lastValue!=_251){
-this.callback(this.element,_251);
-this.lastValue=_251;
-}
-}};
-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(_252,_253){
-this.element=$(_252);
-this.callback=_253;
-this.lastValue=this.getValue();
-if(this.element.tagName.toLowerCase()=="form"){
-this.registerFormCallbacks();
-}else{
-this.registerCallback(this.element);
+},
+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;
}
-},onElementEvent:function(){
-var _254=this.getValue();
-if(this.lastValue!=_254){
-this.callback(this.element,_254);
-this.lastValue=_254;
-}
-},registerFormCallbacks:function(){
-var _255=Form.getElements(this.element);
-for(var i=0;i<_255.length;i++){
-this.registerCallback(_255[i]);
-}
-},registerCallback:function(_256){
-if(_256.type){
-switch(_256.type.toLowerCase()){
-case "checkbox":
-case "radio":
-Event.observe(_256,"click",this.onElementEvent.bind(this));
-break;
-case "password":
-case "text":
-case "textarea":
-case "select-one":
-case "select-multiple":
-Event.observe(_256,"change",this.onElementEvent.bind(this));
-break;
}
}
-}};
-Form.Element.EventObserver=Class.create();
-Form.Element.EventObserver.prototype=Object.extend(new Abstract.EventObserver(),{getValue:function(){
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+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(_257){
-return _257.target||_257.srcElement;
-},isLeftClick:function(_258){
-return (((_258.which)&&(_258.which==1))||((_258.button)&&(_258.button==1)));
-},pointerX:function(_259){
-return _259.pageX||(_259.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft));
-},pointerY:function(_260){
-return _260.pageY||(_260.clientY+(document.documentElement.scrollTop||document.body.scrollTop));
-},stop:function(_261){
-if(_261.preventDefault){
-_261.preventDefault();
-_261.stopPropagation();
-}else{
-_261.returnValue=false;
-_261.cancelBubble=true;
-}
-},findElement:function(_262,_263){
-var _264=Event.element(_262);
-while(_264.parentNode&&(!_264.tagName||(_264.tagName.toUpperCase()!=_263.toUpperCase()))){
-_264=_264.parentNode;
-}
-return _264;
-},observers:false,_observeAndCache:function(_265,name,_266,_267){
-if(!this.observers){
-this.observers=[];
-}
-if(_265.addEventListener){
-this.observers.push([_265,name,_266,_267]);
-_265.addEventListener(name,_266,_267);
-}else{
-if(_265.attachEvent){
-this.observers.push([_265,name,_266,_267]);
-_265.attachEvent("on"+name,_266);
-}
-}
-},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(_268,name,_269,_270){
-var _268=$(_268);
-_270=_270||false;
-if(name=="keypress"&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||_268.attachEvent)){
-name="keydown";
-}
-this._observeAndCache(_268,name,_269,_270);
-},stopObserving:function(_271,name,_272,_273){
-var _271=$(_271);
-_273=_273||false;
-if(name=="keypress"&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||_271.detachEvent)){
-name="keydown";
-}
-if(_271.removeEventListener){
-_271.removeEventListener(name,_272,_273);
-}else{
-if(_271.detachEvent){
-_271.detachEvent("on"+name,_272);
-}
-}
-}});
-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);
-},observe:function(_276,name,_277,_278){
-if(!isList(_276)){
-return this.__observe(_276,name,_277,_278);
-}
-for(var i=0;i<_276.length;i++){
-this.__observe(_276[i],name,_277,_278);
-}
-},__observe:function(_279,name,_280,_281){
-var _279=$(_279);
-_281=_281||false;
-if(name=="keypress"&&((navigator.appVersion.indexOf("AppleWebKit")>0)||_279.attachEvent)){
-name="keydown";
-}
-this._observeAndCache(_279,name,_280,_281);
-},keyCode:function(e){
-return e.keyCode!=null?e.keyCode:e.charCode;
-},isHTMLEvent:function(type){
-var _284=["abort","blur","change","error","focus","load","reset","resize","scroll","select","submit","unload"];
-return _284.include(type);
-},isMouseEvent:function(type){
-var _285=["click","mousedown","mousemove","mouseout","mouseover","mouseup"];
-return _285.include(type);
-},fireEvent:function(_286,type){
-_286=$(_286);
-if(document.createEvent){
-if(Event.isHTMLEvent(type)){
-var _287=document.createEvent("HTMLEvents");
-_287.initEvent(type,true,true);
-}else{
-if(Event.isMouseEvent(type)){
-var _287=document.createEvent("MouseEvents");
-_287.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;
}
+});
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+getValue: function() {
+return Form.serialize(this.element);
}
-_286.dispatchEvent(_287);
-}else{
-if(_286.fireEvent){
-_286.fireEvent("on"+type);
-_286[type]();
-}else{
-_286[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(_288){
-var _289=0,valueL=0;
-do{
-_289+=_288.scrollTop||0;
-valueL+=_288.scrollLeft||0;
-_288=_288.parentNode;
-}while(_288);
-return [valueL,_289];
-},cumulativeOffset:function(_290){
-var _291=0,valueL=0;
-do{
-_291+=_290.offsetTop||0;
-valueL+=_290.offsetLeft||0;
-_290=_290.offsetParent;
-}while(_290);
-return [valueL,_291];
-},positionedOffset:function(_292){
-var _293=0,valueL=0;
-do{
-_293+=_292.offsetTop||0;
-valueL+=_292.offsetLeft||0;
-_292=_292.offsetParent;
-if(_292){
-p=Element.getStyle(_292,"position");
-if(p=="relative"||p=="absolute"){
+});
+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;
-}
-}
-}while(_292);
-return [valueL,_293];
-},offsetParent:function(_294){
-if(_294.offsetParent){
-return _294.offsetParent;
-}
-if(_294==document.body){
-return _294;
-}
-while((_294=_294.parentNode)&&_294!=document.body){
-if(Element.getStyle(_294,"position")!="static"){
-return _294;
-}
-}
-return document.body;
-},within:function(_295,x,y){
-if(this.includeScrollOffsets){
-return this.withinIncludingScrolloffsets(_295,x,y);
-}
-this.xcomp=x;
-this.ycomp=y;
-this.offset=this.cumulativeOffset(_295);
-return (y>=this.offset[1]&&y<this.offset[1]+_295.offsetHeight&&x>=this.offset[0]&&x<this.offset[0]+_295.offsetWidth);
-},withinIncludingScrolloffsets:function(_297,x,y){
-var _298=this.realOffset(_297);
-this.xcomp=x+_298[0]-this.deltaX;
-this.ycomp=y+_298[1]-this.deltaY;
-this.offset=this.cumulativeOffset(_297);
-return (this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+_297.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+_297.offsetWidth);
-},overlap:function(mode,_300){
-if(!mode){
-return 0;
-}
-if(mode=="vertical"){
-return ((this.offset[1]+_300.offsetHeight)-this.ycomp)/_300.offsetHeight;
-}
-if(mode=="horizontal"){
-return ((this.offset[0]+_300.offsetWidth)-this.xcomp)/_300.offsetWidth;
-}
-},clone:function(_301,_302){
-_301=$(_301);
-_302=$(_302);
-_302.style.position="absolute";
-var _303=this.cumulativeOffset(_301);
-_302.style.top=_303[1]+"px";
-_302.style.left=_303[0]+"px";
-_302.style.width=_301.offsetWidth+"px";
-_302.style.height=_301.offsetHeight+"px";
-},page:function(_304){
-var _305=0,valueL=0;
-var _306=_304;
-do{
-_305+=_306.offsetTop||0;
-valueL+=_306.offsetLeft||0;
-if(_306.offsetParent==document.body){
-if(Element.getStyle(_306,"position")=="absolute"){
+case 'password':
+case 'text':
+case 'textarea':
+case 'select-one':
+case 'select-multiple':
+Event.observe(element, 'change', this.onElementEvent.bind(this));
break;
}
}
-}while(_306=_306.offsetParent);
-_306=_304;
-do{
-_305-=_306.scrollTop||0;
-valueL-=_306.scrollLeft||0;
-}while(_306=_306.parentNode);
-return [valueL,_305];
-},clone:function(_307,_308){
-var _309=Object.extend({setLeft:true,setTop:true,setWidth:true,setHeight:true,offsetTop:0,offsetLeft:0},arguments[2]||{});
-_307=$(_307);
-var p=Position.page(_307);
-_308=$(_308);
-var _310=[0,0];
-var _311=null;
-if(Element.getStyle(_308,"position")=="absolute"){
-_311=Position.offsetParent(_308);
-_310=Position.page(_311);
-}
-if(_311==document.body){
-_310[0]-=document.body.offsetLeft;
-_310[1]-=document.body.offsetTop;
-}
-if(_309.setLeft){
-_308.style.left=(p[0]-_310[0]+_309.offsetLeft)+"px";
-}
-if(_309.setTop){
-_308.style.top=(p[1]-_310[1]+_309.offsetTop)+"px";
-}
-if(_309.setWidth){
-_308.style.width=_307.offsetWidth+"px";
-}
-if(_309.setHeight){
-_308.style.height=_307.offsetHeight+"px";
-}
-},absolutize:function(_312){
-_312=$(_312);
-if(_312.style.position=="absolute"){
-return;
-}
-Position.prepare();
-var _313=Position.positionedOffset(_312);
-var top=_313[1];
-var left=_313[0];
-var _315=_312.clientWidth;
-var _316=_312.clientHeight;
-_312._originalLeft=left-parseFloat(_312.style.left||0);
-_312._originalTop=top-parseFloat(_312.style.top||0);
-_312._originalWidth=_312.style.width;
-_312._originalHeight=_312.style.height;
-_312.style.position="absolute";
-_312.style.top=top+"px";
-_312.style.left=left+"px";
-_312.style.width=_315+"px";
-_312.style.height=_316+"px";
-},relativize:function(_317){
-_317=$(_317);
-if(_317.style.position=="relative"){
-return;
-}
-Position.prepare();
-_317.style.position="relative";
-var top=parseFloat(_317.style.top||0)-(_317._originalTop||0);
-var left=parseFloat(_317.style.left||0)-(_317._originalLeft||0);
-_317.style.top=top+"px";
-_317.style.left=left+"px";
-_317.style.height=_317._originalHeight;
-_317.style.width=_317._originalWidth;
-}};
-if(/Konqueror|Safari|KHTML/.test(navigator.userAgent)){
-Position.cumulativeOffset=function(_318){
-var _319=0,valueL=0;
-do{
-_319+=_318.offsetTop||0;
-valueL+=_318.offsetLeft||0;
-if(_318.offsetParent==document.body){
-if(Element.getStyle(_318,"position")=="absolute"){
-break;
-}
}
-_318=_318.offsetParent;
-}while(_318);
-return [valueL,_319];
-};
}
-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(_320){
-_320=_320.toUpperCase();
-var _321=this.NODEMAP[_320]||"div";
-var _322=document.createElement(_321);
-try{
-_322.innerHTML="<"+_320+"></"+_320+">";
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+getValue: function() {
+return Form.Element.getValue(this.element);
}
-catch(e){
+});
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+getValue: function() {
+return Form.serialize(this.element);
}
-var _323=_322.firstChild||null;
-if(_323&&(_323.tagName!=_320)){
-_323=_323.getElementsByTagName(_320)[0];
+});
+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(!_323){
-_323=document.createElement(_320);
}
-if(!_323){
+});
+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);
+}
+else
+{
+if(Logger)
+Logger.error("undefined event", type);
return;
}
-if(arguments[1]){
-if(this._isStringOrNumber(arguments[1])||(arguments[1] instanceof Array)){
-this._children(_323,arguments[1]);
-}else{
-var _324=this._attributes(arguments[1]);
-if(_324.length){
-try{
-_322.innerHTML="<"+_320+" "+_324+"></"+_320+">";
-}
-catch(e){
-}
-_323=_322.firstChild||null;
-if(!_323){
-_323=document.createElement(_320);
-for(attr in arguments[1]){
-_323[attr=="class"?"className":attr]=arguments[1][attr];
+element.dispatchEvent(event);
}
+else if(element.fireEvent)
+{
+element.fireEvent('on'+type);
+element[type]();
}
-if(_323.tagName!=_320){
-_323=_322.getElementsByTagName(_320)[0];
+else
+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';
}
+});
}
-}
-if(arguments[2]){
-this._children(_323,arguments[2]);
-}
-return _323;
-},_text:function(text){
-return document.createTextNode(text);
-},_attributes:function(_326){
-var _327=[];
-for(attribute in _326){
-_327.push((attribute=="className"?"class":attribute)+"=\""+_326[attribute].toString().escapeHTML()+"\"");
-}
-return _327.join(" ");
-},_children:function(_328,_329){
-if(typeof _329=="object"){
-_329.flatten().each(function(e){
-if(typeof e=="object"){
-_328.appendChild(e);
-}else{
-if(Builder._isStringOrNumber(e)){
-_328.appendChild(Builder._text(e));
-}
-}
+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')
+element.appendChild(e)
+else
+if(Builder._isStringOrNumber(e))
+element.appendChild(Builder._text(e));
});
-}else{
-if(Builder._isStringOrNumber(_329)){
-_328.appendChild(Builder._text(_329));
-}
-}
-},_isStringOrNumber:function(_330){
-return (typeof _330=="string"||typeof _330=="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(){
+} 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){
+if(args.length==0)
return Builder.node(tag,null);
-}
-if(args.length==1){
+if(args.length==1)
return Builder.node(tag,args[0]);
-}
-if(args.length>1){
+if(args.length>1)
return Builder.node(tag,args.shift(),args);
-}
};
});
-}});
+}
+});
Builder.exportTags();
-Object.extend(Date.prototype,{SimpleFormat:function(_334,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 _337=""+this.getFullYear();
-_337=(_337.length==2)?"19"+_337:_337;
-bits["yyyy"]=_337;
-bits["yy"]=bits["yyyy"].toString().substr(2,2);
-var frm=new String(_334);
-for(var sect in bits){
-var reg=new RegExp("\\b"+sect+"\\b","g");
-frm=frm.replace(reg,bits[sect]);
+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(_341,_342){
-val=String(_341);
-_342=String(_342);
-if(val.length<=0){
-return null;
-}
-if(_342.length<=0){
-return new Date(_341);
-}
-var _343=function(val){
-var _345="1234567890";
-for(var i=0;i<val.length;i++){
-if(_345.indexOf(val.charAt(i))==-1){
-return false;
+},
+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 _346=function(str,i,_348,_349){
-for(var x=_349;x>=_348;x--){
-var _350=str.substring(i,i+x);
-if(_350.length<_348){
-return null;
-}
-if(_343(_350)){
-return _350;
-}
+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 _351=0;
-var _352=0;
+var i_val=0;
+var i_format=0;
var c="";
-var _354="";
-var _355="";
+var token="";
+var token2="";
var x,y;
var now=new Date();
var year=now.getFullYear();
-var _358=now.getMonth()+1;
+var month=now.getMonth()+1;
var date=1;
-while(_352<_342.length){
-c=_342.charAt(_352);
-_354="";
-while((_342.charAt(_352)==c)&&(_352<_342.length)){
-_354+=_342.charAt(_352++);
-}
-if(_354=="yyyy"||_354=="yy"||_354=="y"){
-if(_354=="yyyy"){
-x=4;
-y=4;
-}
-if(_354=="yy"){
-x=2;
-y=2;
-}
-if(_354=="y"){
-x=2;
-y=4;
-}
-year=_346(val,_351,x,y);
-if(year==null){
-return null;
-}
-_351+=year.length;
-if(year.length==2){
-if(year>70){
-year=1900+(year-0);
-}else{
-year=2000+(year-0);
-}
-}
-}else{
-if(_354=="MM"||_354=="M"){
-_358=_346(val,_351,_354.length,2);
-if(_358==null||(_358<1)||(_358>12)){
-return null;
-}
-_351+=_358.length;
-}else{
-if(_354=="dd"||_354=="d"){
-date=_346(val,_351,_354.length,2);
-if(date==null||(date<1)||(date>31)){
-return null;
-}
-_351+=date.length;
-}else{
-if(val.substring(_351,_351+_354.length)!=_354){
-return null;
-}else{
-_351+=_354.length;
-}
-}
+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;
}
-}
-}
-if(_351!=val.length){
-return null;
-}
-if(_358==2){
-if(((year%4==0)&&(year%100!=0))||(year%400==0)){
-if(date>29){
-return null;
-}
-}else{
-if(date>28){
-return null;
-}
-}
-}
-if((_358==4)||(_358==6)||(_358==9)||(_358==11)){
-if(date>30){
-return null;
-}
-}
-var _360=new Date(year,_358-1,date,0,0,0);
-return _360;
-}});
-var Prado={Version:"3.0a",Browser:function(){
-var info={Version:"1.0"};
-var _362=parseInt(navigator.appVersion);
-info.nver=_362;
-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")&&(_362<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;
+});
+var Prado =
+{
+Version: '3.0a',
+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,_364){
-if(Prado.Browser().ie){
-var _365=doc.createStyleSheet(_364);
-}else{
-var elm=doc.createElement("link");
-elm.rel="stylesheet";
-elm.href=_364;
-if(headArr=doc.getElementsByTagName("head")){
+},
+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.Focus=Class.create();
-Prado.Focus.setFocus=function(id){
-var _368=document.getElementById?document.getElementById(id):document.all[id];
-if(_368&&!Prado.Focus.canFocusOn(_368)){
-_368=Prado.Focus.findTarget(_368);
-}
-if(_368){
-try{
-_368.focus();
-_368.scrollIntoView(false);
-if(window.__smartNav){
-window.__smartNav.ae=_368.id;
-}
-}
-catch(e){
-}
-}
-};
-Prado.Focus.canFocusOn=function(_369){
-if(!_369||!(_369.tagName)){
-return false;
-}
-var _370=_369.tagName.toLowerCase();
-return !_369.disabled&&(!_369.type||_369.type.toLowerCase()!="hidden")&&Prado.Focus.isFocusableTag(_370)&&Prado.Focus.isVisible(_369);
-};
-Prado.Focus.isFocusableTag=function(_371){
-return (_371=="input"||_371=="textarea"||_371=="select"||_371=="button"||_371=="a");
-};
-Prado.Focus.findTarget=function(_372){
-if(!_372||!(_372.tagName)){
-return null;
-}
-var _373=_372.tagName.toLowerCase();
-if(_373=="undefined"){
-return null;
-}
-var _374=_372.childNodes;
-if(_374){
-for(var i=0;i<_374.length;i++){
-try{
-if(Prado.Focus.canFocusOn(_374[i])){
-return _374[i];
-}else{
-var _375=Prado.Focus.findTarget(_374[i]);
-if(_375){
-return _375;
-}
-}
-}
-catch(e){
-}
-}
-}
-return null;
};
-Prado.Focus.isVisible=function(_376){
-var _377=_376;
-while((typeof (_377)!="undefined")&&(_377!=null)){
-if(_377.disabled||(typeof (_377.style)!="undefined"&&((typeof (_377.style.display)!="undefined"&&_377.style.display=="none")||(typeof (_377.style.visibility)!="undefined"&&_377.style.visibility=="hidden")))){
-return false;
-}
-if(typeof (_377.parentNode)!="undefined"&&_377.parentNode!=null&&_377.parentNode!=_377&&_377.parentNode.tagName.toLowerCase()!="body"){
-_377=_377.parentNode;
-}else{
-return true;
-}
-}
-return true;
-};
-Prado.PostBack=function(_378,_379){
-var form=$(_379["FormID"]);
-var _380=true;
-if(_379["CausesValidation"]&&Prado.Validation){
-var _381=true;
-if(_379["ValidationGroup"]){
-_381=Prado.Validation.ValidateValidationGroup(_379["ValidationGroup"]);
-}else{
-_381=Prado.Validation.ValidateNonGroup(form);
-}
-if(!_381){
-return Event.stop(_378);
-}
-}
-if(_379["PostBackUrl"]&&_379["PostBackUrl"].length>0){
-form.action=_379["PostBackUrl"];
-}
-if(_379["TrackFocus"]){
-var _382=$("PRADO_LASTFOCUS");
-if(_382){
-var _383=document.activeElement;
-if(_383){
-_382.value=_383.id;
-}else{
-_382.value=_379["EventTarget"];
-}
-}
-}
-$("PRADO_POSTBACK_TARGET").value=_379["EventTarget"];
-$("PRADO_POSTBACK_PARAMETER").value=_379["EventParameter"];
+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']))
+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'];
Event.fireEvent(form,"submit");
-if(_379["StopEvent"]){
-Event.stop(_378);
-}
-};
-Prado.Element={setValue:function(_384,_385){
-var el=$(_384);
-if(el&&typeof (el.value)!="undefined"){
-el.value=_385;
-}
-},select:function(_387,_388,_389){
-var el=$(_387);
-var _390=_387.indexOf("[]")>-1;
-if(!el&&!_390){
-return;
-}
-_388=_390?"check"+_388:el.tagName.toLowerCase()+_388;
-var _391=Prado.Element.Selection;
-if(isFunction(_391[_388])){
-_391[_388](_390?_387:el,_389);
-}
-},click:function(_392){
-var el=$(_392);
-if(!el){
-return;
-}
-if(document.createEvent){
-var evt=document.createEvent("HTMLEvents");
-evt.initEvent("click",true,true);
+if(options['StopEvent'])
+Event.stop(event);
+}
+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();
}
+else if(el.fireEvent)
+{
+el.fireEvent('onclick');
+if(isFunction(el.onclick))
+el.onclick();
}
-}
-},setAttribute:function(_394,_395,_396){
-var el=$(_394);
-if(_395=="disabled"&&_396==false){
-el.removeAttribute(_395);
-}else{
-el.setAttribute(_395,_396);
-}
-},setOptions:function(_397,_398){
-var el=$(_397);
-if(el&&el.tagName.toLowerCase()=="select"){
-while(el.length>0){
+},
+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;
}
-for(var i=0;i<_398.length;i++){
-el.options[el.options.length]=new Option(_398[i][0],_398[i][1]);
-}
-}
-},focus:function(_399){
-var obj=$(_399);
-if(isObject(obj)&&isdef(obj.focus)){
-setTimeout(function(){
-obj.focus();
-},100);
}
-return false;
-}};
-Prado.Element.Selection={inputValue:function(el,_401){
-switch(el.type.toLowerCase()){
-case "checkbox":
-case "radio":
-return el.checked=_401;
-}
-},selectValue:function(el,_402){
-$A(el.options).each(function(_403){
-_403.selected=_403.value==_402;
+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,_404){
-if(el.type=="select-one"){
-el.selectedIndex=_404;
-}else{
-for(var i=0;i<el.length;i++){
-if(i==_404){
-el.options[i].selected=true;
-}
-}
-}
-},selectClear:function(el){
-el.selectedIndex=-1;
-},selectAll:function(el){
-$A(el.options).each(function(_405){
-_405.selected=true;
-Logger.warn(_405.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(_406){
-_406.selected=!_406.selected;
+},
+selectInvert : function(el)
+{
+$A(el.options).each(function(option)
+{
+option.selected = !option.selected;
});
-},checkValue:function(name,_407){
-$A(document.getElementsByName(name)).each(function(el){
-el.checked=el.value==_407;
+},
+checkValue : function(name, value)
+{
+$A(document.getElementsByName(name)).each(function(el)
+{
+el.checked = el.value == value
});
-},checkIndex:function(name,_408){
-var _409=$A(document.getElementsByName(name));
-for(var i=0;i<_409.length;i++){
-if(i==_408){
-_409[i].checked=true;
-}
-}
-},checkClear:function(name){
-$A(document.getElementsByName(name)).each(function(el){
-el.checked=false;
+},
+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;
+},
+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;
+},
+checkInvert : function(name)
+{
+$A(document.getElementsByName(name)).each(function(el)
+{
+el.checked = !el.checked;
});
-}};
-Object.extend(Prado.Element,{Insert:{After:function(_410,_411){
-new Insertion.After(_410,_411);
-},Before:function(_412,_413){
-new Insertion.Before(_412.innerHTML);
-},Below:function(_414,_415){
-new Insertion.Bottom(_414,_415);
-},Above:function(_416,_417){
-new Insertion.Top(_416,_417);
-}},CssClass:{set:function(_418,_419){
-_418=new Element.ClassNames(_418);
-_418.set(_419);
-}}});
-Prado.WebUI=Class.create();
-Prado.WebUI.PostBackControl=Class.create();
-Object.extend(Prado.WebUI.PostBackControl.prototype,{initialize:function(_420){
-this.element=$(_420["ID"]);
-if(_420["CausesValidation"]&&Prado.Validation){
-Prado.Validation.AddTarget(_420["ID"],_420["ValidationGroup"]);
-}
-if(this.onInit){
-this.onInit(_420);
-}
-}});
-Prado.WebUI.createPostBackComponent=function(_421){
-var _422=Class.create();
-Object.extend(_422.prototype,Prado.WebUI.PostBackControl.prototype);
-if(_421){
-Object.extend(_422.prototype,_421);
-}
-return _422;
+}
+};
+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=Prado.WebUI.createPostBackComponent();
-Prado.WebUI.ClickableComponent=Prado.WebUI.createPostBackComponent({_elementOnClick:null,onInit:function(_423){
-if(isFunction(this.element.onclick)){
-this._elementOnClick=this.element.onclick;
-this.element.onclick=null;
-}
-Event.observe(this.element,"click",this.onClick.bindEvent(this,_423));
-},onClick:function(_424,_425){
-var src=Event.element(_424);
-var _427=true;
-var _428=null;
-if(this._elementOnClick){
-var _428=this._elementOnClick(_424);
-if(isBoolean(_428)){
-_427=_428;
-}
-}
-if(_427){
-this.onPostBack(_424,_425);
-}
-if(isBoolean(_428)&&!_428){
-Event.stop(_424);
-}
-},onPostBack:function(_429,_430){
-Prado.PostBack(_429,_430);
-}});
-Prado.WebUI.TLinkButton=Prado.WebUI.ClickableComponent;
-Prado.WebUI.TCheckBox=Prado.WebUI.ClickableComponent;
-Prado.WebUI.TBulletedList=Prado.WebUI.ClickableComponent;
-Prado.WebUI.TImageMap=Prado.WebUI.ClickableComponent;
-Prado.WebUI.TImageButton=Class.create();
-Object.extend(Prado.WebUI.TImageButton.prototype,Prado.WebUI.ClickableComponent.prototype);
-Object.extend(Prado.WebUI.TImageButton.prototype,{hasXYInput:false,onPostBack:function(_431,_432){
-if(!this.hasXYInput){
-this.addXYInput(_431,_432);
-this.hasXYInput=true;
-}
-Prado.PostBack(_431,_432);
-},addXYInput:function(_433,_434){
-var _435=Position.cumulativeOffset(this.element);
-var _436=[_433.clientX,_433.clientY];
-var x=_436[0]-_435[0]+1;
-var y=_436[1]-_435[1]+1;
-var id=_434["EventTarget"];
-var _437=INPUT({type:"hidden",name:id+"_x",value:x});
-var _438=INPUT({type:"hidden",name:id+"_y",value:y});
-this.element.parentNode.appendChild(_437);
-this.element.parentNode.appendChild(_438);
-}});
-Prado.WebUI.TRadioButton=Prado.WebUI.createPostBackComponent(Prado.WebUI.ClickableComponent.prototype);
-Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize=Prado.WebUI.TRadioButton.prototype.initialize;
-Object.extend(Prado.WebUI.TRadioButton.prototype,{initialize:function(_439){
-this.element=$(_439["ID"]);
-if(!this.element.checked){
-this.onRadioButtonInitialize(_439);
-}
-}});
-Prado.WebUI.TTextBox=Prado.WebUI.createPostBackComponent({onInit:function(_440){
-if(_440["TextMode"]!="MultiLine"){
-Event.observe(this.element,"keydown",this.handleReturnKey.bind(this));
-}
-Event.observe(this.element,"change",Prado.PostBack.bindEvent(this,_440));
-},handleReturnKey:function(e){
-if(Event.keyCode(e)==Event.KEY_RETURN){
-var _441=Event.element(e);
-if(_441){
-Event.fireEvent(_441,"change");
+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=Prado.WebUI.createPostBackComponent({onInit:function(_442){
-Event.observe(this.element,"change",Prado.PostBack.bindEvent(this,_442));
-}});
-Prado.WebUI.TListBox=Prado.WebUI.TListControl;
-Prado.WebUI.TDropDownList=Prado.WebUI.TListControl;
-Prado.WebUI.DefaultButton=Class.create();
-Object.extend(Prado.WebUI.DefaultButton.prototype,{initialize:function(_443){
-this.options=_443;
-this._event=this.triggerEvent.bindEvent(this);
-Event.observe(_443["Panel"],"keydown",this._event);
-},triggerEvent:function(ev,_445){
-var _446=Event.keyCode(ev)==Event.KEY_RETURN;
-var _447=Event.element(ev).tagName.toLowerCase()=="textarea";
-if(_446&&!_447){
-var _448=$(this.options["Target"]);
-if(_448){
-this.triggered=true;
-Event.fireEvent(_448,this.options["Event"]);
+}
+});
+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 _449={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(_449,"Copy Code"));
+};
+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 _450=obj.parentNode.parentNode.parentNode;
-var text="";
-for(var i=0;i<_450.childNodes.length;i++){
-var node=_450.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(_451){
-this.options=_451;
-this.element=$(_451["ID"]);
-Element.addClassName(this.element,_451.cssClass);
-this.radios=document.getElementsByName(_451.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();
+}
+};
+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=_451.selectedIndex;
+this.selectedIndex = options.selectedIndex;
this.setRating(this.selectedIndex);
-},hover:function(ev,_452){
-for(var i=0;i<this.radios.length;i++){
-this.radios[i].parentNode.className=(i<=_452)?"rating_hover":"";
+},
+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.setCaption(_452);
-},recover:function(ev,_453){
-for(var i=0;i<=_453;i++){
-Element.removeClassName(this.radios[i].parentNode,"rating_hover");
}
-this.setRating(this.selectedIndex);
-},click:function(ev,_454){
-for(var i=0;i<this.radios.length;i++){
-this.radios[i].checked=(i==_454);
-}
-this.selectedIndex=_454;
-this.setRating(_454);
-if(isFunction(this.options.onChange)){
-this.options.onChange(this,_454);
-}
-},setRating:function(_455){
-for(var i=0;i<=_455;i++){
-this.radios[i].parentNode.className="rating_selected";
-}
-this.setCaption(_455);
-},setCaption:function(_456){
-this.caption.innerHTML=_456>-1?this.radios[_456].value:this.options.caption;
-}};
-
diff --git a/framework/Web/Javascripts/js/rico.js b/framework/Web/Javascripts/js/rico.js
index 0d3d0a32..3c2035ca 100644
--- a/framework/Web/Javascripts/js/rico.js
+++ b/framework/Web/Javascripts/js/rico.js
@@ -1,1733 +1,900 @@
-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;
+
+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(_1){
-return Object.extend.apply(this,[this,_1]);
-};
-Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;
+Object.prototype.extend = function(object) {
+return Object.extend.apply(this, [this, object]);
}
-if(Array.prototype.push){
-Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.push;
+Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Object.prototype.extend;
}
-if(!Array.prototype.remove){
-Array.prototype.remove=function(dx){
-if(isNaN(dx)||dx>this.length){
-return false;
+if (Array.prototype.push) {
+ Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.push;
}
-for(var i=0,n=0;i<this.length;i++){
-if(i!=dx){
+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;
+ };
+Rico.ArrayExtensions[ Rico.ArrayExtensions.length ] = Array.prototype.remove;
}
-if(!Array.prototype.removeItem){
-Array.prototype.removeItem=function(_4){
-for(var i=0;i<this.length;i++){
-if(this[i]==_4){
+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 _5=new Array();
-for(index in this){
-var _6=false;
-for(var i=0;i<Rico.ArrayExtensions.length;i++){
-if(this[index]==Rico.ArrayExtensions[i]){
-_6=true;
-break;
-}
-}
-if(!_6){
-_5[_5.length]=index;
-}
-}
-return _5;
-};
-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 _8=(new DOMParser()).parseFromString(s,"text/xml");
-while(this.hasChildNodes()){
+ }
+ };
+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<_8.childNodes.length;i++){
-this.appendChild(this.importNode(_8.childNodes[i],true));
-}
+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(_9,_10){
-if(_9==null){
-_9="*";
-}
-var _11=document.getElementsByTagName(_9)||document.all;
-var _12=new Array();
-if(_10==null){
-return _11;
-}
-for(var i=0;i<_11.length;i++){
-var _13=_11[i];
-var _14=_13.className.split(" ");
-for(var j=0;j<_14.length;j++){
-if(_14[j]==_10){
-_12.push(_13);
+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 _12;
-};
-Rico.Accordion=Class.create();
-Rico.Accordion.prototype={initialize:function(_16,_17){
-this.container=$(_16);
-this.lastExpandedTab=null;
-this.accordionTabs=new Array();
-this.setOptions(_17);
-this._attachBehaviors();
-if(!_16){
-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";
-}
+return elements;
}
-this.lastExpandedTab=this.accordionTabs[this.options.onLoadShowTab];
-if(this.options.panelHeight=="auto"){
-var _18=(this.options.onloadShowTab===0)?1:0;
-var _19=parseInt(RicoUtil.getElementsComputedStyle(this.accordionTabs[_18].titleBar,"height"));
-if(isNaN(_19)){
-_19=this.accordionTabs[_18].titleBar.offsetHeight;
-}
-var _20=this.accordionTabs.length*_19;
-var _21=parseInt(RicoUtil.getElementsComputedStyle(this.container.parentNode,"height"));
-if(isNaN(_21)){
-_21=this.container.parentNode.offsetHeight;
-}
-this.options.panelHeight=_21-_20-2;
-}
-this.lastExpandedTab.content.style.height=this.options.panelHeight+"px";
+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(_22){
-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,_22||{});
-},showTabByIndex:function(_23,_24){
-var _25=arguments.length==1?true:_24;
-this.showTab(this.accordionTabs[_23],_25);
-},showTab:function(_26,_27){
-var _28=arguments.length==1?true:_27;
-if(this.options.onHideTab){
-this.options.onHideTab(this.lastExpandedTab);
-}
+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 _29=this;
-var _30=this.lastExpandedTab;
-this.lastExpandedTab.content.style.height=(this.options.panelHeight-1)+"px";
-_26.content.style.display="";
-_26.titleBar.style.fontWeight=this.options.expandedFontWeight;
-if(_28){
-new Effect.AccordionSize(this.lastExpandedTab.content,_26.content,1,this.options.panelHeight,100,10,{complete:function(){
-_29.showTabDone(_30);
-}});
-this.lastExpandedTab=_26;
-}else{
-this.lastExpandedTab.content.style.height="1px";
-_26.content.style.height=this.options.panelHeight+"px";
-this.lastExpandedTab=_26;
-this.showTabDone(_30);
-}
-},showTabDone:function(_31){
-_31.content.style.display="none";
+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 _32=this._getDirectChildrenByTag(this.container,"DIV");
-for(var i=0;i<_32.length;i++){
-var _33=this._getDirectChildrenByTag(_32[i],"DIV");
-if(_33.length!=2){
+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 _34=_33[0];
-var _35=_33[1];
-this.accordionTabs.push(new Rico.Accordion.Tab(this,_34,_35));
-}
-},_getDirectChildrenByTag:function(e,_37){
-var _38=new Array();
-var _39=e.childNodes;
-for(var i=0;i<_39.length;i++){
-if(_39[i]&&_39[i].tagName&&_39[i].tagName==_37){
-_38.push(_39[i]);
-}
-}
-return _38;
-}};
-Rico.Accordion.Tab=Class.create();
-Rico.Accordion.Tab.prototype={initialize:function(_40,_41,_42){
-this.accordion=_40;
-this.titleBar=_41;
-this.content=_42;
+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(){
+ },
+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.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,_43){
-var e=$(e);
-this._setOptions(_43);
-var _44=this.options.color;
-if(this.options.color=="fromElement"){
-_44=this._background(e);
-}
-var _45=this.options.bgColor;
-if(this.options.bgColor=="fromParent"){
-_45=this._background(e.offsetParent);
-}
-this._roundCornersImpl(e,_44,_45);
-},_roundCornersImpl:function(e,_46,_47){
-if(this.options.border){
-this._renderBorder(e,_47);
-}
-if(this._isTopRounded()){
-this._roundTopCorners(e,_46,_47);
-}
-if(this._isBottomRounded()){
-this._roundBottomCorners(e,_46,_47);
-}
-},_renderBorder:function(el,_49){
-var _50="1px solid "+this._borderColor(_49);
-var _51="border-left: "+_50;
-var _52="border-right: "+_50;
-var _53="style='"+_51+";"+_52+"'";
-el.innerHTML="<div "+_53+">"+el.innerHTML+"</div>";
-},_roundTopCorners:function(el,_54,_55){
-var _56=this._createCorner(_55);
-for(var i=0;i<this.options.numSlices;i++){
-_56.appendChild(this._createCornerSlice(_54,_55,i,"top"));
-}
-el.style.paddingTop=0;
-el.insertBefore(_56,el.firstChild);
-},_roundBottomCorners:function(el,_57,_58){
-var _59=this._createCorner(_58);
-for(var i=(this.options.numSlices-1);i>=0;i--){
-_59.appendChild(this._createCornerSlice(_57,_58,i,"bottom"));
-}
-el.style.paddingBottom=0;
-el.appendChild(_59);
-},_createCorner:function(_60){
-var _61=document.createElement("div");
-_61.style.backgroundColor=(this._isTransparent()?"transparent":_60);
-return _61;
-},_createCornerSlice:function(_62,_63,n,_65){
-var _66=document.createElement("span");
-var _67=_66.style;
-_67.backgroundColor=_62;
-_67.display="block";
-_67.height="1px";
-_67.overflow="hidden";
-_67.fontSize="1px";
-var _68=this._borderColor(_62,_63);
-if(this.options.border&&n==0){
-_67.borderTopStyle="solid";
-_67.borderTopWidth="1px";
-_67.borderLeftWidth="0px";
-_67.borderRightWidth="0px";
-_67.borderBottomWidth="0px";
-_67.height="0px";
-_67.borderColor=_68;
-}else{
-if(_68){
-_67.borderColor=_68;
-_67.borderStyle="solid";
-_67.borderWidth="0px 1px";
-}
-}
-if(!this.options.compact&&(n==(this.options.numSlices-1))){
-_67.height="2px";
-}
-this._setMargin(_66,n,_65);
-this._setBorder(_66,n,_65);
-return _66;
-},_setOptions:function(_69){
-this.options={corners:"all",color:"fromElement",bgColor:"fromParent",blend:true,border:false,compact:false};
-Object.extend(this.options,_69||{});
-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){
+ },
+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 "";
-},_borderColor:function(_70,_71){
-if(_70=="transparent"){
-return _71;
-}else{
-if(this.options.border){
-return this.options.border;
-}else{
-if(this.options.blend){
-return this._blend(_71,_70);
-}else{
+ },
+_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 "";
-}
-}
-}
-},_setMargin:function(el,n,_72){
-var _73=this._marginSize(n);
-var _74=_72=="top"?this._whichSideTop():this._whichSideBottom();
-if(_74=="left"){
-el.style.marginLeft=_73+"px";
-el.style.marginRight="0px";
-}else{
-if(_74=="right"){
-el.style.marginRight=_73+"px";
-el.style.marginLeft="0px";
-}else{
-el.style.marginLeft=_73+"px";
-el.style.marginRight=_73+"px";
-}
-}
-},_setBorder:function(el,n,_75){
-var _76=this._borderSize(n);
-var _77=_75=="top"?this._whichSideTop():this._whichSideBottom();
-if(_77=="left"){
-el.style.borderLeftWidth=_76+"px";
-el.style.borderRightWidth="0px";
-}else{
-if(_77=="right"){
-el.style.borderRightWidth=_76+"px";
-el.style.borderLeftWidth="0px";
-}else{
-el.style.borderLeftWidth=_76+"px";
-el.style.borderRightWidth=_76+"px";
-}
-}
-if(this.options.border!=false){
-el.style.borderLeftWidth=_76+"px";
-}
-el.style.borderRightWidth=_76+"px";
-},_marginSize:function(n){
-if(this._isTransparent()){
+ },
+_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;
-}
-var _78=[5,3,2,1];
-var _79=[3,2,1,0];
-var _80=[2,1];
-var _81=[1,0];
-if(this.options.compact&&this.options.blend){
-return _81[n];
-}else{
-if(this.options.compact){
-return _80[n];
-}else{
-if(this.options.blend){
-return _79[n];
-}else{
-return _78[n];
-}
-}
-}
-},_borderSize:function(n){
-var _82=[5,3,2,1];
-var _83=[2,1,1,1];
-var _84=[1,0];
-var _85=[0,2,0,0];
-if(this.options.compact&&(this.options.blend||this._isTransparent())){
-return 1;
-}else{
-if(this.options.compact){
-return _84[n];
-}else{
-if(this.options.blend){
-return _83[n];
-}else{
-if(this.options.border){
-return _85[n];
-}else{
-if(this._isTransparent()){
-return _82[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(_90,x,y,w,h,_95,_96,_97){
-this.element=$(_90);
-this.x=x;
-this.y=y;
-this.w=w;
-this.h=h;
-this.duration=_95;
-this.steps=_96;
-this.options=arguments[7]||{};
+ },
+_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 _98=Math.round(this.duration/this.steps);
-var _99=this.element.offsetLeft;
-var _100=this.element.offsetTop;
-var _101=this.element.offsetWidth;
-var _102=this.element.offsetHeight;
-this.x=(this.x)?this.x:_99;
-this.y=(this.y)?this.y:_100;
-this.w=(this.w)?this.w:_101;
-this.h=(this.h)?this.h:_102;
-var difX=this.steps>0?(this.x-_99)/this.steps:0;
-var difY=this.steps>0?(this.y-_100)/this.steps:0;
-var difW=this.steps>0?(this.w-_101)/this.steps:0;
-var difH=this.steps>0?(this.h-_102)/this.steps:0;
-this.moveBy(difX,difY);
-this.resizeBy(difW,difH);
-this.duration-=_98;
+ },
+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),_98);
-},isFinished:function(){
-return this.steps<=0;
-},moveBy:function(difX,difY){
-var _107=this.element.offsetLeft;
-var _108=this.element.offsetTop;
-var _109=parseInt(difX);
-var _110=parseInt(difY);
-var _111=this.element.style;
-if(_109!=0){
-_111.left=(_107+_109)+"px";
-}
-if(_110!=0){
-_111.top=(_108+_110)+"px";
-}
-},resizeBy:function(difW,difH){
-var _112=this.element.offsetWidth;
-var _113=this.element.offsetHeight;
-var _114=parseInt(difW);
-var _115=parseInt(difH);
-var _116=this.element.style;
-if(_114!=0){
-_116.width=(_112+_114)+"px";
-}
-if(_115!=0){
-_116.height=(_113+_115)+"px";
-}
-}};
-Effect.Size=Class.create();
-Effect.Size.prototype={initialize:function(_117,w,h,_118,_119,_120){
-new Effect.SizeAndPosition(_117,null,null,w,h,_118,_119,_120);
-}};
-Effect.Position=Class.create();
-Effect.Position.prototype={initialize:function(_121,x,y,_122,_123,_124){
-new Effect.SizeAndPosition(_121,x,y,null,null,_122,_123,_124);
-}};
-Effect.Round=Class.create();
-Effect.Round.prototype={initialize:function(_125,_126,_127){
-var _128=document.getElementsByTagAndClassName(_125,_126);
-for(var i=0;i<_128.length;i++){
-Rico.Corner.round(_128[i],_127);
-}
-}};
-Effect.FadeTo=Class.create();
-Effect.FadeTo.prototype={initialize:function(_129,_130,_131,_132,_133){
-this.element=$(_129);
-this.opacity=_130;
-this.duration=_131;
-this.steps=_132;
-this.options=arguments[4]||{};
+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 _134=Math.round(this.duration/this.steps);
-var _135=this.getElementOpacity();
-var _136=this.steps>0?(this.opacity-_135)/this.steps:0;
-this.changeOpacityBy(_136);
-this.duration-=_134;
-this.steps--;
-this.timer=setTimeout(this.fadeTo.bind(this),_134);
-},changeOpacityBy:function(v){
-var _138=this.getElementOpacity();
-var _139=Math.max(0,Math.min(_138+v,1));
-this.element.ricoOpacity=_139;
-this.element.style.filter="alpha(opacity:"+Math.round(_139*100)+")";
-this.element.style.opacity=_139;
-},isFinished:function(){
-return this.steps<=0;
-},getElementOpacity:function(){
-if(this.element.ricoOpacity==undefined){
-var _140=RicoUtil.getElementsComputedStyle(this.element,"opacity");
-this.element.ricoOpacity=_140!=undefined?_140:1;
-}
-return parseFloat(this.element.ricoOpacity);
-}};
-Effect.AccordionSize=Class.create();
-Effect.AccordionSize.prototype={initialize:function(e1,e2,_143,end,_145,_146,_147){
-this.e1=$(e1);
-this.e2=$(e2);
-this.start=_143;
-this.end=end;
-this.duration=_145;
-this.steps=_146;
-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 _148=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-=_148;
+ },
+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.accordionSize.bind(this),_148);
-},isFinished:function(){
-return this.steps<=0;
-},resizeBy:function(diff){
-var _150=this.e1.offsetHeight;
-var _151=this.e2.offsetHeight;
-var _152=parseInt(diff);
-if(diff!=0){
-this.e1.style.height=(_150-_152)+"px";
-this.e2.style.height=(_151+_152)+"px";
-}
-}};
-if(window.Effect==undefined){
-Effect={};
-}
-Effect.SizeAndPosition=Class.create();
-Effect.SizeAndPosition.prototype={initialize:function(_153,x,y,w,h,_154,_155,_156){
-this.element=$(_153);
-this.x=x;
-this.y=y;
-this.w=w;
-this.h=h;
-this.duration=_154;
-this.steps=_155;
-this.options=arguments[7]||{};
+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 _157=Math.round(this.duration/this.steps);
-var _158=this.element.offsetLeft;
-var _159=this.element.offsetTop;
-var _160=this.element.offsetWidth;
-var _161=this.element.offsetHeight;
-this.x=(this.x)?this.x:_158;
-this.y=(this.y)?this.y:_159;
-this.w=(this.w)?this.w:_160;
-this.h=(this.h)?this.h:_161;
-var difX=this.steps>0?(this.x-_158)/this.steps:0;
-var difY=this.steps>0?(this.y-_159)/this.steps:0;
-var difW=this.steps>0?(this.w-_160)/this.steps:0;
-var difH=this.steps>0?(this.h-_161)/this.steps:0;
-this.moveBy(difX,difY);
-this.resizeBy(difW,difH);
-this.duration-=_157;
+ },
+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),_157);
-},isFinished:function(){
-return this.steps<=0;
-},moveBy:function(difX,difY){
-var _162=this.element.offsetLeft;
-var _163=this.element.offsetTop;
-var _164=parseInt(difX);
-var _165=parseInt(difY);
-var _166=this.element.style;
-if(_164!=0){
-_166.left=(_162+_164)+"px";
-}
-if(_165!=0){
-_166.top=(_163+_165)+"px";
-}
-},resizeBy:function(difW,difH){
-var _167=this.element.offsetWidth;
-var _168=this.element.offsetHeight;
-var _169=parseInt(difW);
-var _170=parseInt(difH);
-var _171=this.element.style;
-if(_169!=0){
-_171.width=(_167+_169)+"px";
-}
-if(_170!=0){
-_171.height=(_168+_170)+"px";
-}
-}};
-Effect.Size=Class.create();
-Effect.Size.prototype={initialize:function(_172,w,h,_173,_174,_175){
-new Effect.SizeAndPosition(_172,null,null,w,h,_173,_174,_175);
-}};
-Effect.Position=Class.create();
-Effect.Position.prototype={initialize:function(_176,x,y,_177,_178,_179){
-new Effect.SizeAndPosition(_176,x,y,null,null,_177,_178,_179);
-}};
-Effect.Round=Class.create();
-Effect.Round.prototype={initialize:function(_180,_181,_182){
-var _183=document.getElementsByTagAndClassName(_180,_181);
-for(var i=0;i<_183.length;i++){
-Rico.Corner.round(_183[i],_182);
-}
-}};
-Effect.FadeTo=Class.create();
-Effect.FadeTo.prototype={initialize:function(_184,_185,_186,_187,_188){
-this.element=$(_184);
-this.opacity=_185;
-this.duration=_186;
-this.steps=_187;
-this.options=arguments[4]||{};
+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 _189=Math.round(this.duration/this.steps);
-var _190=this.getElementOpacity();
-var _191=this.steps>0?(this.opacity-_190)/this.steps:0;
-this.changeOpacityBy(_191);
-this.duration-=_189;
-this.steps--;
-this.timer=setTimeout(this.fadeTo.bind(this),_189);
-},changeOpacityBy:function(v){
-var _192=this.getElementOpacity();
-var _193=Math.max(0,Math.min(_192+v,1));
-this.element.ricoOpacity=_193;
-this.element.style.filter="alpha(opacity:"+Math.round(_193*100)+")";
-this.element.style.opacity=_193;
-},isFinished:function(){
-return this.steps<=0;
-},getElementOpacity:function(){
-if(this.element.ricoOpacity==undefined){
-var _194=RicoUtil.getElementsComputedStyle(this.element,"opacity");
-this.element.ricoOpacity=_194!=undefined?_194:1;
-}
-return parseFloat(this.element.ricoOpacity);
-}};
-Effect.AccordionSize=Class.create();
-Effect.AccordionSize.prototype={initialize:function(e1,e2,_195,end,_196,_197,_198){
-this.e1=$(e1);
-this.e2=$(e2);
-this.start=_195;
-this.end=end;
-this.duration=_196;
-this.steps=_197;
-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 _199=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-=_199;
+ },
+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.accordionSize.bind(this),_199);
-},isFinished:function(){
-return this.steps<=0;
-},resizeBy:function(diff){
-var _200=this.e1.offsetHeight;
-var _201=this.e2.offsetHeight;
-var _202=parseInt(diff);
-if(diff!=0){
-this.e1.style.height=(_200-_202)+"px";
-this.e2.style.height=(_201+_202)+"px";
-}
-}};
-Rico.LiveGridMetaData=Class.create();
-Rico.LiveGridMetaData.prototype={initialize:function(_203,_204,_205,_206){
-this.pageSize=_203;
-this.totalRows=_204;
-this.setOptions(_206);
-this.ArrowHeight=16;
-this.columnCount=_205;
-},setOptions:function(_207){
-this.options={largeBufferSize:7,nearLimitFactor:0.2};
-Object.extend(this.options,_207||{});
-},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(_208,_209){
-this.isIE=navigator.userAgent.toLowerCase().indexOf("msie")>=0;
-this.liveGrid=_208;
-this.metaData=_208.metaData;
-this.createScrollBar();
-this.scrollTimeout=null;
-this.lastScrollPos=0;
-this.viewPort=_209;
-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 _210=$(this.liveGrid.tableId+"_header");
-if(_210){
-_210.rows[0].cells[0].style.width=(_210.rows[0].cells[0].offsetWidth+1)+"px";
-}
-},createScrollBar:function(){
-var _211=this.liveGrid.viewPort.visibleHeight();
-this.scrollerDiv=document.createElement("div");
-var _212=this.scrollerDiv.style;
-_212.borderRight=this.liveGrid.options.scrollerBorderRight;
-_212.position="relative";
-_212.left=this.isIE?"-6px":"-3px";
-_212.width="19px";
-_212.height=_211+"px";
-_212.overflow="auto";
-this.heightDiv=document.createElement("div");
-this.heightDiv.style.width="1px";
-this.heightDiv.style.height=parseInt(_211*this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";
-this.scrollerDiv.appendChild(this.heightDiv);
-this.scrollerDiv.onscroll=this.handleScroll.bindAsEventListener(this);
-var _213=this.liveGrid.table;
-_213.parentNode.parentNode.insertBefore(this.scrollerDiv,_213.parentNode.nextSibling);
-var _214=this.isIE?"mousewheel":"DOMMouseScroll";
-Event.observe(_213,_214,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 _216=this.liveGrid.table;
-var _217=this.viewPort.visibleHeight();
-this.heightDiv.style.height=parseInt(_217*this.metaData.getTotalRows()/this.metaData.getPageSize())+"px";
-},rowToPixel:function(_218){
-return (_218/this.metaData.getTotalRows())*this.heightDiv.offsetHeight;
-},moveScroll:function(_219){
-this.scrollerDiv.scrollTop=this.rowToPixel(_219);
-if(this.metaData.options.onscroll){
-this.metaData.options.onscroll(this.liveGrid,_219);
-}
-},handleScroll:function(){
-if(this.scrollTimeout){
-clearTimeout(this.scrollTimeout);
-}
-var _220=this.lastScrollPos-this.scrollerDiv.scrollTop;
-if(_220!=0){
-var r=this.scrollerDiv.scrollTop%this.viewPort.rowHeight;
-if(r!=0){
-this.unplug();
-if(_220<0){
-this.scrollerDiv.scrollTop+=(this.viewPort.rowHeight-r);
-}else{
-this.scrollerDiv.scrollTop-=r;
-}
-this.plugin();
-}
-}
-var _222=parseInt(this.scrollerDiv.scrollTop/this.viewPort.rowHeight);
-this.liveGrid.requestContentRefresh(_222);
-this.viewPort.scrollTo(this.scrollerDiv.scrollTop);
-if(this.metaData.options.onscroll){
-this.metaData.options.onscroll(this.liveGrid,_222);
-}
-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(_223,_224){
-this.startPos=0;
-this.size=0;
-this.metaData=_223;
-this.rows=new Array();
-this.updateInProgress=false;
-this.viewPort=_224;
-this.maxBufferSize=_223.getLargeBufferSize()*2;
-this.maxFetchSize=_223.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(_225){
-var _226=_225.getElementsByTagName("rows")[0];
-this.updateUI=_226.getAttribute("update_ui")=="true";
-var _227=new Array();
-var trs=_226.getElementsByTagName("tr");
-for(var i=0;i<trs.length;i++){
-var row=_227[i]=new Array();
-var _230=trs[i].getElementsByTagName("td");
-for(var j=0;j<_230.length;j++){
-var cell=_230[j];
-var _232=cell.getAttribute("convert_spaces")=="true";
-var _233=RicoUtil.getContentAsString(cell);
-row[j]=_232?this.convertSpaces(_233):_233;
-if(!row[j]){
-row[j]="&nbsp;";
-}
-}
-}
-return _227;
-},update:function(_234,_235){
-var _236=this.loadRows(_234);
-if(this.rows.length==0){
-this.rows=_236;
-this.size=this.rows.length;
-this.startPos=_235;
-return;
-}
-if(_235>this.startPos){
-if(this.startPos+this.rows.length<_235){
-this.rows=_236;
-this.startPos=_235;
-}else{
-this.rows=this.rows.concat(_236.slice(0,_236.length));
-if(this.rows.length>this.maxBufferSize){
-var _237=this.rows.length;
-this.rows=this.rows.slice(this.rows.length-this.maxBufferSize,this.rows.length);
-this.startPos=this.startPos+(_237-this.rows.length);
-}
-}
-}else{
-if(_235+_236.length<this.startPos){
-this.rows=_236;
-}else{
-this.rows=_236.slice(0,this.startPos).concat(this.rows);
-if(this.rows.length>this.maxBufferSize){
-this.rows=this.rows.slice(0,this.maxBufferSize);
-}
-}
-this.startPos=_235;
-}
-this.size=this.rows.length;
-},clear:function(){
-this.rows=new Array();
-this.startPos=0;
-this.size=0;
-},isOverlapping:function(_238,size){
-return ((_238<this.endPos())&&(this.startPos<_238+size))||(this.endPos()==0);
-},isInRange:function(_240){
-return (_240>=this.startPos)&&(_240+this.metaData.getPageSize()<=this.endPos());
-},isNearingTopLimit:function(_241){
-return _241-this.startPos<this.metaData.getLimitTolerance();
-},endPos:function(){
-return this.startPos+this.rows.length;
-},isNearingBottomLimit:function(_242){
-return this.endPos()-(_242+this.metaData.getPageSize())<this.metaData.getLimitTolerance();
-},isAtTop:function(){
-return this.startPos==0;
-},isAtBottom:function(){
-return this.endPos()==this.metaData.getTotalRows();
-},isNearingLimit:function(_243){
-return (!this.isAtTop()&&this.isNearingTopLimit(_243))||(!this.isAtBottom()&&this.isNearingBottomLimit(_243));
-},getFetchSize:function(_244){
-var _245=this.getFetchOffset(_244);
-var _246=0;
-if(_245>=this.startPos){
-var _247=this.maxFetchSize+_245;
-if(_247>this.metaData.totalRows){
-_247=this.metaData.totalRows;
-}
-_246=_247-_245;
-if(_245==0&&_246<this.maxFetchSize){
-_246=this.maxFetchSize;
-}
-}else{
-var _246=this.startPos-_245;
-if(_246>this.maxFetchSize){
-_246=this.maxFetchSize;
-}
-}
-return _246;
-},getFetchOffset:function(_248){
-var _249=_248;
-if(_248>this.startPos){
-_249=(_248>this.endPos())?_248:this.endPos();
-}else{
-if(_248+this.maxFetchSize>=this.startPos){
-var _249=this.startPos-this.maxFetchSize;
-if(_249<0){
-_249=0;
-}
-}
-}
-this.lastOffset=_249;
-return _249;
-},getRows:function(_250,_251){
-var _252=_250-this.startPos;
-var _253=_252+_251;
-if(_253>this.size){
-_253=this.size;
-}
-var _254=new Array();
-var _255=0;
-for(var i=_252;i<_253;i++){
-_254[_255++]=this.rows[i];
-}
-return _254;
-},convertSpaces:function(s){
-return s.split(" ").join("&nbsp;");
-}};
-Rico.GridViewPort=Class.create();
-Rico.GridViewPort.prototype={initialize:function(_256,_257,_258,_259,_260){
-this.lastDisplayedStartPos=0;
-this.div=_256.parentNode;
-this.table=_256;
-this.rowHeight=_257;
-this.div.style.height=this.rowHeight*_258;
-this.div.style.overflow="hidden";
-this.buffer=_259;
-this.liveGrid=_260;
-this.visibleRows=_258+1;
-this.lastPixelOffset=0;
-this.startPos=0;
-},populateRow:function(_261,row){
-for(var j=0;j<row.length;j++){
-_261.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(_262){
-if(_262==this.lastRowPos&&!this.isPartialBlank&&!this.isBlank){
-return;
-}
-if((_262+this.visibleRows<this.buffer.startPos)||(this.buffer.startPos+this.buffer.size<_262)||(this.buffer.size==0)){
-this.clearRows();
-return;
-}
-this.isBlank=false;
-var _263=this.buffer.startPos>_262;
-var _264=_263?this.buffer.startPos:_262;
-var _265=(this.buffer.startPos+this.buffer.size<_262+this.visibleRows)?this.buffer.startPos+this.buffer.size:_262+this.visibleRows;
-var _266=_265-_264;
-var rows=this.buffer.getRows(_264,_266);
-var _268=this.visibleRows-_266;
-var _269=_263?0:_266;
-var _270=_263?_268:0;
-for(var i=0;i<rows.length;i++){
-this.populateRow(this.table.rows[i+_270],rows[i]);
-}
-for(var i=0;i<_268;i++){
-this.populateRow(this.table.rows[i+_269],this.buffer.getBlankRow());
-}
-this.isPartialBlank=_268>0;
-this.lastRowPos=_262;
-this.liveGrid.table.className=this.liveGrid.options.tableClass;
-var _271=this.liveGrid.options.onRefreshComplete;
-if(_271!=null){
-_271();
-}
-},scrollTo:function(_272){
-if(this.lastPixelOffset==_272){
-return;
-}
-this.refreshContents(parseInt(_272/this.rowHeight));
-this.div.scrollTop=_272%this.rowHeight;
-this.lastPixelOffset=_272;
-},visibleHeight:function(){
-return parseInt(RicoUtil.getElementsComputedStyle(this.div,"height"));
-}};
-Rico.LiveGridRequest=Class.create();
-Rico.LiveGridRequest.prototype={initialize:function(_273,_274){
-this.requestOffset=_273;
-}};
-Rico.LiveGrid=Class.create();
-Rico.LiveGrid.prototype={initialize:function(_275,_276,_277,url,_279,_280){
-this.options={tableClass:$(_275).className,loadingClass:$(_275).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,_279||{});
-this.ajaxOptions={parameters:null};
-Object.extend(this.ajaxOptions,_280||{});
-this.tableId=_275;
-this.table=$(_275);
-this.addLiveGridHtml();
-var _281=this.table.rows[0].cells.length;
-this.metaData=new Rico.LiveGridMetaData(_276,_277,_281,_279);
-this.buffer=new Rico.LiveGridBuffer(this.metaData);
-var _282=this.table.rows.length;
-this.viewPort=new Rico.GridViewPort(this.table,this.table.offsetHeight/_282,_276,this.buffer,this);
-this.scroller=new Rico.LiveGridScroller(this,this.viewPort);
-this.options.sortHandler=this.sortHandler.bind(this);
-if($(_275+"_header")){
-this.sort=new Rico.LiveGridSort(_275+"_header",this.options);
-}
-this.processingRequest=null;
-this.unprocessedRequest=null;
-this.initAjax(url);
-if(this.options.prefetchBuffer||this.options.prefetchOffset>0){
-var _283=0;
-if(this.options.offset){
-_283=this.options.offset;
-this.scroller.moveScroll(_283);
-this.viewPort.scrollTo(this.scroller.rowToPixel(_283));
-}
-if(this.options.sortCol){
-this.sortCol=_279.sortCol;
-this.sortDir=_279.sortDir;
-}
-this.requestContentRefresh(_283);
-}
-},addLiveGridHtml:function(){
-if(this.table.getElementsByTagName("thead").length>0){
-var _284=this.table.cloneNode(true);
-_284.setAttribute("id",this.tableId+"_header");
-_284.setAttribute("class",this.table.className+"_header");
-for(var i=0;i<_284.tBodies.length;i++){
-_284.removeChild(_284.tBodies[i]);
-}
-this.table.deleteTHead();
-this.table.parentNode.insertBefore(_284,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(_285){
-this.sortCol=_285.name;
-this.sortDir=_285.currentSort;
-this.resetContents();
-this.requestContentRefresh(0);
-},setTotalRows:function(_286){
-this.resetContents();
-this.metaData.setTotalRows(_286);
-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(_287){
-if(this.buffer.isInRange(_287)&&!this.buffer.isNearingLimit(_287)){
-return;
-}
-if(this.processingRequest){
-this.unprocessedRequest=new Rico.LiveGridRequest(_287);
-return;
-}
-var _288=this.buffer.getFetchOffset(_287);
-this.processingRequest=new Rico.LiveGridRequest(_287);
-this.processingRequest.bufferOffset=_288;
-var _289=this.buffer.getFetchSize(_287);
-var _290=false;
-var _291;
-if(this.options.requestParameters){
-_291=this._createQueryString(this.options.requestParameters,0);
-}
-_291=(_291==null)?"":_291+"&";
-_291=_291+"id="+this.tableId+"&page_size="+_289+"&offset="+_288;
-if(this.sortCol){
-_291=_291+"&sort_col="+escape(this.sortCol)+"&sort_dir="+this.sortDir;
-}
-this.ajaxOptions.parameters=_291;
-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(_292){
-this.fetchBuffer(_292);
-},ajaxUpdate:function(_293){
-try{
-clearTimeout(this.timeoutHandler);
-this.buffer.update(_293,this.processingRequest.bufferOffset);
-this.viewPort.bufferChanged();
-}
-catch(err){
-}
-finally{
-this.processingRequest=null;
-}
-this.processQueuedRequest();
-},_createQueryString:function(_294,_295){
-var _296="";
-if(!_294){
-return _296;
-}
-for(var i=_295;i<_294.length;i++){
-if(i!=_295){
-_296+="&";
-}
-var _297=_294[i];
-if(_297.name!=undefined&&_297.value!=undefined){
-_296+=_297.name+"="+escape(_297.value);
-}else{
-var ePos=_297.indexOf("=");
-var _299=_297.substring(0,ePos);
-var _300=_297.substring(ePos+1);
-_296+=_299+"="+escape(_300);
-}
-}
-return _296;
-},processQueuedRequest:function(){
-if(this.unprocessedRequest!=null){
-this.requestContentRefresh(this.unprocessedRequest.requestOffset);
-this.unprocessedRequest=null;
-}
-}};
-Rico.LiveGridSort=Class.create();
-Rico.LiveGridSort.prototype={initialize:function(_301,_302){
-this.headerTableId=_301;
-this.headerTable=$(_301);
-this.options=_302;
-this.setOptions();
-this.applySortBehavior();
-if(this.options.sortCol){
-this.setSortUI(this.options.sortCol,this.options.sortDir);
-}
-},setSortUI:function(_303,_304){
-var cols=this.options.columns;
-for(var i=0;i<cols.length;i++){
-if(cols[i].name==_303){
-this.setColumnSort(i,_304);
-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 _306=this.headerTable.rows[0];
-var _307=_306.cells;
-for(var i=0;i<_307.length;i++){
-this.addSortBehaviorToColumn(i,_307[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 _308=evt.target?evt.target:evt.srcElement;
-var _309=_308.id;
-var _310=parseInt(_309.substring(_309.lastIndexOf("_")+1));
-var _311=this.getSortedColumnIndex();
-if(_311!=-1){
-if(_311!=_310){
-this.removeColumnSort(_311);
-this.setColumnSort(_310,Rico.TableColumn.SORT_ASC);
-}else{
-this.toggleColumnSort(_311);
-}
-}else{
-this.setColumnSort(_310,Rico.TableColumn.SORT_ASC);
-}
-if(this.options.sortHandler){
-this.options.sortHandler(this.options.columns[_310]);
-}
-},removeColumnSort:function(n){
-this.options.columns[n].setUnsorted();
-this.setSortImage(n);
-},setColumnSort:function(n,_312){
-this.options.columns[n].setSorted(_312);
-this.setSortImage(n);
-},toggleColumnSort:function(n){
-this.options.columns[n].toggleSort();
-this.setSortImage(n);
-},setSortImage:function(n){
-var _313=this.options.columns[n].getSortDirection();
-var _314=$(this.headerTableId+"_img_"+n);
-if(_313==Rico.TableColumn.UNSORTED){
-_314.innerHTML="&nbsp;&nbsp;";
-}else{
-if(_313==Rico.TableColumn.SORT_ASC){
-_314.innerHTML="&nbsp;&nbsp;<img width=\""+this.options.sortImageWidth+"\" "+"height=\""+this.options.sortImageHeight+"\" "+"src=\""+this.options.sortAscendImg+"\"/>";
-}else{
-if(_313==Rico.TableColumn.SORT_DESC){
-_314.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 _315=new Array();
-var _316=this.headerTable.rows[0];
-var _317=_316.cells;
-for(var i=0;i<_317.length;i++){
-_315.push(new Rico.TableColumn(this.deriveColumnNameFromCell(_317[i],i),true));
-}
-return _315;
-},convertToTableColumns:function(cols){
-var _318=new Array();
-for(var i=0;i<cols.length;i++){
-_318.push(new Rico.TableColumn(cols[i][0],cols[i][1]));
-}
-return _318;
-},deriveColumnNameFromCell:function(cell,_319){
-var _320=cell.innerText!=undefined?cell.innerText:cell.textContent;
-return _320?_320.toLowerCase().split(" ").join("_"):"col_"+_319;
-}};
-Rico.TableColumn=Class.create();
-Rico.TableColumn.UNSORTED=0;
-Rico.TableColumn.SORT_ASC="ASC";
-Rico.TableColumn.SORT_DESC="DESC";
-Rico.TableColumn.prototype={initialize:function(name,_322){
-this.name=name;
-this.sortable=_322;
-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(_323){
-this.setSorted(Rico.TableColumn.UNSORTED);
-},setSorted:function(_324){
-this.currentSort=_324;
-}};
-Rico.ArrayExtensions=new Array();
-if(Object.prototype.extend){
-Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Object.prototype.extend;
-}else{
-Object.prototype.extend=function(_325){
-return Object.extend.apply(this,[this,_325]);
-};
-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;
-}
-}
+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;
+ }
};
-Rico.ArrayExtensions[Rico.ArrayExtensions.length]=Array.prototype.removeItem;
-}
-if(!Array.prototype.indices){
-Array.prototype.indices=function(){
-var _327=new Array();
-for(index in this){
-var _328=false;
-for(var i=0;i<Rico.ArrayExtensions.length;i++){
-if(this[index]==Rico.ArrayExtensions[i]){
-_328=true;
-break;
-}
-}
-if(!_328){
-_327[_327.length]=index;
-}
-}
-return _327;
-};
-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(_330,_331){
-if(_330==null){
-_330="*";
-}
-var _332=document.getElementsByTagName(_330)||document.all;
-var _333=new Array();
-if(_331==null){
-return _332;
-}
-for(var i=0;i<_332.length;i++){
-var _334=_332[i];
-var _335=_334.className.split(" ");
-for(var j=0;j<_335.length;j++){
-if(_335[j]==_331){
-_333.push(_334);
-break;
-}
-}
-}
-return _333;
+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
};
-var RicoUtil={getElementsComputedStyle:function(_336,_337,_338){
-if(arguments.length==2){
-_338=_337;
-}
-var el=$(_336);
-if(el.currentStyle){
-return el.currentStyle[_337];
-}else{
-return document.defaultView.getComputedStyle(el,null).getPropertyValue(_338);
-}
-},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(_340){
-return _340.xml!=undefined?this._getContentAsStringIE(_340):this._getContentAsStringMozilla(_340);
-},_getContentAsStringIE:function(_341){
-var _342="";
-for(var i=0;i<_341.childNodes.length;i++){
-var n=_341.childNodes[i];
-if(n.nodeType==4){
-_342+=n.nodeValue;
-}else{
-_342+=n.xml;
-}
-}
-return _342;
-},_getContentAsStringMozilla:function(_343){
-var _344=new XMLSerializer();
-var _345="";
-for(var i=0;i<_343.childNodes.length;i++){
-var n=_343.childNodes[i];
-if(n.nodeType==4){
-_345+=n.nodeValue;
-}else{
-_345+=_344.serializeToString(n);
-}
-}
-return _345;
-},toViewportPosition:function(_346){
-return this._toAbsolute(_346,true);
-},toDocumentPosition:function(_347){
-return this._toAbsolute(_347,false);
-},_toAbsolute:function(_348,_349){
-if(navigator.userAgent.toLowerCase().indexOf("msie")==-1){
-return this._toAbsoluteMozilla(_348,_349);
-}
-var x=0;
-var y=0;
-var _350=_348;
-while(_350){
-var _351=0;
-var _352=0;
-if(_350!=_348){
-var _351=parseInt(this.getElementsComputedStyle(_350,"borderLeftWidth"));
-var _352=parseInt(this.getElementsComputedStyle(_350,"borderTopWidth"));
-_351=isNaN(_351)?0:_351;
-_352=isNaN(_352)?0:_352;
-}
-x+=_350.offsetLeft-_350.scrollLeft+_351;
-y+=_350.offsetTop-_350.scrollTop+_352;
-_350=_350.offsetParent;
-}
-if(_349){
-x-=this.docScrollLeft();
-y-=this.docScrollTop();
-}
-return {x:x,y:y};
-},_toAbsoluteMozilla:function(_353,_354){
-var x=0;
-var y=0;
-var _355=_353;
-while(_355){
-x+=_355.offsetLeft;
-y+=_355.offsetTop;
-_355=_355.offsetParent;
-}
-_355=_353;
-while(_355&&_355!=document.body&&_355!=document.documentElement){
-if(_355.scrollLeft){
-x-=_355.scrollLeft;
-}
-if(_355.scrollTop){
-y-=_355.scrollTop;
-}
-_355=_355.parentNode;
-}
-if(_354){
-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(_356,_357){
-this.options={tableClass:$(_356).className||"",loadingClass:$(_356).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,_357||{});
-this.tableId=_356;
-this.table=$(_356);
+Object.extend(this.options, options || {});
+this.tableId = tableId;
+this.table = $(tableId);
this.addLiveGridHtml();
-var _358=this.table.rows[0].cells.length;
-this.metaData=new Rico.LiveGridMetaData(this.options.visibleRows,this.options.totalRows,_358,_357);
-this.buffer=new Rico.LiveGridBuffer(this.metaData);
-var _359=this.table.rows.length;
-this.viewPort=new Rico.GridViewPort(this.table,this.table.offsetHeight/_359,this.options.visibleRows,this.buffer,this);
-this.scroller=new Rico.LiveGridScroller(this,this.viewPort);
-this.options.sortHandler=this.sortHandler.bind(this);
-if($(_356+"_header")){
-this.sort=new Rico.LiveGridSort(_356+"_header",this.options);
-}
-this.processingRequest=null;
-this.unprocessedRequest=null;
-if(this.options.initialOffset>=0){
-var _360=this.options.initialOffset;
-this.scroller.moveScroll(_360);
-this.viewPort.scrollTo(this.scroller.rowToPixel(_360));
-if(this.options.sortCol){
-this.sortCol=_357.sortCol;
-this.sortDir=_357.sortDir;
-}
-var grid=this;
-setTimeout(function(){
-grid.requestContentRefresh(_360);
-},100);
-}
-},fetchBuffer:function(_362){
-if(this.buffer.isInRange(_362)&&!this.buffer.isNearingLimit(_362)){
-return;
-}
-if(this.processingRequest){
-this.unprocessedRequest=new Rico.LiveGridRequest(_362);
-return;
-}
-var _363=this.buffer.getFetchOffset(_362);
-this.processingRequest=new Rico.LiveGridRequest(_362);
-this.processingRequest.bufferOffset=_363;
-var _364=this.buffer.getFetchSize(_362);
-var _365=false;
-var _366={"page_size":_364,"offset":_363};
-if(this.sortCol){
-Object.extend(_366,{"sort_col":this.sortCol,"sort_dir":this.sortDir});
-}
-Prado.Callback(this.tableId,_366,this.ajaxUpdate.bind(this),this.options);
-this.timeoutHandler=setTimeout(this.handleTimedOut.bind(this),this.options.bufferTimeout);
-},ajaxUpdate:function(_367,_368){
-try{
-clearTimeout(this.timeoutHandler);
-this.buffer.update(_367,this.processingRequest.bufferOffset);
-this.viewPort.bufferChanged();
-}
-catch(err){
-}
-finally{
-this.processingRequest=null;
-}
+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(_369,_370){
-if(this.rows.length==0){
-this.rows=_369;
-this.size=this.rows.length;
-this.startPos=_370;
-return;
-}
-if(_370>this.startPos){
-if(this.startPos+this.rows.length<_370){
-this.rows=_369;
-this.startPos=_370;
-}else{
-this.rows=this.rows.concat(_369.slice(0,_369.length));
-if(this.rows.length>this.maxBufferSize){
-var _371=this.rows.length;
-this.rows=this.rows.slice(this.rows.length-this.maxBufferSize,this.rows.length);
-this.startPos=this.startPos+(_371-this.rows.length);
-}
-}
-}else{
-if(_370+_369.length<this.startPos){
-this.rows=_369;
-}else{
-this.rows=_369.slice(0,this.startPos).concat(this.rows);
-if(this.rows.length>this.maxBufferSize){
-this.rows=this.rows.slice(0,this.maxBufferSize);
-}
-}
-this.startPos=_370;
-}
-this.size=this.rows.length;
-}});
-Object.extend(Rico.GridViewPort.prototype,{populateRow:function(_372,row){
-if(isdef(_372)){
-for(var j=0;j<row.length;j++){
-_372.cells[j].innerHTML=row[j];
-}
-}
-}});
-
+ }
+});
+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]
+}
+ }
+ }
+});
diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js
index 867efc22..7d343d87 100644
--- a/framework/Web/Javascripts/js/validator.js
+++ b/framework/Web/Javascripts/js/validator.js
@@ -1,583 +1,507 @@
-Prado.Validation=Class.create();
-Prado.Validation.Util=Class.create();
-Prado.Validation.Util.toInteger=function(_1){
-var _2=/^\s*[-\+]?\d+\s*$/;
-if(_1.match(_2)==null){
-return null;
-}
-var _3=parseInt(_1,10);
-return (isNaN(_3)?null:_3);
-};
-Prado.Validation.Util.toDouble=function(_4,_5){
-_5=undef(_5)?".":_5;
-var _6=new RegExp("^\\s*([-\\+])?(\\d+)?(\\"+_5+"(\\d+))?\\s*$");
-var m=_4.match(_6);
-if(m==null){
-return null;
-}
-var _8=m[1]+(m[2].length>0?m[2]:"0")+"."+m[4];
-var _9=parseFloat(_8);
-return (isNaN(_9)?null:_9);
-};
-Prado.Validation.Util.toCurrency=function(_10,_11,_12,_13){
-_11=undef(_11)?",":_11;
-_13=undef(_13)?".":_13;
-_12=undef(_12)?2:_12;
-var exp=new RegExp("^\\s*([-\\+])?(((\\d+)\\"+_11+")*)(\\d+)"+((_12>0)?"(\\"+_13+"(\\d{1,"+_12+"}))?":"")+"\\s*$");
-var m=_10.match(exp);
-if(m==null){
-return null;
-}
-var _15=m[2]+m[5];
-var _16=m[1]+_15.replace(new RegExp("(\\"+_11+")","g"),"")+((_12>0)?"."+m[7]:"");
-var num=parseFloat(_16);
-return (isNaN(num)?null:num);
-};
-Prado.Validation.Util.toDate=function(_18,_19){
-var y=0;
-var m=-1;
-var d=0;
-var a=_18.split(/\W+/);
-var b=_19.match(/%./g);
-var i=0,j=0;
-var hr=0;
-var min=0;
-for(i=0;i<a.length;++i){
-if(!a[i]){
-continue;
-}
-switch(b[i]){
-case "%d":
-case "%e":
-d=parseInt(a[i],10);
-break;
-case "%m":
-m=parseInt(a[i],10)-1;
-break;
-case "%Y":
-case "%y":
-y=parseInt(a[i],10);
-(y<100)&&(y+=(y>29)?1900:2000);
-break;
-case "%H":
-case "%I":
-case "%k":
-case "%l":
-hr=parseInt(a[i],10);
-break;
-case "%P":
-case "%p":
-if(/pm/i.test(a[i])&&hr<12){
-hr+=12;
-}
-break;
-case "%M":
-min=parseInt(a[i],10);
-break;
-}
-}
-if(y!=0&&m!=-1&&d!=0){
-var _27=new Date(y,m,d,hr,min,0);
-return (isObject(_27)&&y==_27.getFullYear()&&m==_27.getMonth()&&d==_27.getDate())?_27.valueOf():null;
-}
-return null;
-};
-Prado.Validation.trim=function(_28){
-if(isString(_28)){
-return _28.trim();
+
+Prado.Validation =Class.create();
+Object.extend(Prado.Validation,
+{
+managers : {},
+validate : function(formID, groupID)
+{
+if(this.managers[formID])
+{
+return this.managers[formID].validate(groupID);
+}
+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.");
+},
+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 "";
-};
-Prado.Validation.Util.focus=function(_29){
-var obj=$(_29);
-if(isObject(obj)&&isdef(obj.focus)){
-setTimeout(function(){
-obj.focus();
-},100);
+});
+Prado.Validation.prototype =
+{
+validators : [],
+summaries : [],
+groups : [],
+options : {},
+initialize : function(options)
+{
+this.options = options;
+Prado.Validation.managers[options.FormID] = this;
+},
+validate : function(group)
+{
+if(group)
+return this._validateGroup(group);
+else
+return this._validateNonGroup();
+},
+_validateGroup: function(groupID)
+{
+var valid = true;
+var manager = this;
+if(this.groups.include(groupID))
+{
+this.validators.each(function(validator)
+{
+if(validator.group == groupID)
+valid = valid & validator.validate(manager);
+else
+validator.hide();
+});
}
-return false;
-};
-Prado.Validation.validators=[];
-Prado.Validation.forms=[];
-Prado.Validation.summaries=[];
-Prado.Validation.groups=[];
-Prado.Validation.TargetGroups={};
-Prado.Validation.CurrentTargetGroup=null;
-Prado.Validation.HasTargetGroup=false;
-Prado.Validation.ActiveTarget=null;
-Prado.Validation.IsGroupValidation=false;
-Prado.Validation.AddForm=function(id){
-Prado.Validation.forms.push($(id));
-};
-Prado.Validation.AddTarget=function(id,_32){
-var _33=$(id);
-Event.observe(_33,"click",function(){
-Prado.Validation.ActiveTarget=_33;
-Prado.Validation.CurrentTargetGroup=Prado.Validation.TargetGroups[id];
+this.updateSummary(groupID, true);
+return valid;
+},
+_validateNonGroup : function()
+{
+var valid = true;
+var manager = this;
+this.validators.each(function(validator)
+{
+if(!validator.group)
+valid = valid & validator.validate(manager);
+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;
});
-if(_32){
-Prado.Validation.TargetGroups[id]=_32;
-Prado.Validation.HasTargetGroup=true;
}
-};
-Prado.Validation.SetActiveGroup=function(_34,_35){
-Prado.Validation.ActiveTarget=_34;
-Prado.Validation.CurrentTargetGroup=_35;
-};
-Prado.Validation.AddGroup=function(_36,_37){
-_36.active=false;
-_36.target=$(_36.target);
-_36.validators=_37;
-Prado.Validation.groups.push(_36);
-Event.observe(_36.target,"click",Prado.Validation.UpdateActiveGroup);
-};
-Prado.Validation.UpdateActiveGroup=function(ev){
-var _39=Prado.Validation.groups;
-for(var i=0;i<_39.length;i++){
-_39[i].active=(isdef(ev)&&_39[i].target==Event.element(ev));
+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.Validation.IsGroupValidation=isdef(ev);
};
-Prado.Validation.IsValid=function(_40){
-var _41=true;
-var _42=Prado.Validation.validators;
-for(var i=0;i<_42.length;i++){
-_42[i].enabled=!_42[i].control||undef(_42[i].control.form)||_42[i].control.form==_40;
-_42[i].visible=Prado.Validation.IsGroupValidation?_42[i].inActiveGroup():true;
-if(Prado.Validation.HasTargetGroup){
-_42[i].enabled=Prado.Validation.CurrentTargetGroup==_42[i].group;
-}
-_41&=_42[i].validate();
-}
-Prado.Validation.ShowSummary(_40);
-Prado.Validation.UpdateActiveGroup();
-return _41;
-};
-Prado.Validation.prototype={initialize:function(_43,_44){
-this.evaluateIsValid=_43;
-this.attr=undef(_44)?[]:_44;
-this.message=$(_44.id);
-this.control=$(_44.controltovalidate);
-this.enabled=isdef(_44.enabled)?_44.enabled:true;
-this.visible=isdef(_44.visible)?_44.visible:true;
-this.group=isdef(_44.validationgroup)?_44.validationgroup:null;
-this.isValid=true;
-Prado.Validation.validators.push(this);
-if(this.evaluateIsValid){
-this.evaluateIsValid.bind(this);
-}
-},validate:function(){
-if(this.visible&&this.enabled&&this.evaluateIsValid){
-this.isValid=this.evaluateIsValid();
-}else{
-this.isValid=true;
-}
-this.observe();
-this.update();
-return this.isValid;
-},update:function(){
-if(this.attr.display=="Dynamic"){
-this.isValid?Element.hide(this.message):Element.show(this.message);
-}
-if(this.message){
-this.message.style.visibility=this.isValid?"hidden":"visible";
-}
-var _45=this.attr.controlcssclass;
-if(this.control&&isString(_45)&&_45.length>0){
-Element.condClassName(this.control,_45,!this.isValid);
-}
-Prado.Validation.ShowSummary();
-var _46=this.attr.focusonerror;
-var _47=Prado.Validation.HasTargetGroup;
-var _48=this.group==Prado.Validation.CurrentTargetGroup;
-if(_46&&(!_47||(_47&&_48))){
-Prado.Element.focus(this.attr.focuselementid);
-}
-},setValid:function(_49){
-this.isValid=_49;
-this.update();
-},observe:function(){
-if(undef(this.observing)){
-if(this.control&&this.control.form){
-Event.observe(this.control,"change",this.validate.bind(this));
-}
-this.observing=true;
-}
-},convert:function(_50,_51){
-if(undef(_51)){
-_51=Form.Element.getValue(this.control);
-}
-switch(_50){
-case "Integer":
-return Prado.Validation.Util.toInteger(_51);
-case "Double":
-case "Float":
-return Prado.Validation.Util.toDouble(_51,this.attr.decimalchar);
-case "Currency":
-return Prado.Validation.Util.toCurrency(_51,this.attr.groupchar,this.attr.digits,this.attr.decimalchar);
-case "Date":
-return Prado.Validation.Util.toDate(_51,this.attr.dateformat);
-}
-return _51.toString();
-},inActiveGroup:function(){
-var _52=Prado.Validation.groups;
-for(var i=0;i<_52.length;i++){
-if(_52[i].active&&_52[i].validators.contains(this.attr.id)){
-return true;
-}
-}
-return false;
-}};
-Prado.Validation.Summary=Class.create();
-Prado.Validation.Summary.prototype={initialize:function(_53){
-this.attr=_53;
-this.div=$(_53.id);
-this.visible=false;
-this.enabled=false;
-this.group=isdef(_53.validationgroup)?_53.validationgroup:null;
-Prado.Validation.summaries.push(this);
-},show:function(_54){
-var _55=_54||this.attr.refresh=="1";
-var _56=this.getMessages();
-if(_56.length<=0||!this.visible||!this.enabled){
-if(_55){
-if(this.attr.display=="None"||this.attr.display=="Dynamic"){
-Element.hide(this.div);
-}else{
-this.div.style.visibility="hidden";
-}
-}
-return;
-}
-if(Prado.Validation.HasTargetGroup){
-if(Prado.Validation.CurrentTargetGroup!=this.group){
-if(_55){
-if(this.attr.display=="None"||this.attr.display=="Dynamic"){
-Element.hide(this.div);
-}else{
-this.div.style.visibility="hidden";
-}
-}
-return;
-}
-}
-if(this.attr.showsummary!="False"&&_55){
-this.div.style.display="block";
-this.div.style.visibility="visible";
-while(this.div.childNodes.length>0){
-this.div.removeChild(this.div.lastChild);
-}
-new Insertion.Bottom(this.div,this.formatSummary(_56));
-}
-if(_54){
-window.scrollTo(this.div.offsetLeft-20,this.div.offsetTop-20);
-}
-var _57=this;
-if(_54&&this.attr.showmessagebox=="True"&&_55){
-setTimeout(function(){
-alert(_57.formatMessageBox(_56));
-},20);
-}
-},getMessages:function(){
-var _58=Prado.Validation.validators;
-var _59=[];
-for(var i=0;i<_58.length;i++){
-if(_58[i].isValid==false&&isString(_58[i].attr.errormessage)&&_58[i].attr.errormessage.length>0){
-_59.push(_58[i].attr.errormessage);
-}
-}
-return _59;
-},formats:function(_60){
-switch(_60){
+Prado.WebUI.TValidationSummary = Class.create();
+Prado.WebUI.TValidationSummary.prototype =
+{
+group : null,
+options : {},
+visible : false,
+summary : null,
+initialize : function(options)
+{
+this.options = options;
+this.group = options.ValidationGroup;
+this.summary = $(options.ID);
+this.visible = this.summary.style.visibility != "hidden"
+this.visible = this.visible && this.summary.style.display != "none";
+Prado.Validation.addSummary(options.FormID, this);
+},
+updateSummary : function(validators, update)
+{
+if(validators.length <= 0)
+return this.hideSummary(update);
+var refresh = update || this.visible == false || this.options.Refresh != false;
+if(this.options.ShowSummary != false && refresh)
+{
+this.displayHTMLMessages(this.getMessages(validators));
+this.visible = true;
+}
+if(this.options.ScrollToSummary != false)
+window.scrollTo(this.summary.offsetLeft-20, this.summary.offsetTop-20);
+if(this.options.ShowMessageBox == true && refresh)
+{
+this.alertMessages(this.getMessages(validators));
+this.visible = true;
+}
+},
+displayHTMLMessages : function(messages)
+{
+this.summary.show();
+this.summary.style.visibility = "visible";
+while(this.summary.childNodes.length > 0)
+this.summary.removeChild(this.summary.lastChild);
+new Insertion.Bottom(this.summary, 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(refresh)
+{
+if(refresh || this.options.Refresh != false)
+{
+if(this.options.Display == "None" || this.options.Display == "Dynamic")
+this.summary.hide();
+this.summary.style.visibility="hidden";
+this.visible = false;
+}
+},
+formats : function(type)
+{
+switch(type)
+{
case "List":
-return {header:"<br />",first:"",pre:"",post:"<br />",last:""};
+return { header : "<br />", first : "", pre : "", post : "<br />", last : ""};
case "SingleParagraph":
-return {header:" ",first:"",pre:"",post:" ",last:"<br />"};
+return { header : " ", first : "", pre : "", post : " ", last : "<br />"};
case "BulletList":
default:
-return {header:"",first:"<ul>",pre:"<li>",post:"</li>",last:"</ul>"};
-}
-},formatSummary:function(_61){
-var _62=this.formats(this.attr.displaymode);
-var _63=isdef(this.attr.headertext)?this.attr.headertext+_62.header:"";
-_63+=_62.first;
-for(var i=0;i<_61.length;i++){
-_63+=(_61[i].length>0)?_62.pre+_61[i]+_62.post:"";
-}
-_63+=_62.last;
-return _63;
-},formatMessageBox:function(_64){
-var _65=isdef(this.attr.headertext)?this.attr.headertext+"\n":"";
-for(var i=0;i<_64.length;i++){
-switch(this.attr.displaymode){
+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":
-_65+=_64[i]+"\n";
+output += messages[i] + "\n";
break;
case "BulletList":
default:
-_65+=" - "+_64[i]+"\n";
+output += "- " + messages[i] + "\n";
break;
case "SingleParagraph":
-_65+=_64[i]+" ";
+output += messages[i] + " ";
break;
}
}
-return _65;
-},inActiveGroup:function(){
-var _66=Prado.Validation.groups;
-for(var i=0;i<_66.length;i++){
-if(_66[i].active&&_66[i].id==this.attr.group){
-return true;
-}
-}
-return false;
-}};
-Prado.Validation.ShowSummary=function(_67){
-var _68=Prado.Validation.summaries;
-for(var i=0;i<_68.length;i++){
-if(isdef(_67)){
-if(Prado.Validation.IsGroupValidation){
-_68[i].visible=_68[i].inActiveGroup();
-}else{
-_68[i].visible=undef(_68[i].attr.group);
-}
-_68[i].enabled=$(_68[i].attr.form)==_67;
-}
-_68[i].show(_67);
-}
-};
-Prado.Validation.OnSubmit=function(ev){
-if(typeof tinyMCE!="undefined"){
-tinyMCE.triggerSave();
-}
-if(!Prado.Validation.ActiveTarget){
-return true;
-}
-var _69=Prado.Validation.IsValid(Event.element(ev)||ev);
-if(Event.element(ev)&&!_69){
-Event.stop(ev);
+return output;
}
-Prado.Validation.ActiveTarget=null;
-return _69;
};
-Prado.Validation.OnLoad=function(){
-Event.observe(Prado.Validation.forms,"submit",Prado.Validation.OnSubmit);
-};
-Prado.Validation.ValidateValidatorGroup=function(_70){
-var _71=Prado.Validation.groups;
-var _72=null;
-for(var i=0;i<_71.length;i++){
-if(_71[i].id==_70){
-_72=_71[i];
-Prado.Validation.groups[i].active=true;
-Prado.Validation.CurrentTargetGroup=null;
-Prado.Validation.IsGroupValidation=true;
-}else{
-Prado.Validation.groups[i].active=false;
-}
-}
-if(_72){
-return Prado.Validation.IsValid(_72.target.form);
-}
-return true;
-};
-Prado.Validation.ValidateValidationGroup=function(_73){
-var _74=Prado.Validation.TargetGroups;
-for(var id in _74){
-if(_74[id]==_73){
-var _75=$(id);
-Prado.Validation.ActiveTarget=_75;
-Prado.Validation.CurrentTargetGroup=_73;
-Prado.Validation.IsGroupValidation=false;
-return Prado.Validation.IsValid(_75.form);
-}
-}
-return true;
-};
-Prado.Validation.ValidateNonGroup=function(_76){
-if(Prado.Validation){
-var _77=$(_76);
-_77=_77||document.forms[0];
-Prado.Validation.ActiveTarget=_77;
-Prado.Validation.CurrentTargetGroup=null;
-Prado.Validation.IsGroupValidation=false;
-return Prado.Validation.IsValid(_77);
+Prado.WebUI.TBaseValidator = Class.create();
+Prado.WebUI.TBaseValidator.prototype =
+{
+enabled : true,
+visible : false,
+isValid : true,
+options : {},
+_isObserving : false,
+group : null,
+initialize : function(options)
+{
+options.OnValidate = options.OnValidate || Prototype.emptyFunction;
+options.OnSuccess = options.OnSuccess || Prototype.emptyFunction;
+options.OnError = options.OnError || Prototype.emptyFunction;
+this.options = options;
+this.control = $(options.ControlToValidate);
+this.message = $(options.ID);
+this.group = options.ValidationGroup;
+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";
+}
+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(manager)
+{
+if(this.enabled)
+this.isValid = this.evaluateIsValid(manager);
+this.options.OnValidate(this, manager);
+this.updateControl();
+if(this.isValid)
+this.options.OnSuccess(this, manager);
+else
+this.options.OnError(this, manager);
+this.observeChanges(manager);
+return this.isValid;
+},
+observeChanges : function(manager)
+{
+if(this.options.ObserveChanges != false && !this._isObserving)
+{
+var validator = this;
+Event.observe(this.control, 'change', function()
+{
+if(validator.visible)
+{
+validator.validate(manager);
+manager.updateSummary(validator.group);
}
-return true;
-};
-Event.OnLoad(Prado.Validation.OnLoad);
-Prado.Validation.TRequiredFieldValidator=function(){
-var _78=this.control.getAttribute("type");
-if(_78=="file"){
-return true;
-}else{
-var a=Prado.Validation.trim($F(this.control));
-var b=Prado.Validation.trim(this.attr.initialvalue);
-return (a!=b);
+});
+this._isObserving = true;
+}
+},
+trim : function(value)
+{
+return typeof(value) == "string" ? value.trim() : "";
+},
+convert : function(dataType, value)
+{
+if(typeof(value) == "undefined")
+value = $F(this.control);
+var string = new String(value);
+switch(dataType)
+{
+case "Integer":
+return string.toInteger();
+case "Double" :
+case "Float" :
+return string.toDouble(this.options.DecimalChar);
+case "Currency" :
+return string.toCurrency(this.options.GroupChar, this.options.Digits, this.options.DecimalChar);
+case "Date":
+var value = string.toDate(this.options.DateFormat);
+if(value && typeof(value.getTime) == "function")
+return value.getTime();
+else
+return null;
+case "String":
+return string.toString();
}
-};
-Prado.Validation.TRegularExpressionValidator=function(){
-var _79=Prado.Validation.trim($F(this.control));
-if(_79==""){
-return true;
+return value;
}
-var rx=new RegExp(this.attr.validationexpression);
-var _81=rx.exec(_79);
-return (_81!=null&&_79==_81[0]);
-};
-Prado.Validation.TEmailAddressValidator=Prado.Validation.TRegularExpressionValidator;
-Prado.Validation.TCustomValidator=function(){
-var _82=isNull(this.control)?null:$F(this.control);
-var _83=this.attr.clientvalidationfunction;
-eval("var validate = "+_83);
-return validate&&isFunction(validate)?validate(this,_82):true;
-};
-Prado.Validation.TRangeValidator=function(){
-var _84=Prado.Validation.trim($F(this.control));
-if(_84==""){
-return true;
}
-var _85=this.attr.minimumvalue;
-var _86=this.attr.maximumvalue;
-if(undef(_85)&&undef(_86)){
+Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+evaluateIsValid : function()
+{
+var inputType = this.control.getAttribute("type");
+if(inputType == 'file')
+{
return true;
}
-if(_85==""){
-_85=0;
+else
+{
+var a = this.trim($F(this.control));
+var b = this.trim(this.options.InitialValue);
+return(a != b);
}
-if(_86==""){
-_86=0;
}
-var _87=this.attr.type;
-if(undef(_87)){
-return (parseFloat(_84)>=parseFloat(_85))&&(parseFloat(_84)<=parseFloat(_86));
-}
-var min=this.convert(_87,_85);
-var max=this.convert(_87,_86);
-_84=this.convert(_87,_84);
-return _84>=min&&_84<=max;
-};
-Prado.Validation.TCompareValidator=function(){
-var _89=Prado.Validation.trim($F(this.control));
-if(_89.length==0){
+});
+Prado.WebUI.TCompareValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+_observingComparee : false,
+evaluateIsValid : function(manager)
+{
+var value = this.trim($F(this.control));
+if (value.length <= 0)
return true;
+var comparee = $(this.options.ControlToCompare);
+if(comparee)
+var compareTo = this.trim($F(comparee));
+else
+var compareTo = this.options.ValueToCompare || "";
+var isValid =this.compare(value, compareTo);
+if(comparee)
+{
+this.updateControlCssClass(comparee, isValid);
+this.observeComparee(comparee, manager);
+}
+return isValid;
+},
+observeComparee : function(comparee, manager)
+{
+if(this.options.ObserveChanges != false && !this._observingComparee)
+{
+var validator = this;
+Event.observe(comparee, "change", function()
+{
+if(validator.visible)
+{
+validator.validate(manager);
+manager.updateSummary(validator.group);
}
-var _90;
-var _91=$(this.attr.controlhookup);
-if(_91){
-_90=Prado.Validation.trim($F(_91));
-}else{
-_90=isString(this.attr.valuetocompare)?this.attr.valuetocompare:"";
-}
-var _92=Prado.Validation.TCompareValidator.compare;
-var _93=_92.bind(this)(_89,_90);
-if(_91){
-var _94=this.attr.controlcssclass;
-if(isString(_94)&&_94.length>0){
-Element.condClassName(_91,_94,!_93);
-}
-if(undef(this.observingComparee)){
-Event.observe(_91,"change",this.validate.bind(this));
-this.observingComparee=true;
-}
+});
+this._observingComparee = true;
}
-return _93;
-};
-Prado.Validation.TCompareValidator.compare=function(_95,_96){
-var op1,op2;
-if((op1=this.convert(this.attr.type,_95))==null){
+},
+compare : function(operand1, operand2)
+{
+var op1, op2;
+if((op1 = this.convert(this.options.DataType, operand1)) == null)
return false;
-}
-if(this.attr.operator=="DataTypeCheck"){
-return true;
-}
-if((op2=this.convert(this.attr.type,_96))==null){
+if ((op2 = this.convert(this.options.DataType, operand2)) == null)
return true;
-}
-switch(this.attr.operator){
+switch (this.options.Operator)
+{
case "NotEqual":
-return (op1!=op2);
+return (op1 != op2);
case "GreaterThan":
-return (op1>op2);
+return (op1 > op2);
case "GreaterThanEqual":
-return (op1>=op2);
+return (op1 >= op2);
case "LessThan":
-return (op1<op2);
+return (op1 < op2);
case "LessThanEqual":
-return (op1<=op2);
+return (op1 <= op2);
default:
-return (op1==op2);
-}
-};
-Prado.Validation.TRequiredListValidator=function(){
-var min=undef(this.attr.min)?Number.NEGATIVE_INFINITY:parseInt(this.attr.min);
-var max=undef(this.attr.max)?Number.POSITIVE_INFINITY:parseInt(this.attr.max);
-var _98=document.getElementsByName(this.attr.selector);
-if(_98.length<=0){
-return true;
-}
-var _99=new Array();
-if(isString(this.attr.required)&&this.attr.required.length>0){
-_99=this.attr.required.split(/,\s* /);
+return (op1 == op2);
}
-var _100=true;
-var _101=Prado.Validation.TRequiredListValidator;
-switch(_98[0].type){
-case "radio":
-case "checkbox":
-_100=_101.IsValidRadioList(_98,min,max,_99);
-break;
-case "select-multiple":
-_100=_101.IsValidSelectMultipleList(_98,min,max,_99);
-break;
}
-var _102=this.attr.elementcssclass;
-if(isString(_102)&&_102.length>0){
-map(_98,function(_103){
-condClass(_103,_102,!_100);
});
+Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+evaluateIsValid : function(manager)
+{
+var value = $F(this.control);
+var clientFunction = this.options.ClientValidationFunction;
+if(typeof(clientFunction) == "string" && clientFunction.length > 0)
+{
+validate = clientFunction.toFunction();
+return validate(this, value);
}
-if(undef(this.observingRequiredList)){
-Event.observe(_98,"change",this.validate.bind(this));
-this.observingRequiredList=true;
-}
-return _100;
-};
-Prado.Validation.TRequiredListValidator.IsValidRadioList=function(_104,min,max,_105){
-var _106=0;
-var _107=new Array();
-for(var i=0;i<_104.length;i++){
-if(_104[i].checked){
-_106++;
-_107.push(_104[i].value);
-}
-}
-return Prado.Validation.TRequiredListValidator.IsValidList(_106,_107,min,max,_105);
-};
-Prado.Validation.TRequiredListValidator.IsValidSelectMultipleList=function(_108,min,max,_109){
-var _110=0;
-var _111=new Array();
-for(var i=0;i<_108.length;i++){
-var _112=_108[i];
-for(var j=0;j<_112.options.length;j++){
-if(_112.options[j].selected){
-_110++;
-_111.push(_112.options[j].value);
-}
-}
+return true;
}
-return Prado.Validation.TRequiredListValidator.IsValidList(_110,_111,min,max,_109);
-};
-Prado.Validation.TRequiredListValidator.IsValidList=function(_114,_115,min,max,_116){
-var _117=true;
-if(_116.length>0){
-if(_115.length<_116.length){
+});
+Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+evaluateIsValid : function(manager)
+{
+var value = this.trim($F(this.control));
+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);
+Logger.warn(min+" <= "+value+" <= "+max);
+if(value == null)
return false;
+var valid = true;
+if(min != null)
+valid = valid && value >= min;
+if(max != null)
+valid = valid && value <= max;
+return valid;
}
-for(var k=0;k<_116.length;k++){
-_117=_117&&_115.contains(_116[k]);
-}
+});
+Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+evaluateIsValid : function(master)
+{
+var value = this.trim($F(this.control));
+if (value.length <= 0)
+return true;
+var rx = new RegExp(this.options.ValidationExpression);
+var matches = rx.exec(value);
+return (matches != null && value == matches[0]);
}
-return _117&&_114>=min&&_114<=max;
-};
-
+});
+Prado.WebUI.TEmailAddressValidator = Prado.WebUI.TRegularExpressionValidator;
diff --git a/framework/Web/Javascripts/prado/controls.js b/framework/Web/Javascripts/prado/controls.js
index 0f736f91..de409e94 100644
--- a/framework/Web/Javascripts/prado/controls.js
+++ b/framework/Web/Javascripts/prado/controls.js
@@ -1,16 +1,18 @@
Prado.WebUI = Class.create();
//base postback-able controls
-Prado.WebUI.PostBackControl = Class.create();
-Object.extend(Prado.WebUI.PostBackControl.prototype,
+/*Prado.WebUI.PostBackControl = Class.create();
+Prado.WebUI.PostBackControl.prototype =
{
initialize : function(options)
{
this.element = $(options['ID']);
- if(options['CausesValidation'] && Prado.Validation)
+
+/* if(options.CausesValidation && typeof(Prado.Validation) != 'undefined')
{
- Prado.Validation.AddTarget(options['ID'], options['ValidationGroup']);
+ Prado.Validation.registerTarget(options);
}
+
//TODO: what do the following options do?
//options['PostBackUrl']
//options['ClientSubmit']
@@ -18,7 +20,7 @@ Object.extend(Prado.WebUI.PostBackControl.prototype,
if(this.onInit)
this.onInit(options);
}
-});
+};
//short cut to create postback components
Prado.WebUI.createPostBackComponent = function(definition)
@@ -30,19 +32,28 @@ Prado.WebUI.createPostBackComponent = function(definition)
}
Prado.WebUI.TButton = Prado.WebUI.createPostBackComponent();
+*/
+Prado.WebUI.PostBackControl = Class.create();
-Prado.WebUI.ClickableComponent = Prado.WebUI.createPostBackComponent(
+Prado.WebUI.PostBackControl.prototype =
{
_elementOnClick : null, //capture the element's onclick function
+ initialize : function(options)
+ {
+ this.element = $(options.ID);
+ if(this.onInit)
+ this.onInit(options);
+ },
+
onInit : function(options)
{
- if(isFunction(this.element.onclick))
+ 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));
+ Event.observe(this.element, "click", this.onClick.bindEvent(this,options));
},
onClick : function(event, options)
@@ -53,12 +64,12 @@ Prado.WebUI.ClickableComponent = Prado.WebUI.createPostBackComponent(
if(this._elementOnClick)
{
var onclicked = this._elementOnClick(event);
- if(isBoolean(onclicked))
+ if(typeof(onclicked) == "boolean")
doPostBack = onclicked;
}
if(doPostBack)
this.onPostBack(event,options);
- if(isBoolean(onclicked) && !onclicked)
+ if(typeof(onclicked) == "boolean" && !onclicked)
Event.stop(event);
},
@@ -66,19 +77,19 @@ Prado.WebUI.ClickableComponent = Prado.WebUI.createPostBackComponent(
{
Prado.PostBack(event,options);
}
-});
+};
-Prado.WebUI.TLinkButton = Prado.WebUI.ClickableComponent;
-Prado.WebUI.TCheckBox = Prado.WebUI.ClickableComponent;
-Prado.WebUI.TBulletedList = Prado.WebUI.ClickableComponent;
-Prado.WebUI.TImageMap = Prado.WebUI.ClickableComponent;
+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);
/**
* TImageButton client-side behaviour. With validation, Firefox needs
* to capture the x,y point of the clicked image in hidden form fields.
*/
-Prado.WebUI.TImageButton = Class.create();
-Object.extend(Prado.WebUI.TImageButton.prototype,Prado.WebUI.ClickableComponent.prototype);
+Prado.WebUI.TImageButton = Class.extend(Prado.WebUI.PostBackControl);
Object.extend(Prado.WebUI.TImageButton.prototype,
{
/**
@@ -123,7 +134,7 @@ Object.extend(Prado.WebUI.TImageButton.prototype,
/**
* Radio button, only initialize if not already checked.
*/
-Prado.WebUI.TRadioButton = Prado.WebUI.createPostBackComponent(Prado.WebUI.ClickableComponent.prototype);
+Prado.WebUI.TRadioButton = Class.extend(Prado.WebUI.PostBackControl);
Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize = Prado.WebUI.TRadioButton.prototype.initialize;
Object.extend(Prado.WebUI.TRadioButton.prototype,
{
@@ -136,7 +147,7 @@ Object.extend(Prado.WebUI.TRadioButton.prototype,
});
-Prado.WebUI.TTextBox = Prado.WebUI.createPostBackComponent(
+Prado.WebUI.TTextBox = Class.extend(Prado.WebUI.PostBackControl,
{
onInit : function(options)
{
@@ -159,7 +170,7 @@ Prado.WebUI.TTextBox = Prado.WebUI.createPostBackComponent(
}
});
-Prado.WebUI.TListControl = Prado.WebUI.createPostBackComponent(
+Prado.WebUI.TListControl = Class.extend(Prado.WebUI.PostBackControl,
{
onInit : function(options)
{
@@ -167,11 +178,11 @@ Prado.WebUI.TListControl = Prado.WebUI.createPostBackComponent(
}
});
-Prado.WebUI.TListBox = Prado.WebUI.TListControl;
-Prado.WebUI.TDropDownList = Prado.WebUI.TListControl;
+Prado.WebUI.TListBox = Class.extend(Prado.WebUI.TListControl);
+Prado.WebUI.TDropDownList = Class.extend(Prado.WebUI.TListControl);
Prado.WebUI.DefaultButton = Class.create();
-Object.extend(Prado.WebUI.DefaultButton.prototype,
+Prado.WebUI.DefaultButton.prototype =
{
initialize : function(options)
{
@@ -195,22 +206,25 @@ Object.extend(Prado.WebUI.DefaultButton.prototype,
}
}
}
-});
+};
Prado.WebUI.TTextHighlighter=Class.create();
-Prado.WebUI.TTextHighlighter.prototype={initialize:function(id)
+Prado.WebUI.TTextHighlighter.prototype=
{
- if(!window.clipboardData) return;
- var options =
+ initialize:function(id)
{
- href : 'javascript:;//copy code to clipboard',
- onclick : 'Prado.WebUI.TTextHighlighter.copy(this)',
- onmouseover : 'Prado.WebUI.TTextHighlighter.hover(this)',
- onmouseout : 'Prado.WebUI.TTextHighlighter.out(this)'
+ 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);
}
- var div = DIV({className:'copycode'}, A(options, 'Copy Code'));
- document.write(DIV(null,div).innerHTML);
-}};
+};
Object.extend(Prado.WebUI.TTextHighlighter,
{
diff --git a/framework/Web/Javascripts/prado/element.js b/framework/Web/Javascripts/prado/element.js
index 163a7d6e..fc84e4b1 100644
--- a/framework/Web/Javascripts/prado/element.js
+++ b/framework/Web/Javascripts/prado/element.js
@@ -63,10 +63,11 @@ Prado.Element =
el.options[el.options.length] = new Option(options[i][0],options[i][1]);
}
},
-/**
- * A delayed focus on a particular element
- * @param {element} element to apply focus()
- */
+
+ /**
+ * A delayed focus on a particular element
+ * @param {element} element to apply focus()
+ */
focus : function(element)
{
var obj = $(element);
@@ -172,61 +173,4 @@ Prado.Element.Selection =
el.checked = !el.checked;
});
}
-};
-
-
-/**
- * Alias some of the prototype functions.
- * Insert a html fragment relative to an element.
- */
-Object.extend(Prado.Element,
-{
- /**
- *
- */
- Insert :
- {
- /**
- * Insert directly after the element.
- */
- After : function(element, innerHTML)
- {
- new Insertion.After(element, innerHTML);
- },
-
- /**
- * Insert directly after the element
- */
- Before : function(element, innerHTML)
- {
- new Insertion.Before(element. innerHTML);
- },
-
- /**
- * Insert below the element container.
- */
- Below : function(element, innerHTML)
- {
- new Insertion.Bottom(element, innerHTML);
- },
-
- /**
- * Insert above the element container.
- */
- Above : function(element, innerHTML)
- {
- new Insertion.Top(element, innerHTML);
- }
- },
- CssClass :
- {
- /**
- * Set the css class name of an element.
- */
- set : function(element, cssClass)
- {
- element = new Element.ClassNames(element);
- element.set(cssClass);
- }
- }
-}); \ No newline at end of file
+}; \ No newline at end of file
diff --git a/framework/Web/Javascripts/prado/form.js b/framework/Web/Javascripts/prado/form.js
index 5f4c80d8..addad893 100644
--- a/framework/Web/Javascripts/prado/form.js
+++ b/framework/Web/Javascripts/prado/form.js
@@ -1,4 +1,4 @@
-Prado.Focus = Class.create();
+/*Prado.Focus = Class.create();
Prado.Focus.setFocus = function(id)
{
@@ -97,29 +97,18 @@ Prado.Focus.isVisible = function(element)
}
return true;
}
+*/
+
Prado.PostBack = function(event,options)
{
var form = $(options['FormID']);
var canSubmit = true;
- if(options['CausesValidation'] && Prado.Validation)
- {
- var valid = true;
- if(options['ValidationGroup'])
- {
- valid = Prado.Validation.ValidateValidationGroup(options['ValidationGroup']);
- // Prado.Validation.SetActiveGroup(Event.element(event), options['ValidationGroup']);
- }
- else
- {
- valid = Prado.Validation.ValidateNonGroup(form);
- }
- if(!valid)
- {
- //if(options['StopEvent'])
+ if(options['CausesValidation'] && typeof(Prado.Validation) != "undefined")
+ {
+ if(!Prado.Validation.validate(options['FormID'], options['ValidationGroup']))
return Event.stop(event);
- }
}
if(options['PostBackUrl'] && options['PostBackUrl'].length > 0)
diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js
new file mode 100644
index 00000000..10169aab
--- /dev/null
+++ b/framework/Web/Javascripts/prado/validation3.js
@@ -0,0 +1,918 @@
+
+/**
+ * Prado client-side javascript validation manager.
+ */
+Prado.Validation = Class.create();
+
+/**
+ * A global validation manager.
+ * To validate the inputs of a particular form, call
+ * <code>Prado.Validation.validate(formID, groupID)</code>
+ * where <tt>formID</tt> is the HTML form ID, and the optional
+ * <tt>groupID</tt> if present will only validate the validators
+ * in a particular group.
+ */
+Object.extend(Prado.Validation,
+{
+ managers : {},
+
+ /**
+ * Validate the validators (those that <strong>DO NOT</strong>
+ * belong to a particular group) the form specified by the
+ * <tt>formID</tt> parameter. If <tt>groupID</tt> is specified
+ * then only validators belonging to that group will be validated.
+ * @param string ID of the form to validate
+ * @param string ID of the group to validate.
+ */
+ validate : function(formID, groupID)
+ {
+ if(this.managers[formID])
+ {
+ return this.managers[formID].validate(groupID);
+ }
+ else
+ {
+ throw new Error("Form '"+form+"' is not registered with Prado.Validation");
+ }
+ },
+
+ /**
+ * Check if the validators are valid for a particular form (and group).
+ * The validators states will not be changed.
+ * The <tt>validate</tt> function should be called first.
+ * @param string ID of the form to validate
+ * @param string ID of the group to validate.
+ */
+ isValid : function(formID, groupID)
+ {
+ if(this.managers[formID])
+ return this.managers[formID].isValid(groupID);
+ return true;
+ },
+
+ /**
+ * Add a new validator to a particular form.
+ * @param string the form that the validator belongs.
+ * @param object a validator
+ */
+ 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.");
+ },
+
+ /**
+ * Add a new validation summary.
+ * @param string the form that the validation summary belongs.
+ * @param object a validation summary
+ */
+ 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.");
+ }
+});
+
+/**
+ * Validation manager instances. Manages validators for a particular
+ * HTML form.
+ */
+Prado.Validation.prototype =
+{
+ validators : [], // list of validators
+ summaries : [], // validation summaries
+ groups : [], // validation groups
+ options : {},
+
+ /**
+ * <code>
+ * options['FormID']* The ID of HTML form to manage.
+ * </code>
+ */
+ initialize : function(options)
+ {
+ this.options = options;
+ Prado.Validation.managers[options.FormID] = this;
+ },
+
+ /**
+ * Validate the validators managed by this validation manager.
+ * @param string only validate validators belonging to a group (optional)
+ * @return boolean true if all validators are valid, false otherwise.
+ */
+ validate : function(group)
+ {
+ if(group)
+ return this._validateGroup(group);
+ else
+ return this._validateNonGroup();
+ },
+
+ /**
+ * Validate a particular group of validators.
+ * @param string ID of the form
+ * @return boolean false if group is not valid, true otherwise.
+ */
+ _validateGroup: function(groupID)
+ {
+ var valid = true;
+ var manager = this;
+ if(this.groups.include(groupID))
+ {
+ this.validators.each(function(validator)
+ {
+ if(validator.group == groupID)
+ valid = valid & validator.validate(manager);
+ else
+ validator.hide();
+ });
+ }
+ this.updateSummary(groupID, true);
+ return valid;
+ },
+
+ /**
+ * Validate validators that doesn't belong to any group.
+ * @return boolean false if not valid, true otherwise.
+ */
+ _validateNonGroup : function()
+ {
+ var valid = true;
+ var manager = this;
+ this.validators.each(function(validator)
+ {
+ if(!validator.group)
+ valid = valid & validator.validate(manager);
+ else
+ validator.hide();
+ });
+ this.updateSummary(null, true);
+ return valid;
+ },
+
+ /**
+ * Gets the state of all the validators, true if they are all valid.
+ * @return boolean true if the validators are valid.
+ */
+ isValid : function(group)
+ {
+ if(group)
+ return this._isValidGroup(group);
+ else
+ return this._isValidNonGroup();
+ },
+
+ /**
+ * @return boolean true if all validators not belonging to a group are valid.
+ */
+ _isValidNonGroup : function()
+ {
+ var valid = true;
+ this.validators.each(function(validator)
+ {
+ if(!validator.group)
+ valid = valid & validator.isValid;
+ });
+ return valid;
+ },
+
+ /**
+ * @return boolean true if all validators belonging to the group are 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;
+ },
+
+ /**
+ * Add a validator to this manager.
+ * @param Prado.WebUI.TBaseValidator a new validator
+ */
+ addValidator : function(validator)
+ {
+ this.validators.push(validator);
+ if(validator.group && !this.groups.include(validator.group))
+ this.groups.push(validator.group);
+ },
+
+ /**
+ * Add a validation summary.
+ * @param Prado.WebUI.TValidationSummary validation summary.
+ */
+ addSummary : function(summary)
+ {
+ this.summaries.push(summary);
+ },
+
+ /**
+ * Gets all validators that belong to a group or that the validator
+ * group is null and the validator validation was false.
+ * @return array list of validators with error.
+ */
+ 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;
+ },
+
+ /**
+ * Update the summary of a particular group.
+ * @param string validation group to update.
+ */
+ 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);
+ });
+ }
+};
+
+/**
+ * TValidationSummary displays a summary of validation errors inline on a Web page,
+ * in a message box, or both. By default, a validation summary will collect
+ * <tt>ErrorMessage</tt> of all failed validators on the page. If
+ * <tt>ValidationGroup</tt> is not empty, only those validators who belong
+ * to the group will show their error messages in the summary.
+ *
+ * The summary can be displayed as a list, as a bulleted list, or as a single
+ * paragraph based on the <tt>DisplayMode</tt> option.
+ * The messages shown can be prefixed with <tt>HeaderText</tt>.
+ *
+ * The summary can be displayed on the Web page and in a message box by setting
+ * the <tt>ShowSummary</tt> and <tt>ShowMessageBox</tt>
+ * options, respectively.
+ */
+Prado.WebUI.TValidationSummary = Class.create();
+Prado.WebUI.TValidationSummary.prototype =
+{
+ group : null,
+ options : {},
+ visible : false,
+ summary : null,
+
+ /**
+ * <code>
+ * options['ID']* Validation summary ID, i.e., an HTML element ID
+ * options['FormID']* HTML form that this summary belongs.
+ * options['ShowMessageBox'] True to show the summary in an alert box.
+ * options['ShowSummary'] True to show the inline summary.
+ * options['HeaderText'] Summary header text
+ * options['DisplayMode'] Summary display style, 'BulletList', 'List', 'SingleParagraph'
+ * options['Refresh'] True to update the summary upon validator state change.
+ * options['ValidationGroup'] Validation summary group
+ * options['Display'] Display mode, 'None', 'Static', 'Dynamic'.
+ * options['ScrollToSummary'] True to scroll to the validation summary upon refresh.
+ * </code>
+ */
+ initialize : function(options)
+ {
+ this.options = options;
+ this.group = options.ValidationGroup;
+ this.summary = $(options.ID);
+ this.visible = this.summary.style.visibility != "hidden"
+ this.visible = this.visible && this.summary.style.display != "none";
+ Prado.Validation.addSummary(options.FormID, this);
+ },
+
+ /**
+ * Update the validation summary to show the error message from
+ * validators that failed validation.
+ * @param array list of validators that failed validation.
+ * @param boolean update the summary;
+ */
+ updateSummary : function(validators, update)
+ {
+ if(validators.length <= 0)
+ return this.hideSummary(update);
+
+ var refresh = update || this.visible == false || this.options.Refresh != false;
+
+ if(this.options.ShowSummary != false && refresh)
+ {
+ this.displayHTMLMessages(this.getMessages(validators));
+ this.visible = true;
+ }
+
+ if(this.options.ScrollToSummary != false)
+ window.scrollTo(this.summary.offsetLeft-20, this.summary.offsetTop-20);
+
+ if(this.options.ShowMessageBox == true && refresh)
+ {
+ this.alertMessages(this.getMessages(validators));
+ this.visible = true;
+ }
+ },
+
+ /**
+ * Display the validator error messages as inline HTML.
+ */
+ displayHTMLMessages : function(messages)
+ {
+ this.summary.show();
+ this.summary.style.visibility = "visible";
+ while(this.summary.childNodes.length > 0)
+ this.summary.removeChild(this.summary.lastChild);
+ new Insertion.Bottom(this.summary, this.formatSummary(messages));
+ },
+
+ /**
+ * Display the validator error messages as an alert box.
+ */
+ alertMessages : function(messages)
+ {
+ var text = this.formatMessageBox(messages);
+ setTimeout(function(){ alert(text); },20);
+ },
+
+ /**
+ * @return array list of validator error messages.
+ */
+ 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;
+ },
+
+ /**
+ * Hides the validation summary if options['Refresh'] is not false.
+ * @param boolean true to always hide the summary
+ */
+ hideSummary : function(refresh)
+ {
+ if(refresh || this.options.Refresh != false)
+ {
+ if(this.options.Display == "None" || this.options.Display == "Dynamic")
+ this.summary.hide();
+ this.summary.style.visibility="hidden";
+ this.visible = false;
+ }
+ },
+
+ /**
+ * Return the format parameters for the summary.
+ * @param string format type, "List", "SingleParagraph" or "BulletList"
+ * @type array formatting parameters
+ */
+ 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>"};
+ }
+ },
+
+ /**
+ * Format the message summary.
+ * @param array list of error messages.
+ * @type string formatted message
+ */
+ 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 : "";
+ });
+// for(var i = 0; i < messages.length; i++)
+ // output += (messages[i].length>0) ? format.pre + messages[i] + format.post : "";
+ output += format.last;
+ return output;
+ },
+ /**
+ * Format the message alert box.
+ * @param array a list of error messages.
+ * @type string format message for alert.
+ */
+ 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;
+ }
+};
+
+/**
+ * TBaseValidator serves as the base class for validator controls.
+ *
+ * Validation is performed when a postback control, such as a TButton,
+ * a TLinkButton or a TTextBox (under AutoPostBack mode) is submitting
+ * the page and its <tt>CausesValidation</tt> option is true.
+ * The input control to be validated is specified by <tt>ControlToValidate</tt>
+ * option.
+ */
+Prado.WebUI.TBaseValidator = Class.create();
+Prado.WebUI.TBaseValidator.prototype =
+{
+ enabled : true,
+ visible : false,
+ isValid : true,
+ options : {},
+ _isObserving : false,
+ group : null,
+
+ /**
+ * <code>
+ * options['ID']* Validator ID, e.g. span with message
+ * options['FormID']* HTML form that the validator belongs
+ * options['ControlToValidate']*HTML form input to validate
+ * options['Display'] Display mode, 'None', 'Static', 'Dynamic'
+ * options['ErrorMessage'] Validation error message
+ * options['FocusOnError'] True to focus on validation error
+ * options['FocusElementID'] Element to focus on error
+ * options['ValidationGroup'] Validation group
+ * options['ControlCssClass'] Css class to use on the input upon error
+ * options['OnValidate'] Function to call immediately after validation
+ * options['OnSuccess'] Function to call upon after successful validation
+ * options['OnError'] Function to call upon after error in validation.
+ * options['ObserveChanges'] True to observe changes in input
+ * </code>
+ */
+ initialize : function(options)
+ {
+ options.OnValidate = options.OnValidate || Prototype.emptyFunction;
+ options.OnSuccess = options.OnSuccess || Prototype.emptyFunction;
+ options.OnError = options.OnError || Prototype.emptyFunction;
+
+ this.options = options;
+ this.control = $(options.ControlToValidate);
+ this.message = $(options.ID);
+ this.group = options.ValidationGroup;
+
+ Prado.Validation.addValidator(options.FormID, this);
+ },
+
+ /**
+ * @return string validation error message.
+ */
+ getErrorMessage : function()
+ {
+ return this.options.ErrorMessage;
+ },
+
+ /**
+ * Update the validator span, input CSS class, and focus particular
+ * element. Updating the validator control will set the validator
+ * <tt>visible</tt> property to true.
+ */
+ 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";
+ }
+
+ this.updateControlCssClass(this.control, this.isValid);
+
+ if(this.options.FocusOnError && !this.isValid)
+ Prado.Element.focus(this.options.FocusElementID);
+
+ this.visible = true;
+ },
+
+ /**
+ * Add a css class to the input control if validator is invalid,
+ * removes the css class if valid.
+ * @param object html control element
+ * @param boolean true to remove the css class, false to add.
+ */
+ 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);
+ }
+ },
+
+ /**
+ * Hides the validator messages and remove any validation changes.
+ */
+ hide : function()
+ {
+ this.isValid = true;
+ this.updateControl();
+ this.visible = false;
+ },
+
+ /**
+ * Calls evaluateIsValid() function to set the value of isValid property.
+ * Triggers onValidate event and onSuccess or onError event.
+ * @param Validation manager
+ * @return boolean true if valid.
+ */
+ validate : function(manager)
+ {
+ if(this.enabled)
+ this.isValid = this.evaluateIsValid(manager);
+
+ this.options.OnValidate(this, manager);
+
+ this.updateControl();
+
+ if(this.isValid)
+ this.options.OnSuccess(this, manager);
+ else
+ this.options.OnError(this, manager);
+
+ this.observeChanges(manager);
+
+ return this.isValid;
+ },
+
+ /**
+ * Observe changes to the control input, re-validate upon change. If
+ * the validator is not visible, no updates are propagated.
+ */
+ observeChanges : function(manager)
+ {
+ if(this.options.ObserveChanges != false && !this._isObserving)
+ {
+ var validator = this;
+ Event.observe(this.control, 'change', function()
+ {
+ if(validator.visible)
+ {
+ validator.validate(manager);
+ manager.updateSummary(validator.group);
+ }
+ });
+ this._isObserving = true;
+ }
+ },
+
+ /**
+ * @return string trims the string value, empty string if value is not string.
+ */
+ trim : function(value)
+ {
+ return typeof(value) == "string" ? value.trim() : "";
+ },
+
+ /**
+ * Convert the value to a specific data type.
+ * @param {string} the data type, "Integer", "Double", "Currency", "Date" or "String"
+ * @param {string} the value to convert.
+ * @type {mixed|null} the converted data value.
+ */
+ convert : function(dataType, value)
+ {
+ if(typeof(value) == "undefined")
+ value = $F(this.control);
+ var string = new String(value);
+ switch(dataType)
+ {
+ case "Integer":
+ return string.toInteger();
+ case "Double" :
+ case "Float" :
+ return string.toDouble(this.options.DecimalChar);
+ case "Currency" :
+ return string.toCurrency(this.options.GroupChar, this.options.Digits, this.options.DecimalChar);
+ case "Date":
+ 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;
+ }
+}
+
+
+/**
+ * TRequiredFieldValidator makes the associated input control a required field.
+ * The input control fails validation if its value does not change from
+ * the <tt>InitialValue<tt> option upon losing focus.
+ * <code>
+ * options['InitialValue'] Validation fails if control input equals initial value.
+ * </code>
+ */
+Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+ /**
+ * @return boolean true if the input value is not empty nor equal to the initial value.
+ */
+ evaluateIsValid : function()
+ {
+ var inputType = this.control.getAttribute("type");
+ if(inputType == 'file')
+ {
+ return true;
+ }
+ else
+ {
+ var a = this.trim($F(this.control));
+ var b = this.trim(this.options.InitialValue);
+ return(a != b);
+ }
+ }
+});
+
+
+/**
+ * TCompareValidator compares the value entered by the user into an input
+ * control with the value entered into another input control or a constant value.
+ * To compare the associated input control with another input control,
+ * set the <tt>ControlToCompare</tt> option to the ID path
+ * of the control to compare with. To compare the associated input control with
+ * a constant value, specify the constant value to compare with by setting the
+ * <tt>ValueToCompare</tt> option.
+ *
+ * The <tt>DataType</tt> property is used to specify the data type
+ * of both comparison values. Both values are automatically converted to this data
+ * type before the comparison operation is performed. The following value types are supported:
+ * - <b>Integer</b> A 32-bit signed integer data type.
+ * - <b>Float</b> A double-precision floating point number data type.
+ * - <b>Currency</b> A decimal data type that can contain currency symbols.
+ * - <b>Date</b> A date data type. The format can be by the <tt>DateFormat</tt> option.
+ * - <b>String</b> A string data type.
+ *
+ * Use the <tt>Operator</tt> property to specify the type of comparison
+ * to perform. Valid operators include Equal, NotEqual, GreaterThan, GreaterThanEqual,
+ * LessThan and LessThanEqual.
+ * <code>
+ * options['ControlToCompare']
+ * options['ValueToCompare']
+ * options['Operator']
+ * options['Type']
+ * options['DateFormat']
+ * </code>
+ */
+Prado.WebUI.TCompareValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+ _observingComparee : false,
+
+ /**
+ * Compares the input to another input or a given value.
+ */
+ evaluateIsValid : function(manager)
+ {
+ var value = this.trim($F(this.control));
+ if (value.length <= 0)
+ return true;
+
+ var comparee = $(this.options.ControlToCompare);
+
+ if(comparee)
+ var compareTo = this.trim($F(comparee));
+ else
+ var compareTo = this.options.ValueToCompare || "";
+
+ var isValid = this.compare(value, compareTo);
+
+ if(comparee)
+ {
+ this.updateControlCssClass(comparee, isValid);
+ this.observeComparee(comparee, manager);
+ }
+ return isValid;
+ },
+
+ /**
+ * Observe the comparee input element for changes.
+ * @param object HTML input element to observe
+ * @param object Validation manager.
+ */
+ observeComparee : function(comparee, manager)
+ {
+ if(this.options.ObserveChanges != false && !this._observingComparee)
+ {
+ var validator = this;
+ Event.observe(comparee, "change", function()
+ {
+ if(validator.visible)
+ {
+ validator.validate(manager);
+ manager.updateSummary(validator.group);
+ }
+ });
+ this._observingComparee = true;
+ }
+ },
+
+ /**
+ * Compares two values, their values are casted to type defined
+ * by <tt>DataType</tt> option. False is returned if the first
+ * operand converts to null. Returns true if the second operand
+ * converts to null. The comparision is done based on the
+ * <tt>Operator</tt> option.
+ */
+ 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);
+ }
+ }
+});
+
+/**
+ * TCustomValidator performs user-defined client-side validation on an
+ * input component.
+ *
+ * To create a client-side validation function, add the client-side
+ * validation javascript function to the page template.
+ * The function should have the following signature:
+ * <code>
+ * <script type="text/javascript"><!--
+ * function ValidationFunctionName(sender, parameter)
+ * {
+ * // if(parameter == ...)
+ * // return true;
+ * // else
+ * // return false;
+ * }
+ * -->
+ * </script>
+ * </code>
+ * Use the <tt>ClientValidationFunction</tt> option
+ * to specify the name of the client-side validation script function associated
+ * with the TCustomValidator.
+ * <code>
+ * options['ClientValidationFunction'] custom validation function.
+ * </code>
+ */
+Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+ /**
+ * Calls custom validation function.
+ */
+ evaluateIsValid : function(manager)
+ {
+ var value = $F(this.control);
+ var clientFunction = this.options.ClientValidationFunction;
+ if(typeof(clientFunction) == "string" && clientFunction.length > 0)
+ {
+ validate = clientFunction.toFunction();
+ return validate(this, value);
+ }
+ return true;
+ }
+});
+
+/**
+ * TRangeValidator tests whether an input value is within a specified range.
+ *
+ * TRangeValidator uses three key properties to perform its validation.
+ * The <tt>MinValue</tt> and <tt>MaxValue</tt> options specify the minimum
+ * and maximum values of the valid range. The <tt>DataType</tt> option is
+ * used to specify the data type of the value and the minimum and maximum range values.
+ * These values are converted to this data type before the validation
+ * operation is performed. The following value types are supported:
+ * - <b>Integer</b> A 32-bit signed integer data type.
+ * - <b>Float</b> A double-precision floating point number data type.
+ * - <b>Currency</b> A decimal data type that can contain currency symbols.
+ * - <b>Date</b> A date data type. The date format can be specified by
+ * setting <tt>DateFormat</tt> option, which must be recognizable
+ * by <tt>Date.SimpleParse</tt> javascript function.
+ * - <b>String</b> A string data type.
+ * <code>
+ * options['MinValue'] Minimum range value
+ * options['MaxValue'] Maximum range value
+ * options['DataType'] Value data type
+ * options['DateFormat'] Date format for date data type.
+ * </code>
+ */
+Prado.WebUI.TRangeValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+ /**
+ * Compares the input value with a minimum and/or maximum value.
+ * Returns true if the value is empty, returns false if conversion fails.
+ */
+ evaluateIsValid : function(manager)
+ {
+ var value = this.trim($F(this.control));
+ 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);
+
+ Logger.warn(min+" <= "+value+" <= "+max);
+
+ if(value == null)
+ return false;
+
+ var valid = true;
+
+ if(min != null)
+ valid = valid && value >= min;
+ if(max != null)
+ valid = valid && value <= max;
+ return valid;
+ }
+});
+
+/**
+ * TRegularExpressionValidator validates whether the value of an associated
+ * input component matches the pattern specified by a regular expression.
+ * <code>
+ * options['ValidationExpression'] regular expression to match against.
+ * </code>
+ */
+Prado.WebUI.TRegularExpressionValidator = Class.extend(Prado.WebUI.TBaseValidator,
+{
+ /**
+ * Compare the control input against a regular expression.
+ */
+ evaluateIsValid : function(master)
+ {
+ var value = this.trim($F(this.control));
+ if (value.length <= 0)
+ return true;
+
+ var rx = new RegExp(this.options.ValidationExpression);
+ var matches = rx.exec(value);
+ return (matches != null && value == matches[0]);
+ }
+});
+
+/**
+ * TEmailAddressValidator validates whether the value of an associated
+ * input component is a valid email address.
+ */
+Prado.WebUI.TEmailAddressValidator = Prado.WebUI.TRegularExpressionValidator;
+
+
diff --git a/framework/Web/Javascripts/prototype/ajax.js b/framework/Web/Javascripts/prototype/ajax.js
index e3d442a4..7ec7716c 100644
--- a/framework/Web/Javascripts/prototype/ajax.js
+++ b/framework/Web/Javascripts/prototype/ajax.js
@@ -1,9 +1,9 @@
var Ajax = {
getTransport: function() {
return Try.these(
+ function() {return new XMLHttpRequest()},
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
- function() {return new ActiveXObject('Microsoft.XMLHTTP')},
- function() {return new XMLHttpRequest()}
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}
) || false;
},
@@ -55,6 +55,7 @@ Ajax.Base.prototype = {
this.options = {
method: 'post',
asynchronous: true,
+ contentType: 'application/x-www-form-urlencoded',
parameters: ''
}
Object.extend(this.options, options || {});
@@ -114,11 +115,11 @@ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
setRequestHeaders: function() {
var requestHeaders =
['X-Requested-With', 'XMLHttpRequest',
- 'X-Prototype-Version', Prototype.Version];
+ 'X-Prototype-Version', Prototype.Version,
+ 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
if (this.options.method == 'post') {
- requestHeaders.push('Content-type',
- 'application/x-www-form-urlencoded');
+ requestHeaders.push('Content-type', this.options.contentType);
/* Force "Connection: close" for Mozilla browsers to work around
* a bug where XMLHttpReqeuest sends an incorrect Content-length
@@ -149,7 +150,7 @@ Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
evalJSON: function() {
try {
- return eval(this.header('X-JSON'));
+ return eval('(' + this.header('X-JSON') + ')');
} catch (e) {}
},
diff --git a/framework/Web/Javascripts/prototype/array.js b/framework/Web/Javascripts/prototype/array.js
index 51ad864b..02731141 100644
--- a/framework/Web/Javascripts/prototype/array.js
+++ b/framework/Web/Javascripts/prototype/array.js
@@ -12,7 +12,8 @@ var $A = Array.from = function(iterable) {
Object.extend(Array.prototype, Enumerable);
-//Array.prototype._reverse = Array.prototype.reverse;
+if (!Array.prototype._reverse)
+ Array.prototype._reverse = Array.prototype.reverse;
Object.extend(Array.prototype, {
_each: function(iterator) {
@@ -41,7 +42,7 @@ Object.extend(Array.prototype, {
flatten: function() {
return this.inject([], function(array, value) {
- return array.concat(value.constructor == Array ?
+ return array.concat(value && value.constructor == Array ?
value.flatten() : [value]);
});
},
@@ -58,20 +59,11 @@ Object.extend(Array.prototype, {
if (this[i] == object) return i;
return -1;
},
-
-/*
+
reverse: function(inline) {
return (inline !== false ? this : this.toArray())._reverse();
},
-*/
- shift: function() {
- var result = this[0];
- for (var i = 0; i < this.length - 1; i++)
- this[i] = this[i + 1];
- this.length--;
- return result;
- },
-
+
inspect: function() {
return '[' + this.map(Object.inspect).join(', ') + ']';
}
diff --git a/framework/Web/Javascripts/prototype/base.js b/framework/Web/Javascripts/prototype/base.js
index 8d46d0ef..41b1d904 100644
--- a/framework/Web/Javascripts/prototype/base.js
+++ b/framework/Web/Javascripts/prototype/base.js
@@ -9,7 +9,7 @@ var Class = {
var Abstract = new Object();
Object.extend = function(destination, source) {
- for (property in source) {
+ for (var property in source) {
destination[property] = source[property];
}
return destination;
@@ -100,22 +100,3 @@ PeriodicalExecuter.prototype = {
}
}
}
-
-/*--------------------------------------------------------------------------*/
-
-function $() {
- var elements = new Array();
-
- for (var i = 0; i < arguments.length; i++) {
- var element = arguments[i];
- if (typeof element == 'string')
- element = document.getElementById(element);
-
- if (arguments.length == 1)
- return element;
-
- elements.push(element);
- }
-
- return elements;
-}
diff --git a/framework/Web/Javascripts/prototype/dom.js b/framework/Web/Javascripts/prototype/dom.js
index ade0451b..2d7438d5 100644
--- a/framework/Web/Javascripts/prototype/dom.js
+++ b/framework/Web/Javascripts/prototype/dom.js
@@ -1,19 +1,54 @@
+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(child);
+ elements.push(Element.extend(child));
return elements;
});
}
/*--------------------------------------------------------------------------*/
-if (!window.Element) {
+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;
}
-Object.extend(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';
},
@@ -49,6 +84,19 @@ Object.extend(Element, {
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;
@@ -87,6 +135,13 @@ Object.extend(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,
@@ -114,7 +169,7 @@ Object.extend(Element, {
setStyle: function(element, style) {
element = $(element);
- for (name in style)
+ for (var name in style)
element.style[name.camelize()] = style[name];
},
@@ -180,7 +235,32 @@ Object.extend(Element, {
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;
@@ -200,7 +280,8 @@ Abstract.Insertion.prototype = {
try {
this.element.insertAdjacentHTML(this.adjacency, this.content);
} catch (e) {
- if (this.element.tagName.toLowerCase() == 'tbody') {
+ var tagName = this.element.tagName.toLowerCase();
+ if (tagName == 'tbody' || tagName == 'tr') {
this.insertContent(this.contentFromAnonymousTable());
} else {
throw e;
diff --git a/framework/Web/Javascripts/prototype/enumerable.js b/framework/Web/Javascripts/prototype/enumerable.js
index 79cb8b3f..c3535b81 100644
--- a/framework/Web/Javascripts/prototype/enumerable.js
+++ b/framework/Web/Javascripts/prototype/enumerable.js
@@ -102,7 +102,7 @@ var Enumerable = {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
- if (value >= (result || value))
+ if (result == undefined || value >= result)
result = value;
});
return result;
@@ -112,7 +112,7 @@ var Enumerable = {
var result;
this.each(function(value, index) {
value = (iterator || Prototype.K)(value, index);
- if (value <= (result || value))
+ if (result == undefined || value < result)
result = value;
});
return result;
@@ -164,8 +164,7 @@ var Enumerable = {
var collections = [this].concat(args).map($A);
return this.map(function(value, index) {
- iterator(value = collections.pluck(index));
- return value;
+ return iterator(collections.pluck(index));
});
},
diff --git a/framework/Web/Javascripts/prototype/event.js b/framework/Web/Javascripts/prototype/event.js
index 591b8d93..51b9010e 100644
--- a/framework/Web/Javascripts/prototype/event.js
+++ b/framework/Web/Javascripts/prototype/event.js
@@ -104,4 +104,5 @@ Object.extend(Event, {
});
/* prevent memory leaks in IE */
-Event.observe(window, 'unload', Event.unloadCache, false);
+if (navigator.appVersion.match(/\bMSIE\b/))
+ Event.observe(window, 'unload', Event.unloadCache, false);
diff --git a/framework/Web/Javascripts/prototype/form.js b/framework/Web/Javascripts/prototype/form.js
index 6d1b31ff..590f7f9f 100644
--- a/framework/Web/Javascripts/prototype/form.js
+++ b/framework/Web/Javascripts/prototype/form.js
@@ -46,7 +46,7 @@ var Form = {
form = $(form);
var elements = new Array();
- for (tagName in Form.Element.Serializers) {
+ for (var tagName in Form.Element.Serializers) {
var tagElements = form.getElementsByTagName(tagName);
for (var j = 0; j < tagElements.length; j++)
elements.push(tagElements[j]);
@@ -168,23 +168,17 @@ Form.Element.Serializers = {
var value = '', opt, index = element.selectedIndex;
if (index >= 0) {
opt = element.options[index];
- value = opt.value;
- if (!value && !('value' in opt))
- value = opt.text;
+ value = opt.value || opt.text;
}
return [element.name, value];
},
selectMany: function(element) {
- var value = new Array();
+ var value = [];
for (var i = 0; i < element.length; i++) {
var opt = element.options[i];
- if (opt.selected) {
- var optValue = opt.value;
- if (!optValue && !('value' in opt))
- optValue = opt.text;
- value.push(optValue);
- }
+ if (opt.selected)
+ value.push(opt.value || opt.text);
}
return [element.name, value];
}
diff --git a/framework/Web/Javascripts/prototype/hash.js b/framework/Web/Javascripts/prototype/hash.js
index a6da11c8..7e8c6f5d 100644
--- a/framework/Web/Javascripts/prototype/hash.js
+++ b/framework/Web/Javascripts/prototype/hash.js
@@ -1,6 +1,6 @@
var Hash = {
_each: function(iterator) {
- for (key in this) {
+ for (var key in this) {
var value = this[key];
if (typeof value == 'function') continue;
diff --git a/framework/Web/Javascripts/prototype/prototype.js b/framework/Web/Javascripts/prototype/prototype.js
index 6ae99602..16701d70 100644
--- a/framework/Web/Javascripts/prototype/prototype.js
+++ b/framework/Web/Javascripts/prototype/prototype.js
@@ -1,19 +1,24 @@
-/* Prototype JavaScript framework, version 1.4.0
- * (c) 2005 Sam Stephenson <sam@conio.net>
- *
- * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
- * against the source tree, available from the Prototype darcs repository.
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- *
- * For details, see the Prototype web site: http://prototype.conio.net/
- *
-/*--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.4.0',
- ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
-
- emptyFunction: function() {},
- K: function(x) {return x}
-} \ No newline at end of file
+/* Prototype JavaScript framework, version <%= PROTOTYPE_VERSION %>
+ * (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+ Version: '1.50',
+ ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
+
+ emptyFunction: function() {},
+ K: function(x) {return x}
+}
+
+/*
+<%= include 'base.js', 'string.js' %>
+
+<%= include 'enumerable.js', 'array.js', 'hash.js', 'range.js' %>
+
+<%= include 'ajax.js', 'dom.js', 'selector.js', 'form.js', 'event.js', 'position.js' %>
+
+*/ \ No newline at end of file
diff --git a/framework/Web/Javascripts/prototype/selector.js b/framework/Web/Javascripts/prototype/selector.js
new file mode 100644
index 00000000..cb900e17
--- /dev/null
+++ b/framework/Web/Javascripts/prototype/selector.js
@@ -0,0 +1,110 @@
+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();
+}
diff --git a/framework/Web/Javascripts/prototype/string.js b/framework/Web/Javascripts/prototype/string.js
index 8e820fae..bba474f5 100644
--- a/framework/Web/Javascripts/prototype/string.js
+++ b/framework/Web/Javascripts/prototype/string.js
@@ -1,4 +1,46 @@
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, '');
},
@@ -16,7 +58,7 @@ Object.extend(String.prototype, {
},
evalScripts: function() {
- return this.extractScripts().map(eval);
+ return this.extractScripts().map(function(script) { return eval(script) });
},
escapeHTML: function() {
@@ -62,8 +104,31 @@ Object.extend(String.prototype, {
},
inspect: function() {
- return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'";
+ 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();
+ });
+ }
+}
diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php
index 03362110..c5b5e7a5 100644
--- a/framework/Web/UI/WebControls/TBaseValidator.php
+++ b/framework/Web/UI/WebControls/TBaseValidator.php
@@ -131,14 +131,18 @@ abstract class TBaseValidator extends TLabel implements IValidator
*/
protected function getClientScriptOptions()
{
- $options['id'] = $this->getClientID();
- $options['display'] = $this->getDisplay();
- $options['errormessage'] = $this->getErrorMessage();
- $options['focusonerror'] = $this->getFocusOnError();
- $options['focuselementid'] = $this->getFocusElementID();
- $options['validationgroup'] = $this->getValidationGroup();
- $options['controltovalidate'] = $this->getValidationTarget()->getClientID();
- $options['controlcssclass'] = $this->getControlCssClass();
+ $options['ID'] = $this->getClientID();
+ $options['FormID'] = $this->getPage()->getForm()->getClientID();
+ $options['Display'] = $this->getDisplay();
+ $options['ErrorMessage'] = $this->getErrorMessage();
+ if($this->getFocusOnError())
+ {
+ $options['FocusOnError'] = $this->getFocusOnError();
+ $options['FocusElementID'] = $this->getFocusElementID();
+ }
+ $options['ValidationGroup'] = $this->getValidationGroup();
+ $options['ControlToValidate'] = $this->getValidationTarget()->getClientID();
+ $options['ControlCssClass'] = $this->getControlCssClass();
return $options;
}
@@ -156,8 +160,10 @@ abstract class TBaseValidator extends TLabel implements IValidator
$scriptKey = "TBaseValidator:$formID";
if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey))
{
+ $manager['FormID'] = $formID;
+ $options = TJavaScript::encode($manager);
$scripts->registerPradoScript('validator');
- $scripts->registerEndScript($scriptKey, "Prado.Validation.AddForm('$formID');");
+ $scripts->registerEndScript($scriptKey, "new Prado.Validation({$options});");
}
if($this->getEnableClientScript())
$this->registerClientScriptValidator();
@@ -195,7 +201,7 @@ abstract class TBaseValidator extends TLabel implements IValidator
$scriptKey = "prado:".$this->getClientID();
$scripts = $this->getPage()->getClientScript();
$options = TJavaScript::encode($this->getClientScriptOptions());
- $js = "new Prado.Validation(Prado.Validation.{$class}, {$options});";
+ $js = "new Prado.WebUI.{$class}({$options});";
$scripts->registerEndScript($scriptKey, $js);
}
}
diff --git a/framework/Web/UI/WebControls/TButton.php b/framework/Web/UI/WebControls/TButton.php
index 72c68a2c..b9872a64 100644
--- a/framework/Web/UI/WebControls/TButton.php
+++ b/framework/Web/UI/WebControls/TButton.php
@@ -109,6 +109,7 @@ class TButton extends TWebControl implements IPostBackEventHandler, IButtonContr
{
$options['ID']=$this->getClientID();
$options['CausesValidation']=$this->getCausesValidation();
+ $options['EventTarget'] = $this->getUniqueID();
$options['ValidationGroup']=$this->getValidationGroup();
return $options;
diff --git a/framework/Web/UI/WebControls/TCompareValidator.php b/framework/Web/UI/WebControls/TCompareValidator.php
index 1bf4c529..172e472f 100644
--- a/framework/Web/UI/WebControls/TCompareValidator.php
+++ b/framework/Web/UI/WebControls/TCompareValidator.php
@@ -32,7 +32,8 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator');
* - <b>Integer</b> A 32-bit signed integer data type.
* - <b>Float</b> A double-precision floating point number data type.
* - <b>Currency</b> A decimal data type that can contain currency symbols.
- * - <b>Date</b> A date data type. The format follows the GNU date syntax.
+ * - <b>Date</b> A date data type. The format can be specified by the
+ * {@link setDateFormat DateFormat} property
* - <b>String</b> A string data type.
*
* Use the {@link setOperator Operator} property to specify the type of comparison
@@ -220,15 +221,15 @@ class TCompareValidator extends TBaseValidator
if(($name=$this->getControlToCompare())!=='')
{
if(($control=$this->findControl($name))!==null)
- $options['controltocompare']=$options['controlhookup']=$control->getClientID();
+ $options['ControlToCompare']=$control->getClientID();
}
if(($value=$this->getValueToCompare())!=='')
- $options['valuetocompare']=$value;
+ $options['ValueToCompare']=$value;
if(($operator=$this->getOperator())!=='Equal')
- $options['operator']=$operator;
- $options['type']=$this->getDataType();
+ $options['Operator']=$operator;
+ $options['DataType']=$this->getDataType();
if(($dateFormat=$this->getDateFormat())!=='')
- $options['dateformat']=$dateFormat;
+ $options['DateFormat']=$dateFormat;
return $options;
}
}
diff --git a/framework/Web/UI/WebControls/TCustomValidator.php b/framework/Web/UI/WebControls/TCustomValidator.php
index b72ec344..27cfa67a 100644
--- a/framework/Web/UI/WebControls/TCustomValidator.php
+++ b/framework/Web/UI/WebControls/TCustomValidator.php
@@ -107,7 +107,7 @@ class TCustomValidator extends TBaseValidator
{
$options=parent::getClientScriptOptions();
if(($clientJs=$this->getClientValidationFunction())!=='')
- $options['clientvalidationfunction']=$clientJs;
+ $options['ClientValidationFunction']=$clientJs;
return $options;
}
}
diff --git a/framework/Web/UI/WebControls/TRangeValidator.php b/framework/Web/UI/WebControls/TRangeValidator.php
index 7ded3e71..56cc16bc 100644
--- a/framework/Web/UI/WebControls/TRangeValidator.php
+++ b/framework/Web/UI/WebControls/TRangeValidator.php
@@ -271,11 +271,11 @@ class TRangeValidator extends TBaseValidator
protected function getClientScriptOptions()
{
$options=parent::getClientScriptOptions();
- $options['minimumvalue']=$this->getMinValue();
- $options['maximumvalue']=$this->getMaxValue();
- $options['type']=$this->getDataType();
+ $options['MinValue']=$this->getMinValue();
+ $options['MaxValue']=$this->getMaxValue();
+ $options['DataType']=$this->getDataType();
if(($dateFormat=$this->getDateFormat())!=='')
- $options['dateformat']=$dateFormat;
+ $options['DateFormat']=$dateFormat;
return $options;
}
}
diff --git a/framework/Web/UI/WebControls/TRegularExpressionValidator.php b/framework/Web/UI/WebControls/TRegularExpressionValidator.php
index 4271c820..e73fd5be 100644
--- a/framework/Web/UI/WebControls/TRegularExpressionValidator.php
+++ b/framework/Web/UI/WebControls/TRegularExpressionValidator.php
@@ -89,7 +89,7 @@ class TRegularExpressionValidator extends TBaseValidator
protected function getClientScriptOptions()
{
$options = parent::getClientScriptOptions();
- $options['validationexpression']=$this->getRegularExpression();
+ $options['ValidationExpression']=$this->getRegularExpression();
return $options;
}
}
diff --git a/framework/Web/UI/WebControls/TRequiredFieldValidator.php b/framework/Web/UI/WebControls/TRequiredFieldValidator.php
index 702fc5d2..ddbb12c8 100644
--- a/framework/Web/UI/WebControls/TRequiredFieldValidator.php
+++ b/framework/Web/UI/WebControls/TRequiredFieldValidator.php
@@ -68,7 +68,7 @@ class TRequiredFieldValidator extends TBaseValidator
protected function getClientScriptOptions()
{
$options = parent::getClientScriptOptions();
- $options['initialvalue']=$this->getInitialValue();
+ $options['InitialValue']=$this->getInitialValue();
return $options;
}
}
diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php
index 437e10d6..0d9f88e3 100644
--- a/framework/Web/UI/WebControls/TValidationSummary.php
+++ b/framework/Web/UI/WebControls/TValidationSummary.php
@@ -219,7 +219,7 @@ class TValidationSummary extends TWebControl
if(!$this->getEnabled(true) || !$this->getEnableClientScript())
return;
$options=TJavaScript::encode($this->getClientScriptOptions());
- $script = "new Prado.Validation.Summary({$options});";
+ $script = "new Prado.WebUI.TValidationSummary({$options});";
$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);
}
@@ -229,19 +229,19 @@ class TValidationSummary extends TWebControl
*/
protected function getClientScriptOptions()
{
- $options['id'] = $this->ClientID;
- $options['form'] = $this->Page->Form->ClientID;
+ $options['ID'] = $this->ClientID;
+ $options['FormID'] = $this->Page->Form->ClientID;
if($this->getShowMessageBox())
- $options['showmessagebox']='True';
+ $options['ShowMessageBox']=true;
if(!$this->getShowSummary())
- $options['showsummary']='False';
+ $options['ShowSummary']=false;
- $options['headertext']=$this->getHeaderText();
- $options['displaymode']=$this->getDisplayMode();
+ $options['HeaderText']=$this->getHeaderText();
+ $options['DisplayMode']=$this->getDisplayMode();
- $options['refresh'] = $this->getAutoUpdate();
- $options['validationgroup'] = $this->getValidationGroup();
- $options['display'] = $this->getDisplay();
+ $options['Refresh'] = $this->getAutoUpdate();
+ $options['ValidationGroup'] = $this->getValidationGroup();
+ $options['Display'] = $this->getDisplay();
return $options;
}
diff --git a/tests/FunctionalTests/validators/protected/pages/CausesValidation.page b/tests/FunctionalTests/validators/protected/pages/CausesValidation.page
new file mode 100644
index 00000000..c6748b9a
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/CausesValidation.page
@@ -0,0 +1,11 @@
+<com:TContent ID="Content">
+
+<h1>Test for CausesValidation="false"</h1>
+<div>
+<com:TTextBox ID="TestTextBox" />
+<com:TRequiredFieldValidator ID="TestRFValidator" ControlToValidate="TestTextBox" ErrorMessage="Field Required." />
+<com:TButton ID="TestButton" OnCommand="Page.onTest" Text="Test" CausesValidation="false" />
+<com:TLabel ID="Label1" />
+</div>
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/CompareValidator.page b/tests/FunctionalTests/validators/protected/pages/CompareValidator.page
new file mode 100644
index 00000000..679d2e8e
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/CompareValidator.page
@@ -0,0 +1,31 @@
+<com:TContent ID="Content">
+<h1>Prado CompareValidator Tests</h1>
+<div>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TTextBox ID="text2" />
+ <com:TCompareValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ControlToCompare="text2"
+ ErrorMessage="Must match"
+ ControlCssClass="required" />
+ </div>
+
+ <div>
+ <com:TTextBox ID="text3" />
+ <com:TCompareValidator
+ ID="validator2"
+ ControlToValidate="text3"
+ ValueToCompare="12/1/2005"
+ DataType="Date"
+ DateFormat="d/M/yyyy"
+ ErrorMessage="Must be a date 12/1/2005"
+ ControlCssClass="required" />
+ </div>
+
+ <com:TButton ID="submit1" Text="Test" />
+</div>
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/CustomValidator.page b/tests/FunctionalTests/validators/protected/pages/CustomValidator.page
new file mode 100644
index 00000000..2d0d490b
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/CustomValidator.page
@@ -0,0 +1,26 @@
+<com:TContent ID="Content">
+<h1>Prado CustomValidator Tests</h1>
+
+<script type="text/javascript">
+var MyCustomValidator =
+{
+ validate : function(sender, value)
+ {
+ return value == "Prado";
+ }
+}
+</script>
+<div>
+ <com:TTextBox ID="text1" />
+ <com:TCustomValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="Enter 'Prado'"
+ ControlCssClass="required"
+ ClientValidationFunction="MyCustomValidator.validate"
+ OnServerValidate="CustomValidation"
+ />
+ <com:TButton ID="submit1" Text="Test" />
+</div>
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/CustomValidator.php b/tests/FunctionalTests/validators/protected/pages/CustomValidator.php
new file mode 100644
index 00000000..ed1f9433
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/CustomValidator.php
@@ -0,0 +1,14 @@
+<?php
+/*
+ * Created on 16/04/2006
+ */
+
+class CustomValidator extends TPage
+{
+ function CustomValidation($sender, $params)
+ {
+ $params->isValid = $this->text1->Text == "Prado";
+ }
+}
+
+?>
diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page
new file mode 100644
index 00000000..f7f65460
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorDate.page
@@ -0,0 +1,48 @@
+<com:TContent ID="Content">
+<h1>Prado RangeValidator Tests Date</h1>
+<div>
+ <p>Dates between 22/1/2005 and 3/2/2005</p>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TRangeValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="Dates between 22/1/2005 and 3/2/2005"
+ MinValue="22/1/2005"
+ MaxValue="3/2/2005"
+ DataType="Date"
+ DateFormat="d/M/yyyy"
+ ControlCssClass="required" />
+ </div>
+ <p>Dates &gt;= 22/1/2005</p>
+ <div>
+ <com:TTextBox ID="text2" />
+ <com:TRangeValidator
+ ID="validator2"
+ ControlToValidate="text2"
+ ErrorMessage="Dates &gt;= 22/1/2005"
+ MinValue="22/1/2005"
+ DataType="Date"
+ DateFormat="d/M/yyyy"
+ ControlCssClass="required" />
+ </div>
+
+ <p>Dates &lt;= 3/2/2005</p>
+ <div>
+ <com:TTextBox ID="text3" />
+ <com:TRangeValidator
+ ID="validator3"
+ ControlToValidate="text3"
+ ErrorMessage="Dates &lt;= 3/2/2005"
+ MaxValue="3/2/2005"
+ DataType="Date"
+ DateFormat="d/M/yyyy"
+ ControlCssClass="required" />
+ </div>
+
+ <com:TButton ID="submit1"Text="Test" />
+</div>
+
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page
new file mode 100644
index 00000000..18c476c7
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorFloat.page
@@ -0,0 +1,45 @@
+<com:TContent ID="Content">
+<h1>Prado RangeValidator Tests Float</h1>
+<div>
+ <p>Float between 1.4 and 4.4</p>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TRangeValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="Numbers between 1.4 and 4.4"
+ MinValue="1.4"
+ MaxValue="4.4"
+ DataType="Float"
+ ControlCssClass="required" />
+ </div>
+ <p>Float &gt;= 2.2</p>
+ <div>
+ <com:TTextBox ID="text2" />
+ <com:TRangeValidator
+ ID="validator2"
+ ControlToValidate="text2"
+ ErrorMessage="Numbers &gt;= 2.2"
+ MinValue="2.2"
+ DataType="Float"
+ ControlCssClass="required" />
+ </div>
+
+ <p>Float &lt;= 20.2</p>
+ <div>
+ <com:TTextBox ID="text3" />
+ <com:TRangeValidator
+ ID="validator3"
+ ControlToValidate="text3"
+ ErrorMessage="Numbers &lt;= 20.2"
+ MaxValue="20.2"
+ DataType="Float"
+ ControlCssClass="required" />
+ </div>
+
+ <com:TButton ID="submit1"Text="Test" />
+</div>
+
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page
new file mode 100644
index 00000000..922236e5
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorInteger.page
@@ -0,0 +1,45 @@
+<com:TContent ID="Content">
+<h1>Prado RangeValidator Tests Integer</h1>
+<div>
+ <p>Integers between 1 and 4</p>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TRangeValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="Numbers between 1 and 4"
+ MinValue="1"
+ MaxValue="4"
+ DataType="Integer"
+ ControlCssClass="required" />
+ </div>
+ <p>Integers &gt;= 2</p>
+ <div>
+ <com:TTextBox ID="text2" />
+ <com:TRangeValidator
+ ID="validator2"
+ ControlToValidate="text2"
+ ErrorMessage="Numbers &gt;= 2"
+ MinValue="2"
+ DataType="Integer"
+ ControlCssClass="required" />
+ </div>
+
+ <p>Integers &lt;= 20</p>
+ <div>
+ <com:TTextBox ID="text3" />
+ <com:TRangeValidator
+ ID="validator3"
+ ControlToValidate="text3"
+ ErrorMessage="Numbers &lt;= 20"
+ MaxValue="20"
+ DataType="Integer"
+ ControlCssClass="required" />
+ </div>
+
+ <com:TButton ID="submit1" Text="Test" />
+</div>
+
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page b/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page
new file mode 100644
index 00000000..64e596d6
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RangeValidatorString.page
@@ -0,0 +1,45 @@
+<com:TContent ID="Content">
+<h1>Prado RangeValidator Tests String</h1>
+<div>
+ <p>Strings between 'd' and 'y'</p>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TRangeValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="Strings between 'd' and 'y'"
+ MinValue="d"
+ MaxValue="y"
+ DataType="String"
+ ControlCssClass="required" />
+ </div>
+ <p>Strings &gt;= 'd'</p>
+ <div>
+ <com:TTextBox ID="text2" />
+ <com:TRangeValidator
+ ID="validator2"
+ ControlToValidate="text2"
+ ErrorMessage="Strings &gt;= 'd'"
+ MinValue="d"
+ DataType="String"
+ ControlCssClass="required" />
+ </div>
+
+ <p>Strings &lt;= 'y'</p>
+ <div>
+ <com:TTextBox ID="text3" />
+ <com:TRangeValidator
+ ID="validator3"
+ ControlToValidate="text3"
+ ErrorMessage="Strings &lt;= 'y'"
+ MaxValue="y"
+ DataType="String"
+ ControlCssClass="required" />
+ </div>
+
+ <com:TButton ID="submit1"Text="Test" />
+</div>
+
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page b/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page
new file mode 100644
index 00000000..ac24cd0d
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RegularExpressionValidator.page
@@ -0,0 +1,22 @@
+<com:TContent ID="Content">
+<h1>Prado RegularExpressionValidator Tests</h1>
+<div>
+ <div>
+ <com:TTextBox ID="text1" />
+ <com:TRegularExpressionValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ErrorMessage="5 digits"
+ RegularExpression="\d{5}"
+ ControlCssClass="required" />
+ <com:TTextBox ID="text2" />
+ <com:TEmailAddressValidator
+ ID="validator2"
+ ControlToValidate="text2"
+ ErrorMessage="Email Address!"
+ ControlCssClass="required" />
+ </div>
+ <com:TButton ID="submit1" Text="Test" />
+</div>
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page b/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page
new file mode 100644
index 00000000..f8a1c4ca
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RequiredFieldValidator.page
@@ -0,0 +1,108 @@
+<com:TContent ID="Content">
+<h1>RequiredFieldValidator Tests</h1>
+<div>
+<!-- group 1 -->
+<com:TValidationSummary ID="summary1" ValidationGroup="group1" AutoUpdate="False" />
+<div>
+ <com:TTextBox ID="text1" />
+ <com:TRequiredFieldValidator
+ ID="validator1"
+ ControlToValidate="text1"
+ ControlCssClass="required"
+ Display="Dynamic"
+ CssClass="message"
+ ValidationGroup="group1"
+ ErrorMessage="text1!"/>
+
+ <com:TCheckBox ID="check1" />
+ <com:TRequiredFieldValidator
+ ID="validator2"
+ ControlToValidate="check1"
+ ControlCssClass="required"
+ Display="Dynamic"
+ CssClass="message"
+ ValidationGroup="group1"
+ ErrorMessage="check 1!" />
+ <com:TButton ID="submit1" Text="Group1" ValidationGroup="group1" />
+</div>
+<!-- group 2 -->
+<com:TValidationSummary ID="summary2" ValidationGroup="group2" />
+<div>
+ <com:TTextBox ID="text2" />
+ <com:TRequiredFieldValidator
+ ID="validator3"
+ ControlToValidate="text2"
+ ControlCssClass="required"
+ CssClass="message"
+ ValidationGroup="group2"
+ ErrorMessage="text2!"/>
+
+ <com:TCheckBox ID="check2" />
+ <com:TRequiredFieldValidator
+ ID="validator4"
+ ControlToValidate="check2"
+ ControlCssClass="required"
+ CssClass="message"
+ ValidationGroup="group2"
+ ErrorMessage="check 2!" />
+ <com:TButton ID="submit2" Text="Group2" ValidationGroup="group2"/>
+</div>
+
+<!-- no group -->
+<com:TValidationSummary ID="summary3" />
+
+<div>
+ <com:TTextBox ID="text3" />
+ <com:TRequiredFieldValidator
+ ID="validator5"
+ ControlToValidate="text3"
+ ControlCssClass="required"
+ CssClass="message"
+ ErrorMessage="text3!"/>
+
+ <com:TCheckBox ID="check3" />
+ <com:TRequiredFieldValidator
+ ID="validator6"
+ ControlToValidate="check3"
+ ControlCssClass="required"
+ CssClass="message"
+ ErrorMessage="check 3!" />
+</div>
+<div>
+ <com:TTextBox ID="text4" />
+ <com:TRequiredFieldValidator
+ ID="validator7"
+ ControlToValidate="text4"
+ ControlCssClass="required"
+ CssClass="message"
+ ErrorMessage="text4!"/>
+
+ <com:TCheckBox ID="check4" />
+ <com:TRequiredFieldValidator
+ ID="validator8"
+ ControlToValidate="check4"
+ ControlCssClass="required"
+ CssClass="message"
+ ErrorMessage="check 4!" />
+
+</div>
+ <com:TButton ID="submit3" Text="No Group" />
+
+
+
+<com:TButton ID="submit4" Text="Submit By Pass" CausesValidation="False" />
+
+</div>
+
+<div><h2>InitialValue Test</h2>
+ <com:TTextBox id="text5" Text="test"/>
+ <com:TRequiredFieldValidator
+ id="validator9"
+ ValidationGroup="group4"
+ ControlToValidate="text5"
+ InitialValue="test"
+ ErrorMessage="change 'test' to something else" />
+ <com:TButton id="submit5" Text="initial value" ValidationGroup="group4" />
+</div>
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page b/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page
new file mode 100644
index 00000000..9bbd9d5a
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/RequiredListValidator.page
@@ -0,0 +1,57 @@
+<com:TContent ID="Content">
+
+<div>
+ <div class="lista">
+ <com:TCheckBoxList ID="list1">
+ <com:TListItem Value="1" Text="One" />
+ <com:TListItem Value="2" Text="Two" />
+ <com:TListItem Value="3" Text="Three" />
+ <com:TListItem Value="4" Text="Four" />
+ </com:TCheckBoxList>
+ <com:TRequiredListValidator
+ ID="validator1"
+ ControlToValidate="list1"
+ ErrorMessage="Must select at least 1 and no more than 3"
+ ControlCssClass="required"
+ MinSelection="1"
+ MaxSelection="3" />
+
+ </div>
+ <div>
+ <com:TListBox ID="list2" SelectionMode="Multiple" Rows="5" Style="width:10em">
+ <com:TListItem Value="1" Text="One" />
+ <com:TListItem Value="2" Text="Two" />
+ <com:TListItem Value="3" Text="Three" />
+ <com:TListItem Value="4" Text="Four" />
+ <com:TListItem Value="5" Text="Five" />
+ </com:TListBox>
+ <com:TRequiredListValidator
+ ID="validator2"
+ ControlToValidate="list2"
+ ErrorMessage='Must select at least 2 and no more than 3 and value "two"'
+ MinSelection="2"
+ MaxSelection="3"
+ RequiredSelections="2" />
+ </div>
+
+ <div class="lista">
+ <com:TCheckBoxList ID="list3">
+ <com:TListItem Value="1" Text="One" />
+ <com:TListItem Value="2" Text="Two" />
+ <com:TListItem Value="3" Text="Three" />
+ <com:TListItem Value="4" Text="Four" />
+ </com:TCheckBoxList>
+ <com:TRequiredListValidator
+ ID="validator3"
+ ControlToValidate="list3"
+ ErrorMessage="Must select at least 1"
+ ControlCssClass="required"
+ MinSelection="1"/>
+
+ </div>
+
+
+ <com:TButton ID="submit1" Text="Test" />
+</div>
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page b/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page
new file mode 100644
index 00000000..d260a93a
--- /dev/null
+++ b/tests/FunctionalTests/validators/protected/pages/ValidationSummary.page
@@ -0,0 +1,83 @@
+<com:TContent ID="Content">
+
+<h1>Validation Summary Test</h1>
+<fieldset id="quickRegistration">
+ <legend>Create New Account</legend>
+
+<div class="username">
+ Username:
+ <com:TTextBox ID="Username" />
+ <com:TRequiredFieldValidator
+ ID="UsernameVal"
+ ControlToValidate="Username"
+ Display="None"
+ ValidationGroup="registration"
+ ErrorMessage="a username is required." />
+</div>
+<div class="password">
+ Password
+ <com:TTextBox ID="Password" TextMode="Password" />
+</div>
+<com:TRequiredFieldValidator
+ ID="PasswordVal"
+ ControlToValidate="Password"
+ Display="None"
+ ValidationGroup="registration"
+ ErrorMessage="a password is required." />
+
+<div class="create">
+ <com:TButton ID="Create" ValidationGroup="registration" Text="Create New Account"/>
+</div>
+
+<div class="registrationSummary">
+ <com:TValidationSummary
+ ID="summary1"
+ ValidationGroup="registration"
+ AutoUpdate="false"
+ HeaderText="<p>Unable to create new account because</p>" />
+</div>
+
+</fieldset>
+
+
+<fieldset id="LoginForm">
+ <legend>Sign In</legend>
+
+<div class="username">
+ Login Name:
+ <com:TTextBox ID="UserID" />
+
+ <com:TRequiredFieldValidator
+ ID="UserVal1"
+ ControlToValidate="UserID"
+ Display="None"
+ ValidationGroup="signin"
+ ErrorMessage="the username or email was not provided" />
+</div>
+
+<div class="password" >
+ Password:
+ <com:TTextBox ID="Pass" TextMode="Password" />
+ <com:TRequiredFieldValidator
+ ID="loginValidator3"
+ ControlToValidate="Pass"
+ Display="None"
+ ValidationGroup="signin"
+ ErrorMessage="the password was not provided" />
+</div>
+
+
+<com:TButton ID="login" ValidationGroup="signin" CssClass="button" Text="Sign In" />
+
+<div class="validation">
+ <com:TValidationSummary
+ ID="summary2"
+ ValidationGroup="signin"
+ AutoUpdate="false"
+ HeaderText="<p>You could not login because</p>" />
+</div>
+
+</fieldset>
+
+
+</com:TContent> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php b/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php
new file mode 100644
index 00000000..5107a89f
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/CompareValidatorTestCase.php
@@ -0,0 +1,47 @@
+<?php
+
+//New Test
+class CompareValidatorTestCase extends SeleniumTestCase
+{
+ function test()
+ {
+ $base = "ctl0_Content_";
+
+ $this->open("validators/index.php?page=CompareValidator", "");
+ $this->verifyTextPresent("Prado CompareValidator Tests", "");
+
+ $this->type("{$base}text1", "qwe");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+
+ $this->click("//input[@type='submit' and @value='Test']", "");
+
+ $this->type("{$base}text2", "1234");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1");
+
+ $this->type("{$base}text2", "qwe");
+ $this->assertNotVisible("{$base}validator1");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+
+
+ $this->type("{$base}text3", "12312");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator2");
+
+ $this->type("{$base}text3", "13/1/2005");
+ $this->assertVisible("{$base}validator2");
+
+
+ $this->type("{$base}text3", "12/1/2005");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php b/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php
new file mode 100644
index 00000000..3a5daa6a
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/CustomValidatorTestCase.php
@@ -0,0 +1,31 @@
+<?php
+
+//New Test
+class CustomValidatorTestCase extends SeleniumTestCase
+{
+ function test()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=CustomValidator", "");
+ $this->assertTextPresent("Prado CustomValidator Tests", "");
+ $this->assertNotVisible("{$base}validator1");
+
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1");
+
+ $this->type("{$base}text1", "Prado");
+ $this->pause(250);
+ $this->assertNotVisible("{$base}validator1");
+ $this->type("{$base}text1", "Testing");
+ $this->pause(250);
+ $this->assertVisible("{$base}validator1");
+ $this->type("{$base}text1", "Prado");
+ $this->pause(250);
+ $this->assertNotVisible("{$base}validator1");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1");
+
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php b/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php
new file mode 100644
index 00000000..69d4cc07
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/RangeValidatorTestCase.php
@@ -0,0 +1,167 @@
+<?php
+
+//New Test
+class RangeValidatorTestCase extends SeleniumTestCase
+{
+ function testIntegerRange()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RangeValidatorInteger", "");
+ $this->verifyTextPresent("Prado RangeValidator Tests Integer", "");
+
+ //between 1 and 4
+ $this->type("{$base}text1", "ad");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "12");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "2");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+
+
+ // >= 2
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "1");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "10");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator2", "");
+
+ // <= 20
+ $this->assertNotVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "100");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "10");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator3", "");
+
+ }
+
+ function testFloatRange()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RangeValidatorFloat", "");
+ $this->verifyTextPresent("Prado RangeValidator Tests Float", "");
+
+ //between 1 and 4
+ $this->type("{$base}text1", "ad");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "12");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "2");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+
+
+ // >= 2
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "1");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "10");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator2", "");
+
+ // <= 20
+ $this->assertNotVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "100");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "10");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator3", "");
+ }
+
+ function testDateRange()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RangeValidatorDate", "");
+ $this->verifyTextPresent("Prado RangeValidator Tests Date", "");
+
+ //between 22/1/2005 and 3/2/2005
+ $this->type("{$base}text1", "ad");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "27/2/2005");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "1/2/2005");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+
+
+ // >= 22/1/2005
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "1/1/2005");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->pause(250);
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "1/4/2005");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator2", "");
+
+ // <= 3/2/2005
+ $this->assertNotVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "4/5/2005");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->pause(250);
+ $this->assertVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "1/2/2005");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator3", "");
+ }
+
+ function testStringRange()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RangeValidatorString", "");
+ $this->verifyTextPresent("Prado RangeValidator Tests String", "");
+
+ //between 'd' and 'y'
+ $this->type("{$base}text1", "a");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "b");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "f");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+
+
+ // >= 'd'
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "a");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "g");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator2", "");
+
+ // <= 'y'
+ $this->assertNotVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "z");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator3", "");
+ $this->type("{$base}text3", "t");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator3", "");
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php b/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php
new file mode 100644
index 00000000..751ab80a
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/RegExpValidatorTestCase.php
@@ -0,0 +1,34 @@
+<?php
+
+//New Test
+class RegExpValidatorTestCase extends SeleniumTestCase
+{
+ function test()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RegularExpressionValidator", "");
+ $this->verifyTextPresent("Prado RegularExpressionValidator Tests", "");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->type("{$base}text1", "1");
+ $this->type("{$base}text2", "2");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text1", "asdasd");
+ $this->click("//input[@type='submit' and @value='Test']", "");
+ $this->assertVisible("{$base}validator1", "");
+ $this->type("{$base}text1", "12345");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->assertVisible("{$base}validator2", "");
+ $this->type("{$base}text2", "wei@gmail.com");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->assertNotVisible("{$base}validator2", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Test']", "");
+ $this->assertNotVisible("{$base}validator1", "");
+ $this->assertNotVisible("{$base}validator2", "");
+
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php b/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php
new file mode 100644
index 00000000..41372b93
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/RequiredFieldTestCase.php
@@ -0,0 +1,87 @@
+<?php
+
+class RequiredFieldTestCase extends SeleniumTestCase
+{
+ function test()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RequiredFieldValidator");
+ $this->assertTextPresent("RequiredFieldValidator Tests");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+ $this->click("{$base}submit1");
+ $this->assertVisible("{$base}validator1");
+ $this->assertVisible("{$base}validator2");
+ $this->type("{$base}text1", "testing");
+ $this->click("{$base}submit1");
+ $this->assertNotVisible("{$base}validator1");
+ $this->click("{$base}submit2");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+ $this->assertVisible("{$base}validator3");
+ $this->assertVisible("{$base}validator4");
+ $this->type("{$base}text2", "testing2");
+ $this->click("{$base}submit2");
+ $this->assertNotVisible("{$base}validator3");
+ $this->click("{$base}submit3");
+ $this->assertVisible("{$base}summary3");
+ $this->clickAndWait("{$base}submit4");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+ $this->assertNotVisible("{$base}validator3");
+ $this->assertNotVisible("{$base}validator4");
+ $this->click("{$base}submit1");
+ $this->assertVisible("{$base}validator2");
+ $this->click("{$base}check1");
+ $this->click("{$base}submit2");
+ $this->assertVisible("{$base}validator4");
+ $this->clickAndWait("{$base}submit1");
+ $this->assertNotVisible("{$base}validator1");
+ $this->assertNotVisible("{$base}validator2");
+ $this->type("{$base}text1");
+ $this->click("{$base}check1");
+ $this->click("{$base}submit1");
+ $this->assertVisible("{$base}validator1");
+ $this->assertVisible("{$base}validator2");
+ $this->click("{$base}check2");
+ $this->clickAndWait("{$base}submit2");
+
+ $this->type("{$base}text1", "Hello");
+ $this->click("{$base}check1");
+ $this->click("{$base}submit2");
+
+ $this->assertNotVisible("{$base}validator5");
+ $this->assertNotVisible("{$base}validator6");
+ $this->assertNotVisible("{$base}validator7");
+ $this->assertNotVisible("{$base}validator8");
+ $this->type("{$base}text1");
+ $this->type("{$base}text2");
+ $this->click("{$base}check1");
+ $this->click("{$base}check2");
+ $this->click("{$base}submit3");
+ $this->assertVisible("{$base}validator5");
+ $this->assertVisible("{$base}validator6");
+ $this->assertVisible("{$base}validator7");
+ $this->assertVisible("{$base}validator8");
+ $this->clickAndWait("{$base}submit4");
+ $this->assertNotVisible("{$base}validator5");
+ $this->assertNotVisible("{$base}validator6");
+ $this->assertNotVisible("{$base}validator7");
+ $this->assertNotVisible("{$base}validator8");
+ }
+
+ function testInitialValue()
+ {
+ $base = "ctl0_Content_";
+ $this->open("validators/index.php?page=RequiredFieldValidator");
+ $this->assertTextPresent("InitialValue Test");
+ $this->assertNotVisible("{$base}validator9");
+ $this->click("{$base}submit5");
+ $this->pause(250);
+ $this->assertVisible("{$base}validator9");
+ $this->type("{$base}text5", "adasd");
+ $this->pause(250);
+ $this->assertNotVisible("{$base}validator9");
+ }
+}
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/RequiredListTestCase.php b/tests/FunctionalTests/validators/tests/RequiredListTestCase.php
new file mode 100644
index 00000000..1eab60d4
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/RequiredListTestCase.php
@@ -0,0 +1,40 @@
+<?php
+
+class RequiredListTestCase extends SeleniumTestCase
+{
+
+ function test()
+ {
+ $this->open("validators/index.php?page=RequiredListValidator");
+ $this->assertLocation("index.php?page=RequiredListValidator");
+ $this->click("submit1");
+ $this->assertVisible("validator1");
+ $this->assertVisible("validator2");
+ $this->assertVisible("validator3");
+ $this->click("list1:0");
+ $this->select("list2", "label=One");
+ $this->select("list2", "label=Two");
+ $this->click("list3:3");
+ $this->clickAndWait("submit1");
+ $this->assertNotVisible("validator1");
+ $this->assertNotVisible("validator2");
+ $this->assertNotVisible("validator3");
+ $this->click("list1:1");
+ $this->click("list1:2");
+ $this->click("list1:3");
+ $this->select("list2", "label=Two");
+ $this->click("list1:3");
+ $this->click("submit1");
+ $this->assertNotVisible("validator1");
+ $this->assertNotVisible("validator2");
+ $this->assertNotVisible("validator3");
+ $this->click("list3:3");
+ $this->click("submit1");
+ $this->pause(200);
+ $this->assertNotVisible("validator1");
+ $this->assertNotVisible("validator2");
+ $this->assertVisible("validator3");
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php b/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php
new file mode 100644
index 00000000..3b6225f3
--- /dev/null
+++ b/tests/FunctionalTests/validators/tests/ValidationSummaryTestCase.php
@@ -0,0 +1,50 @@
+<?php
+
+//New Test
+class ValidationSummaryTestCase extends SeleniumTestCase
+{
+ function test()
+ {
+ $base = "ctl0_Content_";
+
+ $this->open("validators/index.php?page=ValidationSummary", "");
+ $this->verifyTextPresent("Validation Summary Test", "");
+ //$this->verifyText("{$base}summary1", "");
+ //$this->verifyText("{$base}summary2", "");
+
+ $this->click("//input[@type='submit' and @value='Create New Account']", "");
+ $this->assertVisible("{$base}summary1");
+ $this->assertNotVisible("{$base}summary2");
+
+ $this->click("//input[@type='submit' and @value='Sign In']", "");
+ $this->assertNotVisible("{$base}summary1");
+ $this->assertVisible("{$base}summary2");
+
+ $this->type("{$base}Username", "qwe");
+ $this->type("{$base}Password", "ewwq");
+ $this->click("//input[@type='submit' and @value='Sign In']", "");
+ $this->assertNotVisible("{$base}summary1");
+ $this->assertVisible("{$base}summary2");
+
+ /*$this->clickAndWait("//input[@type='submit' and @value='Create New Account']", "");
+ $this->type("{$base}UserID", "123");
+ $this->type("{$base}Pass", "123");
+ $this->clickAndWait("//input[@type='submit' and @value='Sign In']", "");
+ //$this->verifyText("{$base}summary1", "");
+ //$this->verifyText("{$base}summary2", "");
+ $this->clickAndWait("//input[@type='submit' and @value='Create New Account']", "");
+ //$this->verifyText("{$base}summary1", "");
+ //$this->verifyText("{$base}summary2", "");
+
+ $this->type("{$base}Password", "");
+ $this->click("//input[@type='submit' and @value='Create New Account']", "");
+ $this->assertVisible("{$base}summary1");
+ $this->assertNotVisible("{$base}summary2");
+
+ $this->type("{$base}Password", "12312");
+ $this->assertVisible("{$base}summary1");
+ */
+ }
+}
+
+?> \ No newline at end of file