rails 1.2.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rails might be problematic. Click here for more details.
- data/CHANGELOG +491 -12
- data/MIT-LICENSE +1 -1
- data/README +17 -25
- data/Rakefile +41 -18
- data/bin/about +1 -1
- data/bin/console +1 -1
- data/bin/destroy +1 -1
- data/bin/generate +1 -1
- data/bin/performance/request +3 -0
- data/bin/plugin +1 -1
- data/bin/runner +1 -1
- data/bin/server +1 -1
- data/builtin/rails_info/rails/info.rb +2 -2
- data/configs/apache.conf +1 -1
- data/configs/databases/mysql.yml +9 -3
- data/configs/databases/postgresql.yml +16 -12
- data/configs/initializers/inflections.rb +10 -0
- data/configs/initializers/mime_types.rb +5 -0
- data/configs/routes.rb +23 -11
- data/doc/README_FOR_APP +1 -1
- data/environments/boot.rb +95 -26
- data/environments/development.rb +2 -5
- data/environments/environment.rb +24 -25
- data/environments/test.rb +4 -1
- data/helpers/application.rb +5 -2
- data/helpers/test_helper.rb +10 -0
- data/html/422.html +30 -0
- data/html/500.html +1 -1
- data/html/index.html +2 -2
- data/html/javascripts/controls.js +484 -354
- data/html/javascripts/dragdrop.js +88 -58
- data/html/javascripts/effects.js +396 -364
- data/html/javascripts/prototype.js +2817 -1107
- data/html/robots.txt +5 -1
- data/lib/commands/console.rb +12 -5
- data/lib/commands/performance/request.rb +6 -0
- data/lib/commands/plugin.rb +15 -10
- data/lib/commands/process/spawner.rb +14 -4
- data/lib/commands/servers/base.rb +12 -0
- data/lib/commands/servers/mongrel.rb +5 -1
- data/lib/commands/servers/webrick.rb +14 -7
- data/lib/console_app.rb +5 -2
- data/lib/console_with_helpers.rb +5 -2
- data/lib/dispatcher.rb +3 -151
- data/lib/fcgi_handler.rb +79 -81
- data/lib/initializer.rb +125 -169
- data/lib/rails/plugin.rb +84 -0
- data/lib/rails/plugin/loader.rb +150 -0
- data/lib/rails/plugin/locator.rb +78 -0
- data/lib/rails/version.rb +3 -3
- data/lib/rails_generator/base.rb +11 -9
- data/lib/rails_generator/commands.rb +20 -10
- data/lib/rails_generator/generators/applications/app/USAGE +0 -7
- data/lib/rails_generator/generators/applications/app/app_generator.rb +25 -6
- data/lib/rails_generator/generators/components/controller/USAGE +11 -12
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +2 -2
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +1 -11
- data/lib/rails_generator/generators/components/controller/templates/{view.rhtml → view.html.erb} +0 -0
- data/lib/rails_generator/generators/components/integration_test/USAGE +5 -11
- data/lib/rails_generator/generators/components/mailer/USAGE +8 -10
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +3 -3
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +8 -24
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +3 -0
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -3
- data/lib/rails_generator/generators/components/migration/USAGE +23 -8
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +15 -2
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +6 -2
- data/lib/rails_generator/generators/components/model/USAGE +15 -14
- data/lib/rails_generator/generators/components/model/model_generator.rb +10 -3
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +11 -3
- data/lib/rails_generator/generators/components/model/templates/migration.rb +4 -1
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +1 -3
- data/lib/rails_generator/generators/components/observer/USAGE +5 -7
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +0 -2
- data/lib/rails_generator/generators/components/plugin/USAGE +8 -18
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +1 -0
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +20 -0
- data/lib/rails_generator/generators/components/plugin/templates/README +10 -1
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +1 -1
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +1 -1
- data/lib/rails_generator/generators/components/resource/USAGE +23 -0
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +13 -15
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +1 -1
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +2 -14
- data/lib/rails_generator/generators/components/scaffold/USAGE +24 -31
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +45 -146
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +64 -37
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +23 -80
- data/lib/rails_generator/generators/components/scaffold/templates/{layout.rhtml → layout.html.erb} +0 -0
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +1 -1
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_edit.rhtml → scaffold/templates/view_edit.html.erb} +4 -4
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_index.rhtml → scaffold/templates/view_index.html.erb} +4 -4
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_new.rhtml → scaffold/templates/view_new.html.erb} +3 -3
- data/lib/rails_generator/generators/components/{scaffold_resource/templates/view_show.rhtml → scaffold/templates/view_show.html.erb} +1 -1
- data/lib/rails_generator/generators/components/session_migration/USAGE +6 -11
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +3 -3
- data/lib/rails_generator/lookup.rb +45 -10
- data/lib/rails_generator/scripts.rb +6 -3
- data/lib/rails_generator/scripts/destroy.rb +23 -0
- data/lib/rails_generator/secret_key_generator.rb +160 -0
- data/lib/rails_generator/spec.rb +1 -1
- data/lib/source_annotation_extractor.rb +62 -0
- data/lib/tasks/annotations.rake +23 -0
- data/lib/tasks/databases.rake +249 -83
- data/lib/tasks/documentation.rake +11 -13
- data/lib/tasks/framework.rake +1 -1
- data/lib/tasks/rails.rb +1 -1
- data/lib/tasks/testing.rake +5 -7
- data/lib/test_help.rb +4 -3
- data/lib/webrick_server.rb +3 -4
- metadata +31 -49
- data/bin/breakpointer +0 -3
- data/lib/binding_of_caller.rb +0 -85
- data/lib/breakpoint.rb +0 -553
- data/lib/breakpoint_client.rb +0 -196
- data/lib/commands/breakpointer.rb +0 -1
- data/lib/rails_generator/generators/components/resource/templates/USAGE +0 -18
- data/lib/rails_generator/generators/components/resource/templates/fixtures.yml +0 -11
- data/lib/rails_generator/generators/components/resource/templates/migration.rb +0 -13
- data/lib/rails_generator/generators/components/resource/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/resource/templates/unit_test.rb +0 -10
- data/lib/rails_generator/generators/components/scaffold/templates/form.rhtml +0 -3
- data/lib/rails_generator/generators/components/scaffold/templates/form_scaffolding.rhtml +0 -1
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.rhtml +0 -9
- data/lib/rails_generator/generators/components/scaffold/templates/view_list.rhtml +0 -27
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.rhtml +0 -8
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.rhtml +0 -8
- data/lib/rails_generator/generators/components/scaffold_resource/USAGE +0 -29
- data/lib/rails_generator/generators/components/scaffold_resource/scaffold_resource_generator.rb +0 -93
- data/lib/rails_generator/generators/components/scaffold_resource/templates/controller.rb +0 -79
- data/lib/rails_generator/generators/components/scaffold_resource/templates/fixtures.yml +0 -11
- data/lib/rails_generator/generators/components/scaffold_resource/templates/functional_test.rb +0 -57
- data/lib/rails_generator/generators/components/scaffold_resource/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold_resource/templates/layout.rhtml +0 -17
- data/lib/rails_generator/generators/components/scaffold_resource/templates/migration.rb +0 -13
- data/lib/rails_generator/generators/components/scaffold_resource/templates/model.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold_resource/templates/style.css +0 -74
- data/lib/rails_generator/generators/components/scaffold_resource/templates/unit_test.rb +0 -10
- data/lib/rails_generator/generators/components/web_service/USAGE +0 -28
- data/lib/rails_generator/generators/components/web_service/templates/api_definition.rb +0 -5
- data/lib/rails_generator/generators/components/web_service/templates/controller.rb +0 -8
- data/lib/rails_generator/generators/components/web_service/templates/functional_test.rb +0 -19
- data/lib/rails_generator/generators/components/web_service/web_service_generator.rb +0 -29
- data/lib/tasks/pre_namespace_aliases.rake +0 -53
| @@ -1,10 +1,10 @@ | |
| 1 | 
            -
            // Copyright (c) 2005 | 
| 2 | 
            -
            //           (c) 2005 | 
| 1 | 
            +
            // Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
         | 
| 2 | 
            +
            //           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
         | 
| 3 3 | 
             
            // 
         | 
| 4 4 | 
             
            // script.aculo.us is freely distributable under the terms of an MIT-style license.
         | 
| 5 5 | 
             
            // For details, see the script.aculo.us web site: http://script.aculo.us/
         | 
| 6 6 |  | 
| 7 | 
            -
            if( | 
| 7 | 
            +
            if(Object.isUndefined(Effect))
         | 
| 8 8 | 
             
              throw("dragdrop.js requires including script.aculo.us' effects.js library");
         | 
| 9 9 |  | 
| 10 10 | 
             
            var Droppables = {
         | 
| @@ -20,14 +20,13 @@ var Droppables = { | |
| 20 20 | 
             
                  greedy:     true,
         | 
| 21 21 | 
             
                  hoverclass: null,
         | 
| 22 22 | 
             
                  tree:       false
         | 
| 23 | 
            -
                }, arguments[1] || {});
         | 
| 23 | 
            +
                }, arguments[1] || { });
         | 
| 24 24 |  | 
| 25 25 | 
             
                // cache containers
         | 
