var PositionUtils = PositionUtils ? PositionUtils : { __isIE: function() { return navigator.appVersion.match(/MSIE/); }, __userAgent: function() { return navigator.userAgent; }, __isFireFox: function() { return this.__userAgent().match(/firefox/i); }, __isFireFoxOld: function() { return this.__isFireFox() && (this.__userAgent().match(/firefox\/2./i) || this.__userAgent().match(/firefox\/1./i)); }, __isFireFoxNew: function() { return this.__isFireFox() && !this.__isFireFoxOld(); }, __parseBorderWidth: function(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 { res = 1; } } return res; }, __getBorderWidth: function(element) { var res = new Object(); res.left = 0; res.top = 0; res.right = 0; res.bottom = 0; if (window.getComputedStyle) { 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 { res.left = this.__parseBorderWidth(element.style.borderLeftWidth); res.top = this.__parseBorderWidth(element.style.borderTopWidth); res.right = this.__parseBorderWidth(element.style.borderRightWidth); res.bottom = this.__parseBorderWidth(element.style.borderBottomWidth); } return res; }, getAbsolutePosition: function(element) { var res = new Object(); res.left = 0; res.top = 0; if (element) { res.left = element.offsetLeft; res.top = element.offsetTop; var offsetParent = element.offsetParent; var parentNode = element.parentNode; var borderWidth = null; while (offsetParent != null) { res.left += offsetParent.offsetLeft; res.top += offsetParent.offsetTop; var parentTagName = offsetParent.tagName.toLowerCase(); if ((this.__isIE() && parentTagName != "table") || (this.__isFireFoxNew() && parentTagName == "td")) { borderWidth = this.__getBorderWidth(offsetParent); res.left += borderWidth.left; res.top += borderWidth.top; } if (offsetParent != document.body && offsetParent != document.documentElement) { res.left -= offsetParent.scrollLeft; res.top -= offsetParent.scrollTop; } //next lines are necessary to support FireFox problem with offsetParent if (!this.__isIE()) { while (offsetParent != parentNode && parentNode !== null) { res.left -= parentNode.scrollLeft; res.top -= parentNode.scrollTop; if (this.__isFireFoxOld()) { borderWidth = this.__getBorderWidth(parentNode); res.left += borderWidth.left; res.top += borderWidth.top; } parentNode = parentNode.parentNode; } } parentNode = offsetParent.parentNode; offsetParent = offsetParent.offsetParent; } } return res; }, getAvailableDimension: function() { var dimension = { width: 0, height: 0 }; if (self.innerWidth) { dimension.width = self.innerWidth; dimension.height = self.innerHeight; } else if (document.documentElement && document.documentElement.clientWidth) { dimension.width = document.documentElement.clientWidth; dimension.height = document.documentElement.clientHeight; } else if (document.body) { dimension.width = document.body.clientWidth; dimension.height = document.body.clientHeight; } else { dimension.width = screen.availWidth; dimension.height = screen.availHeight; } return dimension; } }; var UIOutputTooltip = UIOutputTooltip ? UIOutputTooltip : { hide: function(element, event, tooltipId) { var tooltip = document.getElementById(tooltipId); if (tooltip) { tooltip.style.display = "none"; tooltip.style.visibility = "hidden"; tooltip.style.zIndex = 0; var frame = document.getElementById(tooltipId + "Frame"); if (frame) { // Replace le tooltip au bon endroit dans le document var originalParent = tooltip._originalParent; tooltip.parentNode.removeChild(tooltip); originalParent.appendChild(tooltip); // Supprime le iframe frame.parentNode.removeChild(frame); } } }, show: function(element, event, tooltipId) { var tooltip = document.getElementById(tooltipId); if (tooltip) { var dimension = PositionUtils.getAvailableDimension(); var position = PositionUtils.getAbsolutePosition(element); // Transformer le tooltip en bloc pour avoir une hauteur/largeur tooltip.style.display = "block"; var x = 10; var y = 10; var w = tooltip.clientWidth; var h = tooltip.clientHeight; var absoluteX = position.left + x; var absoluteY = position.top + y; var isBugged = false; var agent = navigator.userAgent.toLowerCase(); if (agent.indexOf("msie") != -1 && agent.indexOf("opera") == -1) { // MSIE var version = parseInt(navigator.appVersion); var isBugged = version < 4; if (!isBugged && version == 4) { isBugged = agent.indexOf("msie 7") != -1 || agent.indexOf("msie 8") != -1 || agent.indexOf("msie 6") != -1 || agent.indexOf("msie 5.5") != -1 || agent.indexOf("msie 5") != -1 || agent.indexOf("msie 4") != -1; } } if (isBugged) { var originalParent = tooltip.parentNode; originalParent.removeChild(tooltip); tooltip._originalParent = originalParent; x = absoluteX + 5; if (absoluteX + w > dimension.width) { x = x - w - 15; if (x < 0) { x = 0; } } y = absoluteY + 5; if (absoluteY + h > dimension.height) { y = y - h - 15; if (y < 0) { y = 0; } } var iframe = document.createElement('IFRAME'); iframe.src = "javascript:'';"; iframe.id = tooltip.id + "Frame"; iframe.style.position = "absolute"; iframe.style.width = (w + 2) + "px"; iframe.style.height = (h + 2) + "px"; iframe.style.top = y + "px"; iframe.style.left = x + "px"; iframe.style.zIndex = 0; document.body.appendChild(iframe); document.body.appendChild(tooltip); tooltip.style.top = y + "px"; tooltip.style.left = x + "px"; } else { if (absoluteX + w > dimension.width) { // Débordement de la page, déplacer si possible x = x - w; var effectiveX = absoluteX + x; if (effectiveX < 0) { x = x - effectiveX + 10; } } if (absoluteY + h > dimension.height) { // Débordement de la page, déplacer si possible y = y - h; var effectiveY = absoluteY + y; if (effectiveY < 0) { y = y - effectiveY + 10; } } tooltip.style.top = y + "px"; tooltip.style.left = x + "px"; } tooltip.style.zIndex = 1000000; tooltip.style.visibility = "visible"; } } }