var undefined;

function DocumentFragmentFader() {
  
}   

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._timeOut = undefined;
DocumentFragmentFader._loadTimeOut = undefined;
DocumentFragmentFader._timeOutDelay = 100;
DocumentFragmentFader._timeOutDelayBeforeFadeOut = 500;
DocumentFragmentFader.list = [];
DocumentFragmentFader.timeList = [];    
DocumentFragmentFader.fadeOutList = {};

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._load = function(event){
  if (DocumentFragmentFader._loadTimeOut) {
    window.clearTimeout(DocumentFragmentFader._loadTimeOut);
  }
 var idx = 0;
 DocumentFragmentFader._fadeIn(0, 0);
}   
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._load_timeout = function(time){
  if (! time) {
    time = 5000;
  }
  DocumentFragmentFader._loadTimeOut = window.setTimeout(DocumentFragmentFader._load, time);
  DocumentFragmentFader.addEvent('unload', window, DocumentFragmentFader._unload);
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._unload = function(event){
  //alert('start');
  /*
  var str = '';
  for (var i in event){
    str += i +' = ' + event[i] + '\n';
  }
  var win = window.open();
  var doc = win.document;
  doc.open();
  doc.write(str);
  doc.close();
  */
  DocumentFragmentFader.eventStopPropagation(event);
  DocumentFragmentFader.eventPreventDefault(event);
  DocumentFragmentFader._fadeOut(100, event);  
}    
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._fadeIn = function(trans, idx){
  if (DocumentFragmentFader._timeOut){
    window.clearTimeout(DocumentFragmentFader._timeOut);
  }
  var fadeElem = DocumentFragmentFader.list[idx];
  if (! fadeElem) {
     return;
  }  
  fadeElem.style.display = 'block';
  var opGrenzwert = 1;
  if (fadeElem.filters != undefined){
    // IE
    opGrenzwert = 100;
    var opValue = parseFloat(0 + parseFloat(trans));
    fadeElem.filters['Alpha']['opacity'] = opValue;
    fadeElem.filters['Alpha']['finishopacity'] = opValue;
    trans += 8;
  } else {
    // Other
    var opValue = parseFloat(0 + parseFloat(trans));
    fadeElem.style.opacity = opValue;
    trans += 0.08;
  }
  if (opValue < opGrenzwert) {
    var func = function () {DocumentFragmentFader._fadeIn(trans, idx)};
    DocumentFragmentFader._timeOut = window.setTimeout(func, DocumentFragmentFader._timeOutDelay);
    return;
  }
  var oldIDx = idx;
  idx++;
  trans = 0;
  var delay = DocumentFragmentFader._timeOutDelay;
  if (DocumentFragmentFader.timeList[idx]) {
    delay = DocumentFragmentFader.timeList[idx];
  }
  var func = function () {DocumentFragmentFader._fadeIn(trans, idx)};
  if (DocumentFragmentFader.fadeOutList[fadeElem.id]) {
      var nextfunc = function () {
        DocumentFragmentFader._timeOut = window.setTimeout(func, delay);
      }
      //DocumentFragmentFader._fadeOut(0, oldIDx, nextfunc);
      var fo = function () {
        DocumentFragmentFader._fadeOut(0, oldIDx, nextfunc);
      }
      DocumentFragmentFader._timeOut = window.setTimeout(fo, DocumentFragmentFader._timeOutDelayBeforeFadeOut );
  } else {
    DocumentFragmentFader._timeOut = window.setTimeout(func, delay);
  }
}    
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader._fadeOut = function(trans, idx, nextfunc){
  if (DocumentFragmentFader._timeOut){
    window.clearTimeout(DocumentFragmentFader._timeOut);
  }
  var fadeElem = DocumentFragmentFader.list[idx];
  if (! fadeElem) {
    return;
  }
  if (fadeElem.filters != undefined){
    // IE
    var opValue = parseFloat(100 - parseFloat(trans));
    fadeElem.filters['Alpha']['opacity'] = opValue;
    fadeElem.filters['Alpha']['finishopacity'] = opValue;
    trans += 5;
  } else {
    // Other
    var opValue = parseFloat(1 - parseFloat(trans));
    fadeElem.style.opacity = opValue;
    trans += 0.05;
  }
  if (opValue > 0) {
    var func = function () {DocumentFragmentFader._fadeOut(trans, idx, nextfunc)};
    DocumentFragmentFader._timeOut = window.setTimeout(func, DocumentFragmentFader._timeOutDelay);
    return;
  }
  if (nextfunc) {
    fadeElem.style.display = 'none';
    nextfunc();
    return;
  }
  idx++;
  trans = 0;
  var func = function () {DocumentFragmentFader._fadeOut(trans, idx, nextfunc)};
  DocumentFragmentFader._timeOut = window.setTimeout(func, DocumentFragmentFader._timeOutDelay);
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.addList = function(idx){
  if (arguments.length != 1) {
    focus();
    throw new Error('DocumentFragmentFader.addList: Falsche Anzahl von Argumenten!');
  }
  if (! document.getElementById(idx)) {
    focus();
    throw new Error('DocumentFragmentFader.addList: Es ist kein Element mit id=' + idx + ' vorhanden!');
  }
  DocumentFragmentFader.list.push(document.getElementById(idx));
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.addTimeList = function(time){
  if (arguments.length != 1) {
    focus();
    throw new Error('DocumentFragmentFader.addTimeList: Falsche Anzahl von Argumenten!');
  }
  DocumentFragmentFader.timeList.push(time);
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.addFadeOut = function(idx){
  if (arguments.length != 1) {
    focus();
    throw new Error('DocumentFragmentFader.addFadeOut: Falsche Anzahl von Argumenten!');
  }
  DocumentFragmentFader.fadeOutList[idx] = 1;
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.init = function(){
  DocumentFragmentFader.addEvent('load', window, DocumentFragmentFader._load);
  DocumentFragmentFader.addEvent('unload', window, DocumentFragmentFader._unload);
}  
 

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.init_timeout = function(time){
  var func = function () {
    DocumentFragmentFader._load_timeout(time);
  }
  DocumentFragmentFader.addEvent('load', window, func);
  //DocumentFragmentFader.addEvent('unload', window, DocumentFragmentFader._unload);
}  

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.addEvent = function(handler, obj, oneEvent, bol, ieWindow){
  if (arguments.length < 3) {
    focus();
    throw new Error('DocumentFragmentFader.addEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.addEventListener){
    // Other
    obj.addEventListener(handler, oneEvent, false);
  } else if(obj.attachEvent){
    // IE
    var win = window;
    if (ieWindow) {
      win = ieWindow;
    }
    obj['e' + handler + oneEvent] = oneEvent;
    obj[handler + oneEvent] = function() { obj['e' + handler + oneEvent] ( win.event ); win.event.cancelBubble = true;};
    obj.attachEvent('on' + handler, obj[handler + oneEvent]);
  }
  return obj;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.removeEvent = function(handler, obj, oneEvent, bol){
  if (arguments.length < 3) {
    focus();                                              
    throw new Error('DocumentFragmentFader.removeEvent: Falsche Anzahl von Argumenten!');
  }
  if(window.removeEventListener){
    // Other
    obj.removeEventListener(handler, oneEvent, bol);
  } else if(obj.detachEvent){
    // IE
    obj.detachEvent( "on"+ handler, obj[handler + oneEvent] );
    obj[handler + oneEvent] = undefined;
    obj["e" + handler + oneEvent] = undefined;
  }
  return true;
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.eventStopPropagation = function(event){
  if (arguments.length!=1){
    focus();
    throw new Error("DocumentFragmentFader:eventStopPropagation: Falsche Anzahl von Argumenten!");
  }
  if (event.stopPropagation){
    // Other
    event.stopPropagation();
  } else {
    // IE
    event.cancelBubble = true;
  }
}

// :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

DocumentFragmentFader.eventPreventDefault = function(event){
  if (arguments.length!=1){
    focus();
    throw new Error("DocumentFragmentFader:eventPreventDefault: Falsche Anzahl von Argumenten!");
  }
  if (event.preventDefault){
    // Other
    event.preventDefault();
  } else {
    // IE
    event.returnValue = false;
  }
}


