@@ -138,21 +138,26 @@ Elm.Native.Utils.make = function(elm) {
138138 return Tuple2(w,h);
139139 }
140140
141− function adjustOffset() {
142− var node = elm.node;
143− var offsetX = 0, offsetY = 0;
144− if (node.offsetParent) {
145− do {
146− offsetX += node.offsetLeft;
147− offsetY += node.offsetTop;
148− } while (node = node.offsetParent);
141+ function getXY(e) {
142+ var posx = 0;
143+ var posy = 0;
144+ if (e.pageX || e.pageY) {
145+ posx = e.pageX;
146+ posy = e.pageY;
147+ } else if (e.clientX || e.clientY) {
148+ posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
149+ posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
149150 }
150− elm.node.offsetX = offsetX;
151− elm.node.offsetY = offsetY;
152− }
153151
154− if (elm.display === ElmRuntime.Display.COMPONENT) {
155− elm.addListener(elm.inputs, elm.node, 'mouseover', adjustOffset);
152+ if (elm.display === ElmRuntime.Display.COMPONENT) {
153+ var rect = elm.node.getBoundingClientRect();
154+ var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft;
155+ var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop;
156+ // TODO: figure out if there is a way to avoid rounding here
157+ posx = posx - Math.round(relx) - elm.node.clientLeft;
158+ posy = posy - Math.round(rely) - elm.node.clientTop;
159+ }
160+ return Tuple2(posx, posy);
156161 }
157162
158163 return elm.Native.Utils.values = {
@@ -172,6 +177,7 @@ Elm.Native.Utils.make = function(elm) {
172177 min : F2(min),
173178 mod : F2(mod),
174179 htmlHeight: F2(htmlHeight),
175− toFloat: function(x){return x}
180+ getXY: getXY,
181+ toFloat: function(x) { return +x; }
176182 };
177183};