% DATES
% Converts between the following date formats:
%  - Year, Month, Day
%  - Year, Day-of-Year
%  - Year, Decimal Year
%  - GPS week, seconds of week
%
% Required M-files: cal2jd, doy2jd, gps2jd, jd2cal, jd2dow, jd2doy, jd2gpsa

% Created 24 May 96, M. Craymer
% Modified 03 Aug 96, Converted to MATLAB
% Modified 29 Sep 98, Convert each option to all other formats
% Modified 25 Mar 99, Converted to use isempty
% Modified 26 Apr 99, Rewrote to use new date conversion routines
%                     Added conversion of GPS week and day of week
% Modified 19 Feb 11, Replaced clear all with clear for specific variables used

% Copyright (c) 2011, Michael R. Craymer
% All rights reserved.
% Email: mike@craymer.com

while 1
clear ver day month buf fmt date ok iyr mn dy jd doy yr dow gpsweek sow rollover
warning on
ver = '1.0 (99.04.26)';
day = ['Sun';'Mon';'Tue';'Wed';'Thu';'Fri';'Sat'];
month = ['Jan';'Feb';'Mar';'Apr';'May';'Jun';'Jul';'Aug';'Sep';'Oct';'Nov';'Dec'];

fprintf(1,'\n\n');
fprintf(1,'-------------------------------------------------\n');
fprintf(1,' DATES: Converts between different date formats.\n');
fprintf(1,'       M.Craymer, v%s\n',ver);
fprintf(1,'-------------------------------------------------\n');

fprintf(1,'\n');
fprintf(1,'Available input date formats:\n');
fprintf(1,' 1) Year, Month, Day\n');
fprintf(1,' 2) Year, Day of Year\n');
fprintf(1,' 3) Year (including decimal year)\n');
fprintf(1,' 4) GPS Week, Sec of Week, Number Rollovers\n');
fprintf(1,' 5) Julian Date\n');
fprintf(1,'\n');

buf = input('Enter date format and date [quit] > ','s');
if isempty(buf)
  fmt = 0;
else
  date = sscanf(buf,'%f');
  fmt = date(1);
end
ok = 1;

%----- Exit program
if fmt == 0
  clear ver day month buf fmt date ok iyr mn dy jd doy yr dow gpsweek sow rollover
  return;

%----- Day, month, year
elseif fmt == 1
  if length(date) < 4
    warning('Too few date arguments entered');
    ok = 0;
  else
    iyr = date(2);
    mn = date(3);
    dy = date(4);
    if mn<1 | mn>12
      warning('Invalid month');
      ok = 0;
    end
    if dy<1 | dy>=32
      warning('Invalid day');
      ok = 0;
    end
    if ok
      jd = cal2jd(iyr,mn,dy);
      doy = jd2doy(jd);
      yr = jd2yr(jd);
      dow = jd2dow(jd);
      [gpsweek,sow,rollover] = jd2gps(jd);
    end
  end

%----- Year, day of year
elseif fmt == 2
  if length(date) < 3
    warning('Too few date arguments entered')
    ok = 0;
  else
    iyr = date(2);
    doy = date(3);
    if doy<1 | doy>=367
      warning('Invliad day of year');
      ok = 0;
    end
    if ok
      jd=doy2jd(iyr,doy);
      [iyr,mn,dy]=jd2cal(jd);
      yr = jd2yr(jd);
      dow = jd2dow(jd);
      [gpsweek,sow,rollover] = jd2gps(jd);
    end
  end

%----- Year & decimal of year
elseif fmt == 3
  if length(date) < 2
    warning('No date arguments entered');
    ok = 0;
  else
    yr = date(2);
    jd=yr2jd(yr);
    [iyr,mn,dy]=jd2cal(jd);
    doy = jd2doy(jd);
    dow = jd2dow(jd);
    [gpsweek,sow,rollover] = jd2gps(jd);
  end

%----- GPS week, sec of week
elseif fmt == 4
  if length(date) < 4
    rollover = 0;
  else
    rollover = date(4);
  end
  if length(date) < 3
    sow = 0;
  else
    sow = date(3);
  end
  if length(date) < 2
    warning('No date arguments entered');
    ok = 0;
  else
    gpsweek = date(2);
    if gpsweek<1 | gpsweek>=1025
      warning('Invalid GPS week');
      ok = 0;
    end
    if sow<0 | sow>604800
      warning('Invliad sec of week');
      ok = 0;
    end
    if ok
      jd = gps2jd(gpsweek,sow,rollover);
      [iyr,mn,dy]=jd2cal(jd);
      doy = jd2doy(jd);
      yr = jd2yr(jd);
      dow = jd2dow(jd);
    end
  end

%----- Julian date
elseif fmt == 5
  if length(date) < 2
    warning('No date arguments entered');
    ok = 0;
  else
    jd = date(2);
    if jd<1
      warning('Invalid Julian date');
      ok = 0;
    end
    if ok
      [iyr,mn,dy]=jd2cal(jd);
      doy = jd2doy(jd);
      yr = jd2yr(jd);
      dow = jd2dow(jd);
      [gpsweek,sow,rollover] = jd2gps(jd);
    end
  end

%----- Invalid date format
else
  warning('Undefined date format entered');
  ok = 0;
end

%----- List results
if ok
  fprintf(1,'\n');
  fprintf(1,'Date    %4d-%2d-%4.1f\n',[iyr,mn,dy]);
  fprintf(1,'Year    %12.4f\n',yr);
  fprintf(1,'Day of Year   %6.1f\n',doy);
  fprintf(1,'Day of Week      %s\n',day(dow,:));
  fprintf(1,'GPS Week      %6d\n',gpsweek);
  fprintf(1,'Sec of Week   %6.0f\n',sow);
  fprintf(1,'Julian Date   %9.1f\n',jd);
end

end %while
