Patch title: Release 85 bulk changes
Abstract:
File: /pliant/appli/forum.pli
Key:
    Removed line
    Added line
   
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/common/mime.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/fullpliant/user.pli"


method page browse_directory f d patch path options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg_rw Data:F
  implicit page
    title "Browse patch '"+d:title+"'"
    if options="delete" and patch
      [Are you sure that you want to delete directory] ; fix
      button "yes" noeol
        file_tree_delete (forum_path f d "/patch"+path)
        goto_backward
      button "no"
        goto_backward
    eif options="list"
      var Array:FileInfo files := file_list (forum_path f d 
      for (var Int i) 0 files:size-1
        file_header path+files:i:name (var FileInfo old_info
        html "<pfile name=[dq]"+(html_encode files:i:name)+"
    else
      table columns 2 border 0
        cell [Path:]
        cell fixed:(text path)
      var Array:FileInfo patches := file_list (forum_path f 
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/default.style"
module "/pliant/protocol/common/mime.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/fullpliant/user.pli"


method page browse_directory f d patch path options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg_rw Data:F
  implicit page
    title "Browse patch '"+d:title+"'"
    if options="delete" and patch
      [Are you sure that you want to delete directory] ; fix
      button "yes" noeol
        file_tree_delete (forum_path f d "/patch"+path)
        goto_backward
      button "no"
        goto_backward
    eif options="list"
      var Array:FileInfo files := file_list (forum_path f d 
      for (var Int i) 0 files:size-1
        file_header path+files:i:name (var FileInfo old_info
        html "<pfile name=[dq]"+(html_encode files:i:name)+"
    else
      table columns 2 border 0
        cell [Path:]
        cell fixed:(text path)
      var Array:FileInfo patches := file_list (forum_path f 
      if patches:size=0
        head "<meta name=[dq]robots[dq] content=[dq]noindex,nofollow[dq]>[lf]"
      var (Index Str FileInfo) sorted
      for (var Int i) 0 patches:size-1
        if not patches:i:is_directory
          file_header (forum_path f d "/patch"+path)+patches
          html "<pfile name=[dq]"+(html_encode patches:i:nam
          patches:i:size := new_info size
          patches:i:datetime := new_info datetime
          patches:i:options += " changed_lines "+string:line
        else
          html "<pfile name=[dq]"+(html_encode patches:i:nam
          patches:i:options += " patched_directory"
        sorted insert patches:i:name patches:i 
      var Array:FileInfo files := file_list f:reference_path
      for (var Int i) 0 files:size-1
        if not exists:(sorted first files:i:name)
          sorted insert files:i:name files:i   
      table columns 4
        cell header
          bold [name]
        cell header
          bold [size]
        cell header
          bold [date ]
          note "*"
            title "Pliant date format"
            [The date is displayed using] ; fixed [ ] ; ital
        cell header
          void
        var Pointer:FileInfo file :> sorted first
        while exists:file
          if file:is_directory
            if (file:options option "patched_directory")
      var (Index Str FileInfo) sorted
      for (var Int i) 0 patches:size-1
        if not patches:i:is_directory
          file_header (forum_path f d "/patch"+path)+patches
          html "<pfile name=[dq]"+(html_encode patches:i:nam
          patches:i:size := new_info size
          patches:i:datetime := new_info datetime
          patches:i:options += " changed_lines "+string:line
        else
          html "<pfile name=[dq]"+(html_encode patches:i:nam
          patches:i:options += " patched_directory"
        sorted insert patches:i:name patches:i 
      var Array:FileInfo files := file_list f:reference_path
      for (var Int i) 0 files:size-1
        if not exists:(sorted first files:i:name)
          sorted insert files:i:name files:i   
      table columns 4
        cell header
          bold [name]
        cell header
          bold [size]
        cell header
          bold [date ]
          note "*"
            title "Pliant date format"
            [The date is displayed using] ; fixed [ ] ; ital
        cell header
          void
        var Pointer:FileInfo file :> sorted first
        while exists:file
          if file:is_directory
            if (file:options option "patched_directory")
              cell color lsh 80 30 60
              cell color (color hsl 60 30 80)
                bold
                  link file:name file:name options "browse"
            else
              cell
                bold
                  link file:name file:name options "browse"
            cell void ; cell void
            cell
              small
                if (file_list path+file:name standard+direct
                  link "delete" file:name options "delete"
          else
            if (file:options option "changed_lines")
                bold
                  link file:name file:name options "browse"
            else
              cell
                bold
                  link file:name file:name options "browse"
            cell void ; cell void
            cell
              small
                if (file_list path+file:name standard+direct
                  link "delete" file:name options "delete"
          else
            if (file:options option "changed_lines")
              cell color lsh 80 30 60
              cell color (color hsl 60 30 80)
                text file:name
            else
              cell
                text file:name
            cell
              text (string file:size)
            cell
              text (string file:datetime)
            cell
              small
                var Str mime := query_mime_type file:extensi
                if not (mime parse "binary/" any) and not (m
                  link "view" file:name no_extension options
                  if patch
                    link "edit" file:name no_extension optio
                link "download" file:name no_extension optio
                if patch
                  link "delete" file:name no_extension optio
          file :> sorted next file
      if patch
        file_upload "" (var Str filename) noeol
        button "Upload"
          if (file_query filename standard)=defined
            var Str remote := filename option "remote_name" 
            if remote<>""
              file_difference f:reference_path+(path 1 path:
              file_hook (forum_path f d "/patch"+path)+remot
              d status := " "
              d update (forum_path f d "/")
              reload_page
            else
              [I have not received the file name !]
          else
            [I have not received the file !]
            para
              [The explaination might be that your browser d
              [If you wonder what browsers supports uploadin
        input "" (var Str filename2) noeol
        button "Create file" noeol
          (var Stream s) open (forum_path f d "/patch"+path)
          reload_page
        button "Create directory"
          file_tree_create (forum_path f d "/patch"+path)+fi
          reload_page
      para
        link "Browse the main tree" "/pliant/browse/file"+pa
      para
        [Yellow cells indicate that the file is modifyed in 


method page browse_file f d patch path options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg CBool pat
  var CBool patched := (file_query (forum_path f d "/patch"+
  if patched
    file_header (forum_path f d "/patch"+path) (var FileInfo
  implicit page
    if (options option "view") or (options option "review") 
      var Str section := (shunt (options option "rejected") 
      patched := (file_query (forum_path f d section+path) s
      table columns 1 border 0
                text file:name
            else
              cell
                text file:name
            cell
              text (string file:size)
            cell
              text (string file:datetime)
            cell
              small
                var Str mime := query_mime_type file:extensi
                if not (mime parse "binary/" any) and not (m
                  link "view" file:name no_extension options
                  if patch
                    link "edit" file:name no_extension optio
                link "download" file:name no_extension optio
                if patch
                  link "delete" file:name no_extension optio
          file :> sorted next file
      if patch
        file_upload "" (var Str filename) noeol
        button "Upload"
          if (file_query filename standard)=defined
            var Str remote := filename option "remote_name" 
            if remote<>""
              file_difference f:reference_path+(path 1 path:
              file_hook (forum_path f d "/patch"+path)+remot
              d status := " "
              d update (forum_path f d "/")
              reload_page
            else
              [I have not received the file name !]
          else
            [I have not received the file !]
            para
              [The explaination might be that your browser d
              [If you wonder what browsers supports uploadin
        input "" (var Str filename2) noeol
        button "Create file" noeol
          (var Stream s) open (forum_path f d "/patch"+path)
          reload_page
        button "Create directory"
          file_tree_create (forum_path f d "/patch"+path)+fi
          reload_page
      para
        link "Browse the main tree" "/pliant/browse/file"+pa
      para
        [Yellow cells indicate that the file is modifyed in 


method page browse_file f d patch path options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg CBool pat
  var CBool patched := (file_query (forum_path f d "/patch"+
  if patched
    file_header (forum_path f d "/patch"+path) (var FileInfo
  implicit page
    if (options option "view") or (options option "review") 
      var Str section := (shunt (options option "rejected") 
      patched := (file_query (forum_path f d section+path) s
      table columns 1 border 0
        cell color lsh 90 0 0
        cell color (color hsl 0 0 90)
          table columns 2 border 0
            cell [Patch title:]
            cell
              text d:title
            cell [Abstract:]
            cell
              table columns 1
          table columns 2 border 0
            cell [Patch title:]
            cell
              text d:title
            cell [Abstract:]
            cell
              table columns 1
                cell color lsh 80 10 60
                cell color (color hsl 60 10 80)
                  text d:abstract
            cell [File:]
            cell
              bold
                fixed text:path
            cell [Key:]
            cell
              table columns 2 border 0
                  text d:abstract
            cell [File:]
            cell
              bold
                fixed text:path
            cell [Key:]
            cell
              table columns 2 border 0
                cell color lsh 80 25 0
                cell color (color hsl 0 25 80)
                  fixed [   ]
                cell
                  [Removed line]
                  fixed [   ]
                cell
                  [Removed line]
                cell color lsh 80 25 120
                cell color (color hsl 120 25 80)
                  fixed [   ]
                cell
                  [Added line]
      if patched
        display_difference (forum_path f d section+path) (sh
      else
                  fixed [   ]
                cell
                  [Added line]
      if patched
        display_difference (forum_path f d section+path) (sh
      else
        head "<meta name=[dq]robots[dq] content=[dq]noindex,nofollow[dq]>[lf]"
        fixed
          (var Stream s0) open f:reference_path+(path 1 path
          while not s0:atend
            text s0:readline+"[lf]"
    eif options="edit" and patch
      if (patched and not binary) or file_is_ascii:path
        small
          bold text:path
          fixed [     ]
          if not patched
            new_info := file_query path standard
            text (string new_info:size)+" bytes last modifye
          eol
        var Stream s1
        if patched
          var Str temp := file_temporary
          file_extract_new (forum_path f d "/patch"+path) te
          s1 open temp in+safe
        else
          s1 open f:reference_path+(path 1 path:len) in+safe
        var Str all := ""
        while not s1:atend
          all += s1:readline+"[lf]"
        if patched
          file_delete temp
        text_input "" all columns 80 rows 35
        button "Update "+(path (path search_last "/" -1)+1 p
          var Str final := file_temporary
          (var Stream s2) open temp out+safe+mkdir
          s2 writechars all
          s2 close
          if (file_query (forum_path f d "/patch"+path) stan
            var Str temp := file_temporary
            file_extract_old (forum_path f d "/patch"+path) 
            file_difference temp final (forum_path f d "/pat
            file_delete temp
          else
            file_difference f:reference_path+(path 1 path:le
          file_hook (forum_path f d "/patch"+path) 
          file_delete final
          d status := " "
          d update (forum_path f d "/")
          goto_backward
      else
        [This is a binary file !]
    eif options="download"
      if patched
        var Str temp := file_temporary
        file_extract_new (forum_path f d "/patch"+path) temp
      reset_http_answer
      http_request send_static_file (shunt patched temp f:re
      if patched
        file_delete temp
    eif options="delete" and patch
      [Are you sure that you want to delete file] ; fixed:(t
      button "yes" noeol
        file_delete (forum_path f d "/patch"+path)
        file_hook (forum_path f d "/patch"+path)
        goto_backward
      button "no"
        goto_backward
    else
      if patched
        var Str temp := file_temporary
        file_extract_new (forum_path f d "/patch"+path) temp
      var Str ext := forum_path f d "/patch"+path
      ext := ext (ext search_last "." ext:len) ext:len
      var Str mime := query_mime_type ext
      reset_http_answer
      http_request send_static_file (shunt patched temp f:re
      if patched
        file_delete temp





method page display f d post maintainer patch options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg_rw Data:F
  implicit page
    html "<title>"+(html_encode f:title)+"</title>[lf]"
    table columns 1 border 0
        fixed
          (var Stream s0) open f:reference_path+(path 1 path
          while not s0:atend
            text s0:readline+"[lf]"
    eif options="edit" and patch
      if (patched and not binary) or file_is_ascii:path
        small
          bold text:path
          fixed [     ]
          if not patched
            new_info := file_query path standard
            text (string new_info:size)+" bytes last modifye
          eol
        var Stream s1
        if patched
          var Str temp := file_temporary
          file_extract_new (forum_path f d "/patch"+path) te
          s1 open temp in+safe
        else
          s1 open f:reference_path+(path 1 path:len) in+safe
        var Str all := ""
        while not s1:atend
          all += s1:readline+"[lf]"
        if patched
          file_delete temp
        text_input "" all columns 80 rows 35
        button "Update "+(path (path search_last "/" -1)+1 p
          var Str final := file_temporary
          (var Stream s2) open temp out+safe+mkdir
          s2 writechars all
          s2 close
          if (file_query (forum_path f d "/patch"+path) stan
            var Str temp := file_temporary
            file_extract_old (forum_path f d "/patch"+path) 
            file_difference temp final (forum_path f d "/pat
            file_delete temp
          else
            file_difference f:reference_path+(path 1 path:le
          file_hook (forum_path f d "/patch"+path) 
          file_delete final
          d status := " "
          d update (forum_path f d "/")
          goto_backward
      else
        [This is a binary file !]
    eif options="download"
      if patched
        var Str temp := file_temporary
        file_extract_new (forum_path f d "/patch"+path) temp
      reset_http_answer
      http_request send_static_file (shunt patched temp f:re
      if patched
        file_delete temp
    eif options="delete" and patch
      [Are you sure that you want to delete file] ; fixed:(t
      button "yes" noeol
        file_delete (forum_path f d "/patch"+path)
        file_hook (forum_path f d "/patch"+path)
        goto_backward
      button "no"
        goto_backward
    else
      if patched
        var Str temp := file_temporary
        file_extract_new (forum_path f d "/patch"+path) temp
      var Str ext := forum_path f d "/patch"+path
      ext := ext (ext search_last "." ext:len) ext:len
      var Str mime := query_mime_type ext
      reset_http_answer
      http_request send_static_file (shunt patched temp f:re
      if patched
        file_delete temp





method page display f d post maintainer patch options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg_rw Data:F
  implicit page
    html "<title>"+(html_encode f:title)+"</title>[lf]"
    table columns 1 border 0
      cell color lsh 65 20 60
      cell color (color hsl 60 25 80)
        para
          center (bold (text f:title))
        if maintainer or (user_name<>"" and user_name=d:main
          para
            select "" d:subject noeol
              option "" ""
              each su f:subject sort su:order
                option su:label keyof:su
            input "" d:title length 60
          text_input "" d:abstract columns 60 rows 8
        else
          para
            if (exists f:subject:(d:subject))
              italic (text f:subject:(d:subject):label+": ")
            bold (text d:title)
          text d:abstract
      if f:reference_path<>"" and (maintainer or (user_name<
        para
          center (bold (text f:title))
        if maintainer or (user_name<>"" and user_name=d:main
          para
            select "" d:subject noeol
              option "" ""
              each su f:subject sort su:order
                option su:label keyof:su
            input "" d:title length 60
          text_input "" d:abstract columns 60 rows 8
        else
          para
            if (exists f:subject:(d:subject))
              italic (text f:subject:(d:subject):label+": ")
            bold (text d:title)
          text d:abstract
      if f:reference_path<>"" and (maintainer or (user_name<
        cell color lsh 65 20 60
        cell color (color hsl 60 20 65)
          each m d:maintainer
            text m ; eol
          if patch and (user_name=d:maintainer:"creator" or 
            input "Maintainer name: " (var Str name) noeol
            button "Add new maintainer" noeol
              if (exists user:name)
                var Str key := "m"+(string datetime:seconds)
                d:maintainer create key
                d:maintainer key := name
                reload_page
              else
                [There is no ] ; fixed text:name ; [ user de
            button "Remove maintainer"
              part remove
                each m d:maintainer
                  if m=name and (keyof:m<>"creator" or allow
                    d:maintainer delete keyof:m
                    leave remove
              reload_page
      if maintainer
          each m d:maintainer
            text m ; eol
          if patch and (user_name=d:maintainer:"creator" or 
            input "Maintainer name: " (var Str name) noeol
            button "Add new maintainer" noeol
              if (exists user:name)
                var Str key := "m"+(string datetime:seconds)
                d:maintainer create key
                d:maintainer key := name
                reload_page
              else
                [There is no ] ; fixed text:name ; [ user de
            button "Remove maintainer"
              part remove
                each m d:maintainer
                  if m=name and (keyof:m<>"creator" or allow
                    d:maintainer delete keyof:m
                    leave remove
              reload_page
      if maintainer
        cell color lsh 65 20 60
        cell color (color hsl 60 20 65)
          read_only not maintainer
            select "" d:status noeol
              option "" ""
              each st f:status sort st:order
                option st:label keyof:st
          button "Record changes"
            goto_backward
      if f:reference_path<>""
        var Array:FileInfo patches := file_list (forum_path 
        cell void
        cell
          table columns 2 border 0
            cell
              [Patch] ; fixed { [ ] ; bold (text keyof:d) ; 
              if maintainer
                button "Apply all"
                  title "Apply all the patch"
                  study_patch f:reference_path (forum_path f
                  button "Apply the patch"
                    apply_patch f:reference_path f:live_path
                    each s d:patch_section
                      if s:release=""
                        s release := string pliant_release_n
                    goto_backward
                button "Reverse all"
                  title "Reverse all the patch"
                  study_reverse f:reference_path (forum_path
                  button "Reverse the patch"
                    reverse_patch f:reference_path f:live_pa
                    goto_backward
            cell
              table columns 3
               cell header [Patch section]
               cell header
                 [Release ]
                 note "*"
                   [The Pliant release in which the patch ha
               cell void
               each s d:patch_section
                 cell 
                   text keyof:s
                 cell
                   read_only not maintainer
                     input "" s:release length 5
                 cell
                   if maintainer
                     button "Apply" noeol
                       title "Apply patch"
                       study_patch f:reference_path (forum_p
                       button "Apply the patch"
                         apply_patch f:reference_path f:live
                         if s:release=""
                           s release := string pliant_releas
                         goto_backward
                     button "Reverse" noeol
                       title "Reverse patch"
                       study_reverse f:reference_path (forum
                       button "Reverse the patch"
                         reverse_patch f:reference_path f:li
                         goto_backward
               if maintainer
                 cell
                   input "" (var Str section_id) length 12
                 cell void
                 cell
                   button "Create" noeol
                     d:patch_section create section_id
                     reload_page
                   button "Delete" noeol
                     d:patch_section delete section_id
                     reload_page
        cell
          if f:live_path<>"" and maintainer
            button "Include live changes" noeol
              title "Include live changes"
              study_live_changes f:reference_path f:live_pat
              input "Include only the changes in: " (var Str
              button "Include the changes"
                catch_live_changes f:reference_path f:live_p
                d update (forum_path f d "/")
                goto_backward
            fixed [  ]
          if (file_query (forum_path f d "/rejected/") stand
            button "Drop rejected changes" noeol
              title "Drop rejected changes"
              var Array:FileInfo rejected := file_list (foru
              table border 0 columns 3
                for (var Int i) 0 rejected:size-1
                  file_header (forum_path f d "/rejected/"+r
                  cell
                    link rejected:i:name rejected:i:name no_
                  cell
                    if binary2
                      text (string new_info2:size)+" byte"+(
                    eif lines2=defined
                      text string:lines2+" modified line"+(s
                  cell
                    link "review" rejected:i:name no_extensi
              button "Drop rejected changes"
                file_tree_delete (forum_path f d "/rejected/
                goto_backward
            fixed [  ]
          if maintainer
            button "Upload to another server" noeol
              title "Upload patch"
              input "Server to upload the patch to: " (var S
              button "Upload"
                var ExtendedStatus st2 := patch_upload keyof
                if st2=success
                  goto_backward
                else
                  [Failed to upload the patch.] ; eol
                  fixed (text st2:message)
        cell
          table border 0 columns 5
            for (var Int i) 0 patches:size-1
              file_header (forum_path f d "/patch/"+patches:
              cell
                link patches:i:name patches:i:name no_extens
              cell
                if (exists sections:first)
                  small
                    var Pointer:Str section :> sections firs
                    while exists:section
                      text " "+section
                      section :> sections next section
              cell
                text (string patches:i:datetime)
              cell
                if binary
                  text (string new_info:size)+" byte"+(shunt
                eif lines=defined
                  text string:lines+" modified line"+(shunt 
              cell
                var Str dir := patches:i:name ; dir := dir 0
                link "browse" dir options "browse" no_extens
                fixed [ ]
                link "review" patches:i:name no_extension op
                if (file_query (forum_path f d "/rejected/"+
                  fixed [ ]
                  link "review rejected changes" patches:i:n
        cell
          link "Browse patch files tree" "" options "browse"
          link "Download the patch" keyof:d+".patch" options
          if patch
            fixed [  ] ; link "Upload the patch" "" options 
          fixed [  ] ; link "Download as a ready to extract 
        cell void
      each msg d:message
          read_only not maintainer
            select "" d:status noeol
              option "" ""
              each st f:status sort st:order
                option st:label keyof:st
          button "Record changes"
            goto_backward
      if f:reference_path<>""
        var Array:FileInfo patches := file_list (forum_path 
        cell void
        cell
          table columns 2 border 0
            cell
              [Patch] ; fixed { [ ] ; bold (text keyof:d) ; 
              if maintainer
                button "Apply all"
                  title "Apply all the patch"
                  study_patch f:reference_path (forum_path f
                  button "Apply the patch"
                    apply_patch f:reference_path f:live_path
                    each s d:patch_section
                      if s:release=""
                        s release := string pliant_release_n
                    goto_backward
                button "Reverse all"
                  title "Reverse all the patch"
                  study_reverse f:reference_path (forum_path
                  button "Reverse the patch"
                    reverse_patch f:reference_path f:live_pa
                    goto_backward
            cell
              table columns 3
               cell header [Patch section]
               cell header
                 [Release ]
                 note "*"
                   [The Pliant release in which the patch ha
               cell void
               each s d:patch_section
                 cell 
                   text keyof:s
                 cell
                   read_only not maintainer
                     input "" s:release length 5
                 cell
                   if maintainer
                     button "Apply" noeol
                       title "Apply patch"
                       study_patch f:reference_path (forum_p
                       button "Apply the patch"
                         apply_patch f:reference_path f:live
                         if s:release=""
                           s release := string pliant_releas
                         goto_backward
                     button "Reverse" noeol
                       title "Reverse patch"
                       study_reverse f:reference_path (forum
                       button "Reverse the patch"
                         reverse_patch f:reference_path f:li
                         goto_backward
               if maintainer
                 cell
                   input "" (var Str section_id) length 12
                 cell void
                 cell
                   button "Create" noeol
                     d:patch_section create section_id
                     reload_page
                   button "Delete" noeol
                     d:patch_section delete section_id
                     reload_page
        cell
          if f:live_path<>"" and maintainer
            button "Include live changes" noeol
              title "Include live changes"
              study_live_changes f:reference_path f:live_pat
              input "Include only the changes in: " (var Str
              button "Include the changes"
                catch_live_changes f:reference_path f:live_p
                d update (forum_path f d "/")
                goto_backward
            fixed [  ]
          if (file_query (forum_path f d "/rejected/") stand
            button "Drop rejected changes" noeol
              title "Drop rejected changes"
              var Array:FileInfo rejected := file_list (foru
              table border 0 columns 3
                for (var Int i) 0 rejected:size-1
                  file_header (forum_path f d "/rejected/"+r
                  cell
                    link rejected:i:name rejected:i:name no_
                  cell
                    if binary2
                      text (string new_info2:size)+" byte"+(
                    eif lines2=defined
                      text string:lines2+" modified line"+(s
                  cell
                    link "review" rejected:i:name no_extensi
              button "Drop rejected changes"
                file_tree_delete (forum_path f d "/rejected/
                goto_backward
            fixed [  ]
          if maintainer
            button "Upload to another server" noeol
              title "Upload patch"
              input "Server to upload the patch to: " (var S
              button "Upload"
                var ExtendedStatus st2 := patch_upload keyof
                if st2=success
                  goto_backward
                else
                  [Failed to upload the patch.] ; eol
                  fixed (text st2:message)
        cell
          table border 0 columns 5
            for (var Int i) 0 patches:size-1
              file_header (forum_path f d "/patch/"+patches:
              cell
                link patches:i:name patches:i:name no_extens
              cell
                if (exists sections:first)
                  small
                    var Pointer:Str section :> sections firs
                    while exists:section
                      text " "+section
                      section :> sections next section
              cell
                text (string patches:i:datetime)
              cell
                if binary
                  text (string new_info:size)+" byte"+(shunt
                eif lines=defined
                  text string:lines+" modified line"+(shunt 
              cell
                var Str dir := patches:i:name ; dir := dir 0
                link "browse" dir options "browse" no_extens
                fixed [ ]
                link "review" patches:i:name no_extension op
                if (file_query (forum_path f d "/rejected/"+
                  fixed [ ]
                  link "review rejected changes" patches:i:n
        cell
          link "Browse patch files tree" "" options "browse"
          link "Download the patch" keyof:d+".patch" options
          if patch
            fixed [  ] ; link "Upload the patch" "" options 
          fixed [  ] ; link "Download as a ready to extract 
        cell void
      each msg d:message
        cell color lsh 70 15 60
        cell color (color hsl 60 15 70)
          [Message posted by] ; fixed (text " "+msg:user+" "
          [Message posted by] ; fixed (text " "+msg:user+" "
        cell color lsh 80 10 60
        cell color (color hsl 60 10 80)
          if msg:encoding=""
            fixed
              text msg:message
          else
            html msg:message
    if post
      button "Post a new message"
        title "New message"
        if user_name=""
          input "Your name: " (var Str name)
        text_input "" (var Str message) columns 80 rows 20
        select "Message format:" (var Str encoding)
          option "Simple text" ""
          option "HTML" "html"
        button "Preview the message"
          var Str user := shunt user_name<>"" user_name "may
          title "Message preview"
          table columns 1
          if msg:encoding=""
            fixed
              text msg:message
          else
            html msg:message
    if post
      button "Post a new message"
        title "New message"
        if user_name=""
          input "Your name: " (var Str name)
        text_input "" (var Str message) columns 80 rows 20
        select "Message format:" (var Str encoding)
          option "Simple text" ""
          option "HTML" "html"
        button "Preview the message"
          var Str user := shunt user_name<>"" user_name "may
          title "Message preview"
          table columns 1
            cell color lsh 65 20 60
            cell color (color hsl 60 20 65)
              para
                center (bold (text f:title))
              para
                if (exists f:subject:(d:subject))
                  italic (text f:subject:(d:subject):label+"
                bold (text d:title)
              text d:abstract
              para
                center (bold (text f:title))
              para
                if (exists f:subject:(d:subject))
                  italic (text f:subject:(d:subject):label+"
                bold (text d:title)
              text d:abstract
            cell color lsh 70 15 60
            cell color (color hsl 60 15 70)
              [Message posted by] ; fixed (text " "+user+" "
              [Message posted by] ; fixed (text " "+user+" "
            cell color lsh 80 10 60
            cell color (color hsl 60 10 80)
              if encoding=""
                fixed
                  text message
              else
                html message
          button "Post the message" noeol
            var DateTime now := datetime
            var Str id := generate_id
            d:message create id
            var Data:ForumMessage msg2 :> d:message id
            msg2 user := user
            msg2 datetime := now
            msg2 encoding := encoding
            msg2 message := message
            d last_author := user
            d last_message := now
            post_message f d msg2 "i"
            goto_backward 2
          button "Edit again"
            page html "<script language=[dq]JavaScript[dq]>[
            page html "history.go(-2)[lf]"
            page html "</script>[lf]"
   


method page display f post maintainer options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg CBool pos
  implicit page
    title f:title
              if encoding=""
                fixed
                  text message
              else
                html message
          button "Post the message" noeol
            var DateTime now := datetime
            var Str id := generate_id
            d:message create id
            var Data:ForumMessage msg2 :> d:message id
            msg2 user := user
            msg2 datetime := now
            msg2 encoding := encoding
            msg2 message := message
            d last_author := user
            d last_message := now
            post_message f d msg2 "i"
            goto_backward 2
          button "Edit again"
            page html "<script language=[dq]JavaScript[dq]>[
            page html "history.go(-2)[lf]"
            page html "</script>[lf]"
   


method page display f post maintainer options
  arg_rw HtmlPage page ; arg_rw Data:Forum f ; arg CBool pos
  implicit page
    title f:title
    note inline
    box border 1
      text f:abstract
    var DateTime now := datetime
    var Str status := options option "status" Str
    var CBool all := options option "all"
    var CBool patches := f:reference_path<>""
    var Float hue := http_request:style_options option "hue"
    if hue=undefined
      hue := 120
    var CBool upgrade := false
    if (options option "detailed")
      table columns 2+(shunt patches 1 0)+(shunt maintainer 
      text f:abstract
    var DateTime now := datetime
    var Str status := options option "status" Str
    var CBool all := options option "all"
    var CBool patches := f:reference_path<>""
    var Float hue := http_request:style_options option "hue"
    if hue=undefined
      hue := 120
    var CBool upgrade := false
    if (options option "detailed")
      table columns 2+(shunt patches 1 0)+(shunt maintainer 
        cell color lsh 70 8 hue [Subject]
        cell color lsh 70 8 hue [Messages]
        cell color (color hsl hue 8 70) [Subject]
        cell color (color hsl hue 8 70) [Messages]
        if patches
        if patches
          cell color lsh 70 8 hue [Files]
          cell color (color hsl hue 8 70) [Files]
        if maintainer
          cell void
        each d f:debate filter (status="" or d:status=status
          cell header
            para
              if (exists f:subject:(d:subject))
                italic (text f:subject:(d:subject):label+": 
              link (shunt d:title<>"" d:title "no title") ke
            text d:abstract
          cell header
            para
              italic (text (shunt  (exists f:status:(d:statu
            var Int n := d:message:size
            if n>0
              text string:n+" message"+(shunt n>1 "s" "") ; 
              how_long_ago d:last_message now ; eol
              text d:last_author
          if patches
            cell header
              if false # para
                italic
                  text (shunt d:patch_status="A" "applied" d
                  if d:patch_release<>""
                    text " in release "+d:patch_release
              var Int n := d patch_count
              if n>0
                text string:n+" file"+(shunt n>1 "s" "") ; e
                how_long_ago d:last_patch now
                each m d:maintainer
                  eol ; text m
          if maintainer
            cell
              button "Delete"
                title "Delete a patch"
                [Patch title: ] ; fixed (text d:title) ; eol
                [Patch maintainers:]
                each m d:maintainer
                  fixed (text " "+m)
                eol
                button "Do delete it"
                  file_tree_delete (forum_path f d "/")
                  f:debate delete keyof:d
                  goto_backward
    else
      table columns 5 border 0
        cell header [Subject]
        cell header small:[Messages[lf]count]
        cell header small:[Last post]
        cell header [By]
        cell header small:[Status]
        each d f:debate filter (status="" or d:status=status
          cell
            if (exists f:subject:(d:subject))
              italic (text f:subject:(d:subject):label+": ")
            link (shunt d:title<>"" d:title "no title") keyo
          cell
            text (string d:message:size)
          cell
            if d:last_message=defined
              how_long_ago d:last_message now
          cell
            text d:last_author
          cell
            if (exists f:status:(d:status))
              small (italic (text f:status:(d:status):label)
            if d:path<>""
              upgrade := true
            if false #  d:patch_status<>""
              eol
              small
                italic
                  text (shunt d:patch_status="A" "applied" d
                  if d:patch_release<>""
                    text " "+d:patch_release
    if post
      para
        button "Open a new debate" noeol
          title f:title+": create a new debate"
          if user_name=""
            input "Your name: " (var Str name)
          if f:subject:size>0
            select "Subject: " (var Str subject)
              option "" ""
              each su f:subject sort su:order
                option su:label keyof:su
          input "Title: " (var Str title) length 60
          para
            text_input "Abstract: " (var Str abstract) colum
            italic [The abstract is always in simple text fo
          para
            [Initial message: ] ; eol
            text_input "" (var Str message) columns 80 rows 
            select "Message format:" (var Str encoding)
              option "Simple text" ""
              option "HTML" "html"
          button "Preview the new debate"
            var Str user := shunt user_name<>"" user_name "m
            title "Message preview"
            table columns 1
        if maintainer
          cell void
        each d f:debate filter (status="" or d:status=status
          cell header
            para
              if (exists f:subject:(d:subject))
                italic (text f:subject:(d:subject):label+": 
              link (shunt d:title<>"" d:title "no title") ke
            text d:abstract
          cell header
            para
              italic (text (shunt  (exists f:status:(d:statu
            var Int n := d:message:size
            if n>0
              text string:n+" message"+(shunt n>1 "s" "") ; 
              how_long_ago d:last_message now ; eol
              text d:last_author
          if patches
            cell header
              if false # para
                italic
                  text (shunt d:patch_status="A" "applied" d
                  if d:patch_release<>""
                    text " in release "+d:patch_release
              var Int n := d patch_count
              if n>0
                text string:n+" file"+(shunt n>1 "s" "") ; e
                how_long_ago d:last_patch now
                each m d:maintainer
                  eol ; text m
          if maintainer
            cell
              button "Delete"
                title "Delete a patch"
                [Patch title: ] ; fixed (text d:title) ; eol
                [Patch maintainers:]
                each m d:maintainer
                  fixed (text " "+m)
                eol
                button "Do delete it"
                  file_tree_delete (forum_path f d "/")
                  f:debate delete keyof:d
                  goto_backward
    else
      table columns 5 border 0
        cell header [Subject]
        cell header small:[Messages[lf]count]
        cell header small:[Last post]
        cell header [By]
        cell header small:[Status]
        each d f:debate filter (status="" or d:status=status
          cell
            if (exists f:subject:(d:subject))
              italic (text f:subject:(d:subject):label+": ")
            link (shunt d:title<>"" d:title "no title") keyo
          cell
            text (string d:message:size)
          cell
            if d:last_message=defined
              how_long_ago d:last_message now
          cell
            text d:last_author
          cell
            if (exists f:status:(d:status))
              small (italic (text f:status:(d:status):label)
            if d:path<>""
              upgrade := true
            if false #  d:patch_status<>""
              eol
              small
                italic
                  text (shunt d:patch_status="A" "applied" d
                  if d:patch_release<>""
                    text " "+d:patch_release
    if post
      para
        button "Open a new debate" noeol
          title f:title+": create a new debate"
          if user_name=""
            input "Your name: " (var Str name)
          if f:subject:size>0
            select "Subject: " (var Str subject)
              option "" ""
              each su f:subject sort su:order
                option su:label keyof:su
          input "Title: " (var Str title) length 60
          para
            text_input "Abstract: " (var Str abstract) colum
            italic [The abstract is always in simple text fo
          para
            [Initial message: ] ; eol
            text_input "" (var Str message) columns 80 rows 
            select "Message format:" (var Str encoding)
              option "Simple text" ""
              option "HTML" "html"
          button "Preview the new debate"
            var Str user := shunt user_name<>"" user_name "m
            title "Message preview"
            table columns 1
              cell color lsh 65 20 60
              cell color (color hsl 60 20 65)
                para
                  center (bold (text f:title))
                para
                  if (exists f:subject:subject)
                    italic (text f:subject:subject:label+": 
                  bold text:title
                text abstract
                para
                  center (bold (text f:title))
                para
                  if (exists f:subject:subject)
                    italic (text f:subject:subject:label+": 
                  bold text:title
                text abstract
              cell color lsh 70 15 60
              cell color (color hsl 60 15 70)
                [Message posted by] ; fixed (text " "+user+"
                [Message posted by] ; fixed (text " "+user+"
              cell color lsh 80 10 60
              cell color (color hsl 60 10 80)
                if encoding=""
                  fixed
                    text message
                else
                  html message
            button "Post it now" noeol
              var Str id := generate_id
              f:debate create id
              var Data:ForumDebate d2 :> f:debate id
              var DateTime now := datetime
              d2 subpath := (string now:year)+(right (string
              d2 subject := subject
              d2 title := title
              d2 abstract := abstract
              d2 last_message := now
              d2:maintainer create "creator"
              d2:maintainer "creator" := user_name
              if message<>""
                d2:message create id
                var Data:ForumMessage msg2 :> d2:message id
                msg2 user := user
                msg2 datetime := now
                msg2 encoding := encoding
                msg2 message := message
                d2 update (forum_path f d2 "/patch/")
                post_message f d2 msg2 "i"
              goto_backward 2
            button "Edit again"
              page html "<script language=[dq]JavaScript[dq]
              page html "history.go(-2)[lf]"
              page html "</script>[lf]"
        if maintainer
          fixed [  ]
          button "Download from another server" noeol
            title "Download patch"
            input "Server: " (var Str server) noeol
            input "Patch: " (var Str patch_id) noeol
            button "Download"
              var ExtendedStatus st := patch_download keyof:
              if st=success
                goto_backward
              else
                [Failed to download the patch.] ; eol
                fixed (text st:message)
    if not (options option "detailed")
      para
        link "DETAILED VIEW" "" options options+" detailed"
    para
      if status="" and not all
        each st f:status
          if st:display_all_label<>""
            link st:display_all_label "" options options+" s
      if not all
        link "display all debates" "" options options+" all"
    if user_name<>""
      var Str freq := f:subscriber:user_name frequency
      select "I want to receive messages by email " freq noe
        option "Never" " "
        option "Once a week" "w"
        option "Once a day" "d"
        option "Once every hour" "h"
        option "Immediately" "i"
      var Str mailbox := f:subscriber:user_name mailbox
      if mailbox=""
        mailbox := user:user_name email
      input " at " mailbox noeol
      button "Do it now"
        if freq<>" " and mailbox<>""
          f:subscriber create user_name
          f:subscriber:user_name mailbox := mailbox
          f:subscriber:user_name frequency := freq 0
        else
          f:subscriber delete user_name
        reload_page
    else
      para
        if not post
          [If you want to open a new debate or subscribe thi
        else
          [If you want to subscribe this forum mailing list,
        [you should log in, after creating an account if you
        execute_dynamic_page "pliant:/pliant/protocol/http/l
    if maintainer
      para
        button "Display subscribers list" noeol
          title "Subscribers to "+f:title
          table columns 3
            cell header [User]
            cell header [Mailbox]
            cell header [Frequency]
            for (var Int lap) 0 3
              each sc f:subscriber
                if sc:frequency="ihdw":lap
                  cell
                    fixed (text keyof:sc)
                  cell
                    text sc:mailbox
                  cell
                    text (shunt lap=0 "immediatly" lap=1 "ho
          var Int n := f:subscriber:size
          text "There "+(shunt n>1 "are" "is" )+" " +(shunt 
          var Array:FileInfo files := file_list f:path+"out/
          var Int n := 0
          for (var Int i) 0 files:size-1
            if files:i:extension=".mail"
              n += 1
          text "There "+(shunt n>1 "are" "is" )+" "+(shunt n
        if upgrade
          button "Move to conforming location" noeol
            f path := "data:/pliant/forum/"+keyof:f+"/"
            f url := "http://"+computer_fullname+"/pliant/br
            each d4 f:debate
              if d4:path<>""
                var Str old := d4 path
                d4 path := ""
                var DateTime now := d4 last_patch
                if now=undefined
                  now := datetime
                d4 subpath := (string now:year)+(right (stri
                file_tree_copy old (forum_path f d4 "/patch/
                file_tree_delete old
            reload_page
        button "Recompute patches informations"
          each d3 f:debate
            d3 update (forum_path f d3 "/patch/")
          reload_page



                if encoding=""
                  fixed
                    text message
                else
                  html message
            button "Post it now" noeol
              var Str id := generate_id
              f:debate create id
              var Data:ForumDebate d2 :> f:debate id
              var DateTime now := datetime
              d2 subpath := (string now:year)+(right (string
              d2 subject := subject
              d2 title := title
              d2 abstract := abstract
              d2 last_message := now
              d2:maintainer create "creator"
              d2:maintainer "creator" := user_name
              if message<>""
                d2:message create id
                var Data:ForumMessage msg2 :> d2:message id
                msg2 user := user
                msg2 datetime := now
                msg2 encoding := encoding
                msg2 message := message
                d2 update (forum_path f d2 "/patch/")
                post_message f d2 msg2 "i"
              goto_backward 2
            button "Edit again"
              page html "<script language=[dq]JavaScript[dq]
              page html "history.go(-2)[lf]"
              page html "</script>[lf]"
        if maintainer
          fixed [  ]
          button "Download from another server" noeol
            title "Download patch"
            input "Server: " (var Str server) noeol
            input "Patch: " (var Str patch_id) noeol
            button "Download"
              var ExtendedStatus st := patch_download keyof:
              if st=success
                goto_backward
              else
                [Failed to download the patch.] ; eol
                fixed (text st:message)
    if not (options option "detailed")
      para
        link "DETAILED VIEW" "" options options+" detailed"
    para
      if status="" and not all
        each st f:status
          if st:display_all_label<>""
            link st:display_all_label "" options options+" s
      if not all
        link "display all debates" "" options options+" all"
    if user_name<>""
      var Str freq := f:subscriber:user_name frequency
      select "I want to receive messages by email " freq noe
        option "Never" " "
        option "Once a week" "w"
        option "Once a day" "d"
        option "Once every hour" "h"
        option "Immediately" "i"
      var Str mailbox := f:subscriber:user_name mailbox
      if mailbox=""
        mailbox := user:user_name email
      input " at " mailbox noeol
      button "Do it now"
        if freq<>" " and mailbox<>""
          f:subscriber create user_name
          f:subscriber:user_name mailbox := mailbox
          f:subscriber:user_name frequency := freq 0
        else
          f:subscriber delete user_name
        reload_page
    else
      para
        if not post
          [If you want to open a new debate or subscribe thi
        else
          [If you want to subscribe this forum mailing list,
        [you should log in, after creating an account if you
        execute_dynamic_page "pliant:/pliant/protocol/http/l
    if maintainer
      para
        button "Display subscribers list" noeol
          title "Subscribers to "+f:title
          table columns 3
            cell header [User]
            cell header [Mailbox]
            cell header [Frequency]
            for (var Int lap) 0 3
              each sc f:subscriber
                if sc:frequency="ihdw":lap
                  cell
                    fixed (text keyof:sc)
                  cell
                    text sc:mailbox
                  cell
                    text (shunt lap=0 "immediatly" lap=1 "ho
          var Int n := f:subscriber:size
          text "There "+(shunt n>1 "are" "is" )+" " +(shunt 
          var Array:FileInfo files := file_list f:path+"out/
          var Int n := 0
          for (var Int i) 0 files:size-1
            if files:i:extension=".mail"
              n += 1
          text "There "+(shunt n>1 "are" "is" )+" "+(shunt n
        if upgrade
          button "Move to conforming location" noeol
            f path := "data:/pliant/forum/"+keyof:f+"/"
            f url := "http://"+computer_fullname+"/pliant/br
            each d4 f:debate
              if d4:path<>""
                var Str old := d4 path
                d4 path := ""
                var DateTime now := d4 last_patch
                if now=undefined
                  now := datetime
                d4 subpath := (string now:year)+(right (stri
                file_tree_copy old (forum_path f d4 "/patch/
                file_tree_delete old
            reload_page
        button "Recompute patches informations"
          each d3 f:debate
            d3 update (forum_path f d3 "/patch/")
          reload_page