aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/helpers/javascripts/prototype.js
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view/helpers/javascripts/prototype.js')
-rw-r--r--actionpack/lib/action_view/helpers/javascripts/prototype.js46
1 files changed, 27 insertions, 19 deletions
diff --git a/actionpack/lib/action_view/helpers/javascripts/prototype.js b/actionpack/lib/action_view/helpers/javascripts/prototype.js
index 1ebb2a46b7..9b0e02cf80 100644
--- a/actionpack/lib/action_view/helpers/javascripts/prototype.js
+++ b/actionpack/lib/action_view/helpers/javascripts/prototype.js
@@ -791,41 +791,49 @@ var Position = {
return [valueL, valueT];
},
+ cumulative_offset: function(element) {
+ var valueT = 0; var valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ } while(element);
+ return [valueL, valueT];
+ },
+
// caches x/y coordinate pair to use with overlap
within: function(element, x, y) {
if(this.include_scroll_offsets)
- return within_including_scrolloffsets(element, x, y);
+ return this.within_including_scrolloffsets(element, x, y);
this.xcomp = x;
this.ycomp = y;
- var offsettop = element.offsetTop;
- var offsetleft = element.offsetLeft;
- return (y>=offsettop &&
- y<offsettop+element.offsetHeight &&
- x>=offsetleft &&
- x<offsetleft+element.offsetWidth);
+ this.offset = this.cumulative_offset(element);
+
+ return (y>=this.offset[1] &&
+ y<this.offset[1]+element.offsetHeight &&
+ x>=this.offset[0] &&
+ x<this.offset[0]+element.offsetWidth);
},
within_including_scrolloffsets: function(element, x, y) {
var offsetcache = this.real_offset(element);
- this.xcomp = x + offsetcache[0] - this.deltaX;
- this.ycomp = y + offsetcache[1] - this.deltaY;
- this.xcomp = x;
- this.ycomp = y;
- var offsettop = element.offsetTop;
- var offsetleft = element.offsetLeft;
- return (y>=offsettop &&
- y<offsettop+element.offsetHeight &&
- x>=offsetleft &&
- x<offsetleft+element.offsetWidth);
+ this.offset = this.cumulative_offset(element);
+ this.xcomp = x + offsetcache[0] - this.deltaX + this.offset[0];
+ this.ycomp = y + offsetcache[1] - this.deltaY + this.offset[1];
+
+ return (this.ycomp>=this.offset[1] &&
+ this.ycomp<this.offset[1]+element.offsetHeight &&
+ this.xcomp>=this.offset[0] &&
+ this.xcomp<this.offset[0]+element.offsetWidth);
},
// within must be called directly before
overlap: function(mode, element) {
if(!mode) return 0;
if(mode == 'vertical')
- return ((element.offsetTop+element.offsetHeight)-this.ycomp) / element.offsetHeight;
+ return ((this.offset[1]+element.offsetHeight)-this.ycomp) / element.offsetHeight;
if(mode == 'horizontal')
- return ((element.offsetLeft+element.offsetWidth)-this.xcomp) / element.offsetWidth;
+ return ((this.offset[0]+element.offsetWidth)-this.xcomp) / element.offsetWidth;
},
clone: function(source, target) {