
// Global Variables (User Can Set These)
var timer_start_value        = '-00:00:00' ;    // Values '+23:59:59' to '-23:59:59' are valid.
var timer_stop_value         = '+00:60:00' ;    // Values '+23:59:59' to '-23:59:59' are valid.
var timer_min_digits         = 4 ;              // Values 0,2,3,4,5,6 are valid.
var timer_alarm              = 'no' ;           // Values 'no' and 'yes' are valid.
var timer_auto_start         = 'no' ;           // Values 'no' and 'yes' are valid.

// Global Variables (User Do NOT Change These)
var timer_status             = 'stop' ;
var timer_start_milliseconds = 0 ;
var timer_now_milliseconds   = 0 ;
var timer_stop_milliseconds  = 0 ;
var timer_now                = new Date() ;
var timer_start_seconds      = 0 ;
var timer_stop_seconds       = 0 ;
var timer_increment          = 0 ;
var timer_current_seconds    = 0 ;
var timer_tolerance          = 10 ;
var timer_display            = '         ' ;
var timer_display_new        = '' ;
var tmp_str                  = '' ;
var tmp_hrs                  = 0 ;
var tmp_min                  = 0 ;
var tmp_sec                  = 0 ;
var tmp_len                  = 0 ;
var tmp_time                 = 0 ;

// Increase minimum digits to handle colons
if ( timer_min_digits > 4 ) timer_min_digits = timer_min_digits + 1 ;
if ( timer_min_digits > 2 ) timer_min_digits = timer_min_digits + 1 ;

function timer_initialize ()
{
  timer_start_seconds = ( timer_start_value.substr(1,2) * 1 * 60 * 60 + timer_start_value.substr(4,2) * 1 * 60 + timer_start_value.substr(7,2) * 1 ) * ( timer_start_value.substr(0,1) == '-' ? -1 : 1 ) ;
  timer_stop_seconds = ( timer_stop_value.substr(1,2) * 1 * 60 * 60 + timer_stop_value.substr(4,2) * 1 * 60 + timer_stop_value.substr(7,2) * 1 ) * ( timer_stop_value.substr(0,1) == '-' ? -1 : 1 ) ;
  timer_increment = timer_start_seconds < timer_stop_seconds ? 1 : -1 ;
  timer_current_seconds = timer_start_seconds ;
  timer_update_display () ;  
}

function timer_start ()
{
  if ( timer_status == 'run' ) return ; // Return since timer already running

  timer_status = 'run' ;
  timer_now = new Date() ;
  timer_start_milliseconds = timer_now.getTime() % 1000 ;  
  timer_stop_milliseconds = 1000 - timer_tolerance ;
  setTimeout ( 'timer_tick()' , timer_stop_milliseconds ) ;
}

function timer_stop ()
{
  timer_status = 'stop' ;
}

function timer_reset ()
{
  timer_status = 'stop' ;
  timer_initialize () ;
}

function timer_tick ()
{
  // Return if timer stopped
  if ( timer_status == 'stop' ) return ;

  // Waste time if needed
  timer_now = new Date() ;
  timer_now_milliseconds = timer_now.getTime() % 1000 ;
  while ( timer_now_milliseconds < timer_start_milliseconds )
    { timer_now = new Date() ; timer_now_milliseconds = timer_now.getTime() % 1000 ; }

  // Bump time
  timer_current_seconds = timer_current_seconds + timer_increment ;
  
  // Check if end of time reached
  if ( ( timer_increment > 0 ) && ( timer_current_seconds >= timer_stop_seconds ) ) { timer_end (); return; }
  if ( ( timer_increment < 0 ) && ( timer_current_seconds <= timer_stop_seconds ) ) { timer_end (); return; }  
 
  // Show new time
  timer_update_display () ;
  
  // Set timeout for next update
  timer_now = new Date() ;
  timer_now_milliseconds = timer_now.getTime() % 1000;
  timer_stop_milliseconds = 1000 - timer_now_milliseconds + timer_start_milliseconds - timer_tolerance ;
  setTimeout( 'timer_tick()' , timer_stop_milliseconds ) ;  
}

