Category: Utilities
Author/Contact Info David Weand (dweand@vt.edu)
http://dweand.campus.vt.edu<
Description: This program opens MS Outlook on your computer and then parses the default calendar folder for appointments that will occur in the next seven days and displays these to the screen.
I had searched Perl Monks for help on this problem, and I didn't find many items. It was hard to find things on other pages also, so I thought I would help out by posting what I came up with.

Some of the functions are probably not as clean as they could be (in fact, there are no functions which is one improvement that could probably be made.)

#! perl.exe

######################################################################
#  This program will open Microsoft Outlook on your computer and
#  display the next seven days of events from the default calendar
#  found in the default Outlook file.
#
#  Written by David Weand (dweand@vt.edu)
#  Friday, January 11th, 2002
#
#  http://dweand.campus.vt.edu
######################################################################
# Useful developing information found at
# - http://msdn.microsoft.com/library/en-us/vbaol10/html/oltocObjectMo
+delApplication.asp
#   Microsoft's MSDN information about the OLE interface with MS Outlo
+ok
#
# - http://www.xav.com/perl/site/lib/Win32/OLE.html
#   ActiveState's online documentation for Win32::OLE
######################################################################

use strict;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Outlook';
use Win32::OLE::Variant;
use Time::Local;
use POSIX;

#Get today and a week from today
my $ONE_DAY = 60*60*24;
my @mytime = localtime(time);
my $startmon = $mytime[4]+1;
my $startday = $mytime[3];
my $startyear= $mytime[5]+1900;
@mytime = localtime(time + 7*$ONE_DAY);
my $endmon = $mytime[4]+1;
my $endday = $mytime[3];
my $endyear= $mytime[5]+1900;

print "Start: $startmon/$startday/$startyear\n";
print "End  : $endmon/$endday/$endyear\n\n";

#open the Outlook program
my $outlook;
eval {
  $outlook = Win32::OLE->GetActiveObject('Outlook.Application')
};
if ($@ || !defined($outlook)) {
  $outlook = Win32::OLE->new('Outlook.Application', sub {$_[0]->Quit;}
+) or die "oops\n";
}

#open the default Calendar and grab the items in the calendar (twice..
+.)
my $namespace = $outlook->GetNameSpace("MAPI") or die "can't open MAPI
+ namespace\n";
my $recurringitems = $namespace->GetDefaultFolder(olFolderCalendar)->{
+Items};
my $calitems = $namespace->GetDefaultFolder(olFolderCalendar)->{Items}
+;


