function __getIEVersion() { var rv = -1; Return value assumes failure. if (navigator.appName == 'Microsoft Internet Explorer') { var ua = navigator.userAgent; var re = new RegExp(MSIE ([0-9]{1,}[.0-9]{0,})); if (re.exec(ua) != null) rv = parseFloat(RegExp.$1); } return rv; } function __getOperaVersion() { var rv = 0; Default value if (window.opera) { var sver = window.opera.version(); rv = parseFloat(sver); } return rv; } var __userAgent = navigator.userAgent; var __isIE = navigator.appVersion.match(MSIE) != null; var __IEVersion = __getIEVersion(); var __isIENew = __isIE && __IEVersion = 8; var __isIEOld = __isIE && !__isIENew; var __isFireFox = __userAgent.match(firefoxi) != null; var __isFireFoxOld = __isFireFox && ((__userAgent.match(firefox2.i) != null) (__userAgent.match(firefox1.i) != null)); var __isFireFoxNew = __isFireFox && !__isFireFoxOld; var __isWebKit = navigator.appVersion.match(WebKit) != null; var __isChrome = navigator.appVersion.match(Chrome) != null; var __isOpera = window.opera != null; var __operaVersion = __getOperaVersion(); var __isOperaOld = __isOpera && (__operaVersion 10); function __parseBorderWidth(width) { var res = 0; if (typeof(width) == string && width != null && width != ) { var p = width.indexOf(px); if (p = 0) { res = parseInt(width.substring(0, p)); } else { do not know how to calculate other values (such as 0.5em or 0.1cm) correctly now so just set the width to 1 pixel res = 1; } } return res; } returns border width for some element function __getBorderWidth(element) { var res = new Object(); res.left = 0; res.top = 0; res.right = 0; res.bottom = 0; if (window.getComputedStyle) { for Firefox var elStyle = window.getComputedStyle(element, null); res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2)); res.top = parseInt(elStyle.borderTopWidth.slice(0, -2)); res.right = parseInt(elStyle.borderRightWidth.slice(0, -2)); res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2)); } else { for other browsers res.left = __parseBorderWidth(element.style.borderLeftWidth); res.top = __parseBorderWidth(element.style.borderTopWidth); res.right = __parseBorderWidth(element.style.borderRightWidth); res.bottom = __parseBorderWidth(element.style.borderBottomWidth); } return res; } returns the absolute position of some element within document function getElementAbsolutePos(elemID) { var element; if (typeof(elemID) == string) { element = document.getElementById(elemID); } else { element = elemID; } var res = new Object(); res.x = 0; res.y = 0; if (element !== null) { res.x = element.offsetLeft; var offsetParent = element.offsetParent; var offsetParentTagName = offsetParent != null offsetParent.tagName.toLowerCase() ; if (__isIENew && offsetParentTagName == 'td') { res.y = element.scrollTop; } else { res.y = element.offsetTop; } var parentNode = element.parentNode; var borderWidth = null; while (offsetParent != null) { res.x += offsetParent.offsetLeft; res.y += offsetParent.offsetTop; var parentTagName = offsetParent.tagName.toLowerCase(); if ((__isIEOld && parentTagName != table) (__isFireFoxNew && parentTagName == td) __isChrome) { borderWidth = __getBorderWidth(offsetParent); res.x += borderWidth.left; res.y += borderWidth.top; } if (offsetParent != document.body && offsetParent != document.documentElement) { res.x -= offsetParent.scrollLeft; res.y -= offsetParent.scrollTop; } next lines are necessary to fix the problem with offsetParent if (!__isIE && !__isOperaOld __isIENew) { while (offsetParent != parentNode && parentNode !== null) { res.x -= parentNode.scrollLeft; res.y -= parentNode.scrollTop; if (__isFireFoxOld __isWebKit) { borderWidth = __getBorderWidth(parentNode); res.x += borderWidth.left; res.y += borderWidth.top; } parentNode = parentNode.parentNode; } } parentNode = offsetParent.parentNode; offsetParent = offsetParent.offsetParent; } } return res; }