function fading(img) {
	var ldr = new Image(), opct = 100, timeout = 10;
	ldr.style.position = 'absolute';
	ldr.style.zIndex   = '99';

	var body = document.body || document.getElementsByTagName('body')[0];
	body.appendChild(ldr);
	ldr.style.left = '-1000px';

	var offset = function(node) {
    var x = node.offsetLeft, y = node.offsetTop;
    if(node.offsetParent) {
      var pos = offset(node.offsetParent);
      x += pos.x; y += pos.y;
    }
    return {x:x, y:y};
	}
	
	var opacity = function(node, value) {
		var op = parseInt(value, 10);
    if(body.filters) {
			var alph = null;
			try {
				alph = (node.filters['DXImageTransform.Microsoft.alpha'] || node.filters.alpha);
			} catch(e) {}
			if(alph) alph.opacity = op;
      else node.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+op+")";
    } else {
      var aop = op / 100
      node.style.opacity = aop;
      node.style.MozOpacity = aop;
      node.style.KhtmlOpacity = aop;
    }
	}

	var o = {

		loader: function(url) {
      ldr.src = url;
      return o;
		},
		opacity: function(val) {
			opct = 100 - val;
			opacity(img, val);
      return o;
		},
		timeout: function(val) {
			timeout = val;
			return o;
		},
		fade: function(url) {
			var pos = offset(img), ipos = {x:pos.x, y:pos.y};
			pos.x += Math.ceil(img.offsetWidth  / 2) - Math.ceil(ldr.offsetWidth  / 2);
			pos.y += Math.ceil(img.offsetHeight / 2) - Math.ceil(ldr.offsetHeight / 2);
			ldr.style.left = pos.x + 'px';
			ldr.style.top  = pos.y + 'px';
			var new_image = new Image();
			new_image.src = url;
			new_image.style.position = 'absolute';
			new_image.style.left = ipos.x + 'px';
			new_image.style.top  = ipos.y + 'px';
			new_image.style.width  = img.offsetWidth  + 'px';
			new_image.style.height = img.offsetHeight + 'px';
			opacity(new_image, opct);
			var stepper = function() {
				opct += 5;
				if(opct > 100) {
					opct = 100;
				}
				var iopct = 50 - opct;
				opacity(new_image, opct);
				if(iopct >= 0) opacity(img, iopct);
				if(opct==100) {
					img.src = new_image.src;
					opacity(img, 100);
					new_image.parentNode.removeChild(new_image);
					begin.running = false;
				} else {
					setTimeout(stepper, timeout);
				}
			}
			var begin = function() {
				if(begin.running) return null;
				begin.running = true;
				ldr.style.left = '-1000px';
        setTimeout(stepper, timeout);
			}
			begin.running = false;
	    if(new_image.addEventListener) {
	      new_image.addEventListener('DOMContentLoaded', begin, false);
	      new_image.addEventListener('load', begin, false);
	    }
	    if(new_image.attachEvent) {
	      new_image.attachEvent('onload', begin);
	    }
			new_image.onload = function() {
			  begin();
			}
			setTimeout(function(){
				if(!begin.running && (/loaded|complete/.test(new_image.readyState) || new_image.complete)) {
			    begin();
			  }
			}, 100);
			body.appendChild(new_image);
			return o;
	  }

	}
	return o;
}

