--- /dev/null
+<public:component>\r
+<script type="text/javascript">\r
+\r
+// IE5.5+ PNG Alpha Fix v2.0 Alpha\r
+// (c) 2004-2009 Angus Turnbull http://www.twinhelix.com\r
+\r
+// This is licensed under the GNU LGPL, version 2.1 or later.\r
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/\r
+\r
+var IEPNGFix = window.IEPNGFix || {};\r
+IEPNGFix.data = IEPNGFix.data || {};\r
+\r
+\r
+// CONFIG: blankImg is the path to blank.gif, *relative to the HTML document*.\r
+// Try either:\r
+// * An absolute path like: '/images/blank.gif'\r
+// * A path relative to this HTC file like: thisFolder + 'blank.gif'\r
+var thisFolder = document.URL.replace(/(\\|\/)[^\\\/]*$/, '/');\r
+IEPNGFix.blankImg = thisFolder + 'blank.gif';\r
+\r
+\r
+IEPNGFix.fix = function(elm, src, t) {\r
+ // Applies an image 'src' to an element 'elm' using the DirectX filter.\r
+ // If 'src' is null, filter is disabled.\r
+ // Disables the 'hook' to prevent infinite recursion on setting BG/src.\r
+ // 't' = type, where background tile = 0, background = 1, IMG SRC = 2.\r
+\r
+ var h = this.hook.enabled;\r
+ this.hook.enabled = 0;\r
+\r
+ var f = 'DXImageTransform.Microsoft.AlphaImageLoader';\r
+ src = (src || '').replace(/\(/g, '%28').replace(/\)/g, '%29');\r
+\r
+ if (\r
+ src && !(/IMG|INPUT/.test(elm.nodeName) && (t != 2)) &&\r
+ elm.currentStyle.width == 'auto' && elm.currentStyle.height == 'auto'\r
+ ) {\r
+ if (elm.offsetWidth) {\r
+ elm.style.width = elm.offsetWidth + 'px';\r
+ }\r
+ if (elm.clientHeight) {\r
+ elm.style.height = elm.clientHeight + 'px';\r
+ }\r
+ if (elm.currentStyle.display == 'inline') {\r
+ elm.style.display = 'inline-block';\r
+ }\r
+ }\r
+\r
+ if (t == 1) {\r
+ elm.style.backgroundImage = 'url("' + this.blankImg + '")';\r
+ }\r
+ if (t == 2) {\r
+ elm.src = this.blankImg;\r
+ }\r
+\r
+ if (elm.filters[f]) {\r
+ elm.filters[f].enabled = src ? true : false;\r
+ if (src) {\r
+ elm.filters[f].src = src;\r
+ }\r
+ } else if (src) {\r
+ elm.style.filter = 'progid:' + f + '(src="' + src +\r
+ '",sizingMethod="' + (t == 2 ? 'scale' : 'crop') + '")';\r
+ }\r
+\r
+ this.hook.enabled = h;\r
+};\r
+\r
+\r
+IEPNGFix.process = function(elm, init) {\r
+ // Checks the onpropertychange event (on first 'init' run, a fake event)\r
+ // and calls the filter-applying-functions.\r
+\r
+ if (\r
+ !/MSIE (5\.5|6)/.test(navigator.userAgent) ||\r
+ typeof elm.filters == 'unknown'\r
+ ) {\r
+ return;\r
+ }\r
+ if (!this.data[elm.uniqueID]) {\r
+ this.data[elm.uniqueID] = {\r
+ className: ''\r
+ };\r
+ }\r
+ var data = this.data[elm.uniqueID],\r
+ evt = init ? { propertyName: 'src,backgroundImage' } : event,\r
+ isSrc = /src/.test(evt.propertyName),\r
+ isBg = /backgroundImage/.test(evt.propertyName),\r
+ isPos = /width|height|background(Pos|Rep)/.test(evt.propertyName),\r
+ isClass = !init && ((elm.className != data.className) &&\r
+ (elm.className || data.className));\r
+ if (!(isSrc || isBg || isPos || isClass)) {\r
+ return;\r
+ }\r
+ data.className = elm.className;\r
+ var blank = this.blankImg.match(/([^\/]+)$/)[1],\r
+ eS = elm.style,\r
+ eCS = elm.currentStyle;\r
+\r
+ // Required for Whatever:hover - erase set BG if className changes.\r
+ if (\r
+ isClass && (eS.backgroundImage.indexOf('url(') == -1 ||\r
+ eS.backgroundImage.indexOf(blank) > -1)\r
+ ) {\r
+ return setTimeout(function() {\r
+ eS.backgroundImage = '';\r
+ }, 0);\r
+ }\r
+\r
+ // Foregrounds.\r
+ if (isSrc && elm.src && { IMG: 1, INPUT: 1 }[elm.nodeName]) {\r
+ if ((/\.png/i).test(elm.src)) {\r
+ if (!elm.oSrc) {\r
+ // MM rollover compat\r
+ elm.oSrc = elm.src;\r
+ }\r
+ this.fix(elm, elm.src, 2);\r
+ } else if (elm.src.indexOf(blank) == -1) {\r
+ this.fix(elm, '');\r
+ }\r
+ }\r
+\r
+ // Backgrounds.\r
+ var bgSrc = eCS.backgroundImage || eS.backgroundImage;\r
+ if ((bgSrc + elm.src).indexOf(blank) == -1) {\r
+ var bgPNG = bgSrc.match(/url[("']+(.*\.png[^\)"']*)[\)"']/i);\r
+ if (bgPNG) {\r
+ if (this.tileBG && !{ IMG: 1, INPUT: 1 }[elm.nodeName]) {\r
+ this.tileBG(elm, bgPNG[1]);\r
+ this.fix(elm, '', 1);\r
+ } else {\r
+ if (data.tiles && data.tiles.src) {\r
+ this.tileBG(elm, '');\r
+ }\r
+ this.fix(elm, bgPNG[1], 1);\r
+ this.childFix(elm);\r
+ }\r
+ } else {\r
+ if (data.tiles && data.tiles.src) {\r
+ this.tileBG(elm, '');\r
+ }\r
+ this.fix(elm, '');\r
+ }\r
+ } else if ((isPos || isClass) && data.tiles && data.tiles.src) {\r
+ this.tileBG(elm, data.tiles.src);\r
+ }\r
+\r
+ if (init) {\r
+ this.hook.enabled = 1;\r
+ elm.attachEvent('onpropertychange', this.hook);\r
+ }\r
+};\r
+\r
+\r
+IEPNGFix.childFix = function(elm) {\r
+ // "hasLayout" fix for unclickable children inside PNG backgrounds.\r
+ var tags = [\r
+ 'a',\r
+ 'input',\r
+ 'select',\r
+ 'textarea',\r
+ 'button',\r
+ 'iframe',\r
+ 'object'\r
+ ],\r
+ t = tags.length,\r
+ tFix = [];\r
+ while (t--) {\r
+ var pFix = elm.all.tags(tags[t]),\r
+ e = pFix.length;\r
+ while (e--) {\r
+ tFix.push(pFix[e]);\r
+ }\r
+ }\r
+ t = tFix.length;\r
+ if (t && (/relative|absolute/i).test(elm.currentStyle.position)) {\r
+ alert('IEPNGFix: Unclickable children of element:' +\r
+ '\n\n<' + elm.nodeName + (elm.id && ' id=' + elm.id) + '>');\r
+ }\r
+ while (t--) {\r
+ if (!(/relative|absolute/i).test(tFix[t].currentStyle.position)) {\r
+ tFix[t].style.position = 'relative';\r
+ }\r
+ }\r
+};\r
+\r
+\r
+IEPNGFix.hook = function() {\r
+ if (IEPNGFix.hook.enabled) {\r
+ IEPNGFix.process(element, 0);\r
+ }\r
+};\r
+\r
+\r
+IEPNGFix.process(element, 1);\r
+\r
+</script>\r
+</public:component>\r
--- /dev/null
+// IE5.5+ PNG Alpha Fix v2.0 Alpha: Background Tiling Support\r
+// (c) 2008-2009 Angus Turnbull http://www.twinhelix.com\r
+\r
+// This is licensed under the GNU LGPL, version 2.1 or later.\r
+// For details, see: http://creativecommons.org/licenses/LGPL/2.1/\r
+\r
+var IEPNGFix = window.IEPNGFix || {};\r
+\r
+IEPNGFix.tileBG = function(elm, pngSrc, ready) {\r
+ // Params: A reference to a DOM element, the PNG src file pathname, and a\r
+ // hidden "ready-to-run" passed when called back after image preloading.\r
+\r
+ var data = this.data[elm.uniqueID],\r
+ elmW = Math.max(elm.clientWidth, elm.scrollWidth),\r
+ elmH = Math.max(elm.clientHeight, elm.scrollHeight),\r
+ bgX = elm.currentStyle.backgroundPositionX,\r
+ bgY = elm.currentStyle.backgroundPositionY,\r
+ bgR = elm.currentStyle.backgroundRepeat;\r
+\r
+ // Cache of DIVs created per element, and image preloader/data.\r
+ if (!data.tiles) {\r
+ data.tiles = {\r
+ elm: elm,\r
+ src: '',\r
+ cache: [],\r
+ img: new Image(),\r
+ old: {}\r
+ };\r
+ }\r
+ var tiles = data.tiles,\r
+ pngW = tiles.img.width,\r
+ pngH = tiles.img.height;\r
+\r
+ if (pngSrc) {\r
+ if (!ready && pngSrc != tiles.src) {\r
+ // New image? Preload it with a callback to detect dimensions.\r
+ tiles.img.onload = function() {\r
+ this.onload = null;\r
+ IEPNGFix.tileBG(elm, pngSrc, 1);\r
+ };\r
+ return tiles.img.src = pngSrc;\r
+ }\r
+ } else {\r
+ // No image?\r
+ if (tiles.src) ready = 1;\r
+ pngW = pngH = 0;\r
+ }\r
+ tiles.src = pngSrc;\r
+\r
+ if (!ready && elmW == tiles.old.w && elmH == tiles.old.h &&\r
+ bgX == tiles.old.x && bgY == tiles.old.y && bgR == tiles.old.r) {\r
+ return;\r
+ }\r
+\r
+ // Convert English and percentage positions to pixels.\r
+ var pos = {\r
+ top: '0%',\r
+ left: '0%',\r
+ center: '50%',\r
+ bottom: '100%',\r
+ right: '100%'\r
+ },\r
+ x,\r
+ y,\r
+ pc;\r
+ x = pos[bgX] || bgX;\r
+ y = pos[bgY] || bgY;\r
+ if (pc = x.match(/(\d+)%/)) {\r
+ x = Math.round((elmW - pngW) * (parseInt(pc[1]) / 100));\r
+ }\r
+ if (pc = y.match(/(\d+)%/)) {\r
+ y = Math.round((elmH - pngH) * (parseInt(pc[1]) / 100));\r
+ }\r
+ x = parseInt(x);\r
+ y = parseInt(y);\r
+\r
+ // Handle backgroundRepeat.\r
+ var repeatX = { 'repeat': 1, 'repeat-x': 1 }[bgR],\r
+ repeatY = { 'repeat': 1, 'repeat-y': 1 }[bgR];\r
+ if (repeatX) {\r
+ x %= pngW;\r
+ if (x > 0) x -= pngW;\r
+ }\r
+ if (repeatY) {\r
+ y %= pngH;\r
+ if (y > 0) y -= pngH;\r
+ }\r
+\r
+ // Go!\r
+ this.hook.enabled = 0;\r
+ if (!({ relative: 1, absolute: 1 }[elm.currentStyle.position])) {\r
+ elm.style.position = 'relative';\r
+ }\r
+ var count = 0,\r
+ xPos,\r
+ maxX = repeatX ? elmW : x + 0.1,\r
+ yPos,\r
+ maxY = repeatY ? elmH : y + 0.1,\r
+ d,\r
+ s,\r
+ isNew;\r
+ if (pngW && pngH) {\r
+ for (xPos = x; xPos < maxX; xPos += pngW) {\r
+ for (yPos = y; yPos < maxY; yPos += pngH) {\r
+ isNew = 0;\r
+ if (!tiles.cache[count]) {\r
+ tiles.cache[count] = document.createElement('div');\r
+ isNew = 1;\r
+ }\r
+ var clipR = Math.max(0, xPos + pngW > elmW ? elmW - xPos : pngW),\r
+ clipB = Math.max(0, yPos + pngH > elmH ? elmH - yPos : pngH);\r
+ d = tiles.cache[count];\r
+ s = d.style;\r
+ s.behavior = 'none';\r
+ s.left = (xPos - parseInt(elm.currentStyle.paddingLeft)) + 'px';\r
+ s.top = yPos + 'px';\r
+ s.width = clipR + 'px';\r
+ s.height = clipB + 'px';\r
+ s.clip = 'rect(' +\r
+ (yPos < 0 ? 0 - yPos : 0) + 'px,' +\r
+ clipR + 'px,' +\r
+ clipB + 'px,' +\r
+ (xPos < 0 ? 0 - xPos : 0) + 'px)';\r
+ s.display = 'block';\r
+ if (isNew) {\r
+ s.position = 'absolute';\r
+ s.zIndex = -999;\r
+ if (elm.firstChild) {\r
+ elm.insertBefore(d, elm.firstChild);\r
+ } else {\r
+ elm.appendChild(d);\r
+ }\r
+ }\r
+ this.fix(d, pngSrc, 0);\r
+ count++;\r
+ }\r
+ }\r
+ }\r
+ while (count < tiles.cache.length) {\r
+ this.fix(tiles.cache[count], '', 0);\r
+ tiles.cache[count++].style.display = 'none';\r
+ }\r
+\r
+ this.hook.enabled = 1;\r
+\r
+ // Cache so updates are infrequent.\r
+ tiles.old = {\r
+ w: elmW,\r
+ h: elmH,\r
+ x: bgX,\r
+ y: bgY,\r
+ r: bgR\r
+ };\r
+};\r
+\r
+\r
+IEPNGFix.update = function() {\r
+ // Update all PNG backgrounds.\r
+ for (var i in IEPNGFix.data) {\r
+ var t = IEPNGFix.data[i].tiles;\r
+ if (t && t.elm && t.src) {\r
+ IEPNGFix.tileBG(t.elm, t.src);\r
+ }\r
+ }\r
+};\r
+IEPNGFix.update.timer = 0;\r
+\r
+if (window.attachEvent && !window.opera) {\r
+ window.attachEvent('onresize', function() {\r
+ clearTimeout(IEPNGFix.update.timer);\r
+ IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100);\r
+ });\r
+}\r