#separate between the recurring and non-recurring items
$recurringitems = $recurringitems->Restrict("[IsRecurring] = true");
$calitems = $calitems->Restrict("[IsRecurring] = false");
#can easily and quickly condense the non-recurring calendar items
$calitems = $calitems->Restrict("[Start] >= '\& $startmon/$startday/$s
+tartyear 00:00\&'");
$calitems = $calitems->Restrict("[Start] <= '\& $endmon/$endday/$endye
+ar 23:59\&'");

my $count=0;
#This will hold all the events occuring in our time frame
# Array of Hashes
my @itemstodisplay;

$count = $calitems->{Count};
my $it = $calitems->GetFirst;  #get the first Appointment item
for (my $i=0;$i<$count;$i++)
{
  my $item;
  $item->{Subject} = $it->{Subject};
  $item->{Location} = $it->{Location};
  $item->{AllDayEvent} = $it->{AllDayEvent};
  $item->{Duration} = $it->{Duration};
  $item->{Start} = $it->{Start};
  $item->{End} = $it->{End};
  push(@itemstodisplay,$item);
  $it = $calitems->GetNext;
}

$count = $recurringitems->{Count};
$it = $recurringitems->GetFirst;  #get the first appointment item
for (my $i=0;$i<$count;$i++)
{
  my $pattern = $it->GetRecurrencePattern;  #get the recurrnence patte
+rn for this appointment
  my $exceptions = $pattern->{Exceptions};  #get the exceptions to the
+ recurrence rule
  my %deleted;                              #use this when processin t
+he exceptions
  for (my $looper=1; $looper<=$exceptions->{Count}; $looper++)
  {
    #loop through the exceptions using the Item function call
    my $thisone = $exceptions->Item($looper);
    my @temp1 = split(/ /,$thisone->{OriginalDate});
    $deleted{$temp1[0]} = 1; #won't want to display an appointment thi
+s day...
    my $oldappoint = $thisone->{AppointmentItem};
    if (defined $oldappoint)  # but if it was moved to a different day
+, want to display that one
    {
      my $item;
      $item->{Subject} = $oldappoint->{Subject};
      $item->{Location} = $oldappoint->{Location};
      $item->{AllDayEvent} = $oldappoint->{AllDayEvent};
      $item->{Duration} = $oldappoint->{Duration};
      $item->{Start} = $oldappoint->{Start};
      $item->{End} = $oldappoint->{End};
      my $temp = timelocal(0,0,0,$oldappoint->{Start}->Date("d"),$olda
+ppoint->{Start}->Date("M")-1,$oldappoint->{Start}->Date("yyyy")-1900)
+;
      if ($temp >= timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00) && $temp <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900))
      {  push(@itemstodisplay,$item);  }
    }
  }

  #Now have to do the nasty work of figuring out the recurrence patter
+ns...
  #I began by dividing the item into either Ending or Non-Ending dates
+.
  #Then using the constants provided in OLE, determined what type of
  #recurrence it was.

  #Interesting trick (and more than a few of my friends would not have
+ 
  #thought Micro$oft smart enough to do this... ;-} ) was the
  #DayOfWeekMask- the field is an integer that is obtained using binar
+y values.
  #  Sunday    = 1   0000001
  #  Monday    = 2   0000010
  #  Tuesday   = 4   0000100
  #  Wednesday = 8   0001000
  #  Thursday  = 16  0010000
  #  Friday    = 32  0100000
  #  Saturday  = 64  1000000
  #To obtain the DayOfWeekMask, you take the days that the appointment
  #should occur on, and you bit-wise OR those days together.
  #  MonWedFri = 42  0101010
  #To reverse this process, you find which days it belongs on by using
  #a bit-wise AND statement- if the result is greater than Zero, then
  #the appointment occurs on that day.

  #The Date fields can be deciphered using the OLE date() and time()
  #functions.  I incorporate the localtime() and timelocal() functions
  #a lot in this program.  Thankfully, the perl gods have optimized th
+ese
  #functions to increase execution speed.  The results/requirements fo
+r the
  #functions are:
  #  (sec,min,hour,mday,mon,year,wday,yday,isdst) = localtime(time)
  #  time = timelocal(sec,min,hour,mday,mon,year,wday,yday,isdst)
  #NOTE: mon = 0..11;  year -= 1900 (ie. 1999 = 99); wday = 0..6

  #The Microsoft MSDN site provides an explanation of how these recurr
+ences
  #are specified.
  #http://msdn.microsoft.com/library/en-us/vbaol10/html/olobjRecurrenc
+ePattern.asp

  if ($pattern->{NoEndDate})
  {
    if ($pattern->{RecurrenceType} == olRecursDaily)
    {
      if ($pattern->{DayOfWeekMask})
      {
        my ($curdate,$stopdate,$curdayweek);
        $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
        if (timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$p
+attern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}-
+>Date("yyyy")-1900) < timelocal(0,0,0,$startday,$startmon-1,$startyea
+r-1900))
        { $curdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-
+1900); }
        else { $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}
+->Date("d"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{Patt
+ernStartDate}->Date("yyyy")-1900); }
        while ($curdate <= $stopdate)
        {
          $curdayweek = pow(2,(localtime($curdate))[6]);
          my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu
+rdate))[3] ."/". ((localtime($curdate))[5]+1900);
          if (!defined($deleted{$temp}))
          {
            if ($pattern->{DayOfWeekMask} & $curdayweek)
            {
              my $curmonth = (localtime($curdate))[4] +1;
              my $curday = (localtime($curdate))[3];
              my $curyear = (localtime($curdate))[5] +1900;
              my $item;
              $item->{Subject} = $it->{Subject};
              $item->{Location} = $it->{Location};
              $item->{AllDayEvent} = $it->{AllDayEvent};
              $item->{Duration} = $it->{Duration};
              $item->{Start} = Variant(VT_DATE, qw(Blank January Febru
+ary March April May June July August September October November Decem
+ber)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("H
+H:mm"));
              $item->{End} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm
+"));
              if ($item->{Start} == $item->{End})
              {  $item->{End} = Variant(VT_DATE, qw(Blank January Febr
+uary March April May June July August September October November Dece
+mber)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{En
+dTime}->Time("HH:mm")); }
              push(@itemstodisplay,$item);
            }
          }
          $curdate += $ONE_DAY;
        }
      }
      else
      {
        my ($curdate,$startdate,$stopdate,$curdayweek);
        $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
        $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-
+1900);
        timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$patte
