--- prototype.js.old	2007-01-18 22:58:42.000000000 +0200
+++ prototype.js.new	2007-02-09 03:44:29.000000000 +0200
@@ -65,13 +65,23 @@
   }
 });
 
-Function.prototype.bind = function() {
+/*Function.prototype.bind = function() {
   var __method = this, args = $A(arguments), object = args.shift();
   return function() {
     return __method.apply(object, args.concat($A(arguments)));
   }
+}*/
+// The above does not work in XUL.
+// Use this function instead
+function _p_bind(context, func) {
+  var __method = func, args = $A(func.arguments), object = context;
+
+  return function() {
+    return __method.apply(object, args.concat($A(arguments)));
+  }
 }
 
+
 Function.prototype.bindAsEventListener = function(object) {
   var __method = this, args = $A(arguments), object = args.shift();
   return function(event) {
@@ -125,7 +135,7 @@
   },
 
   registerCallback: function() {
-    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+    this.timer = setInterval(_p_bind(this, this.onTimerEvent), this.frequency * 1000);
   },
 
   stop: function() {
@@ -856,9 +866,9 @@
         this.options.asynchronous);
 
       if (this.options.asynchronous)
-        setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);
+        setTimeout(_p_bind(this, function() { this.respondToReadyState(1) }), 10);
 
-      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.transport.onreadystatechange = _p_bind(this, this.onStateChange);
       this.setRequestHeaders();
 
       var body = this.method == 'post' ? (this.options.postBody || params) : null;
@@ -993,10 +1003,10 @@
     this.setOptions(options);
 
     var onComplete = this.options.onComplete || Prototype.emptyFunction;
-    this.options.onComplete = (function(transport, param) {
+    this.options.onComplete = _p_bind(this, function(transport, param) {
       this.updateContent();
       onComplete(transport, param);
-    }).bind(this);
+    });
 
     this.request(url);
   },
@@ -1016,7 +1026,7 @@
 
     if (this.success()) {
       if (this.onComplete)
-        setTimeout(this.onComplete.bind(this), 10);
+        setTimeout(_p_bind(this, this.onComplete), 10);
     }
   }
 });
@@ -1038,7 +1048,7 @@
   },
 
   start: function() {
-    this.options.onComplete = this.updateComplete.bind(this);
+    this.options.onComplete = _p_bind(this, this.updateComplete);
     this.onTimerEvent();
   },
 
@@ -1055,7 +1065,7 @@
 
       this.lastText = request.responseText;
     }
-    this.timer = setTimeout(this.onTimerEvent.bind(this),
+    this.timer = setTimeout(_p_bind(this, this.onTimerEvent),
       this.decay * this.frequency * 1000);
   },
 
@@ -1659,9 +1669,9 @@
   },
 
   insertContent: function(fragments) {
-    fragments.each((function(fragment) {
+    fragments.each(_p_bind(this, function(fragment) {
       this.element.parentNode.insertBefore(fragment, this.element);
-    }).bind(this));
+    }));
   }
 });
 
@@ -1673,9 +1683,9 @@
   },
 
   insertContent: function(fragments) {
-    fragments.reverse(false).each((function(fragment) {
+    fragments.reverse(false).each(_p_bind(this, function(fragment) {
       this.element.insertBefore(fragment, this.element.firstChild);
-    }).bind(this));
+    }));
   }
 });
 
@@ -1687,9 +1697,9 @@
   },
 
   insertContent: function(fragments) {
-    fragments.each((function(fragment) {
+    fragments.each(_p_bind(this, function(fragment) {
       this.element.appendChild(fragment);
-    }).bind(this));
+    }));
   }
 });
 
@@ -1700,10 +1710,10 @@
   },
 
   insertContent: function(fragments) {
-    fragments.each((function(fragment) {
+    fragments.each(_p_bind(this, function(fragment) {
       this.element.parentNode.insertBefore(fragment,
         this.element.nextSibling);
-    }).bind(this));
+    }));
   }
 });
 
@@ -1847,7 +1857,7 @@
 Object.extend(Selector, {
   matchElements: function(elements, expression) {
     var selector = new Selector(expression);
-    return elements.select(selector.match.bind(selector)).map(Element.extend);
+    return elements.select(_p_bind(selector, selector.match)).map(Element.extend);
   },
 
   findElement: function(elements, expression, index) {
@@ -2091,7 +2101,7 @@
   },
 
   registerCallback: function() {
-    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+    setInterval(_p_bind(this, this.onTimerEvent), this.frequency * 1000);
   },
 
   onTimerEvent: function() {
@@ -2143,7 +2153,7 @@
   },
 
   registerFormCallbacks: function() {
-    Form.getElements(this.element).each(this.registerCallback.bind(this));
+    Form.getElements(this.element).each(_p_bind(this, this.registerCallback));
   },
 
   registerCallback: function(element) {
@@ -2151,10 +2161,10 @@
       switch (element.type.toLowerCase()) {
         case 'checkbox':
         case 'radio':
-          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          Event.observe(element, 'click', _p_bind(this, this.onElementEvent));
           break;
         default:
-          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          Event.observe(element, 'change', _p_bind(this, this.onElementEvent));
           break;
       }
     }
@@ -2512,4 +2522,4 @@
   }
 }
 
-Element.addMethods();
\ No newline at end of file
+Element.addMethods();
