Patch title: Release 84 bulk changes
Abstract:
File: /pliant/protocol/http/common/virtual_tree.page
Key:
    Removed line
    Added line
module "/pliant/language/context.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/image/pixmap.pli"
module "/pliant/graphic/image/antialiasing.pli"
module "/pliant/graphic/color/gamut.pli"
module "/pliant/graphic/filter/io.pli"
module "/pliant/util/encoding/date.pli"
module "/pliant/protocol/http/style/common.pli"
module "cache.pli"

constant debug false

constant page_datetime (file_query "/pliant/protocol/http/common/virtual_tree.page" standard):datetime


method img rectangle x0 y0 x1 y1 p
  oarg_rw ImagePixmap img ; arg Int x0 y0 x1 y1 ; arg PixelRGB888 p
  img fill x0 y0 x1-x0+1 y1-y0+1 addressof:p

method img circle cx cy r p
  oarg_rw ImagePixmap img ; arg Int cx cy r ; arg PixelRGB888 p
  for (var Int y) cy-r cy+r
    if y>=0 and y<img:size_y
      for (var Int x) cx-r cx+r
        if x>=0 and x<img:size_x
          if (x-cx)*(x-cx)+(y-cy)*(y-cy)<=r*r
            (img pixel x y) map PixelRGB888 := p


if not (http_request modified_since page_datetime)
  reset_http_answer
  http_request answer_status := "304 Not modified"
  http_request answer_is_dynamic := false
  http_request send_header
  http_request send_footer
  return

if virtual_path="/pliant.js"
  reset_http_answer
  http_request answer_mime_type := "application/x-javascript"
  http_request answer_datetime := page_datetime
  http_request answer_is_dynamic := false
  http_request send_header

  http_stream writeline "function refresh(focus) {"
  # http_stream writeline "  if(document.pliant._pliant_reload.value=='true') {"
  # http_stream writeline "    window.status='Pliant reload'"
  # http_stream writeline "    window.location.reload(true)"
  # http_stream writeline "    return"
  # http_stream writeline "  }"
  http_stream writeline "  if(focus) window.focus()"
  http_stream writeline "  if(window.name.substring(0,6)=='_back_' && window.name.substring(7,8)=='_') {"
  http_stream writeline "    var count = window.name.charCodeAt(6)-64"
  http_stream writeline "    window.name = window.name.substring(8,window.name.length)"
  http_stream writeline "    history.go(-count)"
  http_stream writeline "    return"
  http_stream writeline "  }"
  http_stream writeline "  if(window.name.substring(0,8)=='_reload_') {"
  http_stream writeline "    window.name = window.name.substring(8,window.name.length)"
  http_stream writeline "    window.location = window.location.href"
  http_stream writeline "    return"
  http_stream writeline "  }"
  http_stream writeline "  while(window.name.substring(0,4)=='_xy_' && window.name.substring(12,13)=='_') {"
  http_stream writeline "    var spos = window.name.substring(4,12)"
  http_stream writeline "    var xpos = (spos.charCodeAt(0)-65)*17576+(spos.charCodeAt(1)-65)*676+(spos.charCodeAt(2)-65)*26+spos.charCodeAt(3)-65"
  http_stream writeline "    var ypos = (spos.charCodeAt(4)-65)*17576+(spos.charCodeAt(5)-65)*676+(spos.charCodeAt(6)-65)*26+spos.charCodeAt(7)-65"
  http_stream writeline "    window.scrollTo(xpos,ypos)"
  http_stream writeline "    window.name = window.name.substring(13,window.name.length)"
  http_stream writeline "  }"
  http_stream writeline "}"

  if page:http_request:browser_model="konqueror"
    http_stream writeline "var current"
    http_stream writeline "function textin(f) {"
    http_stream writeline "  current = f.value"
    http_stream writeline "}"
    http_stream writeline "function textout(f) {"
    http_stream writeline "  if(f.value!=current && f.name.substring(0,1)=='|') {"
    http_stream writeline "    f.name = 'data'+f.name"
    http_stream writeline "  }"
    if debug
      http_stream writeline "status = 'textout '+f.type+' '+f.name+' -> ' +f.value"
    http_stream writeline "}"
    http_stream writeline "function selectin(f) {"
    http_stream writeline "  current = f.selectedIndex"
    http_stream writeline "}"
    http_stream writeline "function selectout(f) {"
    http_stream writeline "  if(f.selectedIndex!=current && f.name.substring(0,1)=='|') {"
    http_stream writeline "    f.name = 'data'+f.name"
    http_stream writeline "  }"
    if debug
      http_stream writeline "status = 'selectout '+f.type+' '+f.name+' -> ' +f.selectedIndex+' ('+f.value+')'"
    http_stream writeline "}"
  else
    http_stream writeline "function change(f) {"
    http_stream writeline "  if(f.name.substring(0,1)=='|') {"
    http_stream writeline "    f.name = 'data'+f.name"
    http_stream writeline "  }"
    if debug
      http_stream writeline "status = 'change '+f.type+' '+f.name+' -> ' +f.value"
    http_stream writeline "}"

    http_stream writeline "function complete(f) {"
    # http_stream writeline "  document.pliant._pliant_reload.value = 'true'"
    if http_request:browser_model="konqueror"
      http_stream writeline "  document.pliant.encoding = 'application/x-www-form-urlencoded'"
    http_stream writeline "  var more = true"
    http_stream writeline "  while(more) {"
    http_stream writeline "    more = false"
    http_stream writeline "    for(var i = 0; i<f.length; i++) {"
    http_stream writeline "      if(f.elements[lb]i[rb].name.substring(0,1)=='|') {"
    http_stream writeline "        if(f.elements[lb]i[rb].type=='select-one') {"
    http_stream writeline "          f.elements[lb]i[rb].options[lb]0[rb].value = ''"
    http_stream writeline "          f.elements[lb]i[rb].selectedIndex = 0"
    http_stream writeline "        } else {"
    http_stream writeline "          f.elements[lb]i[rb].value = ''"
    http_stream writeline "        }[lf]"
    http_stream writeline "        f.elements[lb]i[rb].name = ''"
    http_stream writeline "        more = true"
    http_stream writeline "      }"
    http_stream writeline "      if(f.elements[lb]i[rb].name.substring(0,12)=='file upload ') {"
    http_stream writeline "        if(f.elements[lb]i[rb].value!='') {"
    if http_request:browser_model="opera"
      http_stream writeline "          document.pliant.enctype = 'multipart/form-data'"
    else
      http_stream writeline "          document.pliant.encoding = 'multipart/form-data'"
    http_stream writeline "        }[lf]"
    http_stream writeline "      }"
    http_stream writeline "    }"
    http_stream writeline "  }"
    if http_request:browser_model="ie"
      http_stream writeline "  f._pliant_x.value = document.body.scrollLeft"
      http_stream writeline "  f._pliant_y.value = document.body.scrollTop"
    else
      http_stream writeline "  f._pliant_x.value = window.pageXOffset"
      http_stream writeline "  f._pliant_y.value = window.pageYOffset"
    http_stream writeline "  return true"
    http_stream writeline "}"

    http_stream writeline "function button_pressed(context,target) {"
    http_stream writeline "  document.pliant._.name = context"
    http_stream writeline "  complete(document.pliant)"
    http_stream writeline "  if(target) document.pliant.target=target"
    http_stream writeline "  else document.pliant.target=window.name"
    http_stream writeline "  document.pliant.submit()"
    http_stream writeline "  if(target) window.setTimeout('document.pliant.target=window.name;',0)"
    http_stream writeline "}"
  http_request send_footer

