#!/usr/bin/env perl
#=======================================================================
#
#  NAME
#
#       special_process.pl
#
#  DESCRIPTION
#
#       This script defines all the routines found in the dads_keywords
#       special_process field.
#
#  HISTORY
#
#       07/03/03  xxxxx  Lisa Gardner    Initial version
#       10/28/08  61112  Lisa Gardner    Fixed DATE_CONCAT for null input
#
#=======================================================================

sub CONCAT
{
   my ( $value, $pattern, %kywdVals ) = @_;
   my ( $delim, @kywds ) = split( /,/, $pattern );
   my @valList = ();
   $valList[0] = $value;
   foreach ( @kywds ) {
      next if $kywdVals{$_} eq '~' or !$kywdVals{$_};
      push( @valList, $kywdVals{$_} );
   }
   $delim = '' if $delim eq 'NONE';
   return $value = join( $delim, @valList );
}

sub DATE_COMPARE
{
   my ( $value ) = @_;
   return $value;
}

sub DATE_CONCAT
{
   my ( $kywdVal, $concatKeyword, %kywdVals ) = @_;
   my $concatDate = '~';

   # Don't split the date if it doesn't exist.
   if ( $kywdVal ne '~' ) {
      my ( $year, $month, $day ) = split( /\-/, $kywdVal );
      $concatDate = "$month/$day/$year";
   }

   # Don't append the time if it doesn't exist.
   if ( $concatKeyword and $kywdVals{$concatKeyword} ne '~' ) {
      $concatDate .= " $kywdVals{$concatKeyword}";
   }
   return $concatDate;
}

sub DATE_ES_1985 
{
   my ( $inpDate ) = @_;
   my $secsInDay = 86400;
   my $mjdi = $inpDate / $secsInDay + 46066;
   my $es = DATE_MJD( $mjdi );
}

sub DATE_MJD 
{ 
   my ( $inpDate, $pattern ) = @_;
   my ( $day_number, $fod, $z, $a, $aa, $b, $c, $d, $e, $day, $month,
        $year, $hour, $min );

   #
   #  Break julian date into integer and float sections
   #
   $day_number = int($inpDate);
   $fod = $inpDate - $day_number;
   $day_number -= 44238;
    
   #
   #  Do convertion of date information
   #
   $z = ($day_number + 2444239.0);
   if ($day_number < -145078.0) {
      $a = $z;
   } else {
      $aa = floor(($z-1867216.25)/36524.25);
      $a = $z + 1 + $aa - floor($aa/4.0);
   }
	
   $b = $a + 1524.0;
   $c = int(($b-122.1)/365.25);
   $d = int(365.25*$c);
   $e = int(($b-$d)/30.6001);
   $day = $b - $d - int(30.6001 * $e);

   if ( $e > 13.5 ) {
      $month = $e - 13.0;
   } else {
      $month = $e - 1;
   }
	
   if ( $month > 2 ) {
      $year = $c - 4716.0;
   } else {
      $year = $c - 4715.0;
   }
	
   if ( $year < 1 ) {
      --$year;
   }
	
   #
   #  Convert fraction of day into h:m:s.d
   #
   $fod *= 24.0;
   $hour = int($fod);
   $fod -= $hour;
   $fod *= 60.0;
   $min =  int($fod);
   $fod -= $min;
   $fod *= 60.0;

   my $mjd_date = sprintf("%02d/%02d/%04d %02d:%02d:%02d",
   	$month, $day, $year, $hour, $min, $fod );

}

sub floor {
   my ($x) = shift;
   return ( $x < 0.0  ?  int($x) - 1  :  int($x) );
}

sub DATE_TIRAF
{
   my ( $kywdVal ) = @_;
   my ( $date, $time ) = split( /T/, $kywdVal );
   my ( $year, $month, $day ) = split( /\-/, $date ); 
   $time = '00:00:00' if !$time;
   my $newDate = "$month/$day/$year $time";
   return $newDate;
}

sub DATE_TSOGS {

   my ( $inpDate ) = @_;
   my $month = 1;
   my ( $hms, $year, $doy );

   $inpDate =~ /^(\d{4})\.?(\d{3})([ :]?(\d\d):?(\d\d):?(\d\d)\.?(\d{3})?)?$/;

   return $inpDate if !$1;

   $year = $1;
   $doy  = $2;
   $hms  = $4 ? "$4:$5:$6" : '00:00:00';

   my $leap = ( ( $year%4 == 0 && $year%100 != 0 ) ||
                $year%400 == 0 ||
                0 );

   my @daysInMonth = ( '31;31','28;29','31;31','30;30','31;31','30;30',
                       '31;31','31;31','30;30','31;31','30;30','31;31' );

   foreach my $numDaysList ( @daysInMonth ) {
      my $numDays = (split(/;/,$numDaysList))[$leap];
      if ( $numDays < $doy ) {
         $doy -= $numDays;
         $month++;
      }
   }
   my $julianDate =  sprintf("%02d/%02d/%04d %08s",
                     $month, $doy, $year, $hms );
}

sub DATE_YYYYDDD {
   my ( $inpDate ) = @_;
   my $tsogs = DATE_TSOGS( $inpDate );
}

sub DEFAULT
{
   my ( $kywdVal, $pattern ) = @_;
   return $kywdVal || $pattern;
}

sub FLOAT2INT
{
   my ( $kywdVal ) = @_;
   $kywdVal =~ s/\.\d+//;
   return $kywdVal;
}

sub TRUNCATE 
{
   my ( $kywdVal, $pattern ) = @_;
   $kywdVal =~ s/^\w+\$//g if $pattern =~ /,\$,/;
   return $kywdVal;
}
1;
