

function add_hours(start_date, num_hours) {
  var sd = new Date(start_date.getTime() + num_hours * 1000 * 3600);
  return sd;
}

// returns Thursay September 24, 2009
function sql2human(dateStr) {
  var date = sql2date(dateStr);
  return date.toLocaleDateString();
}

// returns 24 Sep 2009
function sql2human_short(dateStr) {
  var date = sql2date(dateStr);
  return date.getDate() + " " + monthNamesShort[date.getMonth()] + " " + date.getFullYear();
}

// returns 24 Sep
function sql2human_shortest(dateStr) {
  var date = sql2date(dateStr);
  return date.getDate() + " " + monthNamesShort[date.getMonth()];
}

// returns Thu 24 Sep 2009
function sql2human_short_day(dateStr) {
  var date = sql2date(dateStr);
  return dayNamesShort[date.getDay()] + " " + date.getDate() + " " + monthNamesShort[date.getMonth()] + " " + date.getFullYear();
}

// returns Thu 24 Sep 10:30
function sql2human_short_day_time(dateStr) {
  var date = sql2date(dateStr);
  var date_str = dayNamesShort[date.getDay()] + " " + date.getDate() + " " + monthNamesShort[date.getMonth()];
  if(strip_date(dateStr) && strip_date(dateStr) != '00:00:00') date_str = date_str + ' ' + zero_pad(date.getHours()) + ":" + zero_pad(date.getMinutes());
  return date_str;
}

// returns 10:30
function sql2human_short_time(dateStr) {
  var date = sql2date(dateStr);
  return zero_pad(date.getHours()) + ":" + zero_pad(date.getMinutes());
}

// prepends zero to day/month/hour/minute if < 10
function zero_pad(val) {
  var str = val.toString();
  return str.length < 2 ? '0' + str : str;
}

// by kj
function fixDate(dateStr) {
  var datePat = /^(\d{4})(\/|-)(\d{1,2})(\/|-)(\d{1,2})$/;
  var matchArray = dateStr.match(datePat); // is the format ok?
  year = matchArray[1]; // p@rse date into variables
  month = matchArray[3];
  day = matchArray[5];
  if(day.length<2)
     day = "0" + day;
  if(month.length<2)
     month = "0" + month;
  return year + "-" + month + "-" + day;
}

function sql2date(inputDate) {
  
  // mysql date time as YYYY-MM-DD hh:mm:ss
  var dateTimeArray = inputDate.split(' ');
  var dateString = dateTimeArray[0]
  var timeString = dateTimeArray[1]

  // parse the date from YYYY-MM-DD
  var pattern = /(^\d{4})-(\d{2})-(\d{2}$)/
  var result = dateString.match(pattern);

  var year = result[1];
  var month = result[2];
  var day = result[3];
    
  var date = new Date(year, month - 1, day, 0, 0, 0)
  
  if(timeString) {
    // now parse the time from HH:MM:SS
    pattern = /(^\d{2}):(\d{2}):(\d{2})/
    result = timeString.match(pattern);
    
    var hour   = result[1];
    var minute = result[2];
    var second = result[3];
      
    date.setHours(hour, minute, second);
  }
  
  return date;
}

function sql2ms(dateStr) {
  var date1 = sql2date(dateStr);
  return date1.getTime();
}

function hours_between(datein, dateout) {
  var one_hour = 1000 * 60 * 60;
  return time_between(datein, dateout, one_hour);
}

function days_between(datein, dateout) {
  var one_day = 1000 * 60 * 60 * 24;
  return time_between(datein, dateout, one_day);
}

// todo: consider # days in month
function months_between(datein, dateout) {
  var one_month = 1000 * 60 * 60 * 24 * 30.41666;
  return time_between(datein, dateout, one_month);
}


// returns number of units between 2 days (sql format) (e.g. days/hours/months)
function time_between(datein, dateout, unit_in_ms) {
  if(!unit_in_ms) unit_in_ms = 1000; // default is 1 second
  return (sql2ms(dateout) - sql2ms(datein)) / unit_in_ms;  
  
  // return round_result ? Math.round(difference_ms/unit) : difference_ms/unit;
}

// jquery date(time)-picker helpers

function update_timefield(fld_name) {
  var $date = $('#' + fld_name);
  var date = strip_time($date.val()); 
  var time = $('#'+ fld_name + '_time').val(); 
  //alert("updating to:" + date + " + " + time);  
  if(date && time) { 
    var datetime = date+ " " + time + ":00";
    $date.val(datetime);
  }
}

// date/time helpers 
function add_days(start_date, num_days) {
  var sd = new Date(start_date.getTime() + num_days * 1000 * 3600 * 24);
  return sd;
}

function update_dependent_datefield(source, target, num_days) {
  var $source = $('#' + source + '_disp');
  var $target = $('#' + target + '_disp');

  var source_date = $source.datepicker("getDate");
  if(source_date) {
    var target_date = add_days(source_date, num_days);
    $target.datepicker("option", "minDate", source_date);
    var dep_date = $target.datepicker("getDate");
    if(dep_date && source_date.getTime() >= dep_date.getTime()) $target.datepicker("setDate", target_date);
    //alert("source=" + source_date + " add=" + num_days + " target=" + target_date);  
  }
}

// yyyy-mm-dd hh:mm:ss => yyyy-mm-dd
function strip_time(datetime) {
  return datetime.substring(0, 10);
}

// yyyy-mm-dd hh:mm:ss => hh:mm:ss
function strip_date(datetime) {
  return datetime.substring(11);
}

// yyyy-mm-dd hh:mm:ss => hh:mm
function strip_date_sec(datetime) {
  var time = strip_date(datetime);
  return time.substring(0, 5);
}

// checks if javscript Date object date1 is after date2
function is_after(date1, date2) {
  return time_between(date2sql(date1), date2sql(date2)) < 0;
} 
