Patch title: Release 90 bulk changes
Abstract:
File: /appli/calendar/index.page
Key:
    Removed line
    Added line
module "database.pli"

if user_name=""
  requires "administrator"


method d text_month -> m
  arg Date d ; arg Str m
  var Array:Str monthes
  monthes += "january"
  monthes += "february"
  monthes += "march"
  monthes += "april"
  monthes += "may"
  monthes += "june"
  monthes += "july"
  monthes += "august"
  monthes += "september"
  monthes += "october"
  monthes += "november"
  monthes += "december"
  m := monthes d:month-1

method d smart_text -> t
  arg Date d ; arg Str t
  t := (day_name d:day_of_week)+" "+d:text_month+" "+(string d:day)

method dt compact_text -> t
  arg DateTime dt ; arg Str t
  t := replace (replace (replace string:dt "/" "") " " "") ":" ""

method se event_on from to -> e
  arg (Data Set:CalendarEvent) se ; arg DateTime from to ; arg Data:CalendarEvent e
  # FIXME: user low level database interface
  each ce se
    if to>ce:from and from<ce:to
      e :> ce
      return
  e :> se ""

method se event_on ts -> e
  arg (Data Set:CalendarEvent) se ; arg DateTime ts ; arg Data:CalendarEvent e
  e :> se event_on ts ts

method se event_count from to -> count
  arg (Data Set:CalendarEvent) se ; arg DateTime from to ; arg Int count
  count := 0
  each ce se
    if to>ce:from and from<ce:to
      count += 1

method u archive
  arg_rw Data:CalendarUser u
  var Date date := datetime date ; date days -= date day_of_week
  var DateTime ts := datetime date:year date:month date:day 0 0 0 0
  each ce u:event
    if ce:to>ts
      return
    u:history create keyof:ce
    data_copy ce (u:history keyof:ce)
    u:event delete keyof:ce


method page display_event e
  arg_rw HtmlPage page ; arg_rw Data:CalendarEvent e
  title e:label
  para
    text (day_name e:from:day_of_week)+" "+(string e:from)
  var CBool modify := false
  if (pathof:e parse "/pliant2/calendar/user/" any:(var Str user) "/" any)
    user := html_decode user
    modify := user_name=user
  if modify
    input "" e:label length 80
    text_input "" e:memo columns 80 rows 15
    button "update" noeol
      goto_backward
    button "delete"
      calendar_database:data:user:user:event delete keyof:e
      goto_backward
  else
    text e:memo

method page display_calendar se options
  arg_rw HtmlPage page ; arg (Data Set:CalendarEvent) se ; arg Str options
  var Array:Str monthes
  var Date from_date := options option "from_date" Date datetime:date
  var Date to_date := options option "to_date" Date
  if to_date=undefined
    to_date days := from_date:days+6
  var Int from_hour := options option "from_hour" Int 0
  var Int to_hour := options option "to_hour" Int 23
  var (Array Data:CalendarEvent) current
  current size := to_date:days-from_date:days+1
  table width "100%" border 1
    row
      cell void
      for (var Int i) 0 to_date:days-from_date:days
        var Date date ; date days := from_date:days+i
        current i :> se event_on (datetime date:year date:month date:day from_hour 0 0 0)
        cell void
        cell header width "13%"
          text (day_name date:day_of_week)+"[lf]"+date:text_month+" "+(string date:day)+"[lf]"+string:date
    for (var Int j) from_hour to_hour
      row
        cell header
          text string:j+":00"
        for (var Int i) 0 to_date:days-from_date:days
          var Date date ; date days := from_date:days+i
          var DateTime datetime := datetime date:year date:month date:day j 0 0 0
          var Data:CalendarEvent e :> se datetime:compact_text
          if exists:e
            current i :> e
          eif current:i:to<>undefined and current:i:to>datetime
            e :> current i
          cell void
          if not exists:e
            if date:day_of_week=0 or date:day_of_week=6 or j<8 or j>=12 and j<14 or j>=18
              cell color (color hsl 0 0 95+j%2) void
            else
              cell color (color hsl 0 0 90+j%2) void
          eif datetime=e:from or j=from_hour
            cell color (color hsl (shunt e:privacy="public" 120 e:privacy="private" 0 30) 50 75) rowspan (min (cast (e:to:seconds-datetime:seconds)/3600 Int) to_hour+1-j)
              if (e:privacy="public" or (allowed e:privacy))
                note e:label
                  display_event e
        
