From e3bfd08cbcbffddf53de4f0f6030a794402cf532 Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Sat, 4 Mar 2006 17:12:03 +0000
Subject: Fixed Effect.Appear in effects.js to work with floats in Safari
 (closes #3524, #3813, #3044) [Thomas Fuchs]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3757 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
---
 railties/html/javascripts/effects.js   | 10 +++++++++
 railties/html/javascripts/prototype.js | 41 ++++++++++++++++++----------------
 2 files changed, 32 insertions(+), 19 deletions(-)

(limited to 'railties/html/javascripts')

diff --git a/railties/html/javascripts/effects.js b/railties/html/javascripts/effects.js
index 91d5348a03..c5183092fd 100644
--- a/railties/html/javascripts/effects.js
+++ b/railties/html/javascripts/effects.js
@@ -85,6 +85,12 @@ Element.childrenWithClassName = function(element, className) {
     function(c) { return Element.hasClassName(c, className) });
 }
 
+Element.forceRerendering = function(element) {
+  var n = document.createTextNode(' ');
+  $(element).appendChild(n);
+  Element.remove(n);
+}
+
 Array.prototype.call = function() {
   var args = arguments;
   this.each(function(f){ f.apply(this, args) });
@@ -545,6 +551,10 @@ Effect.Appear = function(element) {
   var options = Object.extend({
   from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
   to:   1.0,
+  // force Safari to render floated elements properly
+  afterFinishInternal: function(effect) {
+    Element.forceRerendering(effect.element);
+  },
   beforeSetup: function(effect) { with(Element) {
     setOpacity(effect.element, effect.options.from);
     show(effect.element); }}
diff --git a/railties/html/javascripts/prototype.js b/railties/html/javascripts/prototype.js
index f37149127f..2c201fd64c 100644
--- a/railties/html/javascripts/prototype.js
+++ b/railties/html/javascripts/prototype.js
@@ -942,17 +942,17 @@ Object.extend(Element, {
     setTimeout(function() {html.evalScripts()}, 10);
   },
 
-  replace: function(element, html) {
-    element = $(element);
-    if (element.outerHTML) {
-      element.outerHTML = html.stripScripts();
-    } else {
-      var range = element.ownerDocument.createRange();
-      range.selectNodeContents(element);
-      element.parentNode.replaceChild(
-        range.createContextualFragment(html.stripScripts()), element);
-    }
-    setTimeout(function() {html.evalScripts()}, 10);
+  replace: function(element, html) { 
+    element = $(element); 
+    if (element.outerHTML) { 
+      element.outerHTML = html.stripScripts(); 
+    } else { 
+      var range = element.ownerDocument.createRange(); 
+      range.selectNodeContents(element); 
+      element.parentNode.replaceChild( 
+        range.createContextualFragment(html.stripScripts()), element); 
+    } 
+    setTimeout(function() {html.evalScripts()}, 10); 
   },
 
   getHeight: function(element) {
@@ -1317,7 +1317,7 @@ var Field = {
       $(arguments[i]).value = '';
   },
 
-  focus: function(element) {
+  focus: function(element) { 
     $(element).focus();
   },
 
@@ -1551,15 +1551,16 @@ Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
 
 Abstract.EventObserver = function() {}
 Abstract.EventObserver.prototype = {
-  initialize: function(element, callback) {
-    this.element  = $(element);
-    this.callback = callback;
+  initialize: function() {
+    this.element  = $(arguments[0]);
+    this.callback = arguments[1];
+    this.trigger  = arguments[2];
 
     this.lastValue = this.getValue();
     if (this.element.tagName.toLowerCase() == 'form')
       this.registerFormCallbacks();
     else
-      this.registerCallback(this.element);
+      this.registerCallback(this.element, this.trigger);
   },
 
   onElementEvent: function() {
@@ -1573,11 +1574,13 @@ Abstract.EventObserver.prototype = {
   registerFormCallbacks: function() {
     var elements = Form.getElements(this.element);
     for (var i = 0; i < elements.length; i++)
-      this.registerCallback(elements[i]);
+      this.registerCallback(elements[i], this.trigger);
   },
 
-  registerCallback: function(element) {
-    if (element.type) {
+  registerCallback: function(element, trigger) {
+    if (trigger && element.type) {
+      Event.observe(element, trigger, this.onElementEvent.bind(this));
+    } else if (element.type) {
       switch (element.type.toLowerCase()) {
         case 'checkbox':
         case 'radio':
-- 
cgit v1.2.3