function $( elem ) {
  return document.getElementById( elem ); 
}

function Fader ( n, elem ) {
  // name der variable die auf das objekt zeigen tut
  var name = n;
  // verwenden wir style.filter oder style.opacity
  var filter = false;
  // bis zu welcher opazität soll gefadet werden
  var end = 0.0;
  // wie lange (ms) soll das faden dauern
  var time = 0;
  // um wieviel pro schritt wird die opazität geändert
  var step = 0;
  // das zu fadende element
  var element = null;
  
  var filterCheck = function () {
    if ( element ) {
      if ( element.style.filter ) {
        filter = true;
        return;
      }
      if ( element.style.opacity ) {
        filter = false;
        return;
      }
    }
  }

  // setzt das zu fadende element und checkt ob filter oder opacity zu verwenden ist
  var setElement = function ( elem_id ) {
    if (typeof elem_id == 'string') {
      element = $( elem_id );
    }
    filterCheck();
  }

  // liefert die opacity zwischen 0.0 und 1.0 des zu fadenden elements
  var getOpacity = function () {
    if ( filter ) {
      var match = element.style.filter.match( /opacity=(\d{1,3})/ );
      return parseInt( match[ 1 ]) / 100;
    } else {
      return (element.style.opacity) ;
    }
  }


  var setOpacity = function ( o ) {
    if ( filter ) {
      var new_opacity = Math.floor( 100 * o );
      element.style.filter="alpha(opacity=" + ( new_opacity ) + ", finishopacity=" + ( new_opacity ) + ", style=1)";
    } else {
      element.style.opacity = o;
    }
  }

  // setzt die zu erreichende opacity
  var setEnd = function ( e ) {
    end = e;
  }

  // setzt den fading zeitraum
  var setTime = function ( t ) {
    time = t * 1000;
  }

  // rechnet aus, um wieviel die opacity pro schritt angepasst werden muss.
  var calculateStep = function () {
    step = 40 * ( end - getOpacity() ) / ( time );
  }

  this.fade = function () {
    var new_opacity = (getOpacity()/1) + (step/1);
    if ( ((step < 0) && ( new_opacity <= end )) || ((step > 0) && ( new_opacity >= end )) ) {
      setOpacity( end );
      return;
    } else {
      
      setOpacity( new_opacity );
      setTimeout( name + ".fade()", 40 );
    }
  }
  
  this.init = function ( e, t ) {
    setEnd( e );
    setTime( t );
    calculateStep();
  }

  setElement( elem );
}




