diff options
Diffstat (limited to 'website-old/logi/iepngfix.htc')
-rwxr-xr-x | website-old/logi/iepngfix.htc | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/website-old/logi/iepngfix.htc b/website-old/logi/iepngfix.htc new file mode 100755 index 00000000..bbfb23c5 --- /dev/null +++ b/website-old/logi/iepngfix.htc @@ -0,0 +1,187 @@ +<public:component> +<script type="text/javascript"> + +// IE5.5+ PNG Alpha Fix v2.0 Alpha +// (c) 2004-2008 Angus Turnbull http://www.twinhelix.com + +// This is licensed under the GNU LGPL, version 2.1 or later. +// For details, see: http://creativecommons.org/licenses/LGPL/2.1/ + +var IEPNGFix = window.IEPNGFix || {}; +IEPNGFix.data = IEPNGFix.data || {}; + + +// This must be a path to a blank image, relative to the HTML document(s). +// In production use I suggest '/images/blankImg' or similar. That's all! +IEPNGFix.blankImg = 'clear.gif'; + + +IEPNGFix.fix = function(elm, src, t) { + // Applies an image 'src' to an element 'elm' using the DirectX filter. + // If 'src' is null, filter is disabled. + // Disables the 'hook' to prevent infinite recursion on setting BG/src. + // 't' = type, where background tile = 0, background = 1, IMG SRC = 2. + + var h = this.hook.enabled; + this.hook.enabled = 0; + + var f = 'DXImageTransform.Microsoft.AlphaImageLoader'; + src = (src || '').replace(/\(/g, '%28').replace(/\)/g, '%29'); + + if ( + src && !(/IMG|INPUT/.test(elm.nodeName) && (t != 2)) && + elm.currentStyle.width == 'auto' && elm.currentStyle.height == 'auto' + ) { + elm.style.width = elm.offsetWidth + 'px'; + elm.style.height = elm.clientHeight + 'px'; + if (elm.currentStyle.display == 'inline') { + elm.style.display = 'inline-block'; + } + } + + if (t == 1) { + elm.style.backgroundImage = 'url("' + this.blankImg + '")'; + } + if (t == 2) { + elm.src = this.blankImg; + } + + if (elm.filters[f]) { + elm.filters[f].enabled = src ? true : false; + if (src) { + elm.filters[f].src = src; + } + } else if (src) { + elm.style.filter = 'progid:' + f + '(src="' + src + + '",sizingMethod="' + (t == 2 ? 'scale' : 'crop') + '")'; + } + + this.hook.enabled = h; +}; + + +IEPNGFix.process = function(elm, init) { + // Checks the onpropertychange event (on first 'init' run, a fake event) + // and calls the filter-applying-functions. + + if ( + !/MSIE (5\.5|6)/.test(navigator.userAgent) || + typeof elm.filters == 'unknown' + ) { + return; + } + if (!this.data[elm.uniqueID]) { + this.data[elm.uniqueID] = { + className: '' + }; + } + var data = this.data[elm.uniqueID], + evt = init ? { propertyName: 'src,backgroundImage' } : event, + isSrc = /src/.test(evt.propertyName), + isBg = /backgroundImage/.test(evt.propertyName), + isPos = /width|height|background(Pos|Rep)/.test(evt.propertyName), + isClass = !init && ((elm.className != data.className) && + (elm.className || data.className)); + if (!(isSrc || isBg || isPos || isClass)) { + return; + } + data.className = elm.className; + var blank = this.blankImg.match(/([^\/]+)$/)[1], + eS = elm.style, + eCS = elm.currentStyle; + + // Required for Whatever:hover - erase set BG if className changes. + if ( + isClass && (eS.backgroundImage.indexOf('url(') == -1 || + eS.backgroundImage.indexOf(blank) > -1) + ) { + return setTimeout(function() { + eS.backgroundImage = ''; + }, 0); + } + + // Foregrounds. + if (isSrc && elm.src && { IMG: 1, INPUT: 1 }[elm.nodeName]) { + if ((/\.png/i).test(elm.src)) { + this.fix(elm, elm.src, 2); + } else if (elm.src.indexOf(blank) == -1) { + this.fix(elm, ''); + } + } + + // Backgrounds. + var bgSrc = eCS.backgroundImage || eS.backgroundImage; + if ((bgSrc + elm.src).indexOf(blank) == -1) { + var bgPNG = bgSrc.match(/url[("']+(.*\.png[^\)"']*)[\)"']/i); + if (bgPNG) { + if (this.tileBG && !{ IMG: 1, INPUT: 1 }[elm.nodeName]) { + this.tileBG(elm, bgPNG[1]); + this.fix(elm, '', 1); + } else { + if (data.tiles && data.tiles.src) { + this.tileBG(elm, ''); + } + this.fix(elm, bgPNG[1], 1); + this.childFix(elm); + } + } else { + if (data.tiles && data.tiles.src) { + this.tileBG(elm, ''); + } + this.fix(elm, ''); + } + } else if ((isPos || isClass) && data.tiles && data.tiles.src) { + this.tileBG(elm, data.tiles.src); + } + + if (init) { + this.hook.enabled = 1; + elm.attachEvent('onpropertychange', this.hook); + } +}; + + +IEPNGFix.childFix = function(elm) { + // "hasLayout" fix for unclickable children inside PNG backgrounds. + var tags = [ + 'a', + 'input', + 'select', + 'textarea', + 'button', + 'iframe', + 'object' + ], + t = tags.length, + tFix = []; + while (t--) { + var pFix = elm.all.tags(tags[t]), + e = pFix.length; + while (e--) { + tFix.push(pFix[e]); + } + } + t = tFix.length; + if (t && (/relative|absolute/i).test(elm.currentStyle.position)) { + alert('IEPNGFix: Unclickable children of element:' + + '\n\n<' + elm.nodeName + (elm.id && ' id=' + elm.id) + '>'); + } + while (t--) { + if (!(/relative|absolute/i).test(tFix[t].currentStyle.position)) { + tFix[t].style.position = 'relative'; + } + } +}; + + +IEPNGFix.hook = function() { + if (IEPNGFix.hook.enabled) { + IEPNGFix.process(element, 0); + } +}; + + +IEPNGFix.process(element, 1); + +</script> +</public:component> |