weblog-mini-calendar.tcl

Weblog Mini Calendar Portlet Include

Location:
/packages/xowiki/lib/portlets/weblog-mini-calendar.tcl

Related Files

[ hide source ] | [ make this the default ]

File Contents

ad_include_contract {
  Weblog Mini Calendar Portlet Include
} {
  __including_page:token,notnull
  {summary:boolean false}
  {noparens:boolean false}
}

::xo::Page requireCSS "/resources/calendar/calendar.css"
set package_id        [::xo::cc package_id]
set parent_id         [$__including_page set parent_id]
set including_item_id [$__including_page set item_id]

if {![info exists base_url] || $base_url eq ""} {
  if {![info exists page]} {
    set page [::$package_id get_parameter weblog_page]
  }
  set base_url [::$package_id pretty_link -parent_id $parent_id -path_encode false $page]
}

set date [ns_queryget date]
if {$date eq ""} {
  set date [dt_sysdate]
}

array set message_key_array {
    list #acs-datetime.List#
    day #acs-datetime.Day#
    week #acs-datetime.Week#
    month #acs-datetime.Month#
}

# Get the current month, day, and the first day of the month
ad_try {
  dt_get_info $date
} on error {errorMsg} {
  # if dt_get_info fails from the provided date, try it with the
  # sysdate.
  set date [dt_sysdate]
  dt_get_info $date
}

set now       [clock scan $date]
set prev_mon  [clock scan "1 month ago" -base $now]
set next_mon  [clock scan "1 month" -base $now]

set date_list [dt_ansi_to_list $date]
set year      [util::trim_leading_zeros [lindex $date_list 0]]
set month     [util::trim_leading_zeros [lindex $date_list 1]]
set day       [util::trim_leading_zeros [lindex $date_list 2]]

set months_list    [dt_month_names]
set curr_month_idx [expr {[util::trim_leading_zeros [clock format $now -format "%m"]]-1}]
set curr_month     [lindex $months_list $curr_month_idx ]

set first_day_of_week [lc_get firstdayofweek]
set week_days [lc_get abday]
multirow create days_of_week day_short
for {set i 0} {$i < 7} {incr i} {
  multirow append days_of_week [lindex $week_days [expr {($i + $first_day_of_week) % 7}]]
}

set date_reference $year-$month-01
set innersql "from xowiki_pagei p, cr_items ci \
        where ci.parent_id = :parent_id \
        and ci.item_id = p.item_id and  ci.live_revision = p.page_id \
        and ci.content_type not in ('::xowiki::PageTemplate', '::xowiki::Form') \
        and ci.item_id != :including_item_id \
        and ci.publish_status <> 'production' "

::xo::dc foreach entries_this_month "select count(ci.item_id) as c,
        [::xo::dc date_trunc day p.publish_date] as d \
        $innersql
        and [::xo::dc date_trunc_expression month p.publish_date :date_reference] \
        group by [::xo::dc date_trunc day p.publish_date]" {
          set entries([lindex $d 0]) $c
        }

#
# The following time range specifies the dates between the navigation
# arrows of the weblog mini calendar should be. Without a limitation,
# crawler will iterate over these pages until they reach infinite past
# or infinite future.
#
#set earliest_date "2006-01-1"
#set latest_date   "1 year"
#
# Compute the available time range
#
set dates [::xo::dc list_of_lists get_dates "select min([::xo::dc date_trunc day p.publish_date]),max([::xo::dc date_trunc day p.publish_date]) $innersql"]
set earliest_date [::xo::db::tcl_date [lindex $dates 0 0] _]
set latest_date   [::xo::db::tcl_date [lindex $dates 0 end] _]

if {$prev_mon < [clock scan $earliest_date]} {
  set prev_month_url ""
} else {
  set prev_month     [clock format $prev_mon -format "%Y-%m-%d"]
  set prev_month_url [export_vars -base $base_url {{date $prev_month} page_num summary}]
}
if {$next_mon > [clock scan $latest_date]} {
  set next_month_url ""
} else {
  set next_month     [clock format $next_mon -format "%Y-%m-%d"]
  set next_month_url [export_vars -base $base_url {{date $next_month} page_num summary}]
}


multirow create days day_number beginning_of_week_p end_of_week_p today_p active_p url id count class

set day_of_week 1

# Calculate number of active days
set active_days_before_month [expr {[dt_first_day_of_month $year $month] -1}]
set active_days_before_month [expr {($active_days_before_month + 7 - $first_day_of_week) % 7}]

set calendar_starts_with_julian_date [expr {$first_julian_date_of_month - $active_days_before_month}]
set day_number [expr {$days_in_last_month - $active_days_before_month + 1}]

set js ""
for {set julian_date $calendar_starts_with_julian_date} {$julian_date <= $last_julian_date + 7} {incr julian_date} {

  if {$julian_date > $last_julian_date_in_month && $end_of_week_p == "t" } {
    break
  }
  set today_p f
  set active_p t

  if {$julian_date < $first_julian_date_of_month} {
    set active_p f
  } elseif {$julian_date > $last_julian_date_in_month} {
    set active_p f
  }
  set ansi_date [dt_julian_to_ansi $julian_date]

  if {$julian_date == $first_julian_date_of_month} {
    set day_number 1
  } elseif {$julian_date == $last_julian_date_in_month +1} {
    set day_number 1
  }

  if {$julian_date == $julian_date_today} {
    set today_p t
  }

  if { $day_of_week == 1} {
    set beginning_of_week_p t
  } else {
    set beginning_of_week_p f
  }

  if { $day_of_week == 7 } {
    set day_of_week 0
    set end_of_week_p t
  } else {
    set end_of_week_p f
  }
  # ns_log notice "--D julian_date = $julian_date [dt_julian_to_ansi $julian_date] //$ansi_date"
  set count [expr {[info exists entries($ansi_date)] ?
                   ($noparens ? "$entries($ansi_date)" : "($entries($ansi_date))")
                   : ""}]
  if {$today_p} {
    set class today
  } elseif {$active_p} {
    set class active
  } else {
    set class inactive
  }
  set url [export_vars -base $base_url {{date $ansi_date} summary}]

  set id minicalendar-$ansi_date
  if {$count ne ""} {
    append js [subst {
      document.getElementById('$id').addEventListener('click', function (event) {
        event.preventDefault();
        window.location.href='$url';
        return false;
      });
    }]
  }

  multirow append days $day_number $beginning_of_week_p $end_of_week_p $today_p $active_p \
      $url $id $count $class
  incr day_number
  incr day_of_week
}

if {$js ne ""} {
  template::add_body_script -script $js
}


set sysdate [dt_sysdate]
set today_url [export_vars -base $base_url {{date $sysdate} page_num}]
if {$sysdate eq $date} {
  set today_p t
} else {
  set today_p f
}


# Local variables:
#    mode: tcl
#    tcl-indent-level: 2
#    indent-tabs-mode: nil
# End: