Patch title: Release 89 bulk changes
Abstract:
File: /protocol/http/style/draw.pli
Key:
    Removed line
    Added line
module "/pliant/language/compiler.pli"
module "/pliant/language/parser.pli"
module "/pliant/protocol/http/server.pli"
module "/pliant/protocol/http/style/common.pli"
module "/pliant/util/encoding/http.pli"
module "/pliant/util/encoding/html.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/graphic/filter/io.pli"
module "/pliant/math/functions.pli"
module "/pliant/protocol/http/cache.pli"


method page html_draw img url_id format options flags link body_id body_context
  arg_rw HtmlPage page ; oarg_rw ImagePrototype img ; arg Str url_id format options ; arg Int flags ; arg Str link body_id body_context
  var Str url := image_cache_record img url_id format options
  var Str id := generate_id
  if (flags .and. 1)<>0
    page html "<a href=[dq]"+html_encode:link+"[dq]>"
  var Str event := ""
  if (flags .and. 4)<>0
    event := " onClick==[dq]button_pressed('button 0 0 "+body_id+" "+(page:request cipher (body_context 1 body_context:len))+" "+(page:request generate_signature body_id+" "+(body_context 1 body_context:len))+"')[dq]"
  page html "<img src=[dq]"+url+"[dq] width=[dq]"+(string img:size_x)+"[dq] height=[dq]"+(string img:size_y)+"[dq] id=[dq]"+id+"[dq]"+event+">"
  if (flags .and. 1)<>0
    page html "</a>"
  if flags=0
    return
  implicit page
    if (flags .and. 2)<>0 and (environment first "pliant draw")=null
      environment insert "pliant draw" true addressof:void
      html "<input type=[dq]hidden[dq] name=[dq]_pliant_x0[dq] value=[dq][dq]>[lf]"
      html "<input type=[dq]hidden[dq] name=[dq]_pliant_y0[dq] value=[dq][dq]>[lf]"
      html "<input type=[dq]hidden[dq] name=[dq]_pliant_x1[dq] value=[dq][dq]>[lf]"
      html "<input type=[dq]hidden[dq] name=[dq]_pliant_y1[dq] value=[dq][dq]>[lf]"
    var Str pos_x := "e.clientX" ; var Str pos_y := "e.clientY" ; var Str buttons := "e.button"
    var Str browser := http_request browser_model
    if browser="mozilla"
      buttons := "e.which"
    eif browser="ie"
      pos_x := "event.clientX" ; pos_y := "event.clientY" ; buttons := "event.button"
    html "<script language=[dq]JavaScript[dq]>[lf]"
    html "function mm_x_"+id+"(x,delta) {[lf]"
    html "  return "+(string img:x0)+"+"+(string img:x1-img:x0)+"*(relative_x(x,'"+id+"')+delta)/"+(string img:size_x)+"; }[lf]"
    html "function mm_y_"+id+"(y,delta) {[lf]"
    html "  return "+(string img:y0)+"+"+(string img:y1-img:y0)+"*(relative_y(y,'"+id+"')+delta)/"+(string img:size_y)+"; }[lf]"
    if (flags .and. 2)<>0
      html "function down_"+id+"(e) {[lf]"
      html "  if("+buttons+"==1){[lf]"
      html "    document.pliant._pliant_x0.value = mm_x_"+id+"("+pos_x+",0);[lf]"
      html "    document.pliant._pliant_y0.value = mm_y_"+id+"("+pos_y+",0);[lf]"
      html "    return false;[lf]"
      html "  } else {[lf]"
      html "    return true; } }[lf]"
      html "function up_"+id+"(e) {[lf]"
      html "  if("+buttons+"==1){[lf]"
      html "    document.pliant._pliant_x1.value = mm_x_"+id+"("+pos_x+",1);[lf]"
      html "    document.pliant._pliant_y1.value = mm_y_"+id+"("+pos_y+",1);[lf]"
      html "    button_pressed('button-0-0-"+body_id+"-"+(page:request cipher (body_context 1 body_context:len))+"-"+(page:request generate_signature body_id+" "+(body_context 1 body_context:len))+"');[lf]"
      html "    button_pressed('button*0*0*"+body_id+"*"+(page:request cipher (body_context 1 body_context:len))+"*"+(page:request generate_signature body_id+" "+(body_context 1 body_context:len))+"');[lf]"
      html "    return false;[lf]"
      html "  } else {[lf]"
      html "    return true; } }[lf]"
      html "document.getElementById([dq]"+id+"[dq]).onmousedown = down_"+id+";[lf]"
      html "document.getElementById([dq]"+id+"[dq]).onmouseup = up_"+id+";[lf]"
    if (flags .and. 8)<>0
      html "function move_"+id+"(e) {[lf]"
      html "  x = mm_x_"+id+"("+pos_x+",0.5);[lf]"
      html "  y = mm_y_"+id+"("+pos_y+",0.5);[lf]"
      var Float psize := (img:x1-img:x0)/img:size_x
      var Int r := 10^(min (max -(cast log:psize Int) 0) 9)
      html "  x = ((x*"+string:r+")-(x*"+string:r+")%1)/"+string:r+";[lf]"
      var Float psize := (img:y1-img:y0)/img:size_y
      var Int r := 10^(min (max -(cast log:psize Int) 0) 9)
      html "  y = ((y*"+string:r+")-(y*"+string:r+")%1)/"+string:r+";[lf]"
      html "  window.status=x+'  '+y;[lf]"
      html "  return true; }[lf]"
      html "document.getElementById([dq]"+id+"[dq]).onmousemove = move_"+id+";[lf]"
    html "</script>[lf]"

