//// livefade.js, notnot 2010 //////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// day-by-day webcam image fader
// Plays back a sequence of webcam images
// named yyyy-mm-dd_composite.jpg in the current directory. 
// The start_date and stop_date of the webcam monitoring should be edited 
// to match the on-line period.
////////////////////////////////////////////////////////////////////////////////

//// externally configured parameters //////////////////////////////////////////

//default input image parameters (set in the html that runs this script)
var img_prefix = "";
var img_suffix = "";
var img_fade_t = 4.0;

//default input start date parameters (set in the html that runs this script)
var date_start_y = 2000;
var date_start_m = 1;      // 1-based integer for months
var date_start_d = 1;      // 1-based integer for days


//// globals ///////////////////////////////////////////////////////////////////

//the on-line camera monitoring period
var start_date   = new Date(date_start_y, date_start_m - 1, date_start_d);
var stop_date    = new Date("Jan 18, 2010");

var current_date = new Date();
var play_date    = start_date;
var on_IExplorer = 0;


//// fader object //////////////////////////////////////////////////////////////

function Fader(fade_dt, fps)
{
  this.fade_dt  = fade_dt;              //fade interval (in milliseconds)
  this.fps      = fps;                  //frames per second
  this.frame    = 0;                    //frame number
  this.frame_dt = 1000 / fps;           //frame duration (in milliseconds)
  this.alpha    = 0.0;                  //image alpha (front buffer)
  this.d_alpha  = 1.0 / (fade_dt*fps);  //alpha delta (per frame)
  this.img_i    = 0;                    //image index
  this.complete = false;
  this.front_buffer = document.getElementById("front_buffer");
  this.back_buffer  = document.getElementById("back_buffer");
}



function OnLoad() 
{
  //detect MS Internet Explorer
  on_IExplorer = (navigator.userAgent.indexOf("MSIE") != -1);

  fader = new Fader(img_fade_t, 15.0);

  //set start date from config variables / URL parameters
  y = parseInt(gup("date_start_y"));
  if (y)  date_start_y = y;
  m = parseInt(gup("date_start_m"));
  if (m)  date_start_m = m;
  d = parseInt(gup("date_start_d"));
  if (d)  date_start_d = d;
  
  start_date = new Date(date_start_y, date_start_m - 1, date_start_d);
  play_date = start_date;
  
  //start playback only if webcam monitoring data is potentially available
  if (current_date >= start_date) {
    Play();
  } else {
    //inform user that filming has not yet started
    txt = "The Tomato Habitus film will debut at " + start_date;
    document.getElementById("infobar").innerHTML = txt;
  }
}



function Play()
{
  FadeStep(fader);
  if (!fader.complete)  setTimeout("Play()", fader.frame_dt);
}



//in : Fader object
function FadeStep(f)
{
  //update image alpha
  SetOpacity(f.front_buffer, f.alpha);
  f.alpha += f.d_alpha;
  if (f.alpha >= 1.0) {  //fade transition complete
    //check series end
    if (play_date > current_date) {
      f.complete = true;
      status = "to be continued..."
      return
    } else if (play_date > stop_date) {
      //loop
      f.complete = false;
      play_date = start_date;
      /*
      f.complete = true;
      status = "the end";
      */
      return;
    }

    //new fade cycle
    f.img_i++;
    f.alpha = 0.0;
    SetOpacity(f.front_buffer, f.alpha);
    
    //update front and backbuffer image sources
    f.back_buffer.src  = f.front_buffer.src;  //swap
    f.front_buffer.src = DayFileName(play_date);
    SetOpacity(f.front_buffer, f.alpha);      //to be sure...

    document.getElementById("infobar").innerHTML = DateYYYYMMDD(play_date);
    play_date = NextDay(play_date);
  }
  f.frame++;
}



function SetOpacity(element, opacity) 
{
  if (on_IExplorer) {
    var normalized = Math.round(opacity * 100);
    element.style.filter = "alpha(opacity=" + normalized + ")";
  } else {
    element.style.opacity = opacity;
  }
}



function NextDay(date)
{
  day = date.getDate();
  next  = new Date(date);
  next.setDate(day + 1);
  return next;
}



// in  : Date
// out : webcam image filename, format : tulpen-yyyy-mm-dd.jpg
function DayFileName(date)
{
  //construct webcam image filename from date
  name = img_prefix + DateYYYYMMDD(date) + img_suffix + ".jpg";
  return name;
}



// in  : Date
// out : date string in format yyyy-mm-dd 
function DateYYYYMMDD(date)
{
  txt = date.getFullYear() + "-";               //year;
  if ((date.getMonth() + 1) < 10)  txt += "0";  //leading 0 if necessary
  txt += (date.getMonth() + 1) + "-";           //month
  if (date.getDate() < 10)  txt += "0";         //leading 0 if necessary
  txt += date.getDate();                        //day
  return txt
}



function ImageError()
{
  status = "image not available";
  //use last successfully loaded image instead
  fader.front_buffer.src = fader.back_buffer.src;
}



function PrintProps(obj, obj_name) 
{
  var result = "";
  for (var i in obj)
    result += obj_name + "." + i + " = " + obj[i] + "\n";
  return result;
}


//get named URL parameter, return value as string  
function gup(name)
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec(window.location.href);
  if (results == null)
    return "";
  else
    return results[1];
}