+rn->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Dat
+e("yyyy")-1900);
        while ($curdate <= $stopdate)
        {
          $curdayweek = pow(2,(localtime($curdate))[6]);
          my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu
+rdate))[3] ."/". ((localtime($curdate))[5]+1900);
          if ($curdate >= $startdate && !defined($deleted{$temp}))
          {
            my $curmonth = (localtime($curdate))[4] +1;
            my $curday = (localtime($curdate))[3];
            my $curyear = (localtime($curdate))[5] +1900;
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
          }
          $curdate += $pattern->{Interval} * $ONE_DAY;
        }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursMonthly)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d
+"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD
+ate}->Date("yyyy")-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        my $curday = $it->{DayOfMonth};
        my $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && !defined($deleted{"$curmonth/$cu
+rday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth += $pattern->{Interval};
        if ($curmonth > 12) { $curyear++; $curmonth-=12; }
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
    if ($pattern->{RecurrenceType} == olRecursMonthNth)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d
+"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD
+ate}->Date("yyyy")-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        my $curday = (localtime($curdate))[3];
        my $curyear = (localtime($curdate))[5] +1900;
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $countdown = $pattern->{Instance};
        if ($countdown == 5)
        {
          $curmonth++;  if ($curmonth==13) { $curyear++; $curmonth=1; 
+}
          $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900
+);
          $curdate -= $ONE_DAY;
          while ($countdown>0)
          {
            $curdayweek = pow(2,(localtime($curdate))[6]);
            if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown 
+= 0; }
            else { $curdate -= $ONE_DAY; }
          }
        }
        while ($countdown>0)
        {
          $curmonth = (localtime($curdate))[4] +1;
          $curday = (localtime($curdate))[3];
          $curyear = (localtime($curdate))[5] +1900;
          $curdayweek = pow(2,(localtime($curdate))[6]);
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {  $countdown--; }
          else
          { $curdate+= $ONE_DAY; }
        }
        $curmonth = (localtime($curdate))[4] +1;
        $curday = (localtime($curdate))[3];
        $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && $curdate <= $stopdate && !define