| 26 26 | 
             
                if(options.containment) {
         | 
| 27 27 | 
             
                  options._containers = [];
         | 
| 28 28 | 
             
                  var containment = options.containment;
         | 
| 29 | 
            -
                  if(( | 
| 30 | 
            -
                    (containment.constructor == Array)) {
         | 
| 29 | 
            +
                  if(Object.isArray(containment)) {
         | 
| 31 30 | 
             
                    containment.each( function(c) { options._containers.push($(c)) });
         | 
| 32 31 | 
             
                  } else {
         | 
| 33 32 | 
             
                    options._containers.push($(containment));
         | 
| @@ -87,21 +86,23 @@ var Droppables = { | |
| 87 86 |  | 
| 88 87 | 
             
              show: function(point, element) {
         | 
| 89 88 | 
             
                if(!this.drops.length) return;
         | 
| 90 | 
            -
                var affected = [];
         | 
| 89 | 
            +
                var drop, affected = [];
         | 
| 91 90 |  | 
| 92 | 
            -
                if(this.last_active) this.deactivate(this.last_active);
         | 
| 93 91 | 
             
                this.drops.each( function(drop) {
         | 
| 94 92 | 
             
                  if(Droppables.isAffected(point, element, drop))
         | 
| 95 93 | 
             
                    affected.push(drop);
         | 
| 96 94 | 
             
                });
         | 
| 97 95 |  | 
| 98 | 
            -
                if(affected.length>0) | 
| 96 | 
            +
                if(affected.length>0)
         | 
| 99 97 | 
             
                  drop = Droppables.findDeepestChild(affected);
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
         | 
| 100 | 
            +
                if (drop) {
         | 
| 100 101 | 
             
                  Position.within(drop.element, point[0], point[1]);
         | 
| 101 102 | 
             
                  if(drop.onHover)
         | 
| 102 103 | 
             
                    drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
         | 
| 103 104 |  | 
| 104 | 
            -
                  Droppables.activate(drop);
         | 
| 105 | 
            +
                  if (drop != this.last_active) Droppables.activate(drop);
         | 
| 105 106 | 
             
                }
         | 
| 106 107 | 
             
              },
         | 
| 107 108 |  | 
| @@ -110,8 +111,10 @@ var Droppables = { | |
| 110 111 | 
             
                Position.prepare();
         | 
| 111 112 |  | 
| 112 113 | 
             
                if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
         | 
| 113 | 
            -
                  if (this.last_active.onDrop) 
         | 
| 114 | 
            -
                    this.last_active.onDrop(element, this.last_active.element, event);
         | 
| 114 | 
            +
                  if (this.last_active.onDrop) {
         | 
| 115 | 
            +
                    this.last_active.onDrop(element, this.last_active.element, event); 
         | 
| 116 | 
            +
                    return true; 
         | 
| 117 | 
            +
                  }
         | 
| 115 118 | 
             
              },
         | 
| 116 119 |  | 
| 117 120 | 
             
              reset: function() {
         | 
| @@ -219,10 +222,7 @@ var Draggables = { | |
| 219 222 |  | 
| 220 223 | 
             
            /*--------------------------------------------------------------------------*/
         | 
| 221 224 |  | 
| 222 | 
            -
            var Draggable = Class.create( | 
| 223 | 
            -
            Draggable._dragging    = {};
         | 
| 224 | 
            -
             | 
| 225 | 
            -
            Draggable.prototype = {
         | 
| 225 | 
            +
            var Draggable = Class.create({
         | 
| 226 226 | 
             
              initialize: function(element) {
         | 
| 227 227 | 
             
                var defaults = {
         | 
| 228 228 | 
             
                  handle: false,
         | 
| @@ -233,7 +233,7 @@ Draggable.prototype = { | |
| 233 233 | 
             
                    });
         | 
| 234 234 | 
             
                  },
         | 
| 235 235 | 
             
                  endeffect: function(element) {
         | 
| 236 | 
            -
                    var toOpacity =  | 
| 236 | 
            +
                    var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
         | 
| 237 237 | 
             
                    new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
         | 
| 238 238 | 
             
                      queue: {scope:'_draggable', position:'end'},
         | 
| 239 239 | 
             
                      afterFinish: function(){ 
         | 
| @@ -243,6 +243,7 @@ Draggable.prototype = { | |
| 243 243 | 
             
                  },
         | 
| 244 244 | 
             
                  zindex: 1000,
         | 
| 245 245 | 
             
                  revert: false,
         | 
| 246 | 
            +
                  quiet: false,
         | 
| 246 247 | 
             
                  scroll: false,
         | 
| 247 248 | 
             
                  scrollSensitivity: 20,
         | 
| 248 249 | 
             
                  scrollSpeed: 15,
         | 
| @@ -250,7 +251,7 @@ Draggable.prototype = { | |
| 250 251 | 
             
                  delay: 0
         | 
| 251 252 | 
             
                };
         | 
| 252 253 |  | 
| 253 | 
            -
                if(!arguments[1] ||  | 
| 254 | 
            +
                if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
         | 
| 254 255 | 
             
                  Object.extend(defaults, {
         | 
| 255 256 | 
             
                    starteffect: function(element) {
         | 
| 256 257 | 
             
                      element._opacity = Element.getOpacity(element);
         | 
| @@ -259,11 +260,11 @@ Draggable.prototype = { | |
| 259 260 | 
             
                    }
         | 
| 260 261 | 
             
                  });
         | 
| 261 262 |  | 
| 262 | 
            -
                var options = Object.extend(defaults, arguments[1] || {});
         | 
| 263 | 
            +
                var options = Object.extend(defaults, arguments[1] || { });
         | 
| 263 264 |  | 
| 264 265 | 
             
                this.element = $(element);
         | 
| 265 266 |  | 
| 266 | 
            -
                if(options.handle && ( | 
| 267 | 
            +
                if(options.handle && Object.isString(options.handle))
         | 
| 267 268 | 
             
                  this.handle = this.element.down('.'+options.handle, 0);
         | 
| 268 269 |  | 
| 269 270 | 
             
                if(!this.handle) this.handle = $(options.handle);
         | 
| @@ -276,7 +277,6 @@ Draggable.prototype = { | |
| 276 277 |  | 
| 277 278 | 
             
                Element.makePositioned(this.element); // fix IE    
         | 
| 278 279 |  | 
| 279 | 
            -
                this.delta    = this.currentDelta();
         | 
| 280 280 | 
             
                this.options  = options;
         | 
| 281 281 | 
             
                this.dragging = false;   
         | 
| 282 282 |  | 
| @@ -298,17 +298,17 @@ Draggable.prototype = { | |
| 298 298 | 
             
              },
         | 
| 299 299 |  | 
| 300 300 | 
             
              initDrag: function(event) {
         | 
| 301 | 
            -
                if( | 
| 301 | 
            +
                if(!Object.isUndefined(Draggable._dragging[this.element]) &&
         | 
| 302 302 | 
             
                  Draggable._dragging[this.element]) return;
         | 
| 303 303 | 
             
                if(Event.isLeftClick(event)) {    
         | 
| 304 304 | 
             
                  // abort on form elements, fixes a Firefox issue
         | 
| 305 305 | 
             
                  var src = Event.element(event);
         | 
| 306 | 
            -
                  if(src.tagName && (
         | 
| 307 | 
            -
                     | 
| 308 | 
            -
                     | 
| 309 | 
            -
                     | 
| 310 | 
            -
                     | 
| 311 | 
            -
                     | 
| 306 | 
            +
                  if((tag_name = src.tagName.toUpperCase()) && (
         | 
| 307 | 
            +
                    tag_name=='INPUT' ||
         | 
| 308 | 
            +
                    tag_name=='SELECT' ||
         | 
| 309 | 
            +
                    tag_name=='OPTION' ||
         | 
| 310 | 
            +
                    tag_name=='BUTTON' ||
         | 
| 311 | 
            +
                    tag_name=='TEXTAREA')) return;
         | 
| 312 312 |  | 
| 313 313 | 
             
                  var pointer = [Event.pointerX(event), Event.pointerY(event)];
         | 
| 314 314 | 
             
                  var pos     = Position.cumulativeOffset(this.element);
         | 
| @@ -321,6 +321,8 @@ Draggable.prototype = { | |
| 321 321 |  | 
| 322 322 | 
             
              startDrag: function(event) {
         | 
| 323 323 | 
             
                this.dragging = true;
         | 
| 324 | 
            +
                if(!this.delta)
         | 
| 325 | 
            +
                  this.delta = this.currentDelta();
         | 
| 324 326 |  | 
| 325 327 | 
             
                if(this.options.zindex) {
         | 
| 326 328 | 
             
                  this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
         | 
| @@ -329,7 +331,9 @@ Draggable.prototype = { | |
| 329 331 |  | 
| 330 332 | 
             
                if(this.options.ghosting) {
         | 
| 331 333 | 
             
                  this._clone = this.element.cloneNode(true);
         | 
| 332 | 
            -
                   | 
| 334 | 
            +
                  this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
         | 
| 335 | 
            +
                  if (!this.element._originallyAbsolute)
         | 
| 336 | 
            +
                    Position.absolutize(this.element);
         | 
| 333 337 | 
             
                  this.element.parentNode.insertBefore(this._clone, this.element);
         | 
| 334 338 | 
             
                }
         | 
| 335 339 |  | 
| @@ -351,8 +355,12 @@ Draggable.prototype = { | |
| 351 355 |  | 
| 352 356 | 
             
              updateDrag: function(event, pointer) {
         | 
| 353 357 | 
             
                if(!this.dragging) this.startDrag(event);
         | 
| 354 | 
            -
                 | 
| 355 | 
            -
                 | 
| 358 | 
            +
                
         | 
| 359 | 
            +
                if(!this.options.quiet){
         | 
| 360 | 
            +
                  Position.prepare();
         | 
| 361 | 
            +
                  Droppables.show(pointer, this.element);
         | 
| 362 | 
            +
                }
         | 
| 363 | 
            +
                
         | 
| 356 364 | 
             
                Draggables.notify('onDrag', this, event);
         | 
| 357 365 |  | 
| 358 366 | 
             
                this.draw(pointer);
         | 
| @@ -380,30 +388,44 @@ Draggable.prototype = { | |
| 380 388 | 
             
                }
         | 
| 381 389 |  | 
| 382 390 | 
             
                // fix AppleWebKit rendering
         | 
| 383 | 
            -
                if( | 
| 391 | 
            +
                if(Prototype.Browser.WebKit) window.scrollBy(0,0);
         | 
| 384 392 |  | 
| 385 393 | 
             
                Event.stop(event);
         | 
| 386 394 | 
             
              },
         | 
| 387 395 |  | 
| 388 396 | 
             
              finishDrag: function(event, success) {
         | 
| 389 397 | 
             
                this.dragging = false;
         | 
| 398 | 
            +
                
         | 
| 399 | 
            +
                if(this.options.quiet){
         | 
| 400 | 
            +
                  Position.prepare();
         | 
| 401 | 
            +
                  var pointer = [Event.pointerX(event), Event.pointerY(event)];
         | 
| 402 | 
            +
                  Droppables.show(pointer, this.element);
         | 
| 403 | 
            +
                }
         | 
| 390 404 |  | 
| 391 405 | 
             
                if(this.options.ghosting) {
         | 
| 392 | 
            -
                   | 
| 406 | 
            +
                  if (!this.element._originallyAbsolute)
         | 
| 407 | 
            +
                    Position.relativize(this.element);
         | 
| 408 | 
            +
                  delete this.element._originallyAbsolute;
         | 
| 393 409 | 
             
                  Element.remove(this._clone);
         | 
| 394 410 | 
             
                  this._clone = null;
         | 
| 395 411 | 
             
                }
         | 
| 396 412 |  | 
| 397 | 
            -
                 | 
| 413 | 
            +
                var dropped = false; 
         | 
| 414 | 
            +
                if(success) { 
         | 
| 415 | 
            +
                  dropped = Droppables.fire(event, this.element); 
         | 
| 416 | 
            +
                  if (!dropped) dropped = false; 
         | 
| 417 | 
            +
                }
         | 
| 418 | 
            +
                if(dropped && this.options.onDropped) this.options.onDropped(this.element);
         | 
| 398 419 | 
             
                Draggables.notify('onEnd', this, event);
         | 
| 399 420 |  | 
| 400 421 | 
             
                var revert = this.options.revert;
         | 
| 401 | 
            -
                if(revert &&  | 
| 422 | 
            +
                if(revert && Object.isFunction(revert)) revert = revert(this.element);
         | 
| 402 423 |  | 
| 403 424 | 
             
                var d = this.currentDelta();
         | 
| 404 425 | 
             
                if(revert && this.options.reverteffect) {
         | 
| 405 | 
            -
                   | 
| 406 | 
            -
                     | 
| 426 | 
            +
                  if (dropped == 0 || revert != 'failure')
         | 
| 427 | 
            +
                    this.options.reverteffect(this.element,
         | 
| 428 | 
            +
                      d[1]-this.delta[1], d[0]-this.delta[0]);
         | 
| 407 429 | 
             
                } else {
         | 
| 408 430 | 
             
                  this.delta = d;
         | 
| 409 431 | 
             
                }
         | 
| @@ -451,15 +473,15 @@ Draggable.prototype = { | |
| 451 473 | 
             
                }.bind(this));
         | 
| 452 474 |  | 
| 453 475 | 
             
                if(this.options.snap) {
         | 
| 454 | 
            -
                  if( | 
| 476 | 
            +
                  if(Object.isFunction(this.options.snap)) {
         | 
| 455 477 | 
             
                    p = this.options.snap(p[0],p[1],this);
         | 
| 456 478 | 
             
                  } else {
         | 
| 457 | 
            -
                  if(this.options.snap | 
| 479 | 
            +
                  if(Object.isArray(this.options.snap)) {
         | 
| 458 480 | 
             
                    p = p.map( function(v, i) {
         | 
| 459 | 
            -
                      return  | 
| 481 | 
            +
                      return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this))
         | 
| 460 482 | 
             
                  } else {
         | 
| 461 483 | 
             
                    p = p.map( function(v) {
         | 
| 462 | 
            -
                      return  | 
| 484 | 
            +
                      return (v/this.options.snap).round()*this.options.snap }.bind(this))
         | 
| 463 485 | 
             
                  }
         | 
| 464 486 | 
             
                }}
         | 
| 465 487 |  | 
| @@ -543,12 +565,13 @@ Draggable.prototype = { | |
| 543 565 | 
             
                }
         | 
| 544 566 | 
             
                return { top: T, left: L, width: W, height: H };
         | 
| 545 567 | 
             
              }
         | 
| 546 | 
            -
            }
         | 
| 568 | 
            +
            });
         | 
| 569 | 
            +
             | 
| 570 | 
            +
            Draggable._dragging = { };
         | 
| 547 571 |  | 
| 548 572 | 
             
            /*--------------------------------------------------------------------------*/
         | 
| 549 573 |  | 
| 550 | 
            -
            var SortableObserver = Class.create( | 
| 551 | 
            -
            SortableObserver.prototype = {
         | 
| 574 | 
            +
            var SortableObserver = Class.create({
         | 
| 552 575 | 
             
              initialize: function(element, observer) {
         | 
| 553 576 | 
             
                this.element   = $(element);
         | 
| 554 577 | 
             
                this.observer  = observer;
         | 
| @@ -564,15 +587,15 @@ SortableObserver.prototype = { | |
| 564 587 | 
             
                if(this.lastValue != Sortable.serialize(this.element))
         | 
| 565 588 | 
             
                  this.observer(this.element)
         | 
| 566 589 | 
             
              }
         | 
| 567 | 
            -
            }
         | 
| 590 | 
            +
            });
         | 
| 568 591 |  | 
| 569 592 | 
             
            var Sortable = {
         | 
| 570 593 | 
             
              SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
         | 
| 571 594 |  | 
| 572 | 
            -
              sortables: {},
         | 
| 595 | 
            +
              sortables: { },
         | 
| 573 596 |  | 
| 574 597 | 
             
              _findRootElement: function(element) {
         | 
| 575 | 
            -
                while (element.tagName != "BODY") {  
         | 
| 598 | 
            +
                while (element.tagName.toUpperCase() != "BODY") {  
         | 
| 576 599 | 
             
                  if(element.id && Sortable.sortables[element.id]) return element;
         | 
| 577 600 | 
             
                  element = element.parentNode;
         | 
| 578 601 | 
             
                }
         | 
| @@ -612,13 +635,20 @@ var Sortable = { | |
| 612 635 | 
             
                  delay:       0,
         | 
| 613 636 | 
             
                  hoverclass:  null,
         | 
| 614 637 | 
             
                  ghosting:    false,
         | 
| 638 | 
            +
                  quiet:       false, 
         | 
| 615 639 | 
             
                  scroll:      false,
         | 
| 616 640 | 
             
                  scrollSensitivity: 20,
         | 
| 617 641 | 
             
                  scrollSpeed: 15,
         | 
| 618 642 | 
             
                  format:      this.SERIALIZE_RULE,
         | 
| 643 | 
            +
                  
         | 
| 644 | 
            +
                  // these take arrays of elements or ids and can be 
         | 
| 645 | 
            +
                  // used for better initialization performance
         | 
| 646 | 
            +
                  elements:    false,
         | 
| 647 | 
            +
                  handles:     false,
         | 
| 648 | 
            +
                  
         | 
| 619 649 | 
             
                  onChange:    Prototype.emptyFunction,
         | 
| 620 650 | 
             
                  onUpdate:    Prototype.emptyFunction
         | 
| 621 | 
            -
                }, arguments[1] || {});
         | 
| 651 | 
            +
                }, arguments[1] || { });
         | 
| 622 652 |  | 
| 623 653 | 
             
                // clear any old sortable with same element
         | 
| 624 654 | 
             
                this.destroy(element);
         | 
| @@ -626,6 +656,7 @@ var Sortable = { | |
| 626 656 | 
             
                // build options for the draggables
         | 
| 627 657 | 
             
                var options_for_draggable = {
         | 
| 628 658 | 
             
                  revert:      true,
         | 
| 659 | 
            +
                  quiet:       options.quiet,
         | 
| 629 660 | 
             
                  scroll:      options.scroll,
         | 
| 630 661 | 
             
                  scrollSpeed: options.scrollSpeed,
         | 
| 631 662 | 
             
                  scrollSensitivity: options.scrollSensitivity,
         | 
| @@ -679,10 +710,9 @@ var Sortable = { | |
| 679 710 | 
             
                  options.droppables.push(element);
         | 
| 680 711 | 
             
                }
         | 
| 681 712 |  | 
| 682 | 
            -
                (this.findElements(element, options) || []).each( function(e) {
         | 
| 683 | 
            -
                   | 
| 684 | 
            -
             | 
| 685 | 
            -
                    $(e).down('.'+options.handle,0) : e;    
         | 
| 713 | 
            +
                (options.elements || this.findElements(element, options) || []).each( function(e,i) {
         | 
| 714 | 
            +
                  var handle = options.handles ? $(options.handles[i]) :
         | 
| 715 | 
            +
                    (options.handle ? $(e).select('.' + options.handle)[0] : e); 
         | 
| 686 716 | 
             
                  options.draggables.push(
         | 
| 687 717 | 
             
                    new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
         | 
| 688 718 | 
             
                  Droppables.add(e, options_for_droppable);
         | 
| @@ -842,7 +872,7 @@ var Sortable = { | |
| 842 872 | 
             
                  only: sortableOptions.only,
         | 
| 843 873 | 
             
                  name: element.id,
         | 
| 844 874 | 
             
                  format: sortableOptions.format
         | 
| 845 | 
            -
                }, arguments[1] || {});
         | 
| 875 | 
            +
                }, arguments[1] || { });
         | 
| 846 876 |  | 
| 847 877 | 
             
                var root = {
         | 
| 848 878 | 
             
                  id: null,
         | 
| @@ -866,7 +896,7 @@ var Sortable = { | |
| 866 896 |  | 
| 867 897 | 
             
              sequence: function(element) {
         | 
| 868 898 | 
             
                element = $(element);
         | 
| 869 | 
            -
                var options = Object.extend(this.options(element), arguments[1] || {});
         | 
| 899 | 
            +
                var options = Object.extend(this.options(element), arguments[1] || { });
         | 
| 870 900 |  | 
| 871 901 | 
             
                return $(this.findElements(element, options) || []).map( function(item) {
         | 
| 872 902 | 
             
                  return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
         | 
| @@ -875,9 +905,9 @@ var Sortable = { | |
| 875 905 |  | 
| 876 906 | 
             
              setSequence: function(element, new_sequence) {
         | 
| 877 907 | 
             
                element = $(element);
         | 
| 878 | 
            -
                var options = Object.extend(this.options(element), arguments[2] || {});
         | 
| 908 | 
            +
                var options = Object.extend(this.options(element), arguments[2] || { });
         | 
| 879 909 |  | 
| 880 | 
            -
                var nodeMap = {};
         | 
| 910 | 
            +
                var nodeMap = { };
         | 
| 881 911 | 
             
                this.findElements(element, options).each( function(n) {
         | 
| 882 912 | 
             
                    if (n.id.match(options.format))
         | 
| 883 913 | 
             
                        nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
         | 
| @@ -895,7 +925,7 @@ var Sortable = { | |
| 895 925 |  | 
| 896 926 | 
             
              serialize: function(element) {
         | 
| 897 927 | 
             
                element = $(element);
         | 
| 898 | 
            -
                var options = Object.extend(Sortable.options(element), arguments[1] || {});
         | 
| 928 | 
            +
                var options = Object.extend(Sortable.options(element), arguments[1] || { });
         | 
| 899 929 | 
             
                var name = encodeURIComponent(
         | 
| 900 930 | 
             
                  (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
         | 
| 901 931 |  | 
| @@ -919,7 +949,7 @@ Element.isParent = function(child, element) { | |
| 919 949 | 
             
              return Element.isParent(child.parentNode, element);
         | 
| 920 950 | 
             
            }
         | 
| 921 951 |  | 
| 922 | 
            -
            Element.findChildren = function(element, only, recursive, tagName) { | 
| 952 | 
            +
            Element.findChildren = function(element, only, recursive, tagName) {   
         | 
| 923 953 | 
             
              if(!element.hasChildNodes()) return null;
         | 
| 924 954 | 
             
              tagName = tagName.toUpperCase();
         | 
| 925 955 | 
             
              if(only) only = [only].flatten();
         | 
    
        data/html/javascripts/effects.js
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            // Copyright (c) 2005 | 
| 1 | 
            +
            // Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
         | 
| 2 2 | 
             
            // Contributors:
         | 
| 3 3 | 
             
            //  Justin Palmer (http://encytemedia.com/)
         | 
| 4 4 | 
             
            //  Mark Pilgrim (http://diveintomark.org/)
         | 
| @@ -11,17 +11,17 @@ | |
| 11 11 | 
             
            // returns self (or first argument) if not convertable  
         | 
| 12 12 | 
             
            String.prototype.parseColor = function() {  
         | 
| 13 13 | 
             
              var color = '#';
         | 
| 14 | 
            -
              if(this.slice(0,4) == 'rgb(') {  
         | 
| 14 | 
            +
              if (this.slice(0,4) == 'rgb(') {  
         | 
| 15 15 | 
             
                var cols = this.slice(4,this.length-1).split(',');  
         | 
| 16 16 | 
             
                var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
         | 
| 17 17 | 
             
              } else {  
         | 
| 18 | 
            -
                if(this.slice(0,1) == '#') {  
         | 
| 19 | 
            -
                  if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
         | 
| 20 | 
            -
                  if(this.length==7) color = this.toLowerCase();  
         | 
| 18 | 
            +
                if (this.slice(0,1) == '#') {  
         | 
| 19 | 
            +
                  if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
         | 
| 20 | 
            +
                  if (this.length==7) color = this.toLowerCase();  
         | 
| 21 21 | 
             
                }  
         | 
| 22 22 | 
             
              }  
         | 
| 23 | 
            -
              return(color.length==7 ? color : (arguments[0] || this));  
         | 
| 24 | 
            -
            }
         | 
| 23 | 
            +
              return (color.length==7 ? color : (arguments[0] || this));  
         | 
| 24 | 
            +
            };
         | 
| 25 25 |  | 
| 26 26 | 
             
            /*--------------------------------------------------------------------------*/
         | 
| 27 27 |  | 
| @@ -30,7 +30,7 @@ Element.collectTextNodes = function(element) { | |
| 30 30 | 
             
                return (node.nodeType==3 ? node.nodeValue : 
         | 
| 31 31 | 
             
                  (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
         | 
| 32 32 | 
             
              }).flatten().join('');
         | 
| 33 | 
            -
            }
         | 
| 33 | 
            +
            };
         | 
| 34 34 |  | 
| 35 35 | 
             
            Element.collectTextNodesIgnoreClass = function(element, className) {  
         | 
| 36 36 | 
             
              return $A($(element).childNodes).collect( function(node) {
         | 
| @@ -38,47 +38,18 @@ Element.collectTextNodesIgnoreClass = function(element, className) { | |
| 38 38 | 
             
                  ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
         | 
| 39 39 | 
             
                    Element.collectTextNodesIgnoreClass(node, className) : ''));
         | 
| 40 40 | 
             
              }).flatten().join('');
         | 
| 41 | 
            -
            }
         | 
| 41 | 
            +
            };
         | 
| 42 42 |  | 
| 43 43 | 
             
            Element.setContentZoom = function(element, percent) {
         | 
| 44 44 | 
             
              element = $(element);  
         | 
| 45 45 | 
             
              element.setStyle({fontSize: (percent/100) + 'em'});   
         | 
| 46 | 
            -
              if( | 
| 46 | 
            +
              if (Prototype.Browser.WebKit) window.scrollBy(0,0);
         | 
| 47 47 | 
             
              return element;
         | 
| 48 | 
            -
            }
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            Element.getOpacity = function(element){
         | 
| 51 | 
            -
              element = $(element);
         | 
| 52 | 
            -
              var opacity;
         | 
| 53 | 
            -
              if (opacity = element.getStyle('opacity'))  
         | 
| 54 | 
            -
                return parseFloat(opacity);  
         | 
| 55 | 
            -
              if (opacity = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))  
         | 
| 56 | 
            -
                if(opacity[1]) return parseFloat(opacity[1]) / 100;  
         | 
| 57 | 
            -
              return 1.0;  
         | 
| 58 | 
            -
            }
         | 
| 48 | 
            +
            };
         | 
| 59 49 |  | 
| 60 | 
            -
            Element. | 
| 61 | 
            -
              element= $(element);  
         | 
| 62 | 
            -
              if (value == 1){
         | 
| 63 | 
            -
                element.setStyle({ opacity: 
         | 
| 64 | 
            -
                  (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 
         | 
| 65 | 
            -
                  0.999999 : 1.0 });
         | 
| 66 | 
            -
                if(/MSIE/.test(navigator.userAgent) && !window.opera)  
         | 
| 67 | 
            -
                  element.setStyle({filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});  
         | 
| 68 | 
            -
              } else {  
         | 
| 69 | 
            -
                if(value < 0.00001) value = 0;  
         | 
| 70 | 
            -
                element.setStyle({opacity: value});
         | 
| 71 | 
            -
                if(/MSIE/.test(navigator.userAgent) && !window.opera)  
         | 
| 72 | 
            -
                  element.setStyle(
         | 
| 73 | 
            -
                    { filter: element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
         | 
| 74 | 
            -
                        'alpha(opacity='+value*100+')' });  
         | 
| 75 | 
            -
              }
         | 
| 76 | 
            -
              return element;
         | 
| 77 | 
            -
            }  
         | 
| 78 | 
            -
             
         | 
| 79 | 
            -
            Element.getInlineOpacity = function(element){  
         | 
| 50 | 
            +
            Element.getInlineOpacity = function(element){
         | 
| 80 51 | 
             
              return $(element).style.opacity || '';
         | 
| 81 | 
            -
            } | 
| 52 | 
            +
            };
         | 
| 82 53 |  | 
| 83 54 | 
             
            Element.forceRerendering = function(element) {
         | 
| 84 55 | 
             
              try {
         | 
| @@ -91,31 +62,63 @@ Element.forceRerendering = function(element) { | |
| 91 62 |  | 
| 92 63 | 
             
            /*--------------------------------------------------------------------------*/
         | 
| 93 64 |  | 
| 94 | 
            -
            Array.prototype.call = function() {
         | 
| 95 | 
            -
              var args = arguments;
         | 
| 96 | 
            -
              this.each(function(f){ f.apply(this, args) });
         | 
| 97 | 
            -
            }
         | 
| 98 | 
            -
             | 
| 99 | 
            -
            /*--------------------------------------------------------------------------*/
         | 
| 100 | 
            -
             | 
| 101 65 | 
             
            var Effect = {
         | 
| 102 66 | 
             
              _elementDoesNotExistError: {
         | 
| 103 67 | 
             
                name: 'ElementDoesNotExistError',
         | 
| 104 68 | 
             
                message: 'The specified DOM element does not exist, but is required for this effect to operate'
         | 
| 105 69 | 
             
              },
         | 
| 70 | 
            +
              Transitions: {
         | 
| 71 | 
            +
                linear: Prototype.K,
         | 
| 72 | 
            +
                sinoidal: function(pos) {
         | 
| 73 | 
            +
                  return (-Math.cos(pos*Math.PI)/2) + 0.5;
         | 
| 74 | 
            +
                },
         | 
| 75 | 
            +
                reverse: function(pos) {
         | 
| 76 | 
            +
                  return 1-pos;
         | 
| 77 | 
            +
                },
         | 
| 78 | 
            +
                flicker: function(pos) {
         | 
| 79 | 
            +
                  var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
         | 
| 80 | 
            +
                  return pos > 1 ? 1 : pos;
         | 
| 81 | 
            +
                },
         | 
| 82 | 
            +
                wobble: function(pos) {
         | 
| 83 | 
            +
                  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
         | 
| 84 | 
            +
                },
         | 
| 85 | 
            +
                pulse: function(pos, pulses) { 
         | 
| 86 | 
            +
                  pulses = pulses || 5; 
         | 
| 87 | 
            +
                  return (
         | 
| 88 | 
            +
                    ((pos % (1/pulses)) * pulses).round() == 0 ? 
         | 
| 89 | 
            +
                          ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
         | 
| 90 | 
            +
                      1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
         | 
| 91 | 
            +
                    );
         | 
| 92 | 
            +
                },
         | 
| 93 | 
            +
                spring: function(pos) { 
         | 
| 94 | 
            +
                  return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
         | 
| 95 | 
            +
                },
         | 
| 96 | 
            +
                none: function(pos) {
         | 
| 97 | 
            +
                  return 0;
         | 
| 98 | 
            +
                },
         | 
| 99 | 
            +
                full: function(pos) {
         | 
| 100 | 
            +
                  return 1;
         | 
| 101 | 
            +
                }
         | 
| 102 | 
            +
              },
         | 
| 103 | 
            +
              DefaultOptions: {
         | 
| 104 | 
            +
                duration:   1.0,   // seconds
         | 
| 105 | 
            +
                fps:        100,   // 100= assume 66fps max.
         | 
| 106 | 
            +
                sync:       false, // true for combining
         | 
| 107 | 
            +
                from:       0.0,
         | 
| 108 | 
            +
                to:         1.0,
         | 
| 109 | 
            +
                delay:      0.0,
         | 
| 110 | 
            +
                queue:      'parallel'
         | 
| 111 | 
            +
              },
         | 
| 106 112 | 
             
              tagifyText: function(element) {
         | 
| 107 | 
            -
                if(typeof Builder == 'undefined')
         | 
| 108 | 
            -
                  throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
         | 
| 109 | 
            -
                  
         | 
| 110 113 | 
             
                var tagifyStyle = 'position:relative';
         | 
| 111 | 
            -
                if( | 
| 114 | 
            +
                if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
         | 
| 112 115 |  | 
| 113 116 | 
             
                element = $(element);
         | 
| 114 117 | 
             
                $A(element.childNodes).each( function(child) {
         | 
| 115 | 
            -
                  if(child.nodeType==3) {
         | 
| 118 | 
            +
                  if (child.nodeType==3) {
         | 
| 116 119 | 
             
                    child.nodeValue.toArray().each( function(character) {
         | 
| 117 120 | 
             
                      element.insertBefore(
         | 
| 118 | 
            -
                         | 
| 121 | 
            +
                        new Element('span', {style: tagifyStyle}).update(
         | 
| 119 122 | 
             
                          character == ' ' ? String.fromCharCode(160) : character), 
         | 
| 120 123 | 
             
                          child);
         | 
| 121 124 | 
             
                    });
         | 
| @@ -125,8 +128,8 @@ var Effect = { | |
| 125 128 | 
             
              },
         | 
| 126 129 | 
             
              multiple: function(element, effect) {
         | 
| 127 130 | 
             
                var elements;
         | 
| 128 | 
            -
                if(((typeof element == 'object') || 
         | 
| 129 | 
            -
                    ( | 
| 131 | 
            +
                if (((typeof element == 'object') || 
         | 
| 132 | 
            +
                    Object.isFunction(element)) && 
         | 
| 130 133 | 
             
                   (element.length))
         | 
| 131 134 | 
             
                  elements = element;
         | 
| 132 135 | 
             
                else
         | 
| @@ -135,7 +138,7 @@ var Effect = { | |
| 135 138 | 
             
                var options = Object.extend({
         | 
| 136 139 | 
             
                  speed: 0.1,
         | 
| 137 140 | 
             
                  delay: 0.0
         | 
| 138 | 
            -
                }, arguments[2] || {});
         | 
| 141 | 
            +
                }, arguments[2] || { });
         | 
| 139 142 | 
             
                var masterDelay = options.delay;
         | 
| 140 143 |  | 
| 141 144 | 
             
                $A(elements).each( function(element, index) {
         | 
| @@ -152,53 +155,20 @@ var Effect = { | |
| 152 155 | 
             
                effect = (effect || 'appear').toLowerCase();
         | 
| 153 156 | 
             
                var options = Object.extend({
         | 
| 154 157 | 
             
                  queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
         | 
| 155 | 
            -
                }, arguments[2] || {});
         | 
| 158 | 
            +
                }, arguments[2] || { });
         | 
| 156 159 | 
             
                Effect[element.visible() ? 
         | 
| 157 160 | 
             
                  Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
         | 
| 158 161 | 
             
              }
         | 
| 159 162 | 
             
            };
         | 
| 160 163 |  | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 163 | 
            -
            /* ------------- transitions ------------- */
         | 
| 164 | 
            -
             | 
| 165 | 
            -
            Effect.Transitions = {
         | 
| 166 | 
            -
              linear: Prototype.K,
         | 
| 167 | 
            -
              sinoidal: function(pos) {
         | 
| 168 | 
            -
                return (-Math.cos(pos*Math.PI)/2) + 0.5;
         | 
| 169 | 
            -
              },
         | 
| 170 | 
            -
              reverse: function(pos) {
         | 
| 171 | 
            -
                return 1-pos;
         | 
| 172 | 
            -
              },
         | 
| 173 | 
            -
              flicker: function(pos) {
         | 
| 174 | 
            -
                return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
         | 
| 175 | 
            -
              },
         | 
| 176 | 
            -
              wobble: function(pos) {
         | 
| 177 | 
            -
                return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
         | 
| 178 | 
            -
              },
         | 
| 179 | 
            -
              pulse: function(pos, pulses) { 
         | 
| 180 | 
            -
                pulses = pulses || 5; 
         | 
| 181 | 
            -
                return (
         | 
| 182 | 
            -
                  Math.round((pos % (1/pulses)) * pulses) == 0 ? 
         | 
| 183 | 
            -
                        ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
         | 
| 184 | 
            -
                    1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
         | 
| 185 | 
            -
                  );
         | 
| 186 | 
            -
              },
         | 
| 187 | 
            -
              none: function(pos) {
         | 
| 188 | 
            -
                return 0;
         | 
| 189 | 
            -
              },
         | 
| 190 | 
            -
              full: function(pos) {
         | 
| 191 | 
            -
                return 1;
         | 
| 192 | 
            -
              }
         | 
| 193 | 
            -
            };
         | 
| 164 | 
            +
            Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
         | 
| 194 165 |  | 
| 195 166 | 
             
            /* ------------- core effects ------------- */
         | 
| 196 167 |  | 
| 197 | 
            -
            Effect.ScopedQueue = Class.create( | 
| 198 | 
            -
            Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
         | 
| 168 | 
            +
            Effect.ScopedQueue = Class.create(Enumerable, {
         | 
| 199 169 | 
             
              initialize: function() {
         | 
| 200 170 | 
             
                this.effects  = [];
         | 
| 201 | 
            -
                this.interval = null;
         | 
| 171 | 
            +
                this.interval = null;    
         | 
| 202 172 | 
             
              },
         | 
| 203 173 | 
             
              _each: function(iterator) {
         | 
| 204 174 | 
             
                this.effects._each(iterator);
         | 
| @@ -206,7 +176,7 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { | |
| 206 176 | 
             
              add: function(effect) {
         | 
| 207 177 | 
             
                var timestamp = new Date().getTime();
         | 
| 208 178 |  | 
| 209 | 
            -
                var position = ( | 
| 179 | 
            +
                var position = Object.isString(effect.options.queue) ? 
         | 
| 210 180 | 
             
                  effect.options.queue : effect.options.queue.position;
         | 
| 211 181 |  | 
| 212 182 | 
             
                switch(position) {
         | 
| @@ -229,115 +199,111 @@ Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { | |
| 229 199 | 
             
                effect.startOn  += timestamp;
         | 
| 230 200 | 
             
                effect.finishOn += timestamp;
         | 
| 231 201 |  | 
| 232 | 
            -
                if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
         | 
| 202 | 
            +
                if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
         | 
| 233 203 | 
             
                  this.effects.push(effect);
         | 
| 234 204 |  | 
| 235 | 
            -
                if(!this.interval) | 
| 236 | 
            -
                  this.interval = setInterval(this.loop.bind(this),  | 
| 205 | 
            +
                if (!this.interval)
         | 
| 206 | 
            +
                  this.interval = setInterval(this.loop.bind(this), 15);
         | 
| 237 207 | 
             
              },
         | 
| 238 208 | 
             
              remove: function(effect) {
         | 
| 239 209 | 
             
                this.effects = this.effects.reject(function(e) { return e==effect });
         | 
| 240 | 
            -
                if(this.effects.length == 0) {
         | 
| 210 | 
            +
                if (this.effects.length == 0) {
         | 
| 241 211 | 
             
                  clearInterval(this.interval);
         | 
| 242 212 | 
             
                  this.interval = null;
         | 
| 243 213 | 
             
                }
         | 
| 244 214 | 
             
              },
         | 
| 245 215 | 
             
              loop: function() {
         | 
| 246 216 | 
             
                var timePos = new Date().getTime();
         | 
| 247 | 
            -
                this.effects. | 
| 217 | 
            +
                for(var i=0, len=this.effects.length;i<len;i++) 
         | 
| 218 | 
            +
                  this.effects[i] && this.effects[i].loop(timePos);
         | 
| 248 219 | 
             
              }
         | 
| 249 220 | 
             
            });
         | 
| 250 221 |  | 
| 251 222 | 
             
            Effect.Queues = {
         | 
| 252 223 | 
             
              instances: $H(),
         | 
| 253 224 | 
             
              get: function(queueName) {
         | 
| 254 | 
            -
                if( | 
| 225 | 
            +
                if (!Object.isString(queueName)) return queueName;
         | 
| 255 226 |  | 
| 256 | 
            -
                 | 
| 257 | 
            -
                  this.instances | 
| 258 | 
            -
                  
         | 
| 259 | 
            -
                return this.instances[queueName];
         | 
| 227 | 
            +
                return this.instances.get(queueName) ||
         | 
| 228 | 
            +
                  this.instances.set(queueName, new Effect.ScopedQueue());
         | 
| 260 229 | 
             
              }
         | 
| 261 | 
            -
            }
         | 
| 230 | 
            +
            };
         | 
| 262 231 | 
             
            Effect.Queue = Effect.Queues.get('global');
         | 
| 263 232 |  | 
| 264 | 
            -
            Effect. | 
| 265 | 
            -
              transition: Effect.Transitions.sinoidal,
         | 
| 266 | 
            -
              duration:   1.0,   // seconds
         | 
| 267 | 
            -
              fps:        25.0,  // max. 25fps due to Effect.Queue implementation
         | 
| 268 | 
            -
              sync:       false, // true for combining
         | 
| 269 | 
            -
              from:       0.0,
         | 
| 270 | 
            -
              to:         1.0,
         | 
| 271 | 
            -
              delay:      0.0,
         | 
| 272 | 
            -
              queue:      'parallel'
         | 
| 273 | 
            -
            }
         | 
| 274 | 
            -
             | 
| 275 | 
            -
            Effect.Base = function() {};
         | 
| 276 | 
            -
            Effect.Base.prototype = {
         | 
| 233 | 
            +
            Effect.Base = Class.create({
         | 
| 277 234 | 
             
              position: null,
         | 
| 278 235 | 
             
              start: function(options) {
         | 
| 279 | 
            -
                 | 
| 236 | 
            +
                function codeForEvent(options,eventName){
         | 
| 237 | 
            +
                  return (
         | 
| 238 | 
            +
                    (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
         | 
| 239 | 
            +
                    (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
         | 
| 240 | 
            +
                  );
         | 
| 241 | 
            +
                }
         | 
| 242 | 
            +
                if (options && options.transition === false) options.transition = Effect.Transitions.linear;
         | 
| 243 | 
            +
                this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
         | 
| 280 244 | 
             
                this.currentFrame = 0;
         | 
| 281 245 | 
             
                this.state        = 'idle';
         | 
| 282 246 | 
             
                this.startOn      = this.options.delay*1000;
         | 
| 283 | 
            -
                this.finishOn     = this.startOn | 
| 247 | 
            +
                this.finishOn     = this.startOn+(this.options.duration*1000);
         | 
| 248 | 
            +
                this.fromToDelta  = this.options.to-this.options.from;
         | 
| 249 | 
            +
                this.totalTime    = this.finishOn-this.startOn;
         | 
| 250 | 
            +
                this.totalFrames  = this.options.fps*this.options.duration;
         | 
| 251 | 
            +
                
         | 
| 252 | 
            +
                eval('this.render = function(pos){ '+
         | 
| 253 | 
            +
                  'if (this.state=="idle"){this.state="running";'+
         | 
| 254 | 
            +
                  codeForEvent(this.options,'beforeSetup')+
         | 
| 255 | 
            +
                  (this.setup ? 'this.setup();':'')+ 
         | 
| 256 | 
            +
                  codeForEvent(this.options,'afterSetup')+
         | 
| 257 | 
            +
                  '};if (this.state=="running"){'+
         | 
| 258 | 
            +
                  'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
         | 
| 259 | 
            +
                  'this.position=pos;'+
         | 
| 260 | 
            +
                  codeForEvent(this.options,'beforeUpdate')+
         | 
| 261 | 
            +
                  (this.update ? 'this.update(pos);':'')+
         | 
| 262 | 
            +
                  codeForEvent(this.options,'afterUpdate')+
         | 
| 263 | 
            +
                  '}}');
         | 
| 264 | 
            +
                
         | 
| 284 265 | 
             
                this.event('beforeStart');
         | 
| 285 | 
            -
                if(!this.options.sync)
         | 
| 286 | 
            -
                  Effect.Queues.get( | 
| 266 | 
            +
                if (!this.options.sync)
         | 
| 267 | 
            +
                  Effect.Queues.get(Object.isString(this.options.queue) ? 
         | 
| 287 268 | 
             
                    'global' : this.options.queue.scope).add(this);
         | 
| 288 269 | 
             
              },
         | 
| 289 270 | 
             
              loop: function(timePos) {
         | 
| 290 | 
            -
                if(timePos >= this.startOn) {
         | 
| 291 | 
            -
                  if(timePos >= this.finishOn) {
         | 
| 271 | 
            +
                if (timePos >= this.startOn) {
         | 
| 272 | 
            +
                  if (timePos >= this.finishOn) {
         | 
| 292 273 | 
             
                    this.render(1.0);
         | 
| 293 274 | 
             
                    this.cancel();
         | 
| 294 275 | 
             
                    this.event('beforeFinish');
         | 
| 295 | 
            -
                    if(this.finish) this.finish(); 
         | 
| 276 | 
            +
                    if (this.finish) this.finish(); 
         | 
| 296 277 | 
             
                    this.event('afterFinish');
         | 
| 297 278 | 
             
                    return;  
         | 
| 298 279 | 
             
                  }
         | 
| 299 | 
            -
                  var pos   = (timePos - this.startOn) /  | 
| 300 | 
            -
             | 
| 301 | 
            -
                  if(frame > this.currentFrame) {
         | 
| 280 | 
            +
                  var pos   = (timePos - this.startOn) / this.totalTime,
         | 
| 281 | 
            +
                      frame = (pos * this.totalFrames).round();
         | 
| 282 | 
            +
                  if (frame > this.currentFrame) {
         | 
| 302 283 | 
             
                    this.render(pos);
         | 
| 303 284 | 
             
                    this.currentFrame = frame;
         | 
| 304 285 | 
             
                  }
         | 
| 305 286 | 
             
                }
         | 
| 306 287 | 
             
              },
         | 
| 307 | 
            -
              render: function(pos) {
         | 
| 308 | 
            -
                if(this.state == 'idle') {
         | 
| 309 | 
            -
                  this.state = 'running';
         | 
| 310 | 
            -
                  this.event('beforeSetup');
         | 
| 311 | 
            -
                  if(this.setup) this.setup();
         | 
| 312 | 
            -
                  this.event('afterSetup');
         | 
| 313 | 
            -
                }
         | 
| 314 | 
            -
                if(this.state == 'running') {
         | 
| 315 | 
            -
                  if(this.options.transition) pos = this.options.transition(pos);
         | 
| 316 | 
            -
                  pos *= (this.options.to-this.options.from);
         | 
| 317 | 
            -
                  pos += this.options.from;
         | 
| 318 | 
            -
                  this.position = pos;
         | 
| 319 | 
            -
                  this.event('beforeUpdate');
         | 
| 320 | 
            -
                  if(this.update) this.update(pos);
         | 
| 321 | 
            -
                  this.event('afterUpdate');
         | 
| 322 | 
            -
                }
         | 
| 323 | 
            -
              },
         | 
| 324 288 | 
             
              cancel: function() {
         | 
| 325 | 
            -
                if(!this.options.sync)
         | 
| 326 | 
            -
                  Effect.Queues.get( | 
| 289 | 
            +
                if (!this.options.sync)
         | 
| 290 | 
            +
                  Effect.Queues.get(Object.isString(this.options.queue) ? 
         | 
| 327 291 | 
             
                    'global' : this.options.queue.scope).remove(this);
         | 
| 328 292 | 
             
                this.state = 'finished';
         | 
| 329 293 | 
             
              },
         | 
| 330 294 | 
             
              event: function(eventName) {
         | 
| 331 | 
            -
                if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
         | 
| 332 | 
            -
                if(this.options[eventName]) this.options[eventName](this);
         | 
| 295 | 
            +
                if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
         | 
| 296 | 
            +
                if (this.options[eventName]) this.options[eventName](this);
         | 
| 333 297 | 
             
              },
         | 
| 334 298 | 
             
              inspect: function() {
         | 
| 335 | 
            -
                 | 
| 299 | 
            +
                var data = $H();
         | 
| 300 | 
            +
                for(property in this)
         | 
| 301 | 
            +
                  if (!Object.isFunction(this[property])) data.set(property, this[property]);
         | 
| 302 | 
            +
                return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
         | 
| 336 303 | 
             
              }
         | 
| 337 | 
            -
            }
         | 
| 304 | 
            +
            });
         | 
| 338 305 |  | 
| 339 | 
            -
            Effect.Parallel = Class.create( | 
| 340 | 
            -
            Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
         | 
| 306 | 
            +
            Effect.Parallel = Class.create(Effect.Base, {
         | 
| 341 307 | 
             
              initialize: function(effects) {
         | 
| 342 308 | 
             
                this.effects = effects || [];
         | 
| 343 309 | 
             
                this.start(arguments[1]);
         | 
| @@ -350,35 +316,45 @@ Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { | |
| 350 316 | 
             
                  effect.render(1.0);
         | 
| 351 317 | 
             
                  effect.cancel();
         | 
| 352 318 | 
             
                  effect.event('beforeFinish');
         | 
| 353 | 
            -
                  if(effect.finish) effect.finish(position);
         | 
| 319 | 
            +
                  if (effect.finish) effect.finish(position);
         | 
| 354 320 | 
             
                  effect.event('afterFinish');
         | 
| 355 321 | 
             
                });
         | 
| 356 322 | 
             
              }
         | 
| 357 323 | 
             
            });
         | 
| 358 324 |  | 
| 359 | 
            -
            Effect. | 
| 360 | 
            -
             | 
| 325 | 
            +
            Effect.Tween = Class.create(Effect.Base, {
         | 
| 326 | 
            +
              initialize: function(object, from, to) {
         | 
| 327 | 
            +
                object = Object.isString(object) ? $(object) : object;
         | 
| 328 | 
            +
                var args = $A(arguments), method = args.last(), 
         | 
| 329 | 
            +
                  options = args.length == 5 ? args[3] : null;
         | 
| 330 | 
            +
                this.method = Object.isFunction(method) ? method.bind(object) :
         | 
| 331 | 
            +
                  Object.isFunction(object[method]) ? object[method].bind(object) : 
         | 
| 332 | 
            +
                  function(value) { object[method] = value };
         | 
| 333 | 
            +
                this.start(Object.extend({ from: from, to: to }, options || { }));
         | 
| 334 | 
            +
              },
         | 
| 335 | 
            +
              update: function(position) {
         | 
| 336 | 
            +
                this.method(position);
         | 
| 337 | 
            +
              }
         | 
| 338 | 
            +
            });
         | 
| 339 | 
            +
             | 
| 340 | 
            +
            Effect.Event = Class.create(Effect.Base, {
         | 
| 361 341 | 
             
              initialize: function() {
         | 
| 362 | 
            -
                 | 
| 363 | 
            -
                  duration: 0
         | 
| 364 | 
            -
                }, arguments[0] || {});
         | 
| 365 | 
            -
                this.start(options);
         | 
| 342 | 
            +
                this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
         | 
| 366 343 | 
             
              },
         | 
| 367 344 | 
             
              update: Prototype.emptyFunction
         | 
| 368 345 | 
             
            });
         | 
| 369 346 |  | 
| 370 | 
            -
            Effect.Opacity = Class.create( | 
| 371 | 
            -
            Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
         | 
| 347 | 
            +
            Effect.Opacity = Class.create(Effect.Base, {
         | 
| 372 348 | 
             
              initialize: function(element) {
         | 
| 373 349 | 
             
                this.element = $(element);
         | 
| 374 | 
            -
                if(!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 350 | 
            +
                if (!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 375 351 | 
             
                // make this work on IE on elements without 'layout'
         | 
| 376 | 
            -
                if( | 
| 352 | 
            +
                if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
         | 
| 377 353 | 
             
                  this.element.setStyle({zoom: 1});
         | 
| 378 354 | 
             
                var options = Object.extend({
         | 
| 379 355 | 
             
                  from: this.element.getOpacity() || 0.0,
         | 
| 380 356 | 
             
                  to:   1.0
         | 
| 381 | 
            -
                }, arguments[1] || {});
         | 
| 357 | 
            +
                }, arguments[1] || { });
         | 
| 382 358 | 
             
                this.start(options);
         | 
| 383 359 | 
             
              },
         | 
| 384 360 | 
             
              update: function(position) {
         | 
| @@ -386,36 +362,30 @@ Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { | |
| 386 362 | 
             
              }
         | 
| 387 363 | 
             
            });
         | 
| 388 364 |  | 
| 389 | 
            -
            Effect.Move = Class.create( | 
| 390 | 
            -
            Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
         | 
| 365 | 
            +
            Effect.Move = Class.create(Effect.Base, {
         | 
| 391 366 | 
             
              initialize: function(element) {
         | 
| 392 367 | 
             
                this.element = $(element);
         | 
| 393 | 
            -
                if(!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 368 | 
            +
                if (!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 394 369 | 
             
                var options = Object.extend({
         | 
| 395 370 | 
             
                  x:    0,
         | 
| 396 371 | 
             
                  y:    0,
         | 
| 397 372 | 
             
                  mode: 'relative'
         | 
| 398 | 
            -
                }, arguments[1] || {});
         | 
| 373 | 
            +
                }, arguments[1] || { });
         | 
| 399 374 | 
             
                this.start(options);
         | 
| 400 375 | 
             
              },
         | 
| 401 376 | 
             
              setup: function() {
         | 
| 402 | 
            -
                // Bug in Opera: Opera returns the "real" position of a static element or
         | 
| 403 | 
            -
                // relative element that does not have top/left explicitly set.
         | 
| 404 | 
            -
                // ==> Always set top and left for position relative elements in your stylesheets 
         | 
| 405 | 
            -
                // (to 0 if you do not need them) 
         | 
| 406 377 | 
             
                this.element.makePositioned();
         | 
| 407 378 | 
             
                this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
         | 
| 408 379 | 
             
                this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
         | 
| 409 | 
            -
                if(this.options.mode == 'absolute') {
         | 
| 410 | 
            -
                  // absolute movement, so we need to calc deltaX and deltaY
         | 
| 380 | 
            +
                if (this.options.mode == 'absolute') {
         | 
| 411 381 | 
             
                  this.options.x = this.options.x - this.originalLeft;
         | 
| 412 382 | 
             
                  this.options.y = this.options.y - this.originalTop;
         | 
| 413 383 | 
             
                }
         | 
| 414 384 | 
             
              },
         | 
| 415 385 | 
             
              update: function(position) {
         | 
| 416 386 | 
             
                this.element.setStyle({
         | 
| 417 | 
            -
                  left:  | 
| 418 | 
            -
                  top:   | 
| 387 | 
            +
                  left: (this.options.x  * position + this.originalLeft).round() + 'px',
         | 
| 388 | 
            +
                  top:  (this.options.y  * position + this.originalTop).round()  + 'px'
         | 
| 419 389 | 
             
                });
         | 
| 420 390 | 
             
              }
         | 
| 421 391 | 
             
            });
         | 
| @@ -423,30 +393,29 @@ Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { | |
| 423 393 | 
             
            // for backwards compatibility
         | 
| 424 394 | 
             
            Effect.MoveBy = function(element, toTop, toLeft) {
         | 
| 425 395 | 
             
              return new Effect.Move(element, 
         | 
| 426 | 
            -
                Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
         | 
| 396 | 
            +
                Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
         | 
| 427 397 | 
             
            };
         | 
| 428 398 |  | 
| 429 | 
            -
            Effect.Scale = Class.create( | 
| 430 | 
            -
            Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
         | 
| 399 | 
            +
            Effect.Scale = Class.create(Effect.Base, {
         | 
| 431 400 | 
             
              initialize: function(element, percent) {
         | 
| 432 401 | 
             
                this.element = $(element);
         | 
| 433 | 
            -
                if(!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 402 | 
            +
                if (!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 434 403 | 
             
                var options = Object.extend({
         | 
| 435 404 | 
             
                  scaleX: true,
         | 
| 436 405 | 
             
                  scaleY: true,
         | 
| 437 406 | 
             
                  scaleContent: true,
         | 
| 438 407 | 
             
                  scaleFromCenter: false,
         | 
| 439 | 
            -
                  scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
         | 
| 408 | 
            +
                  scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
         | 
| 440 409 | 
             
                  scaleFrom: 100.0,
         | 
| 441 410 | 
             
                  scaleTo:   percent
         | 
| 442 | 
            -
                }, arguments[2] || {});
         | 
| 411 | 
            +
                }, arguments[2] || { });
         | 
| 443 412 | 
             
                this.start(options);
         | 
| 444 413 | 
             
              },
         | 
| 445 414 | 
             
              setup: function() {
         | 
| 446 415 | 
             
                this.restoreAfterFinish = this.options.restoreAfterFinish || false;
         | 
| 447 416 | 
             
                this.elementPositioning = this.element.getStyle('position');
         | 
| 448 417 |  | 
| 449 | 
            -
                this.originalStyle = {};
         | 
| 418 | 
            +
                this.originalStyle = { };
         | 
| 450 419 | 
             
                ['top','left','width','height','fontSize'].each( function(k) {
         | 
| 451 420 | 
             
                  this.originalStyle[k] = this.element.style[k];
         | 
| 452 421 | 
             
                }.bind(this));
         | 
| @@ -456,7 +425,7 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { | |
| 456 425 |  | 
| 457 426 | 
             
                var fontSize = this.element.getStyle('font-size') || '100%';
         | 
| 458 427 | 
             
                ['em','px','%','pt'].each( function(fontSizeType) {
         | 
| 459 | 
            -
                  if(fontSize.indexOf(fontSizeType)>0) {
         | 
| 428 | 
            +
                  if (fontSize.indexOf(fontSizeType)>0) {
         | 
| 460 429 | 
             
                    this.fontSize     = parseFloat(fontSize);
         | 
| 461 430 | 
             
                    this.fontSizeType = fontSizeType;
         | 
| 462 431 | 
             
                  }
         | 
| @@ -465,60 +434,61 @@ Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { | |
| 465 434 | 
             
                this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
         | 
| 466 435 |  | 
| 467 436 | 
             
                this.dims = null;
         | 
| 468 | 
            -
                if(this.options.scaleMode=='box')
         | 
| 437 | 
            +
                if (this.options.scaleMode=='box')
         | 
| 469 438 | 
             
                  this.dims = [this.element.offsetHeight, this.element.offsetWidth];
         | 
| 470 | 
            -
                if(/^content/.test(this.options.scaleMode))
         | 
| 439 | 
            +
                if (/^content/.test(this.options.scaleMode))
         | 
| 471 440 | 
             
                  this.dims = [this.element.scrollHeight, this.element.scrollWidth];
         | 
| 472 | 
            -
                if(!this.dims)
         | 
| 441 | 
            +
                if (!this.dims)
         | 
| 473 442 | 
             
                  this.dims = [this.options.scaleMode.originalHeight,
         | 
| 474 443 | 
             
                               this.options.scaleMode.originalWidth];
         | 
| 475 444 | 
             
              },
         | 
| 476 445 | 
             
              update: function(position) {
         | 
| 477 446 | 
             
                var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
         | 
| 478 | 
            -
                if(this.options.scaleContent && this.fontSize)
         | 
| 447 | 
            +
                if (this.options.scaleContent && this.fontSize)
         | 
| 479 448 | 
             
                  this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
         | 
| 480 449 | 
             
                this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
         | 
| 481 450 | 
             
              },
         | 
| 482 451 | 
             
              finish: function(position) {
         | 
| 483 | 
            -
                if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
         | 
| 452 | 
            +
                if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
         | 
| 484 453 | 
             
              },
         | 
| 485 454 | 
             
              setDimensions: function(height, width) {
         | 
| 486 | 
            -
                var d = {};
         | 
| 487 | 
            -
                if(this.options.scaleX) d.width =  | 
| 488 | 
            -
                if(this.options.scaleY) d.height =  | 
| 489 | 
            -
                if(this.options.scaleFromCenter) {
         | 
| 455 | 
            +
                var d = { };
         | 
| 456 | 
            +
                if (this.options.scaleX) d.width = width.round() + 'px';
         | 
| 457 | 
            +
                if (this.options.scaleY) d.height = height.round() + 'px';
         | 
| 458 | 
            +
                if (this.options.scaleFromCenter) {
         | 
| 490 459 | 
             
                  var topd  = (height - this.dims[0])/2;
         | 
| 491 460 | 
             
                  var leftd = (width  - this.dims[1])/2;
         | 
| 492 | 
            -
                  if(this.elementPositioning == 'absolute') {
         | 
| 493 | 
            -
                    if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
         | 
| 494 | 
            -
                    if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
         | 
| 461 | 
            +
                  if (this.elementPositioning == 'absolute') {
         | 
| 462 | 
            +
                    if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
         | 
| 463 | 
            +
                    if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
         | 
| 495 464 | 
             
                  } else {
         | 
| 496 | 
            -
                    if(this.options.scaleY) d.top = -topd + 'px';
         | 
| 497 | 
            -
                    if(this.options.scaleX) d.left = -leftd + 'px';
         | 
| 465 | 
            +
                    if (this.options.scaleY) d.top = -topd + 'px';
         | 
| 466 | 
            +
                    if (this.options.scaleX) d.left = -leftd + 'px';
         | 
| 498 467 | 
             
                  }
         | 
| 499 468 | 
             
                }
         | 
| 500 469 | 
             
                this.element.setStyle(d);
         | 
| 501 470 | 
             
              }
         | 
| 502 471 | 
             
            });
         | 
| 503 472 |  | 
| 504 | 
            -
            Effect.Highlight = Class.create( | 
| 505 | 
            -
            Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
         | 
| 473 | 
            +
            Effect.Highlight = Class.create(Effect.Base, {
         | 
| 506 474 | 
             
              initialize: function(element) {
         | 
| 507 475 | 
             
                this.element = $(element);
         | 
| 508 | 
            -
                if(!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 509 | 
            -
                var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
         | 
| 476 | 
            +
                if (!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 477 | 
            +
                var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
         | 
| 510 478 | 
             
                this.start(options);
         | 
| 511 479 | 
             
              },
         | 
| 512 480 | 
             
              setup: function() {
         | 
| 513 481 | 
             
                // Prevent executing on elements not in the layout flow
         | 
| 514 | 
            -
                if(this.element.getStyle('display')=='none') { this.cancel(); return; }
         | 
| 482 | 
            +
                if (this.element.getStyle('display')=='none') { this.cancel(); return; }
         | 
| 515 483 | 
             
                // Disable background image during the effect
         | 
| 516 | 
            -
                this.oldStyle = {
         | 
| 517 | 
            -
             | 
| 518 | 
            -
             | 
| 519 | 
            -
             | 
| 484 | 
            +
                this.oldStyle = { };
         | 
| 485 | 
            +
                if (!this.options.keepBackgroundImage) {
         | 
| 486 | 
            +
                  this.oldStyle.backgroundImage = this.element.getStyle('background-image');
         | 
| 487 | 
            +
                  this.element.setStyle({backgroundImage: 'none'});
         | 
| 488 | 
            +
                }
         | 
| 489 | 
            +
                if (!this.options.endcolor)
         | 
| 520 490 | 
             
                  this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
         | 
| 521 | 
            -
                if(!this.options.restorecolor)
         | 
| 491 | 
            +
                if (!this.options.restorecolor)
         | 
| 522 492 | 
             
                  this.options.restorecolor = this.element.getStyle('background-color');
         | 
| 523 493 | 
             
                // init color calculations
         | 
| 524 494 | 
             
                this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
         | 
| @@ -526,7 +496,7 @@ Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), | |
| 526 496 | 
             
              },
         | 
| 527 497 | 
             
              update: function(position) {
         | 
| 528 498 | 
             
                this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
         | 
| 529 | 
            -
                  return m+( | 
| 499 | 
            +
                  return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
         | 
| 530 500 | 
             
              },
         | 
| 531 501 | 
             
              finish: function() {
         | 
| 532 502 | 
             
                this.element.setStyle(Object.extend(this.oldStyle, {
         | 
| @@ -535,30 +505,21 @@ Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), | |
| 535 505 | 
             
              }
         | 
| 536 506 | 
             
            });
         | 
| 537 507 |  | 
| 538 | 
            -
            Effect.ScrollTo =  | 
| 539 | 
            -
             | 
| 540 | 
            -
             | 
| 541 | 
            -
                 | 
| 542 | 
            -
                 | 
| 543 | 
            -
             | 
| 544 | 
            -
               | 
| 545 | 
            -
             | 
| 546 | 
            -
             | 
| 547 | 
            -
                 | 
| 548 | 
            -
                 | 
| 549 | 
            -
             | 
| 550 | 
            -
             | 
| 551 | 
            -
             | 
| 552 | 
            -
             | 
| 553 | 
            -
                this.scrollStart = Position.deltaY;
         | 
| 554 | 
            -
                this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
         | 
| 555 | 
            -
              },
         | 
| 556 | 
            -
              update: function(position) {
         | 
| 557 | 
            -
                Position.prepare();
         | 
| 558 | 
            -
                window.scrollTo(Position.deltaX, 
         | 
| 559 | 
            -
                  this.scrollStart + (position*this.delta));
         | 
| 560 | 
            -
              }
         | 
| 561 | 
            -
            });
         | 
| 508 | 
            +
            Effect.ScrollTo = function(element) {
         | 
| 509 | 
            +
              var options = arguments[1] || { },
         | 
| 510 | 
            +
                scrollOffsets = document.viewport.getScrollOffsets(),
         | 
| 511 | 
            +
                elementOffsets = $(element).cumulativeOffset(),
         | 
| 512 | 
            +
                max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();  
         | 
| 513 | 
            +
             | 
| 514 | 
            +
              if (options.offset) elementOffsets[1] += options.offset;
         | 
| 515 | 
            +
             | 
| 516 | 
            +
              return new Effect.Tween(null,
         | 
| 517 | 
            +
                scrollOffsets.top,
         | 
| 518 | 
            +
                elementOffsets[1] > max ? max : elementOffsets[1],
         | 
| 519 | 
            +
                options,
         | 
| 520 | 
            +
                function(p){ scrollTo(scrollOffsets.left, p.round()) }
         | 
| 521 | 
            +
              );
         | 
| 522 | 
            +
            };
         | 
| 562 523 |  | 
| 563 524 | 
             
            /* ------------- combination effects ------------- */
         | 
| 564 525 |  | 
| @@ -566,14 +527,15 @@ Effect.Fade = function(element) { | |
| 566 527 | 
             
              element = $(element);
         | 
| 567 528 | 
             
              var oldOpacity = element.getInlineOpacity();
         | 
| 568 529 | 
             
              var options = Object.extend({
         | 
| 569 | 
            -
             | 
| 570 | 
            -
             | 
| 571 | 
            -
             | 
| 572 | 
            -
             | 
| 573 | 
            -
             | 
| 574 | 
            -
             | 
| 530 | 
            +
                from: element.getOpacity() || 1.0,
         | 
| 531 | 
            +
                to:   0.0,
         | 
| 532 | 
            +
                afterFinishInternal: function(effect) { 
         | 
| 533 | 
            +
                  if (effect.options.to!=0) return;
         | 
| 534 | 
            +
                  effect.element.hide().setStyle({opacity: oldOpacity}); 
         | 
| 535 | 
            +
                }
         | 
| 536 | 
            +
              }, arguments[1] || { });
         | 
| 575 537 | 
             
              return new Effect.Opacity(element,options);
         | 
| 576 | 
            -
            }
         | 
| 538 | 
            +
            };
         | 
| 577 539 |  | 
| 578 540 | 
             
            Effect.Appear = function(element) {
         | 
| 579 541 | 
             
              element = $(element);
         | 
| @@ -586,9 +548,9 @@ Effect.Appear = function(element) { | |
| 586 548 | 
             
              },
         | 
| 587 549 | 
             
              beforeSetup: function(effect) {
         | 
| 588 550 | 
             
                effect.element.setOpacity(effect.options.from).show(); 
         | 
| 589 | 
            -
              }}, arguments[1] || {});
         | 
| 551 | 
            +
              }}, arguments[1] || { });
         | 
| 590 552 | 
             
              return new Effect.Opacity(element,options);
         | 
| 591 | 
            -
            }
         | 
| 553 | 
            +
            };
         | 
| 592 554 |  | 
| 593 555 | 
             
            Effect.Puff = function(element) {
         | 
| 594 556 | 
             
              element = $(element);
         | 
| @@ -610,9 +572,9 @@ Effect.Puff = function(element) { | |
| 610 572 | 
             
                  },
         | 
| 611 573 | 
             
                  afterFinishInternal: function(effect) {
         | 
| 612 574 | 
             
                     effect.effects[0].element.hide().setStyle(oldStyle); }
         | 
| 613 | 
            -
                 }, arguments[1] || {})
         | 
| 575 | 
            +
                 }, arguments[1] || { })
         | 
| 614 576 | 
             
               );
         | 
| 615 | 
            -
            }
         | 
| 577 | 
            +
            };
         | 
| 616 578 |  | 
| 617 579 | 
             
            Effect.BlindUp = function(element) {
         | 
| 618 580 | 
             
              element = $(element);
         | 
| @@ -624,9 +586,9 @@ Effect.BlindUp = function(element) { | |
| 624 586 | 
             
                  afterFinishInternal: function(effect) {
         | 
| 625 587 | 
             
                    effect.element.hide().undoClipping();
         | 
| 626 588 | 
             
                  } 
         | 
| 627 | 
            -
                }, arguments[1] || {})
         | 
| 589 | 
            +
                }, arguments[1] || { })
         | 
| 628 590 | 
             
              );
         | 
| 629 | 
            -
            }
         | 
| 591 | 
            +
            };
         | 
| 630 592 |  | 
| 631 593 | 
             
            Effect.BlindDown = function(element) {
         | 
| 632 594 | 
             
              element = $(element);
         | 
| @@ -643,8 +605,8 @@ Effect.BlindDown = function(element) { | |
| 643 605 | 
             
                afterFinishInternal: function(effect) {
         | 
| 644 606 | 
             
                  effect.element.undoClipping();
         | 
| 645 607 | 
             
                }
         | 
| 646 | 
            -
              }, arguments[1] || {}));
         | 
| 647 | 
            -
            }
         | 
| 608 | 
            +
              }, arguments[1] || { }));
         | 
| 609 | 
            +
            };
         | 
| 648 610 |  | 
| 649 611 | 
             
            Effect.SwitchOff = function(element) {
         | 
| 650 612 | 
             
              element = $(element);
         | 
| @@ -665,8 +627,8 @@ Effect.SwitchOff = function(element) { | |
| 665 627 | 
             
                    }
         | 
| 666 628 | 
             
                  })
         | 
| 667 629 | 
             
                }
         | 
| 668 | 
            -
              }, arguments[1] || {}));
         | 
| 669 | 
            -
            }
         | 
| 630 | 
            +
              }, arguments[1] || { }));
         | 
| 631 | 
            +
            };
         | 
| 670 632 |  | 
| 671 633 | 
             
            Effect.DropOut = function(element) {
         | 
| 672 634 | 
             
              element = $(element);
         | 
| @@ -685,29 +647,35 @@ Effect.DropOut = function(element) { | |
| 685 647 | 
             
                    afterFinishInternal: function(effect) {
         | 
| 686 648 | 
             
                      effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
         | 
| 687 649 | 
             
                    } 
         | 
| 688 | 
            -
                  }, arguments[1] || {}));
         | 
| 689 | 
            -
            }
         | 
| 650 | 
            +
                  }, arguments[1] || { }));
         | 
| 651 | 
            +
            };
         | 
| 690 652 |  | 
| 691 653 | 
             
            Effect.Shake = function(element) {
         | 
| 692 654 | 
             
              element = $(element);
         | 
| 655 | 
            +
              var options = Object.extend({
         | 
| 656 | 
            +
                distance: 20,
         | 
| 657 | 
            +
                duration: 0.5
         | 
| 658 | 
            +
              }, arguments[1] || {});
         | 
| 659 | 
            +
              var distance = parseFloat(options.distance);
         | 
| 660 | 
            +
              var split = parseFloat(options.duration) / 10.0;
         | 
| 693 661 | 
             
              var oldStyle = {
         | 
| 694 662 | 
             
                top: element.getStyle('top'),
         | 
| 695 663 | 
             
                left: element.getStyle('left') };
         | 
| 696 | 
            -
                return new Effect.Move(element, | 
| 697 | 
            -
                  { x:   | 
| 664 | 
            +
                return new Effect.Move(element,
         | 
| 665 | 
            +
                  { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
         | 
| 698 666 | 
             
                new Effect.Move(effect.element,
         | 
| 699 | 
            -
                  { x: - | 
| 667 | 
            +
                  { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
         | 
| 700 668 | 
             
                new Effect.Move(effect.element,
         | 
| 701 | 
            -
                  { x:   | 
| 669 | 
            +
                  { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
         | 
| 702 670 | 
             
                new Effect.Move(effect.element,
         | 
| 703 | 
            -
                  { x: - | 
| 671 | 
            +
                  { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
         | 
| 704 672 | 
             
                new Effect.Move(effect.element,
         | 
| 705 | 
            -
                  { x:   | 
| 673 | 
            +
                  { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
         | 
| 706 674 | 
             
                new Effect.Move(effect.element,
         | 
| 707 | 
            -
                  { x: - | 
| 675 | 
            +
                  { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
         | 
| 708 676 | 
             
                    effect.element.undoPositioned().setStyle(oldStyle);
         | 
| 709 677 | 
             
              }}) }}) }}) }}) }}) }});
         | 
| 710 | 
            -
            }
         | 
| 678 | 
            +
            };
         | 
| 711 679 |  | 
| 712 680 | 
             
            Effect.SlideDown = function(element) {
         | 
| 713 681 | 
             
              element = $(element).cleanWhitespace();
         | 
| @@ -723,7 +691,7 @@ Effect.SlideDown = function(element) { | |
| 723 691 | 
             
                afterSetup: function(effect) {
         | 
| 724 692 | 
             
                  effect.element.makePositioned();
         | 
| 725 693 | 
             
                  effect.element.down().makePositioned();
         | 
| 726 | 
            -
                  if(window.opera) effect.element.setStyle({top: ''});
         | 
| 694 | 
            +
                  if (window.opera) effect.element.setStyle({top: ''});
         | 
| 727 695 | 
             
                  effect.element.makeClipping().setStyle({height: '0px'}).show(); 
         | 
| 728 696 | 
             
                },
         | 
| 729 697 | 
             
                afterUpdateInternal: function(effect) {
         | 
| @@ -733,23 +701,25 @@ Effect.SlideDown = function(element) { | |
| 733 701 | 
             
                afterFinishInternal: function(effect) {
         | 
| 734 702 | 
             
                  effect.element.undoClipping().undoPositioned();
         | 
| 735 703 | 
             
                  effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
         | 
| 736 | 
            -
                }, arguments[1] || {})
         | 
| 704 | 
            +
                }, arguments[1] || { })
         | 
| 737 705 | 
             
              );
         | 
| 738 | 
            -
            }
         | 
| 706 | 
            +
            };
         | 
| 739 707 |  | 
| 740 708 | 
             
            Effect.SlideUp = function(element) {
         | 
| 741 709 | 
             
              element = $(element).cleanWhitespace();
         | 
| 742 710 | 
             
              var oldInnerBottom = element.down().getStyle('bottom');
         | 
| 711 | 
            +
              var elementDimensions = element.getDimensions();
         | 
| 743 712 | 
             
              return new Effect.Scale(element, window.opera ? 0 : 1,
         | 
| 744 713 | 
             
               Object.extend({ scaleContent: false, 
         | 
| 745 714 | 
             
                scaleX: false, 
         | 
| 746 715 | 
             
                scaleMode: 'box',
         | 
| 747 716 | 
             
                scaleFrom: 100,
         | 
| 717 | 
            +
                scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
         | 
| 748 718 | 
             
                restoreAfterFinish: true,
         | 
| 749 | 
            -
                 | 
| 719 | 
            +
                afterSetup: function(effect) {
         | 
| 750 720 | 
             
                  effect.element.makePositioned();
         | 
| 751 721 | 
             
                  effect.element.down().makePositioned();
         | 
| 752 | 
            -
                  if(window.opera) effect.element.setStyle({top: ''});
         | 
| 722 | 
            +
                  if (window.opera) effect.element.setStyle({top: ''});
         | 
| 753 723 | 
             
                  effect.element.makeClipping().show();
         | 
| 754 724 | 
             
                },  
         | 
| 755 725 | 
             
                afterUpdateInternal: function(effect) {
         | 
| @@ -757,12 +727,12 @@ Effect.SlideUp = function(element) { | |
| 757 727 | 
             
                    (effect.dims[0] - effect.element.clientHeight) + 'px' });
         | 
| 758 728 | 
             
                },
         | 
| 759 729 | 
             
                afterFinishInternal: function(effect) {
         | 
| 760 | 
            -
                  effect.element.hide().undoClipping().undoPositioned() | 
| 761 | 
            -
                  effect.element.down().undoPositioned();
         | 
| 730 | 
            +
                  effect.element.hide().undoClipping().undoPositioned();
         | 
| 731 | 
            +
                  effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
         | 
| 762 732 | 
             
                }
         | 
| 763 | 
            -
               }, arguments[1] || {})
         | 
| 733 | 
            +
               }, arguments[1] || { })
         | 
| 764 734 | 
             
              );
         | 
| 765 | 
            -
            }
         | 
| 735 | 
            +
            };
         | 
| 766 736 |  | 
| 767 737 | 
             
            // Bug in opera makes the TD containing this element expand for a instance after finish 
         | 
| 768 738 | 
             
            Effect.Squish = function(element) {
         | 
| @@ -775,7 +745,7 @@ Effect.Squish = function(element) { | |
| 775 745 | 
             
                  effect.element.hide().undoClipping(); 
         | 
| 776 746 | 
             
                }
         | 
| 777 747 | 
             
              });
         | 
| 778 | 
            -
            }
         | 
| 748 | 
            +
            };
         | 
| 779 749 |  | 
| 780 750 | 
             
            Effect.Grow = function(element) {
         | 
| 781 751 | 
             
              element = $(element);
         | 
| @@ -784,7 +754,7 @@ Effect.Grow = function(element) { | |
| 784 754 | 
             
                moveTransition: Effect.Transitions.sinoidal,
         | 
| 785 755 | 
             
                scaleTransition: Effect.Transitions.sinoidal,
         | 
| 786 756 | 
             
                opacityTransition: Effect.Transitions.full
         | 
| 787 | 
            -
              }, arguments[1] || {});
         | 
| 757 | 
            +
              }, arguments[1] || { });
         | 
| 788 758 | 
             
              var oldStyle = {
         | 
| 789 759 | 
             
                top: element.style.top,
         | 
| 790 760 | 
             
                left: element.style.left,
         | 
| @@ -849,7 +819,7 @@ Effect.Grow = function(element) { | |
| 849 819 | 
             
                  )
         | 
| 850 820 | 
             
                }
         | 
| 851 821 | 
             
              });
         | 
| 852 | 
            -
            }
         | 
| 822 | 
            +
            };
         | 
| 853 823 |  | 
| 854 824 | 
             
            Effect.Shrink = function(element) {
         | 
| 855 825 | 
             
              element = $(element);
         | 
| @@ -858,7 +828,7 @@ Effect.Shrink = function(element) { | |
| 858 828 | 
             
                moveTransition: Effect.Transitions.sinoidal,
         | 
| 859 829 | 
             
                scaleTransition: Effect.Transitions.sinoidal,
         | 
| 860 830 | 
             
                opacityTransition: Effect.Transitions.none
         | 
| 861 | 
            -
              }, arguments[1] || {});
         | 
| 831 | 
            +
              }, arguments[1] || { });
         | 
| 862 832 | 
             
              var oldStyle = {
         | 
| 863 833 | 
             
                top: element.style.top,
         | 
| 864 834 | 
             
                left: element.style.left,
         | 
| @@ -903,11 +873,11 @@ Effect.Shrink = function(element) { | |
| 903 873 | 
             
                       effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
         | 
| 904 874 | 
             
                   }, options)
         | 
| 905 875 | 
             
              );
         | 
| 906 | 
            -
            }
         | 
| 876 | 
            +
            };
         | 
| 907 877 |  | 
| 908 878 | 
             
            Effect.Pulsate = function(element) {
         | 
| 909 879 | 
             
              element = $(element);
         | 
| 910 | 
            -
              var options    = arguments[1] || {};
         | 
| 880 | 
            +
              var options    = arguments[1] || { };
         | 
| 911 881 | 
             
              var oldOpacity = element.getInlineOpacity();
         | 
| 912 882 | 
             
              var transition = options.transition || Effect.Transitions.sinoidal;
         | 
| 913 883 | 
             
              var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
         | 
| @@ -916,7 +886,7 @@ Effect.Pulsate = function(element) { | |
| 916 886 | 
             
                Object.extend(Object.extend({  duration: 2.0, from: 0,
         | 
| 917 887 | 
             
                  afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
         | 
| 918 888 | 
             
                }, options), {transition: reverser}));
         | 
| 919 | 
            -
            }
         | 
| 889 | 
            +
            };
         | 
| 920 890 |  | 
| 921 891 | 
             
            Effect.Fold = function(element) {
         | 
| 922 892 | 
             
              element = $(element);
         | 
| @@ -936,37 +906,71 @@ Effect.Fold = function(element) { | |
| 936 906 | 
             
                  afterFinishInternal: function(effect) {
         | 
| 937 907 | 
             
                    effect.element.hide().undoClipping().setStyle(oldStyle);
         | 
| 938 908 | 
             
                  } });
         | 
| 939 | 
            -
              }}, arguments[1] || {}));
         | 
| 909 | 
            +
              }}, arguments[1] || { }));
         | 
| 940 910 | 
             
            };
         | 
| 941 911 |  | 
| 942 | 
            -
            Effect.Morph = Class.create( | 
| 943 | 
            -
            Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
         | 
| 912 | 
            +
            Effect.Morph = Class.create(Effect.Base, {
         | 
| 944 913 | 
             
              initialize: function(element) {
         | 
| 945 914 | 
             
                this.element = $(element);
         | 
| 946 | 
            -
                if(!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 915 | 
            +
                if (!this.element) throw(Effect._elementDoesNotExistError);
         | 
| 947 916 | 
             
                var options = Object.extend({
         | 
| 948 | 
            -
                  style:  | 
| 949 | 
            -
                }, arguments[1] || {});
         | 
| 917 | 
            +
                  style: { }
         | 
| 918 | 
            +
                }, arguments[1] || { });
         | 
| 919 | 
            +
                
         | 
| 920 | 
            +
                if (!Object.isString(options.style)) this.style = $H(options.style);
         | 
| 921 | 
            +
                else {
         | 
| 922 | 
            +
                  if (options.style.include(':'))
         | 
| 923 | 
            +
                    this.style = options.style.parseStyle();
         | 
| 924 | 
            +
                  else {
         | 
| 925 | 
            +
                    this.element.addClassName(options.style);
         | 
| 926 | 
            +
                    this.style = $H(this.element.getStyles());
         | 
| 927 | 
            +
                    this.element.removeClassName(options.style);
         | 
| 928 | 
            +
                    var css = this.element.getStyles();
         | 
| 929 | 
            +
                    this.style = this.style.reject(function(style) {
         | 
| 930 | 
            +
                      return style.value == css[style.key];
         | 
| 931 | 
            +
                    });
         | 
| 932 | 
            +
                    options.afterFinishInternal = function(effect) {
         | 
| 933 | 
            +
                      effect.element.addClassName(effect.options.style);
         | 
| 934 | 
            +
                      effect.transforms.each(function(transform) {
         | 
| 935 | 
            +
                        effect.element.style[transform.style] = '';
         | 
| 936 | 
            +
                      });
         | 
| 937 | 
            +
                    }
         | 
| 938 | 
            +
                  }
         | 
| 939 | 
            +
                }
         | 
| 950 940 | 
             
                this.start(options);
         | 
| 951 941 | 
             
              },
         | 
| 942 | 
            +
              
         | 
| 952 943 | 
             
              setup: function(){
         | 
| 953 944 | 
             
                function parseColor(color){
         | 
| 954 | 
            -
                  if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
         | 
| 945 | 
            +
                  if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
         | 
| 955 946 | 
             
                  color = color.parseColor();
         | 
| 956 947 | 
             
                  return $R(0,2).map(function(i){
         | 
| 957 948 | 
             
                    return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
         | 
| 958 949 | 
             
                  });
         | 
| 959 950 | 
             
                }
         | 
| 960 | 
            -
                this.transforms = this. | 
| 961 | 
            -
                  var  | 
| 962 | 
            -
             | 
| 963 | 
            -
             | 
| 964 | 
            -
                     | 
| 965 | 
            -
             | 
| 966 | 
            -
             | 
| 967 | 
            -
             | 
| 968 | 
            -
                     | 
| 969 | 
            -
             | 
| 951 | 
            +
                this.transforms = this.style.map(function(pair){
         | 
| 952 | 
            +
                  var property = pair[0], value = pair[1], unit = null;
         | 
| 953 | 
            +
             | 
| 954 | 
            +
                  if (value.parseColor('#zzzzzz') != '#zzzzzz') {
         | 
| 955 | 
            +
                    value = value.parseColor();
         | 
| 956 | 
            +
                    unit  = 'color';
         | 
| 957 | 
            +
                  } else if (property == 'opacity') {
         | 
| 958 | 
            +
                    value = parseFloat(value);
         | 
| 959 | 
            +
                    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
         | 
| 960 | 
            +
                      this.element.setStyle({zoom: 1});
         | 
| 961 | 
            +
                  } else if (Element.CSS_LENGTH.test(value)) {
         | 
| 962 | 
            +
                      var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
         | 
| 963 | 
            +
                      value = parseFloat(components[1]);
         | 
| 964 | 
            +
                      unit = (components.length == 3) ? components[2] : null;
         | 
| 965 | 
            +
                  }
         | 
| 966 | 
            +
             | 
| 967 | 
            +
                  var originalValue = this.element.getStyle(property);
         | 
| 968 | 
            +
                  return { 
         | 
| 969 | 
            +
                    style: property.camelize(), 
         | 
| 970 | 
            +
                    originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
         | 
| 971 | 
            +
                    targetValue: unit=='color' ? parseColor(value) : value,
         | 
| 972 | 
            +
                    unit: unit
         | 
| 973 | 
            +
                  };
         | 
| 970 974 | 
             
                }.bind(this)).reject(function(transform){
         | 
| 971 975 | 
             
                  return (
         | 
| 972 976 | 
             
                    (transform.originalValue == transform.targetValue) ||
         | 
| @@ -978,32 +982,35 @@ Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), { | |
| 978 982 | 
             
                });
         | 
| 979 983 | 
             
              },
         | 
| 980 984 | 
             
              update: function(position) {
         | 
| 981 | 
            -
                var style =  | 
| 982 | 
            -
                 | 
| 983 | 
            -
                   | 
| 984 | 
            -
                     | 
| 985 | 
            -
                       | 
| 986 | 
            -
                        (transform.targetValue[ | 
| 987 | 
            -
             | 
| 988 | 
            -
             | 
| 989 | 
            -
             | 
| 990 | 
            -
             | 
| 991 | 
            -
             | 
| 985 | 
            +
                var style = { }, transform, i = this.transforms.length;
         | 
| 986 | 
            +
                while(i--)
         | 
| 987 | 
            +
                  style[(transform = this.transforms[i]).style] = 
         | 
| 988 | 
            +
                    transform.unit=='color' ? '#'+
         | 
| 989 | 
            +
                      (Math.round(transform.originalValue[0]+
         | 
| 990 | 
            +
                        (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
         | 
| 991 | 
            +
                      (Math.round(transform.originalValue[1]+
         | 
| 992 | 
            +
                        (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
         | 
| 993 | 
            +
                      (Math.round(transform.originalValue[2]+
         | 
| 994 | 
            +
                        (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
         | 
| 995 | 
            +
                    (transform.originalValue +
         | 
| 996 | 
            +
                      (transform.targetValue - transform.originalValue) * position).toFixed(3) + 
         | 
| 997 | 
            +
                        (transform.unit === null ? '' : transform.unit);
         | 
| 998 | 
            +
                this.element.setStyle(style, true);
         | 
| 992 999 | 
             
              }
         | 
| 993 1000 | 
             
            });
         | 
| 994 1001 |  | 
| 995 | 
            -
            Effect.Transform = Class.create( | 
| 996 | 
            -
            Object.extend(Effect.Transform.prototype, {
         | 
| 1002 | 
            +
            Effect.Transform = Class.create({
         | 
| 997 1003 | 
             
              initialize: function(tracks){
         | 
| 998 1004 | 
             
                this.tracks  = [];
         | 
| 999 | 
            -
                this.options = arguments[1] || {};
         | 
| 1005 | 
            +
                this.options = arguments[1] || { };
         | 
| 1000 1006 | 
             
                this.addTracks(tracks);
         | 
| 1001 1007 | 
             
              },
         | 
| 1002 1008 | 
             
              addTracks: function(tracks){
         | 
| 1003 1009 | 
             
                tracks.each(function(track){
         | 
| 1004 | 
            -
                   | 
| 1010 | 
            +
                  track = $H(track);
         | 
| 1011 | 
            +
                  var data = track.values().first();
         | 
| 1005 1012 | 
             
                  this.tracks.push($H({
         | 
| 1006 | 
            -
                    ids:      | 
| 1013 | 
            +
                    ids:     track.keys().first(),
         | 
| 1007 1014 | 
             
                    effect:  Effect.Morph,
         | 
| 1008 1015 | 
             
                    options: { style: data }
         | 
| 1009 1016 | 
             
                  }));
         | 
| @@ -1013,76 +1020,101 @@ Object.extend(Effect.Transform.prototype, { | |
| 1013 1020 | 
             
              play: function(){
         | 
| 1014 1021 | 
             
                return new Effect.Parallel(
         | 
| 1015 1022 | 
             
                  this.tracks.map(function(track){
         | 
| 1016 | 
            -
                    var  | 
| 1017 | 
            -
                     | 
| 1023 | 
            +
                    var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
         | 
| 1024 | 
            +
                    var elements = [$(ids) || $$(ids)].flatten();
         | 
| 1025 | 
            +
                    return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
         | 
| 1018 1026 | 
             
                  }).flatten(),
         | 
| 1019 1027 | 
             
                  this.options
         | 
| 1020 1028 | 
             
                );
         | 
| 1021 1029 | 
             
              }
         | 
| 1022 1030 | 
             
            });
         | 
| 1023 1031 |  | 
| 1024 | 
            -
            Element.CSS_PROPERTIES =  | 
| 1025 | 
            -
              'backgroundPosition | 
| 1026 | 
            -
              'borderBottomWidth | 
| 1027 | 
            -
              'borderRightColor | 
| 1028 | 
            -
              'borderTopStyle | 
| 1029 | 
            -
              ' | 
| 1030 | 
            -
              ' | 
| 1031 | 
            -
              ' | 
| 1032 | 
            -
              ' | 
| 1033 | 
            -
              ' | 
| 1034 | 
            -
              'orphans', 'outlineColor', 'outlineOffset', 'outlineStyle', 'outlineWidth', 'overflowX', 'overflowY',
         | 
| 1035 | 
            -
              'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'page', 'pageBreakAfter', 'pageBreakBefore',
         | 
| 1036 | 
            -
              'pageBreakInside', 'pauseAfter', 'pauseBefore', 'pitch', 'pitchRange', 'position', 'quotes',
         | 
| 1037 | 
            -
              'richness', 'right', 'size', 'speakHeader', 'speakNumeral', 'speakPunctuation', 'speechRate', 'stress',
         | 
| 1038 | 
            -
              'tableLayout', 'textAlign', 'textDecoration', 'textIndent', 'textShadow', 'textTransform', 'top',
         | 
| 1039 | 
            -
              'unicodeBidi', 'verticalAlign', 'visibility', 'voiceFamily', 'volume', 'whiteSpace', 'widows',
         | 
| 1040 | 
            -
              'width', 'wordSpacing', 'zIndex'];
         | 
| 1032 | 
            +
            Element.CSS_PROPERTIES = $w(
         | 
| 1033 | 
            +
              'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
         | 
| 1034 | 
            +
              'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
         | 
| 1035 | 
            +
              'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
         | 
| 1036 | 
            +
              'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
         | 
| 1037 | 
            +
              'fontSize fontWeight height left letterSpacing lineHeight ' +
         | 
| 1038 | 
            +
              'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
         | 
| 1039 | 
            +
              'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
         | 
| 1040 | 
            +
              'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
         | 
| 1041 | 
            +
              'right textIndent top width wordSpacing zIndex');
         | 
| 1041 1042 |  | 
| 1042 1043 | 
             
            Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
         | 
| 1043 1044 |  | 
| 1045 | 
            +
            String.__parseStyleElement = document.createElement('div');
         | 
| 1044 1046 | 
             
            String.prototype.parseStyle = function(){
         | 
| 1045 | 
            -
              var  | 
| 1046 | 
            -
               | 
| 1047 | 
            -
             | 
| 1047 | 
            +
              var style, styleRules = $H();
         | 
| 1048 | 
            +
              if (Prototype.Browser.WebKit)
         | 
| 1049 | 
            +
                style = new Element('div',{style:this}).style;
         | 
| 1050 | 
            +
              else {
         | 
| 1051 | 
            +
                String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
         | 
| 1052 | 
            +
                style = String.__parseStyleElement.childNodes[0].style;
         | 
| 1053 | 
            +
              }
         | 
| 1048 1054 |  | 
| 1049 1055 | 
             
              Element.CSS_PROPERTIES.each(function(property){
         | 
| 1050 | 
            -
             | 
| 1056 | 
            +
                if (style[property]) styleRules.set(property, style[property]); 
         | 
| 1051 1057 | 
             
              });
         | 
| 1052 1058 |  | 
| 1053 | 
            -
               | 
| 1054 | 
            -
             | 
| 1055 | 
            -
             | 
| 1056 | 
            -
             | 
| 1057 | 
            -
                
         | 
| 1058 | 
            -
                if(value.parseColor('#zzzzzz') != '#zzzzzz') {
         | 
| 1059 | 
            -
                  value = value.parseColor();
         | 
| 1060 | 
            -
                  unit  = 'color';
         | 
| 1061 | 
            -
                } else if(Element.CSS_LENGTH.test(value)) 
         | 
| 1062 | 
            -
                  var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
         | 
| 1063 | 
            -
                      value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;
         | 
| 1064 | 
            -
                
         | 
| 1065 | 
            -
                result[property.underscore().dasherize()] = $H({ value:value, unit:unit });
         | 
| 1066 | 
            -
              }.bind(this));
         | 
| 1067 | 
            -
              
         | 
| 1068 | 
            -
              return result;
         | 
| 1059 | 
            +
              if (Prototype.Browser.IE && this.include('opacity'))
         | 
| 1060 | 
            +
                styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
         | 
| 1061 | 
            +
             | 
| 1062 | 
            +
              return styleRules;
         | 
| 1069 1063 | 
             
            };
         | 
| 1070 1064 |  | 
| 1071 | 
            -
             | 
| 1072 | 
            -
               | 
| 1073 | 
            -
             | 
| 1065 | 
            +
            if (document.defaultView && document.defaultView.getComputedStyle) {
         | 
| 1066 | 
            +
              Element.getStyles = function(element) {
         | 
| 1067 | 
            +
                var css = document.defaultView.getComputedStyle($(element), null);
         | 
| 1068 | 
            +
                return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
         | 
| 1069 | 
            +
                  styles[property] = css[property];
         | 
| 1070 | 
            +
                  return styles;
         | 
| 1071 | 
            +
                });
         | 
| 1072 | 
            +
              };
         | 
| 1073 | 
            +
            } else {
         | 
| 1074 | 
            +
              Element.getStyles = function(element) {
         | 
| 1075 | 
            +
                element = $(element);
         | 
| 1076 | 
            +
                var css = element.currentStyle, styles;
         | 
| 1077 | 
            +
                styles = Element.CSS_PROPERTIES.inject({ }, function(hash, property) {
         | 
| 1078 | 
            +
                  hash.set(property, css[property]);
         | 
| 1079 | 
            +
                  return hash;
         | 
| 1080 | 
            +
                });
         | 
| 1081 | 
            +
                if (!styles.opacity) styles.set('opacity', element.getOpacity());
         | 
| 1082 | 
            +
                return styles;
         | 
| 1083 | 
            +
              };
         | 
| 1074 1084 | 
             
            };
         | 
| 1075 1085 |  | 
| 1076 | 
            -
             | 
| 1077 | 
            -
              | 
| 1078 | 
            -
             | 
| 1086 | 
            +
            Effect.Methods = {
         | 
| 1087 | 
            +
              morph: function(element, style) {
         | 
| 1088 | 
            +
                element = $(element);
         | 
| 1089 | 
            +
                new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
         | 
| 1090 | 
            +
                return element;
         | 
| 1091 | 
            +
              },
         | 
| 1092 | 
            +
              visualEffect: function(element, effect, options) {
         | 
| 1093 | 
            +
                element = $(element)
         | 
| 1094 | 
            +
                var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
         | 
| 1095 | 
            +
                new Effect[klass](element, options);
         | 
| 1096 | 
            +
                return element;
         | 
| 1097 | 
            +
              },
         | 
| 1098 | 
            +
              highlight: function(element, options) {
         | 
| 1099 | 
            +
                element = $(element);
         | 
| 1100 | 
            +
                new Effect.Highlight(element, options);
         | 
| 1101 | 
            +
                return element;
         | 
| 1102 | 
            +
              }
         | 
| 1103 | 
            +
            };
         | 
| 1104 | 
            +
             | 
| 1105 | 
            +
            $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
         | 
| 1106 | 
            +
              'pulsate shake puff squish switchOff dropOut').each(
         | 
| 1107 | 
            +
              function(effect) { 
         | 
| 1108 | 
            +
                Effect.Methods[effect] = function(element, options){
         | 
| 1109 | 
            +
                  element = $(element);
         | 
| 1110 | 
            +
                  Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
         | 
| 1111 | 
            +
                  return element;
         | 
| 1112 | 
            +
                }
         | 
| 1113 | 
            +
              }
         | 
| 1079 1114 | 
             
            );
         | 
| 1080 1115 |  | 
| 1081 | 
            -
             | 
| 1082 | 
            -
               | 
| 1083 | 
            -
             | 
| 1084 | 
            -
              new Effect[effect_class](element, options);
         | 
| 1085 | 
            -
              return $(element);
         | 
| 1086 | 
            -
            };
         | 
| 1116 | 
            +
            $w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 
         | 
| 1117 | 
            +
              function(f) { Effect.Methods[f] = Element[f]; }
         | 
| 1118 | 
            +
            );
         | 
| 1087 1119 |  | 
| 1088 | 
            -
            Element.addMethods();
         | 
| 1120 | 
            +
            Element.addMethods(Effect.Methods);
         |