function timer_update_display ()
{
  // Get text display of time
  timer_display_new = timer_display_text () ;

  // Update screen images
  var i = 0 ; var char = '' ;
  for ( i = 0 ; i < 8 ; i = i + 1 ) { if ( timer_display_new.charAt(i) != timer_display.charAt(i) ) break }
  while ( i < 9 )
  {
    char = timer_display_new.charAt(i) ;
    if ( char == ' ' ) document[ 'd' + i ].src = 'images/timer/effetti-dot.gif' ;
    else if ( char == ':' ) document[ 'd' + i ].src = 'images/timer/effetti-colon.gif' ;
    else if ( char == '-' ) document[ 'd' + i ].src = 'images/timer/effetti-dash.gif' ;
    else document[ 'd' + i ].src = 'images/timer/effetti-' + char + '.gif' ;
    i = i + 1 ;
  }

  // Save display  
  timer_display = timer_display_new ;  
}

function timer_display_text ()
{
  var tmp_str = '         ' ;
  var tmp_time = timer_current_seconds ;
  if ( tmp_time < 0 ) { tmp_time = tmp_time * -1 ; tmp_str = tmp_str + '-' }
  
  tmp_sec = tmp_time % 60 ;
  tmp_time = ( tmp_time - tmp_sec ) / 60 ;
  tmp_min = tmp_time % 60 ;
  tmp_time = ( tmp_time - tmp_min ) / 60 ;
  tmp_hrs = tmp_time ;
  
  if ( timer_min_digits > 1 )
  {
    tmp_str = tmp_str + ( tmp_hrs < 10 ? '0' : '' ) + tmp_hrs + ':' + ( tmp_min < 10 ? '0' : '' ) + tmp_min + ':' + ( tmp_sec < 10 ? '0' : '' ) + tmp_sec ;
    tmp_str = tmp_str.substr( tmp_str.length - 9 , 9 ) ;
    tmp_len = 1 ;
    if ( tmp_str.charAt(1) != '0' ) tmp_len = 8 ;
    else if ( tmp_str.charAt(2) != '0' ) tmp_len = 7 ;
    else if ( tmp_str.charAt(4) != '0' ) tmp_len = 5 ;
    else if ( tmp_str.charAt(5) != '0' ) tmp_len = 4 ;
    else if ( tmp_str.charAt(7) != '0' ) tmp_len = 2 ;
    if ( tmp_len < timer_min_digits ) tmp_len = timer_min_digits ;
    tmp_str = ( tmp_str.charAt(0) != ' ' ? tmp_str.charAt(0) : '' ) + tmp_str.substr( 9 - tmp_len ) ;
    if ( tmp_str.length < 9 ) tmp_str = tmp_str + '         '.substr ( 0 , 9 - tmp_str.length ) ;
    return tmp_str ;
  }
    
  if ( tmp_hrs > 0 )
  {
    tmp_str = tmp_str + tmp_hrs + ':' ;
    if ( tmp_min > 0 ) tmp_str = tmp_str + ( tmp_min < 10 ? '0' : '' ) + tmp_min + ':' ;
    tmp_str = tmp_str + ( tmp_sec < 10 ? '0' : '' ) + tmp_sec ;
  }
  else if ( tmp_min > 0 ) tmp_str = tmp_str + tmp_min + ':' + ( tmp_sec < 10 ? '0' : '' ) + tmp_sec ;
  else tmp_str = tmp_str + tmp_sec ;
  return tmp_str.substr( tmp_str.length - 9 , 9 ) ;
}

function timer_end ()
{
  timer_update_display () ;
  timer_status = 'stop' ;
  if ( timer_alarm == 'yes' ) document.alert_sound.play() ;
}

// Initialize display
//  timer_initialize ();
//  if ( timer_auto_start == 'yes' ) timer_start () ; // If auto start, start timer

