From: ivan  <%$date->day%> If you want to have reminders in a search you need to go in the /Search/Edit.html"><%loc("Edit Query")%> tab
+of the <%loc("query builder")%> and add something like that :
+
+  +
+% } elsif ($DateTypes->{Resolved}
+%           and RTx::Calendar::LocalDate($Object->ResolvedObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{Resolved}
+%           and RTx::Calendar::LocalDate($Object->ResolvedObj->Unix) eq $today) {
+          +
+% } elsif ($DateTypes->{Starts} and $DateTypes->{Due} 
+%           and RTx::Calendar::LocalDate($Object->StartsObj->Unix) eq $today and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today ) {
+
+
+% } elsif ($DateTypes->{Starts} and $DateTypes->{Due} 
+%           and RTx::Calendar::LocalDate($Object->StartsObj->Unix) eq $today and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today ) {
+     +
+% } elsif ($DateTypes->{Due} and $DateTypes->{Created} 
+%           and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today and RTx::Calendar::LocalDate($Object->CreatedObj->Unix) eq $today ) {
+
+
+% } elsif ($DateTypes->{Due} and $DateTypes->{Created} 
+%           and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today and RTx::Calendar::LocalDate($Object->CreatedObj->Unix) eq $today ) {
+     +
+% } elsif ($DateTypes->{Starts}
+%           and RTx::Calendar::LocalDate($Object->StartsObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{Starts}
+%           and RTx::Calendar::LocalDate($Object->StartsObj->Unix) eq $today) {
+     +
+% } elsif ($DateTypes->{Due} 
+%           and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{Due} 
+%           and RTx::Calendar::LocalDate($Object->DueObj->Unix) eq $today) {
+     +
+% } elsif ($DateTypes->{Created}
+%           and RTx::Calendar::LocalDate($Object->CreatedObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{Created}
+%           and RTx::Calendar::LocalDate($Object->CreatedObj->Unix) eq $today) {
+     +
+% } elsif ($DateTypes->{Started}
+%           and RTx::Calendar::LocalDate($Object->StartedObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{Started}
+%           and RTx::Calendar::LocalDate($Object->StartedObj->Unix) eq $today) {
+     +
+% } elsif ($DateTypes->{LastUpdated}
+%           and RTx::Calendar::LocalDate($Object->LastUpdatedObj->Unix) eq $today) {
+
+
+% } elsif ($DateTypes->{LastUpdated}
+%           and RTx::Calendar::LocalDate($Object->LastUpdatedObj->Unix) eq $today) {
+     +
+% }
+
+	
+           <% $Object->QueueObj->Name %> #<% $TicketId %>
+           <% $display_owner ? 'by ' . $Object->OwnerObj->Name : '' %>
+           <% length($Object->Subject) > 80 ? substr($Object->Subject, 0, 77) . "..." : $Object->Subject %>
+
+% }
+
+	
+           <% $Object->QueueObj->Name %> #<% $TicketId %>
+           <% $display_owner ? 'by ' . $Object->OwnerObj->Name : '' %>
+           <% length($Object->Subject) > 80 ? substr($Object->Subject, 0, 77) . "..." : $Object->Subject %>
+	
+	
+           <% $Object->QueueObj->Name %> #<% $TicketId %>
+        
+	: <% $subject%>
+	
+
+%# logic taken from Ticket/Search/Results.tsv
+% foreach my $attr (@display_fields) {
+%    my $value;
+%
+%    if ($attr =~ /(.*)->ISO$/ and $Object->$1->Unix <= 0) {
+%        $value = '-';
+%    } else {
+%        my $method = '$Object->'.$attr.'()';
+%        $method =~ s/->ISO\(\)$/->ISO( Timezone => 'user' )/;
+%        $value = eval $method;
+%        if ($@) {die "Check your CalendarPopupFields config in etc/RT_SiteConfig.pm.
Failed to find \"$attr\" - ". $@}; 
+%    }
+	<&|/l&><% $label_of{$attr} %>&>: <% $value %>
+% }
+
+
+	
+
+
+
+
+ &>
+
+<%INIT>
+
+use RTx::Calendar;
+
+my $title = loc("Calendar");
+
+my $rtdate = RT::Date->new($session{'CurrentUser'});
+
+my @DateTypes = qw/Created Starts Started Due LastUpdated Resolved/;
+
+my $today = DateTime->today;
+
+# this line is used to debug MyCalendar
+# $today = DateTime->new(year => 2007, month => 4, day => 11);
+
+my $begin = $today->clone->subtract( days => 3);
+my $end   = $today->clone->add( days => 3);
+
+# use this to loop over days until $end
+my $set = DateTime::Set->from_recurrence(
+    next => sub { $_[0]->truncate( to => 'day' )->add( days => 1 ) }
+);
+
+my $Query = "( Status = 'new' OR Status = 'open' OR Status = 'stalled')
+ AND ( Owner = '" . $session{CurrentUser}->Id ."' OR Owner = 'Nobody'  )
+ AND ( Type = 'reminder' OR 'Type' = 'ticket' )";
+my $Format = "__Starts__ __Due__";
+
+if ( my $Search = RTx::Calendar::SearchDefaultCalendar($session{CurrentUser}) ) {
+  $Format = $Search->SubValue('Format');
+  $Query = $Search->SubValue('Query');
+}
+
+# we search all date types in Format string
+my @Dates = grep { $Format =~ m/__${_}(Relative)?__/ } @DateTypes;
+
+# used to display or not a date in Element/CalendarEvent
+my %DateTypes = map { $_ => 1 } @Dates;
+
+$Query .= RTx::Calendar::DatesClauses(\@Dates, $begin->strftime("%F"), $end->strftime("%F"));
+
+# print STDERR $Query, "\n";
+
+my %Tickets = RTx::Calendar::FindTickets($session{'CurrentUser'}, $Query, \@Dates);
+
+%INIT>
diff --git a/rt/share/html/NoAuth/Calendar/dhandler b/rt/share/html/NoAuth/Calendar/dhandler
new file mode 100644
index 000000000..4b4aa631e
--- /dev/null
+++ b/rt/share/html/NoAuth/Calendar/dhandler
@@ -0,0 +1,159 @@
+<%init>
+
+use Data::ICal;
+use Data::ICal::Entry::Todo;
+use Data::ICal::Entry::Event;
+use Date::ICal;
+
+$RT::ICalTicketType   ||= "Data::ICal::Entry::Todo";
+$RT::ICalReminderType ||= "Data::ICal::Entry::Event";
+
+my ($UserId, $SearchId, $MagicNumber);
+my $arg = $m->dhandler_arg;
+
+if ($arg =~ m{^(\d+)@(\d+)/(.*)$}) {
+    $UserId = $1;
+    $SearchId = $2;
+    $MagicNumber = $3;
+} elsif ($arg =~ m{^(\d+)/(.*)}) {
+    $UserId = $1;
+    $MagicNumber = $2;
+} else {
+    Abort("Corrupted URL.");
+}
+
+my $CurrentUser = new RT::CurrentUser();
+$CurrentUser->LoadById($UserId);
+my $user = $CurrentUser->Name;
+
+# if no user, abort
+unless ($CurrentUser->Id) {
+    $RT::Logger->error("No such user id $UserId from $ENV{'REMOTE_ADDR'}");
+    $m->out("RT/".$RT::VERSION ." ".404 ."\n\nno such file\n");
+    $m->abort;
+}
+
+# verify user has LoadSavedSearch right
+if ($SearchId and not $CurrentUser->HasRight( Right => 'LoadSavedSearch',
+                                              Object=> $RT::System )) {
+    $RT::Logger->error("not enough rights for user $user from $ENV{'REMOTE_ADDR'}");
+    $m->out("RT/".$RT::VERSION ." ".404 ."\n\nno such file\n");
+    $m->abort;
+}
+
+
+# if MagicNumber doesn't match the one stored in database, abort
+my $Search;
+my $ICalAttribute;
+if ($SearchId) {
+    $Search = $CurrentUser->Attributes->WithId($SearchId);
+    $ICalAttribute = $Search->FirstAttribute('ICalURL');
+} else {
+    $ICalAttribute = $CurrentUser->UserObj->FirstAttribute('ICalURL');
+}
+
+unless ($ICalAttribute) {
+    $RT::Logger->error("No such ICal feed for $user from $ENV{'REMOTE_ADDR'}");
+    $m->out("RT/".$RT::VERSION ." ".404 ."\n\nno such file\n");
+    $m->abort;
+}
+
+
+if ($MagicNumber ne $ICalAttribute->Content) {
+    $RT::Logger->error("FAILED LOGIN for $user from $ENV{'REMOTE_ADDR'}");
+    $m->out("RT/".$RT::VERSION ." ".404 ."\n\nno such file\n");
+    $m->abort;
+}
+
+my $Tickets   = RT::Tickets->new($CurrentUser);
+
+my $Query = "( Status = 'new' OR Status = 'open' OR Status = 'stalled')
+ AND ( Owner = '" . $CurrentUser->Id ."' OR Owner = 'Nobody'  )
+ AND ( Type = 'reminder' OR 'Type' = 'ticket' )";
+
+$Query = $Search->SubValue('Query')
+    if $Search;
+
+$Query .= " AND ( Due > '1970-01-01' OR Starts > '1970-01-01' )";
+
+$Tickets->FromSQL($Query);
+
+$Tickets->OrderBy(FIELD => 'Due', ORDER => 'ASC');
+
+my $calendar = Data::ICal->new();
+
+my ($uid) = $RT::WebURL =~ m{https?://([^:]+)};
+
+while (my $Ticket = $Tickets->Next ) {
+
+    my $event;
+    if ($Ticket->Type eq 'ticket') {
+	$event = add_todo($Ticket, $uid);
+    } else {
+	$event = add_event($Ticket, $uid);
+    }
+    next unless $event;
+    $calendar->add_entry($event);
+}
+
+my $cal = $calendar->as_string;
+
+$r->content_type('text/calendar;charset=utf-8');
+$m->clear_buffer();
+$m->out($cal);
+$m->abort; 
+
+sub add_event {
+    my ($Reminder, $uid) = @_;
+
+    return unless defined $Reminder->RefersTo->First;
+    my $Ticket  = $Reminder->RefersTo->First->TargetObj;
+    
+    my %event = (
+	summary => $Reminder->Subject ? $Reminder->Subject : '',
+	url        => "${RT::WebURL}/Ticket/Display.html?id=" . $Ticket->id,
+	uid        => Date::ICal->new( epoch => time() )->ical() . "-" . $Reminder->Id . "@" . $uid,
+	categories => $Ticket->QueueObj->Name,
+	dtstart     => Date::ICal->new( epoch => $Reminder->DueObj->Unix )->ical,
+    );
+
+    my $event = $RT::ICalReminderType->new();
+    $event->add_properties(%event);
+
+    return $event;
+}
+
+sub add_todo {
+    my ($Ticket, $uid) = @_;
+
+    my %vtodo = (
+	summary    => $Ticket->Subject ? $Ticket->Subject : '',
+	dtstart    => Date::ICal->new( epoch => $Ticket->CreatedObj->Unix )->ical,
+	url        => "${RT::WebURL}/Ticket/Display.html?id=" . $Ticket->id,
+	uid        => Date::ICal->new( epoch => time() )->ical() . "-" . $Ticket->Id . "@" . $uid,
+	categories => $Ticket->QueueObj->Name,
+    );
+
+    $vtodo{due} = Date::ICal->new( epoch => $Ticket->DueObj->Unix )->ical,
+        if $Ticket->DueObj;
+
+    if ($Ticket->OwnerObj->Id != $RT::Nobody->Id and $Ticket->OwnerObj->EmailAddress) {
+	$vtodo{organizer} = "MAILTO:" . $Ticket->OwnerObj->EmailAddress;
+	$vtodo{attendee} = "MAILTO:" . $Ticket->OwnerObj->EmailAddress;
+    } elsif ($Ticket->QueueObj->CommentAddress) {
+	$vtodo{organizer} = "MAILTO:" . $Ticket->QueueObj->CommentAddress;
+	$vtodo{attendee} = "MAILTO:" . $Ticket->QueueObj->CommentAddress; 
+    }
+
+    $vtodo{priority} = $Ticket->Priority
+	if $Ticket->Priority;
+
+    my $vtodo = $RT::ICalTicketType->new();
+    $vtodo->add_properties(%vtodo);
+
+    return $vtodo;
+}
+
+
+
+%init>
diff --git a/rt/share/html/NoAuth/css/calendar.css b/rt/share/html/NoAuth/css/calendar.css
new file mode 100644
index 000000000..e313dff99
--- /dev/null
+++ b/rt/share/html/NoAuth/css/calendar.css
@@ -0,0 +1,40 @@
+.tooltip{position:relative;z-index:1;}
+.tooltip:hover{z-index:5;color:#000;}
+.tooltip span.tip{display: none; text-align:left;}
+
+div.tooltip:hover span.tip{
+display:block;
+position:absolute;
+top:12px; left:24px; width:350px;
+border:1px solid #555;
+background-color:#fff;
+padding: 4px;
+font-size: 0.8em;
+color:#505050;
+}
+
+.date {
+text-align: right;
+}
+
+table.rtxcalendar {
+    width:100%;
+    border-collapse: collapse;
+    border: 1px dotted #d0d0d0;
+    margin-bottom: 6px;
+}
+
+table.rtxcalendar td {
+    border: 1px solid #d7d7d7;
+    vertical-align: top;
+}
+
+table.rtxcalendar th {
+    border: 1px solid #d7d7d7;
+    background: #eee;
+}
+table.rtxcalendar tbody th {
+    border: 1px solid #d7d7d7;
+    background: #eee;
+    font-weight: normal;
+}
diff --git a/rt/share/html/NoAuth/images/created.png b/rt/share/html/NoAuth/images/created.png
new file mode 100644
index 000000000..4d5eeb9ea
Binary files /dev/null and b/rt/share/html/NoAuth/images/created.png differ
diff --git a/rt/share/html/NoAuth/images/created_due.png b/rt/share/html/NoAuth/images/created_due.png
new file mode 100644
index 000000000..52dfc96f0
Binary files /dev/null and b/rt/share/html/NoAuth/images/created_due.png differ
diff --git a/rt/share/html/NoAuth/images/due.png b/rt/share/html/NoAuth/images/due.png
new file mode 100644
index 000000000..30a3aff8a
Binary files /dev/null and b/rt/share/html/NoAuth/images/due.png differ
diff --git a/rt/share/html/NoAuth/images/reminder.png b/rt/share/html/NoAuth/images/reminder.png
new file mode 100644
index 000000000..4370b6902
Binary files /dev/null and b/rt/share/html/NoAuth/images/reminder.png differ
diff --git a/rt/share/html/NoAuth/images/resolved.png b/rt/share/html/NoAuth/images/resolved.png
new file mode 100644
index 000000000..09db36d5a
Binary files /dev/null and b/rt/share/html/NoAuth/images/resolved.png differ
diff --git a/rt/share/html/NoAuth/images/started.png b/rt/share/html/NoAuth/images/started.png
new file mode 100644
index 000000000..e177addea
Binary files /dev/null and b/rt/share/html/NoAuth/images/started.png differ
diff --git a/rt/share/html/NoAuth/images/starts.png b/rt/share/html/NoAuth/images/starts.png
new file mode 100644
index 000000000..88064ba50
Binary files /dev/null and b/rt/share/html/NoAuth/images/starts.png differ
diff --git a/rt/share/html/NoAuth/images/starts_due.png b/rt/share/html/NoAuth/images/starts_due.png
new file mode 100644
index 000000000..16a4de46f
Binary files /dev/null and b/rt/share/html/NoAuth/images/starts_due.png differ
diff --git a/rt/share/html/NoAuth/images/updated.png b/rt/share/html/NoAuth/images/updated.png
new file mode 100644
index 000000000..680e79a54
Binary files /dev/null and b/rt/share/html/NoAuth/images/updated.png differ
diff --git a/rt/share/html/Prefs/Calendar.html b/rt/share/html/Prefs/Calendar.html
new file mode 100644
index 000000000..5fbdd2717
--- /dev/null
+++ b/rt/share/html/Prefs/Calendar.html
@@ -0,0 +1,123 @@
+<%args>
+$ChangeURL   => undef
+$ResetURL    => undef
+$SearchType  => 'Ticket'
+$HiddenField => undef
+%args>
+
+<& /Elements/Header, Title => $title &>
+<& /User/Elements/Tabs,
+    current_tab => 'Prefs/Calendar.html',
+    Title => $title
+&>
+
+<&| /Widgets/TitleBox, title => loc('ICal Feeds (ics)') &>
+
+<&| /Widgets/TitleBox, title => 'Help' &>
+
+
+% my $date = $begin->clone;
+% while ( $date <= $end ) {
+ 
+
+
+<%$rtdate->GetWeekday($date->day_of_week % 7)%> 
+% $date = $set->next($date);
+% }
+
+% $date = $begin->clone;
+% while ($date <= $end) {
+ 
+
+
+ 
+% $date = $set->next($date);
+% }
+displaying reminders :
+
+   AND ( Type = 'ticket' OR Type = 'reminder' )
+
+
By default RTx::Calendar display Due and Starts dates. You can +select other kind of events you want with the <%loc("Display +Columns")%> section in the /Search/Build.html"><%loc("Query +Builder")%>. The following one will display the two latter and +LastUpdated dates : + +
+ '<small>__Due__</small>', + '<small>__Starts__</small>', + '<small>__LastUpdated__</small>' ++ + +
You can change the default Query of Calendar.html and MyCalendar
+portlet by saving a query with the name calendar in the
+<%loc("Query
+Builder")%>.
<%$FeedText%>
+% } else { +This feed will show tickets with due date find with query:Your can paste this url in your calendar : <%$link%>
+
| + ++ | + ++ | 
| +% my ($PMonth, $PYear) = ($Month - 1, $Year); +% if ($PMonth < 0) { +% $PYear--; +% $PMonth = 11; +% } +«<%$rtdate->GetMonth($PMonth)%> ++ | +Calendar Preferences and Help ++ | +% my ($NMonth, $NYear) = ($Month + 1, $Year); +% if ($NMonth > 11) { +% $NYear++; +% $NMonth = 0; +% } +<%$rtdate->GetMonth($NMonth)%>» ++ | 
| +% for (1 .. 6, 0) { + | <%$rtdate->GetWeekday($_)%>+% } + | 
|---|---|
| <% $date->week_number %>+% } + | + +% $date = $set->next($date);
+% if ( $date->day_of_week == 1) {
+<%$date->day%>+% for my $t ( @{ $Tickets{$date->strftime("%F")} } ) { +<& /Elements/CalendarEvent, Object => $t, Date => $date, DateTypes => \%DateTypes &> +% } + | 
| +«<%$rtdate->GetMonth($PMonth)%> ++ | +<%$rtdate->GetMonth($NMonth)%>» ++ | 
| + ++ | + + : <&|/l&>Created&> +  : <&|/l&>Due&> +  : <&|/l&>Resolved&> +  : <&|/l&>Last Updated&> +  : <&|/l&>Created&>, <&|/l&>Due&> +  : <&|/l&>Reminders&> +  : <&|/l&>Starts&> +  : <&|/l&>Started&> +  : <&|/l&>Starts&>, <&|/l&>Due&> + + + |