+d($deleted{"$curmonth/$curday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth += $pattern->{Interval};
        $curday = 1;
        if ($curmonth > 12) { $curyear++; $curmonth-=12; }
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
    if ($pattern->{RecurrenceType} == olRecursWeekly)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d
+"),$pattern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartD
+ate}->Date("yyyy")-1900);
      while ($curdate <= $stopdate)
      {
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curd
+ate))[3] ."/". ((localtime($curdate))[5]+1900);
        if ($curdate >= $startdate && !defined($deleted{$temp}))
        {
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {
            my $curmonth = (localtime($curdate))[4] +1;
            my $curday = (localtime($curdate))[3];
            my $curyear = (localtime($curdate))[5] +1900;
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
          }
        }
        $curdate += $ONE_DAY;
        if ($curdayweek == 64 && $pattern->{Interval} > 1) { $curdate 
++= ($pattern->{Interval} - 1)*7*$ONE_DAY; }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursYearly)
    {
      if (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-190
+0) &&
          timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startye
+ar-1900))
      {
        my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth
+} ."/". $endyear;
        if (!defined($deleted{$temp}))
        {
          my $item;
          $item->{Subject} = $it->{Subject};
          $item->{Location} = $it->{Location};
          $item->{AllDayEvent} = $it->{AllDayEvent};
          $item->{Duration} = $it->{Duration};
          $item->{Start} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear
+ ." ". $pattern->{StartTime}->Time("HH:mm"));
          $item->{End} = Variant(VT_DATE, qw(Blank January February Ma
+rch April May June July August September October November December)[$
+pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear .
+" ". $pattern->{EndTime}->Time("HH:mm"));
          if ($item->{Start} == $item->{End})
          {  $item->{End} = Variant(VT_DATE, qw(Blank January February
+ March April May June July August September October November December
+)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $en
+dyear ." ". $pattern->{EndTime}->Time("HH:mm")); }
          push(@itemstodisplay,$item);
        }
      }
      elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOf
+Year}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyea
+r-1900) &&
          timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$start
+year-1900))
      {
        my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth
+} ."/". $startyear;
        if (!defined($deleted{$temp}))
        {
          my $item;
          $item->{Subject} = $it->{Subject};
          $item->{Location} = $it->{Location};
          $item->{AllDayEvent} = $it->{AllDayEvent};
          $item->{Duration} = $it->{Duration};
          $item->{Start} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startye
+ar ." ". $pattern->{StartTime}->Time("HH:mm"));
          $item->{End} = Variant(VT_DATE, qw(Blank January February Ma
+rch April May June July August September October November December)[$
+pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear
+ ." ". $pattern->{EndTime}->Time("HH:mm"));
          if ($item->{Start} == $item->{End})
          {  $item->{End} = Variant(VT_DATE, qw(Blank January February
+ March April May June July August September October November December
+)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $st
+artyear ." ". $pattern->{EndTime}->Time("HH:mm")); }
          push(@itemstodisplay,$item);
        }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursYearNth)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900);
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,1,$startmon-1,$startyear-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        while ($curmonth != $pattern->{MonthOfYear})
        { $curdate+= $ONE_DAY; $curmonth = (localtime($curdate))[4] +1
+; }
        my $curday = (localtime($curdate))[3];
        my $curyear = (localtime($curdate))[5] +1900;
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $countdown = $pattern->{Instance};
        if ($countdown == 5)
        {
          $curmonth++;  if ($curmonth==13) { $curyear++; $curmonth=1; 
+}
          $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900
+);
          $curdate -= $ONE_DAY;
          while ($countdown>0)
          {
            $curdayweek = pow(2,(localtime($curdate))[6]);
            if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown 
+= 0; }
            else { $curdate -= $ONE_DAY; }
          }
        }
        while ($countdown>0)
        {
          $curmonth = (localtime($curdate))[4] +1;
          $curday = (localtime($curdate))[3];
          $curyear = (localtime($curdate))[5] +1900;
          $curdayweek = pow(2,(localtime($curdate))[6]);
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {  $countdown--; }
          else
          { $curdate+= $ONE_DAY; }
        }
        $curmonth = (localtime($curdate))[4] +1;
        $curday = (localtime($curdate))[3];
        $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && $curdate <= $stopdate && !define
