var xfade = {
  delay: 4000,
  items: new Array(),

  init: function(container, delay) {
    // test DOM
    if (!document.getElementById ||
        !document.getElementsByTagName ||
        !document.createElement ||
        !document.getElementById(container)) {
      return;
    }

    // apply cross fade effect
    if (delay) { xfade.delay = delay; }
    var container = document.getElementById(container);
    xfade.map(function(node){xfade.getElementNodes(node, xfade.items);}, container.childNodes);
    xfade.map(function(obj){obj.xOpacity = 0;}, xfade.items);
    xfade.xFadeEffect();
  },

  // Cross Fade Effect
  xFadeEffect: function() {
    var items = xfade.items;
    var nums = new Array();
    var current = 0;
    var timer = null;

    showCurrent(); // Start cross fade
    function showCurrent() {
      var currentObj = items[Math.floor(items.length*Math.random())];
      currentObj.style.zIndex = "30";
      currentObj.xOpacity = .99;
      timer = setTimeout(so_xfade, xfade.delay);
    }

    // Image Cross Fade Redux | Version 1.0
    // Last revision: 02.15.2006 | steve@slayeroffice.com
    function so_xfade() {
      var cOpacity = items[current].xOpacity;
      var nIndex = (items[current+1]) ? current+1 : 0;
      var nOpacity = items[nIndex].xOpacity;

      cOpacity -= .05;
      nOpacity += .05;

      items[nIndex].style.display = "block";
      items[current].xOpacity = cOpacity;
      items[nIndex].xOpacity = nOpacity;

      setOpacity(items[current]);
      setOpacity(items[nIndex]);

      if(cOpacity <= 0) {
        items[current].style.display = "none";
        current = nIndex;
        timer = setTimeout(so_xfade, xfade.delay);
      } else {
        timer = setTimeout(so_xfade, 50);
      }

      function setOpacity(obj) {
        if (obj.xOpacity > .99) {
          obj.xOpacity = .99;
          return;
        }
        obj.style.opacity = obj.xOpacity;
        obj.style.MozOpacity = obj.xOpacity;
        obj.style.filter = "alpha(opacity=" + (obj.xOpacity*100) + ")";
      }
    }
  },

  map: function(fn, elems) {
    for (var i = 0; i < elems.length; i++) {
      fn(elems[i]);
    }
  },
  getElementNodes: function(node, nodeArray) {
    if (node.nodeType != 1) {
      return;
    }
    nodeArray[nodeArray.length] = node;
  },
  countPreviousSiblings: function(elem) {
    var i = 0;
    while (elem.previousSibling) {
      elem = elem.previousSibling;
      if (elem.nodeType == 1) { ++i; }
    }
    return i;
  },
  addEvent: function(obj, type, fn) {
    if (obj.addEventListener) {
      obj.addEventListener(type, fn, false);
    } else if (obj.attachEvent) {
      obj["e"+type+fn] = fn;
      obj[type+fn] = function() { obj["e"+type+fn](window.event); }
      obj.attachEvent("on"+type, obj[type+fn]);
    }
  }
}

xfade.addEvent(window, "load", function() { xfade.init("rotation", 4000); });