method page display_calendar users options
  arg_rw HtmlPage page ; arg Array:Str users ; arg Str options
  var Date from_date := options option "from_date" Date datetime:date
  var Date to_date := options option "to_date" Date
  if to_date=undefined
    to_date days := from_date:days+6
  var Int from_hour := options option "from_hour" Int 0
  var Int to_hour := options option "to_hour" Int 23
  var (Array Data:CalendarEvent) current
  current size := users size
  table
    row
      cell header [Date]
      cell header [Time]
      for (var Int k) 0 users:size-1
        current k :> calendar_database:data:user:(users k):event event_on (datetime from_date:year from_date:month from_date:day from_hour 0 0 0)
        cell void
        cell header (text users:k)
    for (var Int i) 0 to_date:days-from_date:days
      var Date date ; date days := from_date:days+i
      for (var Int j) from_hour to_hour
        var DateTime datetime := datetime date:year date:month date:day j 0 0 0
        row
          cell
            if j=from_hour
              text date:smart_text
          cell
            text string:j+":00"
          for (var Int k) 0 users:size-1
            var Data:CalendarEvent e :> calendar_database:data:user:(users k):event datetime:compact_text
            if exists:e
              current k :> e
            eif current:k:to<>undefined and current:k:to>datetime
              e :> current k
            cell void
            if not exists:e
              if date:day_of_week=0 or date:day_of_week=6 or j<8 or j>=12 and j<14 or j>=18
                cell color (color hsl 0 0 95+j%2) void
              else
                cell color (color hsl 0 0 90+j%2) void
            eif datetime=e:from or j=from_hour
              cell color (color hsl (shunt e:privacy="public" 120 e:privacy="private" 0 30) 50 75) rowspan (min (cast (e:to:seconds-datetime:seconds)/3600 Int) to_hour+1-j)
                if (e:privacy="public" or (allowed e:privacy))
                  var Str user := users k
                  note e:label
                    display_event e

       
title user_name+" diary"