+d($deleted{"$curmonth/$curday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth = $pattern->{MonthOfYear};
        $curday = 1;
        $curyear++;
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
  }
  elsif (timelocal(0,0,0,$pattern->{PatternStartDate}->Date("d"),$patt
+ern->{PatternStartDate}->Date("M")-1,$pattern->{PatternStartDate}->Da
+te("yyyy")-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)
      && timelocal(0,0,0,$pattern->{PatternEndDate}->Date("d"),$patter
+n->{PatternEndDate}->Date("M")-1,$pattern->{PatternEndDate}->Date("yy
+yy")-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startyear-1900))
  {
    my ($psm,$psd,$psy,$pem,$ped,$pey);
    $psm = $pattern->{PatternStartDate}->Date("M");
    $psd = $pattern->{PatternStartDate}->Date("d");
    $psy = $pattern->{PatternStartDate}->Date("yyyy");
    $pem = $pattern->{PatternEndDate}->Date("M");
    $ped = $pattern->{PatternEndDate}->Date("d");
    $pey = $pattern->{PatternEndDate}->Date("yyyy");

    if ($pattern->{RecurrenceType} == olRecursDaily)
    {
      if ($pattern->{DayOfWeekMask})
      {
        my ($curdate,$stopdate,$curdayweek);
        if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$
+endday,$endmon-1,$endyear-1900))
        { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)
+; }
        else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
        if (timelocal(0,0,0,$psd,$psm-1,$psy-1900) < timelocal(0,0,0,$
+startday,$startmon-1,$startyear-1900))
        { $curdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-
+1900); }
        else { $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900); }
        while ($curdate <= $stopdate)
        {
          $curdayweek = pow(2,(localtime($curdate))[6]);
          my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu
+rdate))[3] ."/". ((localtime($curdate))[5]+1900);
          if (!defined($deleted{$temp}))
          {
            if ($pattern->{DayOfWeekMask} & $curdayweek)
            {
              my $curmonth = (localtime($curdate))[4] +1;
              my $curday = (localtime($curdate))[3];
              my $curyear = (localtime($curdate))[5] +1900;
              my $item;
              $item->{Subject} = $it->{Subject};
              $item->{Location} = $it->{Location};
              $item->{AllDayEvent} = $it->{AllDayEvent};
              $item->{Duration} = $it->{Duration};
              $item->{Start} = Variant(VT_DATE, qw(Blank January Febru
+ary March April May June July August September October November Decem
+ber)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("H
+H:mm"));
              $item->{End} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm
+"));
              if ($item->{Start} == $item->{End})
              {  $item->{End} = Variant(VT_DATE, qw(Blank January Febr
+uary March April May June July August September October November Dece
+mber)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{En
+dTime}->Time("HH:mm")); }
              push(@itemstodisplay,$item);
            }
          }
          $curdate += $ONE_DAY;
        }
      }
      else
      {
        my ($curdate,$startdate,$stopdate,$curdayweek);
        if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$
+endday,$endmon-1,$endyear-1900))
        { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900)
+; }
        else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
        $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-
+1900);
        $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900);
        while ($curdate <= $stopdate)
        {
          $curdayweek = pow(2,(localtime($curdate))[6]);
          my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($cu
+rdate))[3] ."/". ((localtime($curdate))[5]+1900);
          if ($curdate >= $startdate && !defined($deleted{$temp}))
          {
            my $curmonth = (localtime($curdate))[4] +1;
            my $curday = (localtime($curdate))[3];
            my $curyear = (localtime($curdate))[5] +1900;
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
          }
          $curdate += $pattern->{Interval} * $ONE_DAY;
        }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursMonthly)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$en
+dday,$endmon-1,$endyear-1900))
      { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); 
+}
      else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        my $curday = $it->{DayOfMonth};
        my $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && !defined($deleted{"$curmonth/$cu
+rday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth += $pattern->{Interval};
        if ($curmonth > 12) { $curyear++; $curmonth-=12; }
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
    if ($pattern->{RecurrenceType} == olRecursMonthNth)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$en
+dday,$endmon-1,$endyear-1900))
      { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); 
+}
      else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        my $curday = (localtime($curdate))[3];
        my $curyear = (localtime($curdate))[5] +1900;
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $countdown = $pattern->{Instance};
        if ($countdown == 5)
        {
          $curmonth++;  if ($curmonth==13) { $curyear++; $curmonth=1; 
+}
          $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900
+);
          $curdate -= $ONE_DAY;
          while ($countdown>0)
          {
            $curdayweek = pow(2,(localtime($curdate))[6]);
            if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown 
+= 0; }
            else { $curdate -= $ONE_DAY; }
          }
        }
        while ($countdown>0)
        {
          $curmonth = (localtime($curdate))[4] +1;
          $curday = (localtime($curdate))[3];
          $curyear = (localtime($curdate))[5] +1900;
          $curdayweek = pow(2,(localtime($curdate))[6]);
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {  $countdown--; }
          else
          { $curdate+= $ONE_DAY; }
        }
        $curmonth = (localtime($curdate))[4] +1;
        $curday = (localtime($curdate))[3];
        $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && $curdate <= $stopdate && !define