meta '. draw' e
  if e:size<2 or not (e:0 cast HtmlPage) or not (e:1 cast ImagePrototype)
    return
  var Link:Argument id :> argument constant Str ""
  var Link:Argument format :> argument constant Str "png"
  var Link:Argument options :> argument constant Str ""
  var Int flags := 0
  var Link:Argument link :> argument constant Str ""
  var Link:Argument ctx :> argument constant Str ""
  var Int i := 2
  while i<e:size
    if i+1<e:size and e:i:ident="id" and (e:(i+1) cast Str)
      e suckup (e i+1)
      id :> e:(i+1) result
      i += 2
    eif i+1<e:size and e:i:ident="format" and (e:(i+1) cast Str)
      e suckup (e i+1)
      format :> e:(i+1) result
      i += 2
    eif i+1<e:size and e:i:ident="options" and (e:(i+1) cast Str)
      e suckup (e i+1)
      options :> e:(i+1) result
      i += 2
    eif i+1<e:size and e:i:ident="link" and (e:(i+1) cast Str)
      e suckup (e i+1)
      link :> e:(i+1) result
      flags := flags .or. 1
      i += 2
    eif e:i:ident="clic"
      flags := flags .or. 4
      i += 1
    eif e:i:ident="position"
      flags := flags .or. 8
      i += 1
    eif e:i:ident="{}" and i=e:size-1
      flags := flags .or. 2
      if not (button_expression e "" (var Str button_id) (var Link:Argument ctx))
        return
      i += 1
    else
      return
  e suckup e:0 ; e suckup e:1
  e add (instruction (the_function '. html_draw' HtmlPage ImagePrototype Str Str Str Int Str Str Str) e:0:result e:1:result id format options (argument constant Int flags) link (argument constant Str button_id) ctx)
  e set_void_result

method page selected x0 y0 x1 y1
  arg_rw HtmlPage page ; arg_w Float x0 y0 x1 y1
  var Str context
  if ("&"+page:request:form+"&"+page:request:encoded_options+"=" eparse any "&button-" any "-" any "-" any:(var Str button) "-" any:(var Str scontext) "-" any:(var Str signature) "=" any)
  if ("&"+page:request:form+"&"+page:request:encoded_options+"=" eparse any "&button*" any "*" any "*" any:(var Str button) "*" any:(var Str scontext) "*" any:(var Str signature) "=" any)
    context := page:request uncipher http_decode:scontext false
  else
    context := ""
  if not ("&"+context+"&" eparse any "&_pliant_x0=" x0 "&" any)
    x0 := undefined
  if not ("&"+context+"&" eparse any "&_pliant_y0=" y0 "&" any)
    y0 := undefined
  if not ("&"+context+"&" eparse any "&_pliant_x1=" x1 "&" any)
    x1 := undefined
  if not ("&"+context+"&" eparse any "&_pliant_y1=" y1 "&" any)
    y1 := undefined

export '. draw' '. selected'