var time_field_switch_info = {
   from: null,
   length: -1,
   toname: ''
};

function timeFieldSetSwitchInfo(from, length, toname)
{
   time_field_switch_info.from = from;
   time_field_switch_info.length = length;
   time_field_switch_info.toname = toname;
}

function timeFieldResetSwitchInfo()
{
   timeFieldSetSwitchInfo(null, -1, '');
}

function timeFieldKeyUp(parent, callback)
{
   if (time_field_switch_info.toname && time_field_switch_info.from
       && time_field_switch_info.from.value.length == time_field_switch_info.length)
   {
      var nodes = parent.childNodes;
      for (var i = 0; i < nodes.length; i++)
      {
         if (nodes[i].name == time_field_switch_info.toname)
         {
            nodes[i].focus();
            break;
         }
      }
      timeFieldResetSwitchInfo();
   }

   if (callback)
   {
      eval(callback);
   }
}

function timeFieldKeyDown(event, field, prev, next)
{
   var keynum;
   if (window.event) // IE
   {
      keynum = event.keyCode;
   }
   else if (event.which) // Netscape/Firefox/Opera
   {
      keynum = event.which;
   }

   if ((keynum >= 48 && keynum <= 57)       // Digit
           || (keynum >= 96 && keynum <= 105)) // Numeric keypad digit
   {
      timeFieldSetSwitchInfo(field, 2, next);
   }
   else if (field.value.length === 0 && keynum == 8) // Backspace
   {
      timeFieldSetSwitchInfo(field, 0, prev);
   }
}

function timeFieldToString(hour_str, minute_str, year_str)
{
   if (hour_str.length === 0)
   {
      throw('Geen uur ingevuld');
   }
   if (minute_str.length === 0)
   {
      throw('Geen minuten ingevuld');
   }

   var hour = parseInt(hour_str, 10);
   var minute = parseInt(minute_str, 10);

   if (isNaN(hour_str) || hour < 0 || hour > 24 || (hour == 24 && minute > 0))
   {
      throw('Ongeldig waarde voor uur');
   }
   if (isNaN(minute_str) || minute < 0 || minute > 59)
   {
      throw('Ongeldig waarde voor minuut');
   }
   
   hour_str = (hour < 10 ? '0' : '' ) + hour.toString();
   minute_str = (minute < 10 ? '0' : '' ) + minute.toString();

   return hour_str + ':' + minute_str + ':00';
}

function timeFieldGetComponents(field)
{
   var res = { hour: '', minute: '' };

   var nodes = field.childNodes;
   for (var i = 0; i < nodes.length; i++)
   {
      switch (nodes[i].name)
      {
      case 'hour':   res.hour = nodes[i].value; break;
      case 'minute': res.minute = nodes[i].value; break;
      }
   }

   return res;
}

function timeFieldOnChange(field, callback)
{
   var comp = timeFieldGetComponents(field);

   if (comp.hour.length > 0
      && comp.minute.length > 0)
   {
      try
      {
         var time_str = timeFieldToString(comp.hour, comp.minute);
         callback(time_str);
      }
      catch (exc)
      {
         alert(exc);
      }
   }
   else if (comp.hour.length === 0
      && comp.minute.length === 0)
   {
      callback('');
   }
}

function timeFieldGetValue(id, allowEmpty)
{
   var field = document.getElementById(id);
   var comp = timeFieldGetComponents(field);
   if (allowEmpty
       && (comp.hour.length === 0 || comp.minute.length != 2))
   {
      return '';
   }

   return timeFieldToString(comp.hour, comp.minute);
}

function timeFieldSetValue(id, value)
{
   var field = document.getElementById(id);
   if (!field)
   {
      return;
   }

   var parts = value.split(':');
   if (parts.length < 2)
   {
      return;
   }

   var nodes = field.childNodes;
   for (var i = 0; i < nodes.length; i++)
   {
      switch (nodes[i].name)
      {
      case 'hour':   nodes[i].value = parts[0]; break;
      case 'minute': nodes[i].value = parts[1]; break;
      }
   }
}

function createTimeField(id, attrs)
{
   var attr_str = '';
   var hour_str = '';
   var min_str = '';
   var cb_str = '';
   var keyup_str = '';
   if (attrs)
   {
      for (var name in attrs)
      {
         var value = attrs[name];
         switch (name)
         {
         case 'value':
            hour_str += ' value="' + value.substr(0, 2) + '"';
            min_str += ' value="' + value.substr(3, 2) + '"';
            break;
         case 'callback':
            cb_str = ' onchange="timeFieldOnChange(this.parentNode, ' + value + ');"';
            break;
         case 'onkeyup':
            keyup_str = value;
            break;
         case 'hour_attrs':
            for (var hname in value)
            {
               hour_str += ' ' + hname + '="' + value[hname] + '"';
            }
            break;
         case 'minute_attrs':
            for (var mname in value)
            {
               min_str += ' ' + mname + '="' + value[mname] + '"';
            }
            break;
         default:
            attr_str += ' ' + name + '="' + value + '"';
         }
      }
   }

   var field = '<div id="' + id + '"' + attr_str + '>'
             + '<input type="text" maxlength="2" class="time_field_hour" name="hour"'
             +   ' onKeyDown="timeFieldKeyDown(event, this, \'\', \'minute\');"'
             +   ' onKeyUp="timeFieldKeyUp(this.parentNode,\'' + keyup_str + '\');"'
             +   cb_str + hour_str + '>:'
             + '<input type="text" maxlength="2" class="time_field_minute" name="minute"'
             +   ' onKeyDown="return timeFieldKeyDown(event, this, \'hour\', \'\');"'
             +   ' onKeyUp="timeFieldKeyUp(this.parentNode, \'' + keyup_str +'\');"'
             +   cb_str + min_str + '>'
             + '</div>';
   return field;
}