eif (virtual_path parse "/corner_" (var Int corner) "_size_" (var Int size) "_color_" (var Int cr) "_" (var Int cg) "_" (var Int cb) "_ground_" (var Int gr) "_" (var Int gg) "_" (var Int gb) ".png")
  size := shunt size<1 1 size>64 64 size
  var Int aa := 4
  if gr<0 or gr>255 or gg<0 or gg>255 or gb<0 or gb>255
    return
  if cr<0 or cr>255 or cg<0 or cg>255 or cb<0 or cb>255
    return

  gvar Dictionary corners
  gvar Sem corners_sem

  corners_sem rd_request
  var Pointer:Arrow c :> corners first virtual_path
  var Link:Str bytes
  if c=null
    corners_sem rd_release
    corners_sem request
    if (corners first virtual_path)=null
      if corners:count>=256
        corners := var Dictionary empty_dictionary
      var Link:ImagePixmap img :> new ImagePixmap
      img setup (image_prototype 0 0 1 1 size*aa size*aa color_gamut:"rgb") ""
      img rectangle 0 0 size*aa-1 size*aa-1 (rgb_pixel gr gg gb)
      img circle (shunt (corner .and. 1)<>0 -1 size*aa) (shunt (corner .and. 2)<>0 -1 size*aa) size*aa (rgb_pixel cr cg cb)
      var Link:ImageAntiAliasing final :> new ImageAntiAliasing
      final bind img aa
      final bind img aa aa
      var Str temp := file_temporary
      final save temp "filter [dq].png[dq]"
      var FileInfo info := file_query temp standard
      var Link:Str bytes :> new Str
      if info=defined
        var Int len := cast info:size Int
        bytes set (memory_allocate len addressof:bytes) len true
      (var Stream s) open temp in+safe
      s raw_read bytes:characters bytes:len
      s close
      file_delete temp
      corners insert virtual_path true addressof:bytes
    corners_sem release
  else
    bytes :> c map Str
    corners_sem rd_release

  reset_http_answer
  http_request answer_mime_type := "image/png"
  http_request answer_size := bytes len
  http_request answer_datetime := page_datetime
  http_request answer_is_dynamic := false
  # var DateTime expires := datetime ; expires seconds += 86400
  # http_request:answer_extra append addressof:(new Str "Expires: "+rfc1123_date:expires)
  http_request send_header
  http_stream writechars bytes
  http_request send_footer

eif (virtual_path parse "/image/" any:(var Str id) "." any:(var Str format))
  image_cache_send id

eif false
  console "area root is " http_request:area_root eol
  console "area path is " http_request:area_path eol
  console "virtual path is " virtual_path eol