para

  page note "record new event"
    var Date today := datetime date
    title "Add calendar event"
    table columns 2 border 0
      cell [From]
      cell
        var Date from_date1 := undefined
        select "date: " from_date1 noeol
          option "" ""
          for (var Int i) 0 30
            var Date date ; date days := today:days+i
            option date:smart_text string:date
        input " " (var Str from_date2) length 10 noeol
        var Int from_hour := undefined
        select " time: " from_hour noeol
          option "" ""
          for (var Int i) 0 23
            option (right string:i 2 "0")+":00" string:i
        var Int from_minute := 0
        if false # select " " from_minute
          for (var Int i) 0 45 step 15
            option string:i string:i
      cell [To]
      cell
        var Date to_date1 := undefined
        select "date: " to_date1 noeol
          option "same day" ""
          for (var Int i) 0 30
            var Date date ; date days := today:days+i
            option date:smart_text string:date
        input " " (var Str to_date2) length 10 noeol
        var Int to_hour := undefined
        select " time: " to_hour noeol
          option "" ""
          for (var Int i) 0 23
            option (right string:i 2 "0")+":00" string:i
        var Int to_minute := 0
        if false # select " " to_minute
          for (var Int i) 0 45 step 15
            option string:i string:i
      cell [Label]
      cell
        input "" (var Str new_label) length 80
      cell [Memo]
      cell colspan 2
        text_input "" (var Str new_memo) columns 80 rows 5
      cell [Privacy]
      cell
        var Str new_privacy := "public"
        select "" new_privacy noeol
          option "public" "public"
          option "private" "private"
          option "public only to users with selected right" ""
        input " " (var Str new_right) length 20
    page button "record"
      if not (from_date2 parse (var Date from_date))
        from_date := from_date1
      if not (to_date2 parse (var Date to_date))
        to_date := shunt to_date1<>undefined to_date1 from_date
      var DateTime from_datetime := datetime from_date:year from_date:month from_date:day from_hour from_minute 0 0
      var DateTime to_datetime := datetime to_date:year to_date:month to_date:day to_hour to_minute 0 0
      if from_date=undefined or from_hour=undefined or to_date=undefined or to_hour=undefined
        [Incorrect input. Please press the back button and correct.]
      eif exists:(calendar_database:data:user:user_name:event event_on from_datetime to_datetime)
        [The new event is overlapping an existing one. Please press the back button and correct.]
      else
        calendar_database:data:user create user_name
        calendar_database:data:user:user_name:event create from_datetime:compact_text
        var Data:CalendarEvent e :> calendar_database:data:user:user_name:event from_datetime:compact_text
        e from := from_datetime
        e to := to_datetime
        e label := new_label
        e memo := new_memo
        e privacy := shunt new_privacy<>"" new_privacy new_right
        goto_backward
  eol

  page note "list all events"
    title "All events listing"
    var Date current := undefined
    table columns 3
      cell header [Date]
      cell header [Time]
      cell header [Event]
      each e calendar_database:data:user:user_name:event
        e:from split (var Date d) (var Time t)
        cell
          if d<>current
            text d:smart_text
            current := d
        cell
          text (string:t 0 5)
        cell color (color hsl (shunt e:privacy="public" 120 e:privacy="private" 0 30) 50 75)
          note e:label
            display_event e
  eol

  page note "compare diaries"
    title "Compare diaries"
    table columns 2 border 0
      cell [Users]
      cell (text_input "" (var Str all) columns 30 rows 5)
      cell [Week]
      cell
        var Date date := datetime date ; date days -= date day_of_week
        var Str base := string date
        select "" base noeol
          for (var Int i) 0 51
            var Date until := date ; until days += 6
            option date:text_month+" "+(string date:day)+" to "+(shunt until:month<>date:month until:text_month+" " "")+(string until:day) string:date
            date days += 7
    button "compare"
      var Array:Str users
      while all<>""
        if not (all parse any:(var Str first) "[lf]" any:(var Str remain))
          first := all ; remain := ""
        if (first parse any:(var Str user)) and user<>""
          users += user
        all := remain
      display_calendar users "from_date "+string:base
  eol

calendar_database:data:user:user_name archive

var Date date := datetime date ; date days -= date day_of_week
display_calendar calendar_database:data:user:user_name:event "from_date "+string:date
  
para

  var Date date := datetime date ; date days -= date day_of_week
  select "" (var Str futur) noeol
    for (var Int i) 1 51
      date days += 7
      var Date until := date ; until days += 6
      option date:text_month+" "+(string date:day)+" to "+(shunt until:month<>date:month until:text_month+" " "")+(string until:day) string:date
  page button "display futur week"
    title user_name+" diary"
    display_calendar calendar_database:data:user:user_name:event "from_date "+string:futur
  
  var Date date := datetime date ; date days -= date day_of_week
  select "" (var Str past) noeol
    for (var Int i) 1 51
      date days -= 7
      var Date until := date ; until days += 6
      option (string date:year)+" "+date:text_month+" "+(string date:day)+" to "+(shunt until:month<>date:month until:text_month+" " "")+(string until:day) string:date
  page button "display past week"
    title user_name+" diary"
    display_calendar calendar_database:data:user:user_name:history "from_date "+string:past