+d($deleted{"$curmonth/$curday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth += $pattern->{Interval};
        $curday = 1;
        if ($curmonth > 12) { $curyear++; $curmonth-=12; }
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
    if ($pattern->{RecurrenceType} == olRecursWeekly)
    {
      my ($loopmon,$loopday,$loopyear,$curdate,$startdate,$stopdate,$c
+urdayweek);
      $loopday=$psd; $loopmon=$psm; $loopyear=$psy;
      if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$en
+dday,$endmon-1,$endyear-1900))
      { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); 
+}
      else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$loopday,$loopmon-1,$loopyear-1900);
      while ($curdate <= $stopdate)
      {
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $temp = ((localtime($curdate))[4]+1) ."/". (localtime($curd
+ate))[3] ."/". ((localtime($curdate))[5]+1900);
        if ($curdate >= $startdate && !defined($deleted{$temp}))
        {
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {
            my $curmonth = (localtime($curdate))[4] +1;
            my $curday = (localtime($curdate))[3];
            my $curyear = (localtime($curdate))[5] +1900;
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
          }
        }
        $curdate += $ONE_DAY;
        if ($curdayweek == 64 && $pattern->{Interval} > 1) { $curdate 
++= ($pattern->{Interval} - 1)*7*$ONE_DAY; }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursYearly)
    {
      if (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$endyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyear-190
+0) &&
          timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$endyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$startye
+ar-1900))
      {
        my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth
+} ."/". $endyear;
        if (!defined($deleted{$temp}))
        {
          my $item;
          $item->{Subject} = $it->{Subject};
          $item->{Location} = $it->{Location};
          $item->{AllDayEvent} = $it->{AllDayEvent};
          $item->{Duration} = $it->{Duration};
          $item->{Start} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear
+ ." ". $pattern->{StartTime}->Time("HH:mm"));
          $item->{End} = Variant(VT_DATE, qw(Blank January February Ma
+rch April May June July August September October November December)[$
+pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $endyear .
+" ". $pattern->{EndTime}->Time("HH:mm"));
          if ($item->{Start} == $item->{End})
          {  $item->{End} = Variant(VT_DATE, qw(Blank January February
+ March April May June July August September October November December
+)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $en
+dyear ." ". $pattern->{EndTime}->Time("HH:mm")); }
          push(@itemstodisplay,$item);
        }
      }
      elsif (timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOf
+Year}-1,$startyear-1900) <= timelocal(0,0,0,$endday,$endmon-1,$endyea
+r-1900) &&
          timelocal(0,0,0,$pattern->{DayOfMonth},$pattern->{MonthOfYea
+r}-1,$startyear-1900) >= timelocal(0,0,0,$startday,$startmon-1,$start
+year-1900))
      {
        my $temp = $pattern->{MonthOfYear} ."/". $pattern->{DayOfMonth
+} ."/". $startyear;
        if (!defined($deleted{$temp}))
        {
          my $item;
          $item->{Subject} = $it->{Subject};
          $item->{Location} = $it->{Location};
          $item->{AllDayEvent} = $it->{AllDayEvent};
          $item->{Duration} = $it->{Duration};
          $item->{Start} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startye
+ar ." ". $pattern->{StartTime}->Time("HH:mm"));
          $item->{End} = Variant(VT_DATE, qw(Blank January February Ma
+rch April May June July August September October November December)[$
+pattern->{MonthOfYear}] ." ". $pattern->{DayOfMonth} ." ". $startyear
+ ." ". $pattern->{EndTime}->Time("HH:mm"));
          if ($item->{Start} == $item->{End})
          {  $item->{End} = Variant(VT_DATE, qw(Blank January February
+ March April May June July August September October November December
+)[$pattern->{MonthOfYear}] ." ". ($pattern->{DayOfMonth}+1) ." ". $st
+artyear ." ". $pattern->{EndTime}->Time("HH:mm")); }
          push(@itemstodisplay,$item);
        }
      }
    }
    if ($pattern->{RecurrenceType} == olRecursYearNth)
    {
      my ($curdate,$startdate,$stopdate,$curdayweek);
      if (timelocal(0,0,0,$ped,$pem-1,$pey-1900) > timelocal(0,0,0,$en
+dday,$endmon-1,$endyear-1900))
      { $stopdate = timelocal(0,0,0,$endday,$endmon-1,$endyear-1900); 
+}
      else { $stopdate = timelocal(0,0,0,$ped,$pem-1,$pey-1900); }
      $startdate = timelocal(0,0,0,$startday,$startmon-1,$startyear-19
+00);
      $curdate = timelocal(0,0,0,$psd,$psm-1,$psy-1900);
      while ($curdate <= $stopdate)
      {
        my $curmonth = (localtime($curdate))[4] +1;
        while ($curmonth != $pattern->{MonthOfYear})
        { $curdate+= $ONE_DAY; $curmonth = (localtime($curdate))[4] +1
+; }
        my $curday = (localtime($curdate))[3];
        my $curyear = (localtime($curdate))[5] +1900;
        $curdayweek = pow(2,(localtime($curdate))[6]);
        my $countdown = $pattern->{Instance};
        if ($countdown == 5)
        {
          $curmonth++;  if ($curmonth==13) { $curyear++; $curmonth=1; 
+}
          $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900
+);
          $curdate -= $ONE_DAY;
          while ($countdown>0)
          {
            $curdayweek = pow(2,(localtime($curdate))[6]);
            if ($pattern->{DayOfWeekMask} & $curdayweek) { $countdown 
+= 0; }
            else { $curdate -= $ONE_DAY; }
          }
        }
        while ($countdown>0)
        {
          $curmonth = (localtime($curdate))[4] +1;
          $curday = (localtime($curdate))[3];
          $curyear = (localtime($curdate))[5] +1900;
          $curdayweek = pow(2,(localtime($curdate))[6]);
          if ($pattern->{DayOfWeekMask} & $curdayweek)
          {  $countdown--; }
          else
          { $curdate+= $ONE_DAY; }
        }
        $curmonth = (localtime($curdate))[4] +1;
        $curday = (localtime($curdate))[3];
        $curyear = (localtime($curdate))[5] +1900;
        if ($curdate >= $startdate && $curdate <= $stopdate && !define
+d($deleted{"$curmonth/$curday/$curyear"}))
        {
            my $item;
            $item->{Subject} = $it->{Subject};
            $item->{Location} = $it->{Location};
            $item->{AllDayEvent} = $it->{AllDayEvent};
            $item->{Duration} = $it->{Duration};
            $item->{Start} = Variant(VT_DATE, qw(Blank January Februar
+y March April May June July August September October November Decembe
+r)[$curmonth] ." $curday $curyear ". $pattern->{StartTime}->Time("HH:
+mm"));
            $item->{End} = Variant(VT_DATE, qw(Blank January February 
+March April May June July August September October November December)
+[$curmonth] ." $curday $curyear ". $pattern->{EndTime}->Time("HH:mm")
+);
            if ($item->{Start} == $item->{End})
            {  $item->{End} = Variant(VT_DATE, qw(Blank January Februa
+ry March April May June July August September October November Decemb
+er)[$curmonth] ." ". ($curday+1) ." ". $curyear ." ". $pattern->{EndT
+ime}->Time("HH:mm")); }
            push(@itemstodisplay,$item);
        }
        $curmonth = $pattern->{MonthOfYear};
        $curday = 1;
        $curyear++;
        $curdate = timelocal(0,0,0,$curday,$curmonth-1,$curyear-1900);
      }
    }
  }
  $it = $recurringitems->GetNext;
}

print "***********************************************************\n";

#sort the items from earliest to latest (including the starting times)
#if two entries have the same starting time, sort by name also
#Probably could use a more efficient search, but oh well :)

$count = $#itemstodisplay;
my $changeflag=1;
while ($changeflag)
{
  $changeflag=0;
  for (my $loop=0;$loop<$count;$loop++)
  {
    if (timelocal(0,$itemstodisplay[$loop]->{Start}->Time("m"),$itemst
+odisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start}->
+Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodispla
+y[$loop]->{Start}->Date("yyyy")-1900)
      > timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$item
+stodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{St
+art}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$items
+todisplay[$loop+1]->{Start}->Date("yyyy")-1900))
    {
      $changeflag=1;
      my $item = $itemstodisplay[$loop];
      $itemstodisplay[$loop] = $itemstodisplay[$loop+1];
      $itemstodisplay[$loop+1] = $item;
    }
    elsif (timelocal(0,$itemstodisplay[$loop]->{Start}->Time("m"),$ite
+mstodisplay[$loop]->{Start}->Time("H"),$itemstodisplay[$loop]->{Start
+}->Date("d"),$itemstodisplay[$loop]->{Start}->Date("M")-1,$itemstodis
+play[$loop]->{Start}->Date("yyyy")-1900)
      == timelocal(0,$itemstodisplay[$loop+1]->{Start}->Time("m"),$ite
+mstodisplay[$loop+1]->{Start}->Time("H"),$itemstodisplay[$loop+1]->{S
+tart}->Date("d"),$itemstodisplay[$loop+1]->{Start}->Date("M")-1,$item
+stodisplay[$loop+1]->{Start}->Date("yyyy")-1900)
      && $itemstodisplay[$loop]->{Subject} gt $itemstodisplay[$loop+1]
+->{Subject} )
    {
      $changeflag=1;
      my $item = $itemstodisplay[$loop];
      $itemstodisplay[$loop] = $itemstodisplay[$loop+1];
      $itemstodisplay[$loop+1] = $item;
    }
  }
}

