


function cdg_anim_init(oElem)
{
  if (oElem.cdg_animtimer)
  {
    clearTimeout(oElem.cdg_animtimer);
    oElem.cdg_animtimer = undefined;
  }
  oElem.cdg_tween          = 'linear';
  oElem.cdg_duration       = undefined;
  oElem.cdg_framerate      = 100;
  oElem.cdg_opacity_start  = undefined;
  oElem.cdg_opacity_finish = undefined;
  oElem.cdg_width_start    = undefined;
  oElem.cdg_width_finish   = undefined;
  oElem.cdg_height_start   = undefined;
  oElem.cdg_height_finish  = undefined;
  oElem.cdg_left_start     = undefined;
  oElem.cdg_left_finish    = undefined;
  oElem.cdg_top_start      = undefined;
  oElem.cdg_top_finish     = undefined;  
  oElem.cdg_onanimstart    = undefined;
  oElem.cdg_onanimframe    = undefined;
  oElem.cdg_onanimfinish   = undefined;  
}

function cdg_animate(oElem,fDuration)
{
  oElem.cdg_duration = fDuration;
  if ( oElem.cdg_onanimstart != undefined ) oElem.cdg_onanimstart(oElem); 
  _cdg_anim_engine(oElem.id, 0);
}

function _cdg_anim_engine(element_id,percentage)
{

  // Get element
  var oElem = document.getElementById(element_id);

  // Clear the current timer
  if (oElem.cdg_animtimer)
  {
    clearTimeout(oElem.cdg_animtimer);
    oElem.cdg_animtimer = undefined;
  }
  
  // Measure time and adjust framerate 
  var tNow = new Date();     
  if ( oElem.cdg_lasttime != undefined )
  {    
    var iPlan = oElem.cdg_framerate;
    var iReal = 1000/(tNow-oElem.cdg_lasttime);
	var iDiff = iReal/iPlan;
	if ( iDiff < 0.5 ) oElem.cdg_framerate = 1 + ( 0.5 * oElem.cdg_framerate ) ;
	else if ( iDiff > 0.9 ) oElem.cdg_framerate = Math.min(100, 1.5*oElem.cdg_framerate ) ;
    //document.getElementById('debugfps').innerHTML = Math.round(10*oElem.cdg_framerate)/10+' FPS';
  }   
  oElem.cdg_lasttime = tNow;
  
  // Calculate frame time 
  var pct = Math.max(0,Math.min(1,percentage));
  if ( oElem.cdg_tween == 'linear' ) /* nothing */ ;
  else if ( oElem.cdg_tween == 'easein'  ) pct = pct * pct;
  else if ( oElem.cdg_tween == 'easeout' ) pct = Math.sqrt(pct);

  // hide/show the element
  var hidden = false;
  
  // Opacity   
  if ( oElem.cdg_opacity_start != undefined ) 
  {
    var opa;
    if (percentage >= 1) opa = oElem.cdg_opacity_finish;
    else opa = oElem.cdg_opacity_start + pct * ( oElem.cdg_opacity_finish - oElem.cdg_opacity_start );
    if (oElem.style.opacity!=opa)
    {
      oElem.style.opacity = opa;
      oElem.style.filter = 'alpha(opacity:'+(100*opa)+')';
      if (opa==0) hidden = true;
    }
  }

  // Width  
  if ( oElem.cdg_width_start != undefined ) 
  {
    var wth;
    if (percentage >= 1) wth = oElem.cdg_width_finish;
    else wth = oElem.cdg_width_start + pct * ( oElem.cdg_width_finish - oElem.cdg_width_start );
    wth = Math.round(wth);
    oElem.style.width = wth+'px';
    if (wth==0) hidden = true;
  }

  // Height
  if ( oElem.cdg_height_start != undefined ) 
  {
    var hht;
    if (percentage >= 1) hht = oElem.cdg_height_finish;
    else hht = oElem.cdg_height_start + pct * ( oElem.cdg_height_finish - oElem.cdg_height_start );
    hht = Math.round(hht);
    oElem.style.height = hht+'px';
    if (hht==0) hidden = true;
  }
  
  // Left
  if ( oElem.cdg_left_start != undefined ) 
  {
    var lft;
    if (percentage >= 1) lft = oElem.cdg_left_finish;
    else lft = oElem.cdg_left_start + pct * ( oElem.cdg_left_finish - oElem.cdg_left_start );
    lft = Math.round(lft);
    oElem.style.left = lft+'px';
  }
  
  // Top
  if ( oElem.cdg_top_start != undefined ) 
  {
    var top;
    if (percentage >= 1) top = oElem.cdg_top_finish;
    else top = oElem.cdg_top_start + pct * ( oElem.cdg_top_finish - oElem.cdg_top_start );
    top = Math.round(top);
    oElem.style.top = top+'px';
  }

  // hide/show the element
  if (hidden) oElem.style.display = 'none'; else oElem.style.display = 'block';

  if ( oElem.cdg_onanimframe != undefined ) oElem.cdg_onanimframe(oElem,pct); 
  	
  // Set up a new timer for the next frame
  if ( percentage<1 )
  {
    percentage += (1/( oElem.cdg_framerate * oElem.cdg_duration));
    var func = '_cdg_anim_engine(\'' + element_id + '\', ' + percentage + ' )';		
    oElem.cdg_animtimer = setTimeout(func,1000/oElem.cdg_framerate);	
  }
  else
  {
  	if ( oElem.cdg_onanimfinish != undefined ) oElem.cdg_onanimfinish(oElem);
  	//document.getElementById('debugfps').innerHTML = 'still';
  }

}

