// IE5.5+ PNG Alpha Fix v2.0 Alpha: Background Tiling Support
// (c) 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.tileBG = function (elm, pngSrc, ready) { var data = this.data[elm.uniqueID], elmW = Math.max(elm.clientWidth, elm.scrollWidth), elmH = Math.max(elm.clientHeight, elm.scrollHeight), bgX = elm.currentStyle.backgroundPositionX, bgY = elm.currentStyle.backgroundPositionY, bgR = elm.currentStyle.backgroundRepeat; if (!data.tiles) data.tiles = { elm: elm, src: "", cache: [], img: new Image, old: {} }; var tiles = data.tiles, pngW = tiles.img.width, pngH = tiles.img.height; if (pngSrc) { if (!ready && pngSrc != tiles.src) { tiles.img.onload = function () { this.onload = null; IEPNGFix.tileBG(elm, pngSrc, 1) }; return tiles.img.src = pngSrc } } else { if (tiles.src) ready = 1; pngW = pngH = 0 } tiles.src = pngSrc; if (!ready && elmW == tiles.old.w && elmH == tiles.old.h && bgX == tiles.old.x && bgY == tiles.old.y && bgR == tiles.old.r) return; var pos = { top: "0%", left: "0%", center: "50%", bottom: "100%", right: "100%" }, x, y, pc; x = pos[bgX] || bgX; y = pos[bgY] || bgY; if (pc = x.match(/(\d+)%/)) x = Math.round((elmW - pngW) * (parseInt(pc[1]) / 100)); if (pc = y.match(/(\d+)%/)) y = Math.round((elmH - pngH) * (parseInt(pc[1]) / 100)); x = parseInt(x); y = parseInt(y); var repeatX = ({ repeat: 1, "repeat-x": 1 })[bgR], repeatY = ({ repeat: 1, "repeat-y": 1 })[bgR]; if (repeatX) { x %= pngW; if (x > 0) x -= pngW } if (repeatY) { y %= pngH; if (y > 0) y -= pngH } this.hook.enabled = 0; if (!({ relative: 1, absolute: 1 })[elm.currentStyle.position]) elm.style.position = "relative"; var count = 0, xPos, maxX = repeatX ? elmW : x + .1, yPos, maxY = repeatY ? elmH : y + .1, d, s, isNew; if (pngW && pngH) for (xPos = x; xPos < maxX; xPos += pngW) for (yPos = y; yPos < maxY; yPos += pngH) { isNew = 0; if (!tiles.cache[count]) { tiles.cache[count] = document.createElement("div"); isNew = 1 } var clipR = xPos + pngW > elmW ? elmW - xPos : pngW, clipB = yPos + pngH > elmH ? elmH - yPos : pngH; d = tiles.cache[count]; s = d.style; s.behavior = "none"; s.left = xPos + "px"; s.top = yPos + "px"; s.width = clipR + "px"; s.height = clipB + "px"; s.clip = "rect(" + (yPos < 0 ? 0 - yPos : 0) + "px," + clipR + "px," + clipB + "px," + (xPos < 0 ? 0 - xPos : 0) + "px)"; s.display = "block"; if (isNew) { s.position = "absolute"; s.zIndex = -999; if (elm.firstChild) elm.insertBefore(d, elm.firstChild); else elm.appendChild(d) } this.fix(d, pngSrc, 0); count++ } while (count < tiles.cache.length) { this.fix(tiles.cache[count], "", 0); tiles.cache[count++].style.display = "none" } this.hook.enabled = 1; tiles.old = { w: elmW, h: elmH, x: bgX, y: bgY, r: bgR} }; IEPNGFix.update = function () { for (var i in IEPNGFix.data) { var t = IEPNGFix.data[i].tiles; t && t.elm && t.src && IEPNGFix.tileBG(t.elm, t.src) } }; IEPNGFix.update.timer = 0; window.attachEvent && !window.opera && window.attachEvent("onresize", function () { clearTimeout(IEPNGFix.update.timer); IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100) })
