/*
window.addListener('load',function(){
  body.innerHTML+= '<div id=trace style="position:absolute; right:0px; top:0px; z-index:1000; width:500px; height:800px; overflow:auto; background:#FFFFFF; border:1px solid red; white-space:pre; text-align:left;" ></div>';
  document.getElementById('inhalt').style.marginLeft='1%';
});
*/

function flip(me,direction,v){
  if(typeof direction!= 'number') var direction= 1;
  if(!v) var v= 0.5;
//  alert(dump(me.flips) +'\n\n'+ me.psn +" + "+ direction +'\n\n'+ me.flips.length +'\n\n-->'+ i);
  var i; 
  if( direction < 0 ){
    if( me.psn+direction < 0 ){
      me.psn= me.flips.length-1;
      me.scrollTop= me.flips[me.psn].y;
    }
    v= -v;
  }
  else{
    if( me.psn+direction > me.flips.length-1 ){
      me.psn= 0;
      me.scrollTop= me.flips[me.psn].y;
    }
    v= v;
  }
  spulZu( me, me.flips[me.psn+direction].y, 'flipped( document.getElementById(\''+ me.id +'\'),'+ (me.psn+direction) +')' );

}


function spulZu(me,ziel,callback,v,a,b){
  var t= 1000/40;  // fps
  var a= a ? a : (me.flip.accel ? me.flip.accel : -1);
  var b= b ? b : (me.flip.brake ? me.flip.brake : -a*1.3);
  if(!v) var v=0; 
  
  if(me.hold){
    return;
  }

  var dir, d, db, dba, dz, va, s;
  

  dz= Math.abs( ziel - me.scrollTop ); // distance to target position

  db=  v*v/b/2;                        // distance needed for braking w/ actual speed

  va= Math.round( (v + a)*100 )/100;
  dba= va*va/b/2;                      // distance needed for braking w/ more acceleration
  
  if( Math.abs(db) >= dz ){            // brake
    s= 'B';
    d= v + 0.5*b;
    v= v+b; 
  }
  else if( Math.abs(dba) >= dz){       // glide, brake next time 
//    v= Math.sqrt(2*b*dz);
    s= 'G';
    d= v;
    v= v+b;
  }
  else{                                // accelerate
    s= 'A';
    d= 0.5*a + v;
    v= v+a;
  }

// trace(s+' v:'+v +', d:'+ d +', db:'+ db +', dba:'+ dba +', dz:'+ dz +', a:'+ a +', b:'+ b);
  
  
  if( v<0 ? me.scrollTop+d < ziel : me.scrollTop+d > ziel){
    me.scrollTop= ziel;
    eval(callback);
  }
  else{
    me.scrollTop+= d;
    me.to= setTimeout('spulZu( document.getElementById("'+me.id+'"),'+ ziel +',"'+ callback +'",'+v+','+a+','+b+')',t);
  }
}

function flipped(me,psn){
  me.psn= psn;
  if(me.flip.auto){
    var interval= typeof me.flips[me.psn].interval=='number' ? me.flips[me.psn].interval : me.flip.interval;
    me.to= setTimeout('flip( document.getElementById("'+ me.id +'"),'+ me.flip.auto +' )', interval );
  }
}



function hold(){
  this.hold= true;
  clearTimeout(this.to);
}
function unhold(){
  this.hold= false;
  if( this.flip.auto ){
    flip( this, this.flip.auto);
  }
}



function initFlipper(){
  var flipDiv, flips, f, conf;
  for(var i=0; i<flipperInits.length; i++){
    flipDiv= document.getElementById(flipperInits[i].id);
    conf= typeof flipperInits[i].conf == 'object' ? flipperInits[i].conf : {};

//    flips= flipDiv.getChildsByAttribute('class','flipItem','or',false);
    flips= $('.flipItem', flipDiv);
// duplicate 1st flip to the end
    flips.push( flipDiv.appendChild( flips[0].cloneNode(true) ) );
    if( conf.tSpecial && typeof conf.tSpecial[0] == 'number' ){
      conf.tSpecial[flips.length-1]= conf.tSpecial[0];
    }
trace( dump(conf,1) );
    
    flipDiv.flips= [];
    flipDiv.psn= 0;
    for(f=0; f<flips.length; f++){
//      flipDiv.flips[f]= {h:flips[f].offsetHeight, y:flips[f].offsetTop-flipDiv.offsetTop, obj:flips[f]};
      flipDiv.flips[f]= {h:flips[f].offsetHeight, y:flips[f].offsetTop, obj:flips[f]};
      if( conf.tSpecial && typeof conf.tSpecial[f] == 'number' ){
        flipDiv.flips[f].interval= conf.tSpecial[f]*1000;
      }
      if(flipDiv.scrollTop >= flips[f].offsetTop){
        flipDiv.psn= f;
      }
    }
    flipDiv.onmouseover= hold;
    flipDiv.onmouseout = unhold;
    flipDiv.scrollTop= flips[flipDiv.psn].offsetTop;
    flipDiv.flip= new Object();
    flipDiv.flip.auto= 1;
    flipDiv.flip.interval= conf.interval ? conf.interval*1000 : 5000;
    flipDiv.flip.accel= conf.accel ? conf.accel : 1;
    flipDiv.flip.brake= conf.brake ? -conf.brake : flipDiv.flip.accel*-1.3; 
    flipDiv.flip.tSpecial= typeof conf.tSpecial == 'object' ? conf.tSpecial : {};
    flipDiv.to= setTimeout('flip( document.getElementById("'+ flipDiv.id +'"),'+ flipDiv.flip.auto +' )', (conf.start ? conf.start*1000 : 4000) + Math.round( ( conf.startRnd ? conf.startRnd*1000 : 4000)*Math.random() ) );
    
  }
  var ret= "initFlipper(\n"+ flipperInits.join('\n') +")" + dump(flipDiv.flips,1);
//  trace( ret );
  return ret;
}

/*
if(window.addListener){
  window.addListener('load', initFlipper );
}
else{
  window.attachEvent('onload', initFlipper);
}  
*/

var flipperInits= [];