#display the items to the screen

$count = $#itemstodisplay+1;
for (my $i=0;$i<$count;$i++)
{
  $it = $itemstodisplay[$i];
  #if it ends on the end of the day, MS Outlook makes it 0000 on the n
+ext day
  #Not very clean if you ask me... so I decrease it by a minute

  if ($it->{End}->Time("HH:mm") eq "00:00")
  {  my $month = $it->{End}->Date("M");  my $day = $it->{End}->Date("d
+");  my $year = $it->{End}->Date("yyyy");  my $minutes = $it->{End}->
+Time("m");  my $hours = $it->{End}->Time("H");
     my $temptime = timelocal(0,$minutes,$hours,$day,$month-1,$year-19
+00) - 60;
     $month = (localtime($temptime))[4];
     $day = (localtime($temptime))[3];
     $year = (localtime($temptime))[5]+1900;
     $it->{End} = Variant(VT_DATE, qw(January February March April May
+ June July August September October November December)[$month] ." $da
+y $year 23:59");
  }
  print $it->{Start}->Date("ddd MMM d',' yy") ." ". $it->{Start}->Time
+("HH:mm") ." - ". $it->{End}->Date("ddd MMM d',' yy")  ." ". $it->{En
+d}->Time("HH:mm") ."\n     $it->{Subject} ($it->{Location})\n\n";
}
Replies are listed 'Best First'.
Re: MS Outlook Calendar Parser
by grep (Monsignor) on Jan 12, 2002 at 08:04 UTC
    This works great.. good job. I would recommend (as you pointed out in your header) to factor out your redundant code (i.e. you look up the OL object's parameters every few lines) to functions. You will not only be able to maintain and bug fix it ,but it will make it far easier on the eyes, in case someone else would like to contribute to your script.

    I would suggest to do this right away while this is fresh in your mind, or you might end up like me, scratching my head wondering "why did I do that here?" :)

    BTW THX for using code tags on this post.

    grep
    grep> cd pub grep> more beer