// 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) { 
 // Params: A reference to a DOM element, the PNG src file pathname, and a 
 // hidden "ready-to-run" passed when called back after image preloading. 
  
 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; 
  
 // Cache of DIVs created per element, and image preloader/data. 
 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) { 
 // New image? Preload it with a callback to detect dimensions. 
 tiles.img.onload = function() { 
 this.onload = null; 
 IEPNGFix.tileBG(elm, pngSrc, 1); 
 }; 
 return tiles.img.src = pngSrc; 
 } 
 } else { 
 // No image? 
 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; 
 } 
  
 // Convert English and percentage positions to pixels. 
 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); 
  
 // Handle backgroundRepeat. 
 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; 
 } 
  
 // Go! 
 this.hook.enabled = 0; 
 if (!({ relative: 1, absolute: 1 }[elm.currentStyle.position])) { 
 elm.style.position = 'relative'; 
 } 
 var count = 0, 
 xPos, 
 maxX = repeatX ? elmW : x + 0.1, 
 yPos, 
 maxY = repeatY ? elmH : y + 0.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; 
  
 // Cache so updates are infrequent. 
 tiles.old = { 
 w: elmW, 
 h: elmH, 
 x: bgX, 
 y: bgY, 
 r: bgR 
 }; 
 }; 
  
  
 IEPNGFix.update = function() { 
 // Update all PNG backgrounds. 
 for (var i in IEPNGFix.data) { 
 var t = IEPNGFix.data[i].tiles; 
 if (t && t.elm && t.src) { 
 IEPNGFix.tileBG(t.elm, t.src); 
 } 
 } 
 }; 
 IEPNGFix.update.timer = 0; 
  
 if (window.attachEvent && !window.opera) { 
 window.attachEvent('onresize', function() { 
 clearTimeout(IEPNGFix.update.timer); 
 IEPNGFix.update.timer = setTimeout(IEPNGFix.update, 100); 
 }); 
 } 
 

