Filesend — File Browser

Filesendv1.100 / Filesendv1.100 / filesend.dialog.mrc

filesend.dialog.mrc — 100.68 KB — Download this file

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FILESEND ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;                           ** made by Vliedel **
;
;                            ** Version 1.100 **
;
; Please report bugs and suggestions to:
;
; #Vliedel @ Quakenet
; #Filesend @ Quakenet
;
; Written and tested on mirc 6.2
;
;
; Start with /filesend (or the button in toolbar)
;
; This script goes with filesend.mrc and adds a dialog to control the filesend script.
; All events are stored in a filesend.log (in filesend dir)
; All settings are stored in filesend.ini (default)
; Just try it out, double clicking in lists has a function too.
;
; Thanks to Kashin, who helped with the dialog design
; Thanks to Albie, Rutix and |16bit| who helped testing a lot
;
; have fun :)
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


alias -l fs.folder {
  ; return the path of the default filesend folder
  ; default is $scriptdirfilesend
  return $scriptdirfilesend
}

alias -l fs.settings.file {
  ; return the filename of the ini-file (path\file.ini) that stores the filesend settings, don't use quotes
  ; default is $scriptdirfilesend.ini
  return $scriptdirfilesend.ini
}

alias -l fs.icon.file {
  ; return the filename of the icon-file (path\file.ico), don't use quotes
  ; default is $scriptdirfilesend.ico
  return $scriptdirfilesend.ico
}

alias filesend {
; possible parameters
; $1 = settings  $2 = restart
; $1 = server
; $1 = connect  $2 = ip  $3 = port  $4 = pw
  if ($filesend.version == $null) { noop $input(To run filesend you need to load filesend.mrc first,wo,Filesend) | return }
  if ($filesend.version !=== $fs.dlg.version) { noop $input(Filesend version ( $+ $filesend.version $+ ) differs from Filesend dialog version ( $+ $fs.dlg.version $+ ),ow,filesend) | return }
  if ($dialog(filesend)) { noop $input(Filesend dialog is already opened,o,Filesend) | dialog -v filesend | return }
  if (!$exists($fs.folder)) {
    if (!$makedir($fs.folder)) { noop $input($fs.folder is an invalid pathname,o,Filesend) | return }
  }
  if ($2 !== restart) {
    if ($sock(filesend.*)) {
      if (!$input(One or more filesend connections are open. Do you want to close them and continue?,y,Filesend)) { return }
    }
    if ($hget(filesend)) { hfree filesend }
    hmake filesend 200
    sockclose filesend.*
    if ($hget(filesend.log)) { hfree filesend.log }
    hmake filesend.log 200
    if ($hget(filesend.set)) { hfree filesend.set }
    hmake filesend.set 100
    hload -i filesend.set $qt($fs.settings.file) settings
  }
  if (!$hget(filesend,files)) { hadd filesend files 0 }
  if ($hget(filesend.set,menus)) && (!$toolbar(filesend)) && ($exists($fs.icon.file)) { fs.dlg.toolbar }
  elseif (!$hget(filesend.set,menus)) && ($toolbar(filesend)) { toolbar -d filesend }
  var %tab.h = $iif($hget(filesend.set,tab.h) == $null,0,$int($v1))
  if (%tab.h < 145) { var %tab.h = 145 }
  if (%tab.h > 500) { var %tab.h = 500 }
  hadd filesend.set tab.h %tab.h
  
  dialog $iif($hget(filesend.set,desktop),-md,-m) filesend filesend
  
  var %i = 1 , %m = $iif($int($hget(filesend.set,shareddir.0)) == $null,0,$v1)
  while (%i <= %m) {
    var %d = $iif($nocontrol2($hget(filesend.set,shareddir. $+ %i)) == $null,* file corrupted *,$v1)
    if ($2 !== restart) { noop $filesend.adddir(%d) }
    did -a filesend 151 %d
    inc %i
  }
  if ($2 !== restart) { fs.dlg.adderrlog Errorlog session starting at $time(dd-mmm-yyyy) }
  
  else {
    var %i = 1 , %max = $iif($hget(filesend,dialog.conlist.len) == $null,0,$v1)
    while (%i <= %max) {
      did -o filesend 3 %i $hget(filesend,dialog.conlist.showname. $+ %i)
      inc %i
    }
    var %con = $hget(filesend,dialog.cur.con)
    did -c filesend 3 $hget(filesend,dialog.conlist.name-pos. $+ %con)
    hdel filesend dialog.cur.con
    fs.dlg.newcon %con
    var %i = 1
    while (%i <= $hget(filesend,dialog.ul.filelist.listlength)) {
      var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ %i)
      did -a filesend 121 $hget(filesend,dialog.ul.filelist.name. $+ %id)
      did -a filesend 122 $hget(filesend,dialog.ul.filelist.type. $+ %id)
      did -a filesend 123 $bytes($hget(filesend,dialog.ul.filelist.size. $+ %id),3).suf
      inc %i
    }
    if ($hget(filesend.log,0) > 1) { did -o filesend 32 1 $hget(filesend.log,$calc($hget(filesend.log,0) - 1)) }
    did -o filesend 33 1 $hget(filesend.log,$hget(filesend.log,0))
  }
  if ($1 == settings) {
    did -f filesend 106
    did -h filesend 91-96
    did -h filesend 14
    did -tvo filesend 15 1 Apply
  }
  hsave -i filesend.set $qt($fs.settings.file) settings
  if ($1 == server) { fs.dlg.server }
  if ($1 == connect) { fs.dlg.invited $2 $3 $4 }
}

alias -l makedir {
  ; $makedir(dir)
  ; makes a dir, even if the path doesn't exist yet.
  ; returns $true if succeeded, returns $false if failed.
  var %i = 1, %n = 0, %dir = $replace($noqt($1),/,\)
  while ($pos(%dir,\,%i) || $len(%dir) > %n) {
    var %n = $v1
    if (!$isdir($mid(%dir,1,%n))) mkdir $qt($mid(%dir,1,%n))
    inc %i
  }
  return $isdir($1)
  :error
  reseterror
  return $false
}



alias -l fs.size {
  if ($1 == edge) { return 4 }
  elseif ($1 == box.u.edge) { return 8 }
  elseif ($1 == box.u.but.edge) { return 3 }
  elseif ($1 == box.l.edge) { return 3 }
  elseif ($1 == box.s.edge) { return 3 }
  elseif ($1 == but.h) { return 12 }
  elseif ($1 == but.w) { return 39 }
  elseif ($1 == but2.h) { return 10 }
  elseif ($1 == lst.type.w) { return 25 }
  elseif ($1 == lst.size.w) { return 38 }
  elseif ($1 == lst.status.w) { return 38 }
  elseif ($1 == lst.overlap) { return 1 }
  elseif ($1 == lst.search.uedge) { return 2 }
  elseif ($1 == lst.search.sedge) { return 2 }
  elseif ($1 == tab.w) { return 255 }
  elseif ($1 == tab.h) { return $hget(filesend.set,tab.h) }
  elseif ($1 == tab.sedge) { return 3 }
  elseif ($1 == tab.ledge) { return 3 }
  elseif ($1 == tab.uedge) { return 18 }
  elseif ($1 == box.w) { return 70 }
  elseif ($1 == bar.text.w) { return 25 }
  elseif ($1 == bar.text.h) { return 7 }
  elseif ($1 == bar.w) { return 65 }
  elseif ($1 == bar.h) { return 6 }
  elseif ($1 == bar.speed.w) { return 25 }
  elseif ($1 == set.edit.h) { return 10 }
  elseif ($1 == set.edit-txt.h) { return 2 }
  elseif ($1 == set.port.w) { return 25 }
  elseif ($1 == set.pwcheck.w) { return 20 }
  elseif ($1 == set.times.w) { return 15 }
  elseif ($1 == set.secs.w) { return 20 }
  elseif ($1 == set.space.w) { return 3 }
  elseif ($1 == set.c.box.w) { return 111 }
  elseif ($1 == set.c.text1.w) { return 25 }
  elseif ($1 == set.c.text2.w) { return 40 }
  elseif ($1 == set.c.but.w) { return 30 }
  elseif ($1 == set.c.comb.uedge) { return 5 }
  elseif ($1 == set.c.comb.ledge) { return 1 }
  elseif ($1 == set.s.box.w) { return 124 }
  elseif ($1 == set.s.text1.w) { return 25 }
  elseif ($1 == set.s.text2.w) { return 75 }
  elseif ($1 == set.s.text3.w) { return 80 }
  elseif ($1 == set.g.text1.w) { return 120 }
  elseif ($1 == set.g.text2.w) { return 45 }
  elseif ($1 == set.g.but.w) { return 25 }
  elseif ($1 == set.g.deskcheck.w) { return 50 }
  elseif ($1 == set.g.text3.w) { return 30 }
  elseif ($1 == error.text.h) { return 7 }
}

alias -l fs.size2 {
  if ($1 == lst.name.x) { return $calc((2 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(tab.sedge)) }
  elseif ($1 == lst.type.x) { return $calc((2 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(tab.w) - $fs.size(lst.status.w) - $fs.size(tab.sedge) - $fs.size(lst.size.w) - $fs.size(lst.type.w)) }
  elseif ($1 == lst.size.x) { return $calc((2 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(tab.w) - $fs.size(lst.status.w) - $fs.size(tab.sedge) - $fs.size(lst.size.w)) }
  elseif ($1 == lst.status.x) { return $calc((2 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(tab.w) - $fs.size(lst.status.w) - $fs.size(tab.sedge)) }
  elseif ($1 == lst.name.w) { return $calc($fs.size(tab.w) - (2 * $fs.size(tab.sedge)) - $fs.size(lst.status.w) - $fs.size(lst.size.w) - $fs.size(lst.type.w) + $fs.size(lst.overlap)) }
  elseif ($1 == lst.h) { return $calc($fs.size(tab.h) - $fs.size(tab.uedge) - $fs.size(but2.h) - $fs.size(tab.ledge) - $fs.size(lst.search.uedge) - $fs.size(but2.h)) }
  elseif ($1 == lst2.h) { return $calc($fs.size(tab.h) - $fs.size(tab.uedge) - $fs.size(but2.h) - $fs.size(tab.ledge)) }
  elseif ($1 == but.y) { return $calc((3 * $fs.size(edge)) + $fs.size(tab.h) + $fs.size(box.u.edge) + (2 * $fs.size(error.text.h)) + $fs.size(box.l.edge)) }
  elseif ($1 == set.cs.box.h) { return $calc($fs.size(box.u.edge) + (6 * $fs.size(set.edit.h)) + $fs.size(set.c.comb.uedge) + $fs.size(set.c.comb.ledge) + $fs.size(box.l.edge)) }
  elseif ($1 == set.c.txt.x) { return $calc((3 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(box.s.edge)) }
  elseif ($1 == set.c.txt.y) { return $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(box.u.edge)) }
  elseif ($1 == set.s.txt.x) { return $calc($fs.size(edge) + $fs.size(box.w) + $fs.size(tab.w) - $fs.size(set.s.box.w) + $fs.size(box.s.edge)) }
  elseif ($1 == set.s.txt.y) { return $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(box.u.edge)) }
  elseif ($1 == set.g.txt.x) { return $calc((3 * $fs.size(edge)) + $fs.size(box.w) + $fs.size(box.s.edge)) }
}

alias -l fs.size3 {
  if ($1 == set.g.txt.y) { return $calc((2 * $fs.size(edge)) + $fs.size(tab.uedge) + $fs.size2(set.cs.box.h) + $fs.size(box.u.edge)) }
}

dialog -l filesend {
  title "Filesend"
  icon $fs.icon.file ,0
  size                                                           -1      -1                                                                                                                       337     $calc((4 * $fs.size(edge)) + $fs.size(tab.h) + (2 * $fs.size(error.text.h)) + $fs.size(box.u.edge) + $fs.size(box.l.edge) + $fs.size(but.h))
  option dbu
  box "Connections",                                      2,     4       $fs.size(edge)                                                                                                           70      $calc($fs.size(tab.h) + 1)
  list                                                    3,     7       $calc($fs.size(edge) + $fs.size(box.u.edge))                                                                             64      $calc($fs.size(tab.h) - $fs.size(box.u.edge) - $fs.size(box.l.edge))                , size
  
  button "Connect",                                       11,    4       $fs.size2(but.y)                                                                                                         39      $fs.size(but.h)
  button "Start server",                                  12,    43      $fs.size2(but.y)                                                                                                         39      $fs.size(but.h)
  button "Disconnect",                                    13,    82      $fs.size2(but.y)                                                                                                         39      $fs.size(but.h)
  
  button "Download file",                                 14,    255     $fs.size2(but.y)                                                                                                         39      $fs.size(but.h)
  button "Download file",                                 15,    294     $fs.size2(but.y)                                                                                                         39      $fs.size(but.h)
  
  box "Info",                                             31,    4       $calc((2 * $fs.size(edge)) + $fs.size(tab.h))                                                                            329     $calc((2 * $fs.size(error.text.h)) + $fs.size(box.u.edge) + $fs.size(box.l.edge))
  text "",                                                32,    7       $calc((2 * $fs.size(edge)) + $fs.size(tab.h) + $fs.size(box.u.edge))                                                     280     $fs.size(error.text.h)
  text "",                                                33,    7       $calc((2 * $fs.size(edge)) + $fs.size(tab.h) + $fs.size(box.u.edge) + $fs.size(error.text.h))                            280     $fs.size(error.text.h)
  
  tab "Downloadable",                                     101,   78      $fs.size(edge)                                                                                                           255     $fs.size(tab.h)
  tab "Shared files",                                     102
  tab "Queue",                                            103
  tab "Downloaded",                                       104
  tab "Shared dirs",                                      105
  tab "Settings",                                         106
  tab "Log",                                              107
  
  button "Name",                                          91,    81      $calc($fs.size(edge) + $fs.size(tab.uedge))                                                                              148     $fs.size(but2.h)
  button "Type",                                          92,    229     $calc($fs.size(edge) + $fs.size(tab.uedge))                                                                              25      $fs.size(but2.h)
  button "Size",                                          93,    254     $calc($fs.size(edge) + $fs.size(tab.uedge))                                                                              38      $fs.size(but2.h)
  button "Status",                                        94,    292     $calc($fs.size(edge) + $fs.size(tab.uedge))                                                                              38      $fs.size(but2.h)
  
  edit ""                                                 95,    81      $calc($fs.size(edge) + $fs.size(tab.h) - $fs.size(tab.ledge) - $fs.size(but2.h))                                         209     $fs.size(but2.h)                                                                    , autohs
  button "Search",                                        96,    292     $calc($fs.size(edge) + $fs.size(tab.h) - $fs.size(tab.ledge) - $fs.size(but2.h))                                         38      $fs.size(but2.h)
  
  list                                                    111,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           149     $fs.size2(lst.h)                                                                    , tab 101 size extsel
  list                                                    112,   229     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           26      $fs.size2(lst.h)                                                                    , tab 101 size extsel
  list                                                    113,   254     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           39      $fs.size2(lst.h)                                                                    , tab 101 size extsel
  list                                                    114,   292     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           38      $fs.size2(lst.h)                                                                    , tab 101 size extsel
  
  list                                                    121,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           149     $fs.size2(lst.h)                                                                    , tab 102 size extsel
  list                                                    122,   229     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           26      $fs.size2(lst.h)                                                                    , tab 102 size extsel
  list                                                    123,   254     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           39      $fs.size2(lst.h)                                                                    , tab 102 size extsel
  list                                                    124,   292     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           38      $fs.size2(lst.h)                                                                    , tab 102 size extsel
  
  list                                                    131,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           249     $fs.size2(lst2.h)                                                                    , tab 103 size
  
  list                                                    141,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           149     $fs.size2(lst.h)                                                                    , tab 104 size extsel
  list                                                    142,   229     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           26      $fs.size2(lst.h)                                                                    , tab 104 size extsel
  list                                                    143,   254     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           39      $fs.size2(lst.h)                                                                    , tab 104 size extsel
  list                                                    144,   292     $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           38      $fs.size2(lst.h)                                                                    , tab 104 size extsel
  
  list                                                    151,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           249     $fs.size2(lst2.h)                                                                   , tab 105 size extsel
  
  box "Client",                                           600,   82      $calc($fs.size2(set.c.txt.y) - $fs.size(box.u.edge))                                                                     111     $fs.size2(set.cs.box.h)                                                             , tab 106
  text "address",                                         601,   85      $calc($fs.size2(set.c.txt.y) + $fs.size(set.edit-txt.h))                                                                 25      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                611,   110     $fs.size2(set.c.txt.y)                                                                                                   80      $fs.size(set.edit.h)                                                                , tab 106 autohs
  text "port",                                            602,   85      $calc($fs.size2(set.c.txt.y) + $fs.size(set.edit.h) + $fs.size(set.edit-txt.h))                                          25      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                612,   110     $calc($fs.size2(set.c.txt.y) + $fs.size(set.edit.h))                                                                     25      $fs.size(set.edit.h)                                                                , tab 106
  text "password",                                        603,   85      $calc($fs.size2(set.c.txt.y) + (2 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    25      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                613,   110     $calc($fs.size2(set.c.txt.y) + (2 * $fs.size(set.edit.h)))                                                               57      $fs.size(set.edit.h)                                                                , tab 106 autohs
  check "save",                                           623,   170     $calc($fs.size2(set.c.txt.y) + (2 * $fs.size(set.edit.h)))                                                               20      $fs.size(set.edit.h)                                                                , tab 106 left
  text "auto reconnect",                                  604,   85      $calc($fs.size2(set.c.txt.y) + (3 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    40      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                614,   125     $calc($fs.size2(set.c.txt.y) + (3 * $fs.size(set.edit.h)))                                                               15      $fs.size(set.edit.h)                                                                , tab 106
  text "times",                                           624,   143     $calc($fs.size2(set.c.txt.y) + (3 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    47      $fs.size(set.edit.h)                                                                , tab 106
  combo                                                   605,   85      $calc($fs.size2(set.c.txt.y) + (4 * $fs.size(set.edit.h)) + $fs.size(set.c.comb.uedge))                                  90      $fs.size(set.edit.h)                                                                , tab 106 drop edit
  button "Load",                                          606,   85      $calc($fs.size2(set.c.txt.y) + (5 * $fs.size(set.edit.h)) + $fs.size(set.c.comb.uedge) + $fs.size(set.c.comb.ledge))     30      $fs.size(set.edit.h)                                                                , tab 106
  button "Save",                                          616,   115     $calc($fs.size2(set.c.txt.y) + (5 * $fs.size(set.edit.h)) + $fs.size(set.c.comb.uedge) + $fs.size(set.c.comb.ledge))     30      $fs.size(set.edit.h)                                                                , tab 106
  button "Delete",                                        626,   145     $calc($fs.size2(set.c.txt.y) + (5 * $fs.size(set.edit.h)) + $fs.size(set.c.comb.uedge) + $fs.size(set.c.comb.ledge))     30      $fs.size(set.edit.h)                                                                , tab 106
  
  box "Server",                                           630,   205     $calc($fs.size2(set.s.txt.y) - $fs.size(box.u.edge))                                                                     124     $fs.size2(set.cs.box.h)                                                             , tab 106
  text "address",                                         636,   208     $calc($fs.size2(set.s.txt.y) + $fs.size(set.edit-txt.h))                                                                 25      $fs.size(set.edit.h)                                                                , tab 106
  edit "fill_in_your_own_address",                        646,   233     $fs.size2(set.s.txt.y)                                                                                                   93      $fs.size(set.edit.h)                                                                , tab 106
  text "port",                                            631,   208     $calc($fs.size2(set.s.txt.y) + $fs.size(set.edit.h) + $fs.size(set.edit-txt.h))                                          25      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                641,   233     $calc($fs.size2(set.s.txt.y) + $fs.size(set.edit.h))                                                                     25      $fs.size(set.edit.h)                                                                , tab 106
  text "password",                                        632,   208     $calc($fs.size2(set.s.txt.y) + (2 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    25      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                642,   233     $calc($fs.size2(set.s.txt.y) + (2 * $fs.size(set.edit.h)))                                                               70      $fs.size(set.edit.h)                                                                , tab 106 autohs
  check "save",                                           652,   306     $calc($fs.size2(set.s.txt.y) + (2 * $fs.size(set.edit.h)))                                                               20      $fs.size(set.edit.h)                                                                , tab 106 left
  text "listen for new connections",                      633,   208     $calc($fs.size2(set.s.txt.y) + (3 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    75      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                643,   283     $calc($fs.size2(set.s.txt.y) + (3 * $fs.size(set.edit.h)))                                                               20      $fs.size(set.edit.h)                                                                , tab 106 autohs
  text "minutes",                                         653,   306     $calc($fs.size2(set.s.txt.y) + (3 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    20      $fs.size(set.edit.h)                                                                , tab 106
  text "when port is in use, auto retry",                 634,   208     $calc($fs.size2(set.s.txt.y) + (4 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    80      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                644,   288     $calc($fs.size2(set.s.txt.y) + (4 * $fs.size(set.edit.h)))                                                               15      $fs.size(set.edit.h)                                                                , tab 106
  text "times",                                           654,   306     $calc($fs.size2(set.s.txt.y) + (4 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    20      $fs.size(set.edit.h)                                                                , tab 106
  text "auto reconnect",                                  635,   208     $calc($fs.size2(set.s.txt.y) + (5 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    80      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                645,   288     $calc($fs.size2(set.s.txt.y) + (5 * $fs.size(set.edit.h)))                                                               15      $fs.size(set.edit.h)                                                                , tab 106
  text "times",                                           655,   306     $calc($fs.size2(set.s.txt.y) + (5 * $fs.size(set.edit.h)) + $fs.size(set.edit-txt.h))                                    20      $fs.size(set.edit.h)                                                                , tab 106
  
  box "General",                                          660,   82      $calc($fs.size3(set.g.txt.y) - $fs.size(box.u.edge))                                                                     247     $calc($fs.size(box.u.edge) + (3 * $fs.size(set.edit.h)) + $fs.size(box.l.edge))     , tab 106
  text "when a corrupted file is downloaded, auto retry", 661,   85      $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit-txt.h))                                                                 120     $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                671,   205     $fs.size3(set.g.txt.y)                                                                                                   15      $fs.size(set.edit.h)                                                                , tab 106
  text "times",                                           681,   223     $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit-txt.h))                                                                 25      $fs.size(set.edit.h)                                                                , tab 106
  text "download folder",                                 662,   85      $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit.h) + $fs.size(set.edit-txt.h))                                          45      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                672,   130     $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit.h))                                                                     90      $fs.size(set.edit.h)                                                                , tab 106 autohs
  button "change",                                        682,   223     $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit.h))                                                                     25      $fs.size(set.edit.h)                                                                , tab 106
  text "Tab height",                                      664,   276     $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit-txt.h))                                                                 30      $fs.size(set.edit.h)                                                                , tab 106
  edit "",                                                674,   306     $fs.size3(set.g.txt.y)                                                                                                   20      $fs.size(set.edit.h)                                                                , tab 106
  check "Open on desktop",                                665,   276     $calc($fs.size3(set.g.txt.y) + $fs.size(set.edit.h))                                                                     50      $fs.size(set.edit.h)                                                                , tab 106 left
  check "Integrate menus",                                666,   276     $calc($fs.size3(set.g.txt.y) + (2 * $fs.size(set.edit.h)))                                                               50      $fs.size(set.edit.h)                                                                , tab 106 left
  
  text "Current connection log"                           170,   81      $calc($fs.size(edge) + $fs.size(tab.uedge))                                                                              249     $fs.size(but2.h)                                                                    , tab 107
  edit "",                                                171,   81      $calc($fs.size(edge) + $fs.size(tab.uedge) + $fs.size(but2.h))                                                           249     $fs.size2(lst2.h)                                                                   , tab 107 read multi vsbar
  
  text "Download",                                        21,    125     $fs.size2(but.y)                                                                                                         25      $fs.size(bar.text.h)
  text "Upload",                                          22,    125     $calc($fs.size2(but.y) + $fs.size(bar.text.h) - 1)                                                                       25      $fs.size(bar.text.h)
  edit "",                                                23,    154     $fs.size2(but.y)                                                                                                         65      $fs.size(bar.h)                                                                     , read
  edit "",                                                24,    154     $calc($fs.size2(but.y) + $fs.size(bar.text.h) - 1)                                                                       65      $fs.size(bar.h)                                                                     , read
  text "0B/s"                                             25,    223     $fs.size2(but.y)                                                                                                         25      $fs.size(bar.text.h)
  text "0B/s"                                             26,    223     $calc($fs.size2(but.y) + $fs.size(bar.text.h) - 1)                                                                       25      $fs.size(bar.text.h)
}


dialog -l fs.errorlog {
  title "Filesend errorlog"
  icon $fs.icon.file ,0
  size -1 -1 260 120
  option dbu
  edit "", 1, $fs.size(edge)  $fs.size(edge)  $calc(260 - (2 * $fs.size(edge)))  $calc(120 - (2 * $fs.size(edge)))  ,read multi vsbar
}


on *:DIALOG:filesend:init:*:{
  var %dl.dir = $hget(filesend.set,dl.folder)
  if (!$isdir(%dl.dir)) { var %dl.dir = $iif($sdir($fs.folder,Select download folder) == $null,$fs.folder,$v1) }
  hadd filesend dl.folder %dl.dir
  hadd filesend.set dl.folder %dl.dir
  did -o filesend 672 1 %dl.dir
  var %ul.dir = $hget(filesend.set,ul.folder) , %ul.dir = $iif($isdir(%u.dir),%u.dir,$fs.folder)
  hadd filesend ul.folder %ul.dir
  hadd filesend.set ul.folder %ul.dir
  did -o filesend 23,24 1 $str(:,30)
  did -h filesend 14
  did -o filesend 611 1 $nocontrol($hget(filesend.set,client.ip))
  did -o filesend 612 1 $int($hget(filesend.set,client.port))
  if ($hget(filesend.set,client.store.pass) == on) {
    did -o filesend 613 1 $nocontrol($hget(filesend.set,client.pass))
    did -c filesend 623
  }
  did -o filesend 614 1 $int($hget(filesend.set,client.retry.con))
  did -o filesend 641 1 $int($hget(filesend.set,server.port))
  if ($hget(filesend.set,server.store.pass) == on) {
    did -o filesend 642 1 $nocontrol($hget(filesend.set,server.pass))
    did -c filesend 652
  }
  did -o filesend 643 1 $iif($hget(filesend.set,server.listentime) !== $null,$round($calc($int($v1) / 60),2))
  did -o filesend 644 1 $int($hget(filesend.set,server.retry.port))
  did -o filesend 645 1 $int($hget(filesend.set,server.retry.con))
  if ($hget(filesend.set,server.ip) !== $null) { did -o filesend 646 1 $v1 }
  did -o filesend 671 1 $int($hget(filesend.set,retry.file))
  did -o filesend 674 1 $hget(filesend.set,tab.h)
  if ($hget(filesend.set,desktop)) { did -c filesend 665 }
  if ($hget(filesend.set,menus)) { did -c filesend 666 }
  did -t filesend 11
  var %i = 1 , %max = $iif($int($hget(filesend.set,fav.name.0)) == $null,0,$v1)
  while (%i <= %max) {
    did -o filesend 605 %i $iif($nocontrol2($hget(filesend.set,fav.name. $+ %i)) == $null,* file corrupted *,$v1)
    inc %i
  }
  hsave -i filesend.set $qt($fs.settings.file) settings
}

on *:DIALOG:filesend:close:*:{
  if ($fopen(filesend.log)) { .fclose filesend.log }
  if ($exists($fs.folder $+ /filesend.log)) { .fopen filesend.log $qt($fs.folder $+ /filesend.log) }
  else {
    if (!$exists($fs.folder)) {
      if (!$makedir($fs.folder)) { .timer 1 0 noop $input($fs.folder is an invalid pathname,o,Filesend) }
      else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
    }
    else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
  }
  if ($fopen(filesend.log)) {
    .fseek filesend.log $file($fopen(filesend.log).fname).size
    var %lines = $iif($hget(filesend.log,0) == $null,0,$v1)
    if (%lines > 1) {
      fs.dlg.adderrlog Errorlog session stopped at $time(dd-mmm-yyyy)
      inc %lines
      
      .fwrite filesend.log $crlf $crlf
      var %i = 1
      while (%i <= %lines) {
        .fwrite -n filesend.log $hget(filesend.log,%i)
        inc %i
      }
    }
    
    var %pos = $hget(filesend,dialog.conlist.len)
    while (%pos > 0) {
      var %name = $hget(filesend,dialog.conlist.pos-name. $+ %pos)
      if (%name !== socklisten) { fs.dlg.log.disconnect %name }
      fs.dlg.addlog %name Stopped at $time(dd-mmm-yyyy)
      .fwrite filesend.log $crlf $crlf
      var %i = 1 , %max = $iif($hget(filesend.log,0. $+ %name) == $null,0,$v1)
      while (%i <= %max) {
        .fwrite -n filesend.log $hget(filesend.log,%i $+ . $+ %name)
        inc %i
      }
      dec %pos
    }
    .fclose filesend.log
  }
  
  filesend.server.stop
  filesend.client.stop
  
  hsave -i filesend.set $qt($fs.settings.file) settings
  hfree filesend.set
  hfree filesend.log
  if ($hget(fs.flist)) { hfree fs.flist }
  hfree filesend
}

alias -l nocontrol { return $regsubex($gettok($1,1,32),/[\x01-\x1F]/g,) }
alias -l nocontrol2 { return $regsubex($1,/[\x01-\x1F]/g,) }

on *:DIALOG:filesend:sclick:*:{
  var %tab = $dialog(filesend).tab
  if ($did == 101) { did -v filesend 91-96 | did -h filesend 14 | did -to filesend 15 1 Download file }
  elseif ($did == 102) { did -v filesend 91-96 | did -tvo filesend 14 1 Add file | did -vo filesend 15 1 Remove file }
  elseif ($did == 103) { did -h filesend 91-96 | did -h filesend 14,15 }
  elseif ($did == 104) { did -v filesend 91-96 | did -tvo filesend 14 1 Open file | did -vo filesend 15 1 Open dir }
  elseif ($did == 105) { did -h filesend 91-96 | did -tvo filesend 14 1 Add dir | did -vo filesend 15 1 Remove dir }
  elseif ($did == 106) { did -h filesend 91-96 | did -h filesend 14 | did -tvo filesend 15 1 Apply }
  elseif ($did == 107) { did -h filesend 91-96 | did -tvo filesend 14 1 Open logfile | did -vo filesend 15 1 Error log }
  elseif ($did isnum 111-114) || ($did isnum 121-124) || ($did isnum 141-144) {
    var %dids = $mid($did,2,1) , %dids = $remtok($+(1,%dids,1,$chr(44),1,%dids,2,$chr(44),1,%dids,3,$chr(44),1,%dids,4),$did,1,44)
    var %i = $did($did,0).sel
    did -u filesend %dids
    while (%i > 0) {
      did -kc filesend %dids $did($did,%i).sel
      dec %i
    }
  }
  
  elseif ($did == 3) {
    var %sock = $hget(filesend,dialog.conlist.pos-name. $+ $did($did).sel)
    if (!%sock) { return }
    fs.dlg.newcon %sock
  }
  elseif ($did == 11) { fs.dlg.client }
  elseif ($did == 12) { fs.dlg.server }
  elseif ($did == 13) {
    var %pos = $did(3).sel
    if (!%pos) { return }
    var %sock = $hget(filesend,dialog.conlist.pos-name. $+ %pos)
    if (%sock == socklisten) {
      var %pos = $hget(filesend,dialog.conlist.len)
      while (%pos > 0) {
        var %sock = $hget(filesend,dialog.conlist.pos-name. $+ %pos)
        if (filesend.server.* iswm %sock) { fs.dlg.log.disconnect %sock }
        dec %pos
      }
      filesend.server.stop
    }
    else {
      fs.dlg.log.disconnect %sock
      hdel filesend sockerr. $+ %sock
      filesend.sockclose.msg %sock
      sockclose %sock
      filesend.sockclose %sock
    }
  }
  elseif ($did == 14) {
    if (%tab == 102) { filesend.addfile.user }
    elseif (%tab == 104) {
      if ($did(141,0).sel !== 1) { noop $input(Select one file to open,ou,Filesend) | return }
      if ($lock(run)) { noop $input(Can't open file $+ $chr(44) run command is locked.,ou,Filesend) | return }
      var %con = $hget(filesend,dialog.cur.con)
      var %id = $hget(filesend,dialog.dled.filelist.pos-id. $+ $did(141,1).sel $+ . $+ %con)
      var %fname = $hget(filesend,dialog.dl.filelist.name. $+ %id $+ . $+ %con) $+ $iif($hget(filesend,dialog.dl.filelist.type. $+ %id $+ . $+ %con) !== $null,. $+ $v1)
      var %file = $hget(filesend,dialog.dled.filelist.folder. $+ %id $+ . $+ %con) $+ \ $+ %fname
      if (!$isfile(%file)) { noop $input(Can't open file $+ $chr(44) file doesn't exist.,ou,Filesend) | return }
      run $qt(%file)
    }
    elseif (%tab == 105) {
      var %dir = $sdir($fs.folder,Select shared files folder),1-,32)
      if (!$isdir(%dir)) { return }
      if ($len(%dir) !== $len($gettok(%dir,1-,32))) { fs.dlg.adderrlog Can't add dir $qt(%dir) it contains double spaces. | return }
      filesend.adddir %dir
      var %i = 1 , %n = $iif($hget(filesend.set,shareddir.0) == $null,0,$v1)
      while (%i <= %n) {
        if ($hget(filesend.set,shareddir. $+ %i) == %dir) { return }
        inc %i
      }
      hinc filesend.set shareddir.0
      hadd filesend.set shareddir. $+ %i %dir
      did -o filesend 151 %i %dir
      hsave -i filesend.set $qt($fs.settings.file) settings
    }
    elseif (%tab == 107) {
      if ($lock(run)) { noop $input(Can't open file $+ $chr(44) run command is locked.,ou,Filesend) | return }
      if (!$isfile($fs.folder $+ \filesend.log)) { noop $input(Can't open file $+ $chr(44) file doesn't exist.,ou,Filesend) | return }
      run $qt($fs.folder $+ \filesend.log)
    }
  }
  elseif ($did == 15) {
    if (%tab == 101) {
      if (!$hget(filesend,dialog.cur.con)) || ($sock($hget(filesend,dialog.cur.con)).mark !=== Accepted) { noop $input(No valid connection selected,ou,Filesend) | return }
      var %i = 1 , %max = $did(111,0).sel , %curcon = $hget(filesend,dialog.cur.con)
      while (%i <= %max) && ($len(%ids) < 700) {
        var %ids = %ids $hget(filesend,dialog.dl.filelist.pos-id. $+ $did(111,%i).sel $+ . $+ %curcon)
        inc %i
      }
      if (%ids) { filesend.request $hget(filesend,dialog.cur.con) %ids }
    }
    elseif (%tab == 102) {
      var %i = 1 , %max = $did(121,0).sel
      while (%i <= %max) && ($len(%ids) < 700) {
        var %ids = %ids $hget(filesend,dialog.ul.filelist.pos-id. $+ $did(121,%i).sel)
        inc %i
      }
      if (%ids) { filesend.remfile %ids }
    }
    elseif (%tab == 104) {
      if ($lock(run)) { noop $input(Can't open the download dir $+ $chr(44) run command is locked.,ou,Filesend) | return }
      var %dir = $hget(filesend,dl.folder)
      if (!$isdir(%dir)) { noop $input(Can't open the download dir $+ $chr(44) dir doesn't exist.,ou,Filesend) | return }
      run $qt(%dir)
    }
    elseif (%tab == 105) {
      var %i = $did(151,0).sel , %m = $iif($hget(filesend.set,shareddir.0) == $null,0,$int($v1)) , %f
      while (%i) {
        var %l = $did(151,%i).sel
        inc %f $filesend.remdir($hget(filesend.set,shareddir. $+ %l))
        did -d filesend 151 %l
        while (%l < %m) {
          hadd filesend.set shareddir. $+ %l $hget(filesend.set,shareddir. $+ $calc(%l + 1))
          inc %l
        }
        hdel filesend.set shareddir. $+ %m
        dec %m
        dec %i
      }
      if (%f) { filesend.flist.send }
      hadd filesend.set shareddir.0 %m
      hsave -i filesend.set $qt($fs.settings.file) settings
    }
    elseif (%tab == 106) {
      var %text = $nocontrol($did(611))
      if (%text !== $null) {
        did -o filesend 611 1 %text
        hadd filesend.set client.ip %text
      }
      else { did -o filesend 611 1 $hget(filesend.set,client.ip) }
      if ($remove($did(612),$chr(32)) !== $null) {
        var %text = $int($did(612))
        if (%text > 65535) { var %text = 65535 }
        if (%text < 1) { var %text = 1 }
        did -o filesend 612 1 %text
        hadd filesend.set client.port %text
      }
      else { did -o filesend 612 1 $hget(filesend.set,client.port) }
      if ($did(623).state) {
        var %text = $nocontrol($did(613))
        if (%text !== $null) {
          did -o filesend 613 1 %text
          if ($hget(filesend,pw.filesend.client) !== $null) { hadd filesend pw.filesend.client %text }
          hadd filesend.set client.pass %text
        }
        else { did -o filesend 613 1 $hget(filesend.set,client.pass) }
        hadd filesend.set client.store.pass on
      }
      else {
        did -r filesend 613
        hdel filesend.set client.pass
        hdel filesend.set client.store.pass
      }
      if ($remove($did(614),$chr(32)) !== $null) {
        var %text = $int($did(614))
        if (%text > 100) { var %text = 100 }
        if (%text < 0) { var %text = 0 }
        did -o filesend 614 1 %text
        if ($hget(filesend,retry.con.filesend.client) !== $null) { hadd filesend retry.con.filesend.client %text }
        hadd filesend.set client.retry.con %text
      }
      else { did -o filesend 614 1 $hget(filesend.set,client.retry.con) }
      
      var %text = $nocontrol($did(646))
      if (%text !== $null) {
        did -o filesend 646 1 %text
        hadd filesend.set server.ip %text
      }
      elseif ($hget(filesend.set,server.ip) !== $null) { did -o filesend 646 1 $v1 }
      else { did -o filesend 646 1 fill_in_your_own_address }
      if ($remove($did(641),$chr(32)) !== $null) {
        var %text = $int($did(641))
        if (%text > 65535) { var %text = 65535 }
        if (%text < 1) { var %text = 1 }
        did -o filesend 641 1 %text
        hadd filesend.set server.port %text
      }
      else { did -o filesend 641 1 $hget(filesend.set,server.port) }
      if ($did(652).state) {
        var %text = $nocontrol($did(642))
        if (%text !== $null) {
          did -o filesend 642 1 %text
          if ($hget(filesend,pw.filesend.listen) !== $null) { hadd filesend pw.filesend.listen %text }
          hadd filesend.set server.pass %text
        }
        else { did -o filesend 642 1 $hget(filesend.set,server.pass) }
        hadd filesend.set server.store.pass on
      }
      else {
        did -r filesend 642
        hdel filesend.set server.pass
        hdel filesend.set server.store.pass
      }
      if ($remove($did(643),$chr(32)) !== $null) {
        var %text = $int($calc($did(643) * 60))
        if (%text > 604800) { var %text = 604800 }
        if (%text < 1) { var %text = 1 }
        did -o filesend 643 1 $round($calc(%text / 60),2)
        hadd filesend.set server.listentime %text
      }
      else { did -o filesend 643 1 $round($calc($hget(filesend.set,server.listentime) / 60),2) }
      if ($remove($did(644),$chr(32)) !== $null) {
        var %text = $int($did(644))
        if (%text > 100) { var %text = 100 }
        if (%text < 0) { var %text = 0 }
        did -o filesend 644 1 %text
        if ($hget(filesend,retry.port.filesend.listen) !== $null) { hadd filesend retry.port.filesend.listen %text }
        hadd filesend.set server.retry.port %text
      }
      else { did -o filesend 644 1 $hget(filesend.set,server.retry.port) }
      if ($remove($did(645),$chr(32)) !== $null) {
        var %text = $int($did(645))
        if (%text > 100) { var %text = 100 }
        if (%text < 0) { var %text = 0 }
        did -o filesend 645 1 %text
        if ($hget(filesend,retry.con.filesend.listen) !== $null) { hadd filesend retry.con.filesend.listen %text }
        hadd filesend.set server.retry.con %text
      }
      else { did -o filesend 645 1 $hget(filesend.set,server.retry.con) }
      if ($remove($did(671),$chr(32)) !== $null) {
        var %text = $int($did(671))
        if (%text > 100) { var %text = 100 }
        if (%text < 0) { var %text = 0 }
        did -o filesend 671 1 %text
        if ($hget(filesend,retry.file) !== $null) { hadd filesend retry.file %text }
        hadd filesend.set retry.file %text
      }
      else { did -o filesend 671 1 $hget(filesend.set,retry.file) }
      if ($isdir($did(672))) {
        hadd filesend dl.folder $did(672)
        hadd filesend.set dl.folder $did(672)
      }
      else { did -o filesend 672 1 $hget(filesend,dl.folder) }
      
      if ($remove($did(674),$chr(32)) !== $null) { var %text = $int($did(674)) }
      else { var %text = $hget(filesend.set,tab.h) }
      if (%text < 145) { var %text = 145 }
      if (%text > 500) { var %text = 500 }
      did -o filesend 674 1 %text
      if (%text !== $hget(filesend.set,tab.h)) { var %restart = 1 }
      hadd filesend.set tab.h %text
      
      if ($did(665).state) && (!$hget(filesend.set,desktop)) { var %restart = 1 | hadd filesend.set desktop 1 }
      elseif (!$did(665).state) && ($hget(filesend.set,desktop)) { var %restart = 1 | hdel filesend.set desktop }
      
      if ($did(666).state) { hadd filesend.set menus 1 }
      else { hadd filesend.set menus 0 }
      
      if ($hget(filesend.set,menus)) && (!$toolbar(filesend)) && ($exists($fs.icon.file)) { fs.dlg.toolbar }
      elseif (!$hget(filesend.set,menus)) && ($toolbar(filesend)) { toolbar -d filesend }
      
      hsave -i filesend.set $qt($fs.settings.file) settings
      if (%restart == 1) { dialog -x filesend | filesend settings restart }
    }
    elseif (%tab == 107) {
      if ($dialog(fs.errorlog)) { dialog -v fs.errorlog | return }
      dialog -am fs.errorlog fs.errorlog
      var %i = 1 , %l = $iif($hget(filesend.log,0) == $null,0,$v1)
      while (%i <= %l) {
        did -o fs.errorlog 1 %i $hget(filesend.log,%i)
        inc %i
      }
    }
  }
  
  elseif ($did isnum 91-94) { fs.dlg.flist.sort $did }
  elseif ($did == 96) { fs.dlg.flist.search }
  
  elseif ($did == 606) {
    var %num = $did(605).sel
    if (%num == 0) { noop $input(Invalid name,owu,filesend) | return }
    did -o filesend 605 0 $nocontrol2($hget(filesend.set,fav.name. $+ %num))
    var %ip = $nocontrol($hget(filesend.set,fav.ip. $+ %num))
    did -o filesend 611 1 %ip
    if (%ip !== $null) { hadd filesend.set client.ip %ip }
    else { hdel filesend.set client.ip }
    var %port = $int($hget(filesend.set,fav.port. $+ %num))
    if (%port isnum 1-65535) {
      did -o filesend 612 1 %port
      hadd filesend.set client.port %port
    }
    else {
      did -r filesend 612
      hdel filesend.set client.port
    }
    if ($hget(filesend.set,fav.store.pass. $+ %num) == on) {
      var %pass = $nocontrol($hget(filesend.set,fav.pass. $+ %num))
      did -o filesend 613 1 %pass
      if (%pass !== $null) { hadd filesend.set client.pass %pass }
      else { hdel filesend.set client.pass }
      did -c filesend 623
      hadd filesend.set client.store.pass on
    }
    else {
      hdel filesend.set client.pass
      did -r filesend 613
      did -u filesend 623
    }
    var %r.con = $hget(filesend.set,fav.retry.con. $+ %num)
    if (%r.con !== $null) {
      var %r.con = $int(%r.con)
      if (%r.con > 100) { var %r.con = 100 }
      if (%r.con < 0) { var %r.con = 0 }
      did -o filesend 614 1 %r.con
      hadd filesend retry.con.filesend.client %r.con
      hadd filesend.set client.retry.con %r.con
    }
    else {
      did -r filesend 614
      hdel filesend.set client.retry.con
    }
    hsave -i filesend.set $qt($fs.settings.file) settings
  }
  elseif ($did == 616) {
    var %name = $nocontrol2($iif($did(605) == $null,$input(Enter name,eu,filesend),$v1))
    if (%name == $null) { noop $input(Invalid name,owu,filesend) | return }
    var %i = 1 , %max = $iif($int($hget(filesend.set,fav.name.0)) == $null,0,$v1)
    while (%i <= %max) {
      if ($nocontrol2($hget(filesend.set,fav.name. $+ %i)) == %name) { break }
      inc %i
    }
    hadd filesend.set fav.name.0 $iif(%i > %max,%i,%max)
    hadd filesend.set fav.name. $+ %i %name
    
    var %ip = $nocontrol($did(611))
    did -o filesend 611 1 %ip
    if (%ip !== $null) {
      hadd filesend.set client.ip %ip
      hadd filesend.set fav.ip. $+ %i %ip
    }
    else {
      hdel filesend.set client.ip
      hdel filesend.set fav.ip. $+ %i
    }
    
    if ($remove($did(612),$chr(32)) !== $null) {
      var %port = $int($did(612))
      if (%port > 65535) { var %port = 65535 }
      if (%port < 1) { var %port = 1 }
      did -o filesend 612 1 %port
      hadd filesend.set client.port %port
      hadd filesend.set fav.port. $+ %i %port
    }
    else {
      did -r filesend 612
      hdel filesend.set client.port
      hdel filesend.set fav.port. $+ %i
    }
    
    if ($did(623).state) {
      var %pass = $nocontrol($did(613))
      did -o filesend 613 1 %pass
      if (%pass !== $null) {
        hadd filesend.set client.pass %pass
        hadd filesend.set fav.pass. $+ %i %pass
      }
      else {
        hdel filesend.set client.pass
        hdel filesend.set fav.pass. $+ %i
      }
      hadd filesend.set client.store.pass on
      hadd filesend.set fav.store.pass. $+ %i on
    }
    else {
      did -r filesend 613
      hdel filesend.set client.pass
      hdel filesend.set client.store.pass
      hdel filesend.set fav.pass. $+ %i
      hdel filesend.set fav.store.pass. $+ %i
    }
    
    if ($remove($did(614),$chr(32)) !== $null) {
      var %r.con = $int($did(614))
      if (%r.con > 100) { var %r.con = 100 }
      if (%r.con < 0) { var %r.con = 0 }
      did -o filesend 614 1 %r.con
      hadd filesend retry.con.filesend.client %r.con
      hadd filesend.set client.retry.con %r.con
      hadd filesend.set fav.retry.con. $+ %i %r.con
    }
    else {
      did -r filesend 614
      hdel filesend.set client.retry.con
      hdel filesend.set fav.retry.con. $+ %i
    }
    did -o filesend 605 %i %name
    hsave -i filesend.set $qt($fs.settings.file) settings
  }
  elseif ($did == 626) {
    var %i = $did(605).sel
    if (%i == 0) { noop $input(Invalid name,owu,filesend) | return }
    did -d filesend 605 %i
    var %max = $iif($int($hget(filesend.set,fav.name.0)) == $null,0,$v1)
    while (%i < %max) {
      hadd filesend.set fav.name. $+ %i $hget(filesend.set,fav.name. $+ $calc(%i + 1))
      hadd filesend.set fav.ip. $+ %i $hget(filesend.set,fav.ip. $+ $calc(%i + 1))
      hadd filesend.set fav.port. $+ %i $hget(filesend.set,fav.port. $+ $calc(%i + 1))
      hadd filesend.set fav.store.pass. $+ %i $hget(filesend.set,fav.store.pass. $+ $calc(%i + 1))
      hadd filesend.set fav.pass. $+ %i $hget(filesend.set,fav.pass. $+ $calc(%i + 1))
      hadd filesend.set fav.retry.con. $+ %i $hget(filesend.set,fav.retry.con. $+ $calc(%i + 1))
      inc %i
    }
    hdel -w filesend.set fav.*. $+ %max
    hdec filesend.set fav.name.0
    hsave -i filesend.set $qt($fs.settings.file) settings
  }
  
  elseif ($did == 682) {
    var %dl.dir = $hget(filesend,dl.folder)
    if ($sdir($iif($isdir(%dl.dir),%dl.dir,$fs.folder),Select download folder) !== $null) { did -o filesend 672 1 $v1 }
  }
}

on *:DIALOG:filesend:dclick:3,111-114,121-124,141-144,151:{
  if ($did($did,0).sel !== 1) { return }
  if ($did == 3) {
    var %text = $input(Enter new connection name,eu,filesend)
    if (%text == $null) { return }
    var %text = $left(%text,20)
    did -co filesend 3 $did(3,1).sel %text
    hadd filesend dialog.conlist.showname. $+ $did(3,1).sel %text
  }
  if ($did isnum 111-112) {
    if (!$hget(filesend,dialog.cur.con)) { return }
    var %id = $hget(filesend,dialog.dl.filelist.pos-id. $+ $did($did,1).sel $+ . $+ $hget(filesend,dialog.cur.con))
    if (%id) { filesend.request $hget(filesend,dialog.cur.con) %id }
  }
  if ($did isnum 121-124) {
    var %file = $hget(fs.flist,$hget(filesend,dialog.ul.filelist.pos-id. $+ $did($did,1).sel))
    if (!$lock(run)) && ($isfile(%file)) { run $qt(%file) }
  }
  if ($did isnum 141-144) {
    var %con = $hget(filesend,dialog.cur.con)
    var %id = $hget(filesend,dialog.dled.filelist.pos-id. $+ $did($did,1).sel $+ . $+ %con)
    var %fname = $hget(filesend,dialog.dled.filelist.name. $+ %id $+ . $+ %con) $+ $iif($hget(filesend,dialog.dled.filelist.type. $+ %id $+ . $+ %con) !== $null,. $+ $v1)
    var %file = $hget(filesend,dialog.dled.filelist.folder. $+ %id $+ . $+ %con) $+ \ $+ %fname
    if (!$lock(run)) && ($isfile(%file)) { run $qt(%file) }
  }
  if ($did == 151) {
    var %dir = $hget(filesend.set,shareddir. $+ $did($did,1).sel)
    if (!$lock(run)) && ($isdir(%dir)) { run $qt(%dir) }
  }
}

on *:DIALOG:filesend:edit:95:{ did -t filesend 96 }

alias -l fs.dlg.invited {
; $1 = address  $2 = port  $3 = pw
  dialog -v filesend
  var %ip = $nocontrol($1)
  if (%ip == $null) { noop $input(Invalid address,owu,filesend) | return }
  var %port = $int($2)
  if (%port > 65535) || (%port < 1)  { noop $input(Invalid port,owu,filesend) | return }
  var %pw = $nocontrol($3)
  if (%pw == $null) { noop $input(Invalid password,owu,filesend) | return }
  if ($hget(filesend.set,client.store.pass) == on) {
    did -o filesend 613 1 %pw
    hadd filesend.set client.pass %pw
  }
  else {
    did -r filesend 613
    hdel filesend.set client.pass
  }
  did -o filesend 611 1 %ip
  hadd filesend.set client.ip %ip
  did -o filesend 612 1 %port
  hadd filesend.set client.port %port
  fs.dlg.client invite %pw
}

alias -l fs.dlg.client {
; possible parameters
; $1 = invite  $2 = password
  var %port = $int($hget(filesend.set,client.port)) , %ip = $nocontrol($hget(filesend.set,client.ip))
  if ($1 !== invite) {
    var %text
    if (%ip !== $null) {
      if (%port isnum 1-65535) { var %text = %ip $+ : $+ %port }
      else { %text = %ip }
    }
    var %address = $input(Enter server address,eou,filesend,%text)
    var %ip = $nocontrol($gettok(%address,1,58)) , %port = $int($gettok(%address,2,58))
  }
  if (%ip == $null) { noop $input(Invalid server address,owu,filesend) | return }
  if (%port !isnum 1-65535) {
    var %port = $int($input(Enter port,eu,filesend))
    if (%port !isnum 1-65535) { noop $input(Invalid port,owu,filesend) | return }
  }
  if (%ip == $nocontrol($hget(filesend.set,client.ip))) { var %pass = $nocontrol($hget(filesend.set,client.pass)) }
  if ($1 == invite) { var %pass = $2 }
  if (%pass == $null) || (($hget(filesend.set,client.store.pass) !== on) && ($1 !== invite)) {
    var %pass = $nocontrol($input(Enter password,eu,filesend))
    if (%pass == $null) { noop $input(Invalid password,owu,filesend) | return }
    if ($hget(filesend.set,client.store.pass) == on) {
      hadd filesend.set client.pass %pass
      did -o filesend 613 1 %pass
      did -c filesend 623
    }
  }
  var %retry.con = $hget(filesend.set,client.retry.con)
  if (%retry.con == $null) || ($int(%retry.con) !isnum 0-100) {
    if ($input(Enter number of times to retry connection,eu,filesend) == $null) { noop $input(Aborted by user,ou,filesend) | return }
    var %retry.con = $int($v1)
    if (%retry.con !isnum 0-100) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set client.retry.con %retry.con
  }
  var %retry.file = $hget(filesend.set,retry.file)
  if (%retry.file == $null) || ($int(%retry.file) !isnum 0-100) {
    if ($input(Enter number of times to retry corrupted files,eu,filesend) == $null) { noop $input(Aborted by user,ou,filesend) | return }
    var %retry.file = $int($v1)
    if (%retry.file !isnum 0-100) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set retry.file %retry.file
  }
  hadd filesend.set client.ip %ip
  hadd filesend.set client.port %port
  did -o filesend 611 1 %ip
  did -o filesend 612 1 %port
  did -o filesend 614 1 %retry.con
  did -o filesend 671 1 %retry.file
  hsave -i filesend.set $qt($fs.settings.file) settings
  filesend.client %ip %port %pass $int(%retry.con) $int(%retry.file)
}

alias -l fs.dlg.server {
  var %port = $int($hget(filesend.set,server.port))
  if (%port !isnum 1-65535) {
    var %port = $int($input(Enter port,eu,filesend))
    if (%port !isnum 1-65535) { noop $input(Invalid port,owu,filesend) | return }
    hadd filesend.set server.port %port
  }
  if ($hget(filesend,dialog.conlist.name-pos.socklisten)) && (%port == $hget(filesend,port.filesend.listen)) {
    var %port = $int($input(Enter port ( $+ %port is in use),eu,filesend))
    if (%port !isnum 1-65535) { noop $input(Invalid port,owu,filesend) | return }
    hadd filesend.set server.port %port
  }
  var %pass = $nocontrol($hget(filesend.set,server.pass))
  if (%pass == $null) || ($hget(filesend.set,server.store.pass) !== on) {
    var %pass = $nocontrol($input(Enter password,eu,filesend))
    if (%pass == $null) { noop $input(Invalid password,owu,filesend) | return }
    if ($hget(filesend.set,server.store.pass) == on) {
      hadd filesend.set server.pass %pass
      did -o filesend 642 1 %pass
      did -c filesend 652
    }
  }
  var %retry.port = $hget(filesend.set,server.retry.port)
  if (%retry.port == $null) || (%retry.port !isnum 0-100) {
    if ($input(Enter number of times to retry when port is in use,eu,filesend) == $null) { noop $input(Aborted by user,ou,filesend) | return }
    var %retry.port = $int($v1)
    if (%retry.port !isnum 0-100) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set server.retry.port %retry.port
  }
  var %listentime = $int($hget(filesend.set,server.listentime))
  if (%listentime !isnum 1-604800) {
    var %listentime = $int($input(Enter number of seconds to listen for new connections,eu,filesend))
    if (%listentime !isnum 1-604800) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set server.listentime %listentime
  }
  did -o filesend 641 1 %port
  did -o filesend 643 1 $round($calc(%listentime / 60),2)
  did -o filesend 644 1 %retry.port
  if ($hget(filesend,dialog.conlist.name-pos.socklisten)) {
    hsave -i filesend.set $qt($fs.settings.file) settings
    filesend.listen.restart %port %pass $int(%retry.port) %listentime
    return
  }
  var %retry.con = $hget(filesend.set,server.retry.con)
  if (%retry.con == $null) || (%retry.con !isnum 0-100) {
    if ($input(Enter number of times to retry connection,eu,filesend) == $null) { noop $input(Aborted by user,ou,filesend) | return }
    var %retry.con = $int($v1)
    if (%retry.con !isnum 0-100) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set server.retry.con %retry.con
  }
  var %retry.file = $hget(filesend.set,retry.file)
  if (%retry.file == $null) || (%retry.file !isnum 0-100) {
    if ($input(Enter number of times to retry corrupted files,eu,filesend) == $null) { noop $input(Aborted by user,ou,filesend) | return }
    var %retry.file = $int($v1)
    if (%retry.file !isnum 0-100) { noop $input(Invalid number,owu,filesend) | return }
    hadd filesend.set retry.file %retry.file
  }
  did -o filesend 645 1 %retry.con
  did -o filesend 671 1 %retry.file
  hsave -i filesend.set $qt($fs.settings.file) settings
  filesend.server %port %pass $int(%retry.port) %listentime $int(%retry.con) $int(%retry.file)
}

alias -l fs.dlg.addlog {
; $1 = sockname   $2- is text
  var %logline = $chr(91) $+ $time(HH:nn:ss) $+ $chr(93) $2-
  hinc filesend.log 0. $+ $1
  hadd filesend.log $hget(filesend.log,0. $+ $1) $+ . $+ $1 %logline
  if ($hget(filesend,dialog.cur.con) == $1) { did -a filesend 171 %logline $crlf }
}

alias -l fs.dlg.adderrlog {
; $1 = con  $2- = text
  var %logline = $chr(91) $+ $time(HH:nn:ss) $+ $chr(93) - $+ $1 $+ - $2-
  hinc filesend.log 0
  hadd filesend.log $hget(filesend.log,0) %logline
  did -o filesend 32 1 $did(filesend,33).text
  did -o filesend 33 1 %logline
  if ($dialog(fs.errorlog)) { did -a fs.errorlog 1 %logline $crlf }
}

alias -l fs.dlg.newcon {
; $1 = sockname
  if ($hget(filesend,dialog.cur.con) == $1) || ($1 == $null) { return }
  hadd filesend dialog.cur.con $1
  did -o filesend 23,24 1 $str(:,30)
  did -o filesend 25 1 $bytes($calc($hget(filesend,dialog.dl.lastspeed. $+ $1) / 2),3).suf $+ /s
  did -o filesend 26 1 $bytes($calc($hget(filesend,dialog.ul.lastspeed. $+ $1) / 2),3).suf $+ /s
  did -r filesend 111-114,131,141-144,171
  var %i = 1 , %max = $hget(filesend,dialog.dl.filelist.listlength. $+ $1)
  while (%i <= %max) {
    var %id = $hget(filesend,dialog.dl.filelist.pos-id. $+ %i $+ . $+ $1) , %id = $+(%id,.,$1)
    did -a filesend 111 $hget(filesend,dialog.dl.filelist.name. $+ %id)
    did -a filesend 112 $hget(filesend,dialog.dl.filelist.type. $+ %id)
    did -a filesend 113 $bytes($hget(filesend,dialog.dl.filelist.size. $+ %id),3).suf
    did -a filesend 114 $hget(filesend,dialog.dl.filelist.status. $+ %id)
    inc %i
  }
  var %i = 1 , %max = $hget(filesend,dialog.ul.filelist.listlength)
  while (%i <= %max) {
    var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ %i)
    did $iif($did(filesend,124,%i).state,-okc,-o) filesend 124 %i $hget(filesend,$+(dialog.ul.filelist.status.,%id,.,$1))
    inc %i
  }
  var %i = 1 , %max = $hget(filesend,dialog.dled.filelist.listlength. $+ $1)
  while (%i <= %max) {
    var %id = $hget(filesend,$+(dialog.dled.filelist.pos-id.,%i,.,$1)) , %id = $+(%id,.,$1)
    did -a filesend 141 $hget(filesend,dialog.dled.filelist.name. $+ %id)
    did -a filesend 142 $hget(filesend,dialog.dled.filelist.type. $+ %id)
    did -a filesend 143 $bytes($hget(filesend,dialog.dled.filelist.size. $+ %id),3).suf
    did -a filesend 144 $hget(filesend,dialog.dled.filelist.status. $+ %id)
    inc %i
  }
  var %i = 1 , %max = $hget(filesend.log,0. $+ $1)
  while (%i <= %max) {
    did -a filesend 171 $hget(filesend.log,$+(%i,.,$1)) $crlf
    inc %i
  }
}

alias -l fs.dlg.log.disconnect {
; $1 = sockname
  fs.dlg.addlog $1 Disconnecting..
  var %ok = 0 , %err = 0 , %i = $iif($hget(filesend,dialog.dled.filelist.listlength. $+ $1) == $null,0,$v1)
  while (%i) {
    if ($hget(filesend,dialog.dled.filelist.status. $+ $hget(filesend,dialog.dled.filelist.pos-id. $+ %i $+ . $+ $1) $+ . $+ $1) == Ok) { inc %ok }
    else { inc %err }
    dec %i
  }
  fs.dlg.addlog $1 Total downloaded: $calc(%ok + %err) files $iif(%err,$chr(40) $+ %err corrupt $+ $chr(41)) -- $bytes($sock($1).rcvd,3).suf
  fs.dlg.addlog $1 Total sent: $iif($hget(filesend,dialog.uled.filelist.listlength. $+ $1) == $null,0,$v1) files -- $bytes($sock($1).sent,3).suf
  fs.dlg.addlog $1 Total time: $duration($sock($1).to)
}

alias -l fs.dlg.flist.sort {
; $1 = $did (91-94)
; tab = 101 102 104
  var %tab = $dialog(filesend).tab , %con = $hget(filesend,dialog.cur.con) , %dids = $+(1,$mid(%tab,3,1),1-1,$mid(%tab,3,1),4)
  if ($1 == 91) { var %it = name }
  elseif ($1 == 92) { var %it = type }
  elseif ($1 == 93) { var %it = size }
  elseif ($1 == 94) { var %it = status }
  if ($window(@filesend.sort)) { window -c @filesend.sort }
  window $iif($1 == 93,-hn,-hns) @filesend.sort
  if ($istok(101 104,%tab,32)) {
    var %t = $iif(%tab == 101,dl,dled) , %i = $hget(filesend,$+(dialog.,%t,.filelist.listlength.,%con))
    while (%i) {
      var %id = $hget(filesend,$+(dialog.,%t,.filelist.pos-id.,%i,.,%con))
      aline @filesend.sort $hget(filesend,$+(dialog.,%t,.filelist.,%it,.,%id,.,%con)) %id
      dec %i
    }
    if ($1 == 93) { filter -cwwtu 1 32 @filesend.sort @filesend.sort }
    var %i = 1 , %max = $line(@filesend.sort,0) , %did1 = $+(1,$mid(%tab,3,1),1) , %did2 = $calc(%did1 + 1) , %did3 = $calc(%did2 + 1) , %did4 = $calc(%did3 + 1)
    did -r filesend %dids
    while (%i <= %max) {
      var %id = $gettok($line(@filesend.sort,%i),-1,32)
      hadd filesend $+(dialog.,%t,.filelist.pos-id.,%i,.,%con) %id
      hadd filesend $+(dialog.,%t,.filelist.id-pos.,%id,.,%con) %i
      did -a filesend %did1 $hget(filesend,$+(dialog.,%t,.filelist.name.,%id,.,%con))
      did -a filesend %did2 $hget(filesend,$+(dialog.,%t,.filelist.type.,%id,.,%con))
      did -a filesend %did3 $bytes($hget(filesend,$+(dialog.,%t,.filelist.size.,%id,.,%con)),3).suf
      did -a filesend %did4 $hget(filesend,$+(dialog.,%t,.filelist.status.,%id,.,%con))
      inc %i
    }
  }
  elseif (%tab == 102) {
    var %i = $hget(filesend,dialog.ul.filelist.listlength)
    while (%i) {
      var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ %i)
      aline @filesend.sort $hget(filesend,$+(dialog.ul.filelist.,%it,.,%id,$iif(%it == status,. $+ %con))) %id
      dec %i
    }
    if ($1 == 93) { filter -cwwtu 1 32 @filesend.sort @filesend.sort }
    var %i = 1 , %max = $line(@filesend.sort,0)
    did -r filesend %dids
    while (%i <= %max) {
      var %id = $gettok($line(@filesend.sort,%i),-1,32)
      hadd filesend dialog.ul.filelist.pos-id. $+ %i %id
      hadd filesend dialog.ul.filelist.id-pos. $+ %id %i
      did -a filesend 121 $hget(filesend,dialog.ul.filelist.name. $+ %id)
      did -a filesend 122 $hget(filesend,dialog.ul.filelist.type. $+ %id)
      did -a filesend 123 $bytes($hget(filesend,dialog.ul.filelist.size. $+ %id),3).suf
      did -a filesend 124 $hget(filesend,$+(dialog.ul.filelist.status.,%id,.,%con))
      inc %i
    }
  }
  window -c @filesend.sort
}

alias -l fs.dlg.flist.search {
; tab 101 102 104
  var %tab = $dialog(filesend).tab , %con = $hget(filesend,dialog.cur.con) , %dids = $+(1,$mid(%tab,3,1),1-1,$mid(%tab,3,1),4)
  if ($window(@filesend.search)) { window -c @filesend.search }
  if ($window(@filesend.searchx)) { window -c @filesend.searchx }
  window -hn @filesend.search
  window -hn @filesend.searchx
  did -r filesend %dids
  if ($istok(101 104,%tab,32)) {
    var %t = $iif(%tab == 101,dl,dled) , %i = 1 , %max = $hget(filesend,$+(dialog.,%t,.filelist.listlength.,%con))
    while (%i <= %max) {
      var %id = $hget(filesend,$+(dialog.,%t,.filelist.pos-id.,%i,.,%con)) , %name = $hget(filesend,$+(dialog.,%t,.filelist.name.,%id,.,%con)) , %type = $hget(filesend,$+(dialog.,%t,.filelist.type.,%id,.,%con))
      aline @filesend.search %id %name $+ $iif(%type !== $null,. $+ $v1)
      inc %i
    }
    filter -wwx @filesend.search @filesend.searchx & $+(*,$did(filesend,95).text,*)
    filter -cww @filesend.search @filesend.search & $+(*,$did(filesend,95).text,*)
    var %i = 1 , %max = $line(@filesend.search,0) , %did1 = $+(1,$mid(%tab,3,1),1) , %did2 = $calc(%did1 + 1) , %did3 = $calc(%did2 + 1) , %did4 = $calc(%did3 + 1)
    while (%i <= %max) {
      var %id = $gettok($line(@filesend.search,%i),1,32)
      hadd filesend $+(dialog.,%t,.filelist.pos-id.,%i,.,%con) %id
      hadd filesend $+(dialog.,%t,.filelist.id-pos.,%id,.,%con) %i
      did -ack filesend %did1 $hget(filesend,$+(dialog.,%t,.filelist.name.,%id,.,%con))
      did -ack filesend %did2 $hget(filesend,$+(dialog.,%t,.filelist.type.,%id,.,%con))
      did -ack filesend %did3 $bytes($hget(filesend,$+(dialog.,%t,.filelist.size.,%id,.,%con)),3).suf
      did -ack filesend %did4 $hget(filesend,$+(dialog.,%t,.filelist.status.,%id,.,%con))
      inc %i
    }
    var %j = 1 , %max = $line(@filesend.searchx,0)
    while (%j <= %max) {
      var %id = $gettok($line(@filesend.searchx,%j),1,32)
      hadd filesend $+(dialog.,%t,.filelist.pos-id.,%i,.,%con) %id
      hadd filesend $+(dialog.,%t,.filelist.id-pos.,%id,.,%con) %i
      did -a filesend %did1 $hget(filesend,$+(dialog.,%t,.filelist.name.,%id,.,%con))
      did -a filesend %did2 $hget(filesend,$+(dialog.,%t,.filelist.type.,%id,.,%con))
      did -a filesend %did3 $bytes($hget(filesend,$+(dialog.,%t,.filelist.size.,%id,.,%con)),3).suf
      did -a filesend %did4 $hget(filesend,$+(dialog.,%t,.filelist.status.,%id,.,%con))
      inc %i
      inc %j
    }
  }
  elseif (%tab == 102) {
    var %i = 1 , %max = $hget(filesend,dialog.ul.filelist.listlength)
    while (%i <= %max) {
      var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ %i) , %name = $hget(filesend,$+(dialog.ul.filelist.name.,%id)) , %type = $hget(filesend,$+(dialog.ul.filelist.type.,%id))
      aline @filesend.search %id %name $+ $iif(%type !== $null,. $+ $v1)
      inc %i
    }
    filter -wwx @filesend.search @filesend.searchx & $+(*,$did(filesend,95).text,*)
    filter -cww @filesend.search @filesend.search & $+(*,$did(filesend,95).text,*)
    var %i = 1 , %max = $line(@filesend.search,0)
    while (%i <= %max) {
      var %id = $gettok($line(@filesend.search,%i),1,32)
      hadd filesend dialog.ul.filelist.pos-id. $+ %i %id
      hadd filesend dialog.ul.filelist.id-pos. $+ %id %i
      did -ack filesend 121 $hget(filesend,dialog.ul.filelist.name. $+ %id)
      did -ack filesend 122 $hget(filesend,dialog.ul.filelist.type. $+ %id)
      did -ack filesend 123 $bytes($hget(filesend,dialog.ul.filelist.size. $+ %id),3).suf
      did -ack filesend 124 $hget(filesend,$+(dialog.ul.filelist.status.,%id,.,%con))
      inc %i
    }
    var %j = 1 , %max = $line(@filesend.searchx,0)
    while (%j <= %max) {
      var %id = $gettok($line(@filesend.searchx,%j),1,32)
      hadd filesend dialog.ul.filelist.pos-id. $+ %i %id
      hadd filesend dialog.ul.filelist.id-pos. $+ %id %i
      did -a filesend 121 $hget(filesend,dialog.ul.filelist.name. $+ %id)
      did -a filesend 122 $hget(filesend,dialog.ul.filelist.type. $+ %id)
      did -a filesend 123 $bytes($hget(filesend,dialog.ul.filelist.size. $+ %id),3).suf
      did -a filesend 124 $hget(filesend,$+(dialog.ul.filelist.status.,%id,.,%con))
      inc %i
      inc %j
    }
  }
  window -c @filesend.search
  window -c @filesend.searchx
}

on *:SIGNAL:filesend:{
  if (!$dialog(filesend)) { return }
  
;;;;;;; CONNECTION ;;;;;;;
  
  if ($1 == pw.denied) {
; $2 = sockname
    fs.dlg.adderrlog $gettok($2,2,46) password denied by the server.
  }
  elseif ($1 == version.denied) {
; $2 = sockname  $3- = others version
    fs.dlg.adderrlog $gettok($2,2,46) disconnected: $iif($gettok($2,2,46) == server,Client,Server) is running $3- $+ . Your version is $filesend.version
    fs.dlg.adderrlog $gettok($2,2,46) Get the latest version at http://home.versatel.nl/vliet1953/irc/
  }
  if ($1 == version.accept) {
; $2 = sockname
    if (filesend.server.* !iswm $2) && (filesend.client !== $2) { return }
    fs.dlg.addlog $2 Connected to $sock($2).ip at $time(dd-mmm-yyyy)
    var %showname = $gettok($2,2-,46) $sock($2).ip
    var %pos = 1 , %max = $hget(filesend,dialog.ul.filelist.listlength)
    while (%pos <= %max) {
      var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ %pos)
      hadd filesend $+(dialog.ul.filelist.status.,%id,.,$2) ..
      inc %pos
    }
    hinc filesend dialog.conlist.len
    hadd filesend dialog.conlist.pos-name. $+ $hget(filesend,dialog.conlist.len) $2
    hadd filesend dialog.conlist.name-pos. $+ $2 $hget(filesend,dialog.conlist.len)
    hadd filesend dialog.conlist.showname. $+ $hget(filesend,dialog.conlist.len) %showname
    if ($did(filesend,3).lines == 0) || (($did(filesend,3).lines == 1) && ($hget(filesend,dialog.cur.con) == socklisten)) { did -ca filesend 3 %showname | fs.dlg.newcon $2 }
    else { did -o filesend 3 $hget(filesend,dialog.conlist.len) %showname }
  }
  
  if ($1 == socklisten.open) {
;$2 = port
    fs.dlg.addlog socklisten Started listening for connections at $time(dd-mmm-yyyy) using port $2
    hinc filesend dialog.conlist.len
    hadd filesend dialog.conlist.pos-name. $+ $hget(filesend,dialog.conlist.len) socklisten
    hadd filesend dialog.conlist.name-pos.socklisten $hget(filesend,dialog.conlist.len)
    hadd filesend dialog.conlist.showname. $+ $hget(filesend,dialog.conlist.len) Server (listening)
    if ($hget(filesend,dialog.conlist.len) == 1) { did -ca filesend 3 Server (listening) | fs.dlg.newcon socklisten }
    else { did -a filesend 3 Server (listening) }
    if ($hget(filesend,dialog.invite)) {
      notice $gettok($hget(filesend,dialog.invite),1,32) Filesend invite $gettok($hget(filesend,dialog.invite),3,32) $hget(filesend,port.filesend.listen) $hget(filesend,pw.filesend.listen)
      hdel filesend dialog.invite
    }
  }
  if ($1 == socklisten.reopen) {
;$2 = port
    fs.dlg.addlog socklisten Started listening for connections at $time(dd-mmm-yyyy) using port $2
    hadd filesend dialog.conlist.showname. $+ $hget(filesend,dialog.conlist.len) Server (listening)
    if ($hget(filesend,dialog.cur.con) == socklisten) { did -co filesend 3 $hget(filesend,dialog.conlist.name-pos.socklisten) Server (listening) }
    else { did -o filesend 3 $hget(filesend,dialog.conlist.name-pos.socklisten) Server (listening) }
    if ($hget(filesend,dialog.invite)) {
      notice $gettok($hget(filesend,dialog.invite),1,32) Filesend invite $gettok($hget(filesend,dialog.invite),3,32) $hget(filesend,port.filesend.listen) $hget(filesend,pw.filesend.listen)
      hdel filesend dialog.invite
    }
  }
  if ($1 == client.close) || ($1 == disconnected) {
; $2 = sockname
    if (filesend.client !== $2) && (filesend.server.* !iswm $2) { return }
    var %pos = $hget(filesend,dialog.conlist.name-pos. $+ $2)
    if (!%pos) { return }
    
    fs.dlg.addlog $2 Disconnected at $time(dd-mmm-yyyy)
    if ($fopen(filesend.log)) { .fclose filesend.log }
    if ($exists($fs.folder $+ /filesend.log)) { .fopen filesend.log $qt($fs.folder $+ /filesend.log) }
    else {
      if (!$exists($fs.folder)) {
        if (!$makedir($fs.folder)) { .timer 1 0 noop $input($fs.folder is an invalid pathname,o,Filesend) }
        else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
      }
      else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
    }
    if ($fopen(filesend.log)) {
      .fseek filesend.log $file($fopen(filesend.log).fname).size
      .fwrite filesend.log $crlf $crlf
      var %i = 1 , %max = $iif($hget(filesend.log,0. $+ $2) == $null,0,$v1)
      while (%i <= %max) {
        .fwrite -n filesend.log $hget(filesend.log,%i $+ . $+ $2)
        inc %i
      }
      .fclose filesend.log
    }
    did -d filesend 3 %pos
    while (%pos < $hget(filesend,dialog.conlist.len)) {
      var %curname = $hget(filesend,dialog.conlist.pos-name. $+ $calc(%pos + 1))
      hadd filesend dialog.conlist.pos-name. $+ %pos %curname
      hadd filesend dialog.conlist.name-pos. $+ %curname %pos
      hadd filesend dialog.conlist.showname. $+ %pos $hget(filesend,dialog.conlist.showname. $+ $calc(%pos + 1))
      inc %pos
    }
    hdec filesend dialog.conlist.len
    hdel filesend dialog.conlist.name-pos. $+ $2
    hdel filesend dialog.conlist.pos-name. $+ %pos
    hdel filesend dialog.conlist.showname. $+ %pos
    if ($hget(filesend,dialog.cur.con) == $2) {
      hdel filesend dialog.cur.con
      did -r filesend 111-114,124,131,141-144
      did -o filesend 23,24 1 $str(:,30)
      did -o filesend 25,26 1 0B/s
    }
    hdel -w filesend *. $+ $2
    hdel -w filesend.log *. $+ $2
  }
  if ($1 == socklisten.close) {
    var %pos = $hget(filesend,dialog.conlist.name-pos.socklisten)
    if (!%pos) { return }
    hadd filesend dialog.conlist.showname. $+ %pos Server
    did -o filesend 3 %pos Server
    fs.dlg.addlog socklisten Stopped listening for connections
  }
  if ($1 == server.close) {
    if ($fopen(filesend.log)) { .fclose filesend.log }
    if ($exists($fs.folder $+ /filesend.log)) { .fopen filesend.log $qt($fs.folder $+ /filesend.log) }
    else {
      if (!$exists($fs.folder)) {
        if (!$makedir($fs.folder)) { .timer 1 0 noop $input($fs.folder is an invalid pathname,o,Filesend) }
        else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
      }
      else { .fopen -n filesend.log $qt($fs.folder $+ /filesend.log) }
    }
    if ($fopen(filesend.log)) { .fseek filesend.log $file($fopen(filesend.log).fname).size }
    var %pos = 1 , %newpos = 1 , %dpos = 1
    while (%pos <= $hget(filesend,dialog.conlist.len)) {
      var %name = $hget(filesend,dialog.conlist.pos-name. $+ %pos)
      if (%name == socklisten) || (filesend.server.* iswm %name) {
        did -d filesend 3 %dpos
        dec %dpos
        if ($fopen(filesend.log)) {
          if (%name == socklisten) { fs.dlg.addlog socklisten Server stopped at $time(dd-mmm-yyyy) }
          else { fs.dlg.addlog %name Disconnected at $time(dd-mmm-yyyy) }
          .fwrite filesend.log $crlf $crlf
          var %i = 1 , %max = $iif($hget(filesend.log,0. $+ %name) == $null,0,$v1)
          while (%i <= %max) {
            .fwrite -n filesend.log $hget(filesend.log,%i $+ . $+ %name)
            inc %i
          }
        }
        hdel filesend dialog.conlist.pos-name. %pos
        hdel filesend dialog.conlist.name-pos. %name
        hdel filesend dialog.conlist.showname. %pos
        if ($hget(filesend,dialog.cur.con) == %name) {
          hdel filesend dialog.cur.con
          did -r filesend 111-114,124,131,141-144
          did -o filesend 23,24 1 $str(:,30)
          did -o filesend 25,26 1 0B/s
        }
        hdel -w filesend *. $+ %name
        hdel -w filesend.log *. $+ %name
      }
      else {
        hadd filesend dialog.conlist.pos-name. $+ %newpos %name
        hadd filesend dialog.conlist.name-pos. $+ %name %newpos
        hadd filesend dialog.conlist.showname. $+ %newpos $hget(filesend,dialog.conlist.showname. $+ %pos)
        inc %newpos
      }
      inc %dpos
      inc %pos
    }
    if ($fopen(filesend.log)) { .fclose filesend.log }
    hdel -w filesend *.filesend.server.*
    hdel -w filesend *.listen
    hdel -w filesend *.socklisten
    hdel -w filesend.log *.filesend.server.*
    hadd filesend dialog.conlist.len $calc(%newpos - 1)
  }
  if ($1 == quiting) {
; $2 = sockname
    fs.dlg.log.disconnect $2
  }
  
  
;;;;;;; GET LIST ;;;;;;;
  
  if ($1 == getlist) {
; $2 = sockname   $3 = fileID   $4 = size / nr of files / -1   $5- = filename
    if ($3 == 0) {
      fs.dlg.addlog $2 Receiving new downloadable files list -- $4 files
      var %pos = $hget(filesend,dialog.dl.filelist.listlength. $+ $2)
      while (%pos > 0) {
        var %id = $+($hget(filesend,$+(dialog.dl.filelist.pos-id.,%pos,.,$2)),.,$2)
        hadd filesend dialog.dl.filelist.tempstatus. $+ %id $hget(filesend,dialog.dl.filelist.status. $+ %id)
        dec %pos
      }
      hadd filesend dialog.dl.filelist.files. $+ $2 $4
      hdel filesend dialog.dl.filelist.listlength. $+ $2
      hdel -w filesend dialog.dl.filelist.name.*. $+ $2
      hdel -w filesend dialog.dl.filelist.type.*. $+ $2
      hdel -w filesend dialog.dl.filelist.size.*. $+ $2
      hdel -w filesend dialog.dl.filelist.status.*. $+ $2
      hdel -w filesend dialog.dl.filelist.pos-id.*. $+ $2
      hdel -w filesend dialog.dl.filelist.id-pos.*. $+ $2
      return
    }
    hinc filesend dialog.dl.filelist.listlength. $+ $2
    var %pos = $hget(filesend,dialog.dl.filelist.listlength. $+ $2) , %id = $+($3,.,$2) , %stat = $iif($hget(filesend,$+(dialog.dl.filelist.tempstatus.,$3,.,$2)) == $null,..,$v1)
    if ($4 == -1) { var %stat = File missing }
    elseif (%stat == File missing) && ($4 !== -1) { var %stat = .. }
    if (%pos <= $hget(filesend,dialog.dl.filelist.files. $+ $2)) {
      fs.dlg.addlog $2 FileID $3 -- Size $4 bytes -- Name $5-
      hadd filesend dialog.dl.filelist.name. $+ %id $iif($numtok($5-,46) > 1,$deltok($5-,-1,46),$5-)
      hadd filesend dialog.dl.filelist.type. $+ %id $iif($numtok($5-,46) > 1,$gettok($5-,-1,46))
      hadd filesend dialog.dl.filelist.size. $+ %id $iif($4 !== -1,$4)
      hadd filesend dialog.dl.filelist.status. $+ %id %stat
      hadd filesend $+(dialog.dl.filelist.pos-id.,%pos,.,$2) $3
      hadd filesend dialog.dl.filelist.id-pos. $+ %id %pos
    }
    if (%pos == $hget(filesend,dialog.dl.filelist.files. $+ $2)) {
      fs.dlg.addlog $2 End of downloadable files list.
      hdel -w filesend dialog.dl.filelist.tempstatus.*. $+ $2
      if ($hget(filesend,dialog.cur.con) == $2) {
        did -r filesend 111-114
        var %i = 1
        while (%i <= %pos) {
          var %id = $+($hget(filesend,dialog.dl.filelist.pos-id. $+ %i $+ . $+ $2),.,$2)
          did -a filesend 111 $hget(filesend,dialog.dl.filelist.name. $+ %id)
          did -a filesend 112 $hget(filesend,dialog.dl.filelist.type. $+ %id)
          did -a filesend 113 $bytes($hget(filesend,dialog.dl.filelist.size. $+ %id),3).suf
          did -a filesend 114 $hget(filesend,dialog.dl.filelist.status. $+ %id)
          inc %i
        }
      }
    }
  }
  
  
;;;;;;; ADD REM FILE ;;;;;;;
  
  if ($1 == addfile) {
  ; $2 = fileID   $3- = filename
    var %file = $nopath($3-)
    hinc filesend dialog.ul.filelist.listlength
    var %pos = $hget(filesend,dialog.ul.filelist.listlength)
    hadd filesend dialog.ul.filelist.name. $+ $2 $iif($numtok(%file,46) > 1,$deltok(%file,-1,46),%file)
    hadd filesend dialog.ul.filelist.type. $+ $2 $iif($numtok(%file,46) > 1,$gettok(%file,-1,46))
    hadd filesend dialog.ul.filelist.size. $+ $2 $file($3-).size
    var %i = $hget(filesend,dialog.conlist.len)
    while (%i > 0) {
      hadd filesend $+(dialog.ul.filelist.status.,$2,.,$hget(filesend,dialog.conlist.pos-name. $+ %i)) ..
      dec %i
    }
    hadd filesend dialog.ul.filelist.pos-id. $+ %pos $2
    hadd filesend dialog.ul.filelist.id-pos. $+ $2 %pos
    did -a filesend 121 $hget(filesend,dialog.ul.filelist.name. $+ $2)
    did -a filesend 122 $hget(filesend,dialog.ul.filelist.type. $+ $2)
    did -a filesend 123 $bytes($hget(filesend,dialog.ul.filelist.size. $+ $2),3).suf
    did -a filesend 124 $hget(filesend,$+(dialog.ul.filelist.status.,$2,.,$hget(filesend,dialog.cur.con)))
  }
  if ($1 == remfile) {
; $2 = fileID
    var %pos = $hget(filesend,dialog.ul.filelist.id-pos. $+ $2)
    did -d filesend 121-124 %pos
    var %max = $hget(filesend,dialog.ul.filelist.listlength)
    while (%pos < %max) {
      var %id = $hget(filesend,dialog.ul.filelist.pos-id. $+ $calc(%pos + 1))
      hadd filesend dialog.ul.filelist.id-pos. $+ %id %pos
      hadd filesend dialog.ul.filelist.pos-id. $+ %pos %id
      inc %pos
    }
    hdel filesend dialog.ul.filelist.name. $+ $2
    hdel filesend dialog.ul.filelist.type. $+ $2
    hdel filesend dialog.ul.filelist.size. $+ $2
    hdel -w filesend dialog.ul.filelist.status. $+ $2 $+ .*
    hdel filesend dialog.ul.filelist.id-pos. $+ $2
    hdel filesend dialog.ul.filelist.pos-id. $+ %max
    hdec filesend dialog.ul.filelist.listlength
  }
  
  
;;;;;;; GET FILE ;;;;;;;
  
  if ($1 == getfile.start) || ($1 == getfile.missing) {
; $2 = sockname   $3 = fileID   $4 = size   $5- = real-filename
    var %s = $iif($1 == getfile.start,1)
    if (%s) {
      hadd filesend dialog.dl.curfile.size. $+ $2 $4
      hadd filesend $+(dialog.dled.filelist.folder.,$3,.,$2) $hget(filesend,dl.folder)
    }
    hadd filesend $+(dialog.dl.filelist.status.,$3,.,$2) $iif(%s,Downloading,File missing)
    if ($hget(filesend,dialog.cur.con) == $2) {
      did -o filesend 23 1 $str(:,30)
      var %pos = $hget(filesend,$+(dialog.dl.filelist.id-pos.,$3,.,$2))
      did $iif($did(filesend,114,%pos).state,-cko,-o) filesend 114 %pos $iif(%s,Downloading,File missing)
    }
    fs.dlg.addlog $2 $iif(%s,Starting download of $5- $bytes($4,3).suf,Couldn't start download of $5- (file missing))
  }
  if ($1 == getfile.done) || ($1 == getfile.err) {
; done:  $2 = sockname   $3 = fileID   $4- = filename
; err:   $2 = sockname   $3 = fileID   $4 = retry.nr   $5 = max retry.nr   $6- = filename
    
    if ($1 == getfile.done) { var %fname = $iif($numtok($4-,46) > 1,$deltok($4-,-1,46),$4-) , %type = $iif($numtok($4-,46) > 1,$gettok($4-,-1,46)) }
    else { var %fname = $iif($numtok($6-,46) > 1,$deltok($6-,-1,46),$6-) , %type = $iif($numtok($6-,46) > 1,$gettok($6-,-1,46)) }
    var %size = $hget(filesend,dialog.dl.curfile.size. $+ $2)
    if ($1 == getfile.done) { fs.dlg.addlog $2 Downloaded $4- $bytes(%size,3).suf }
    elseif ($4 <= $5) { fs.dlg.addlog $2 Downloaded corrupt file: $6- $bytes(%size,3).suf -- Auto retry ( $+ $4 $+ / $+ $5 $+ ) }
    else { fs.dlg.addlog $2 Downloaded corrupt file: $6- $bytes(%size,3).suf -- No more auto retry }
    if ($1 == getfile.done) || (($1 == getfile.err) && ($4 > $5)) {
      var %id = $+($3,.,$2) , %pos = $hget(filesend,dialog.dled.filelist.id-pos. $+ %id)
      if (%pos) {
        did -d filesend 141-144 %pos
        var %max = $hget(filesend,dialog.dled.filelist.listlength. $+ $2)
        while (%pos < %max) {
          var %fid = $hget(filesend,$+(dialog.dled.filelist.pos-id.,$calc(%pos + 1),.,$2))
          hadd filesend $+(dialog.dled.filelist.id-pos.,%fid,.,$2) %pos
          hadd filesend $+(dialog.dled.filelist.pos-id.,%pos,.,$2) %fid
          inc %pos
        }
      }
      else {
        hinc filesend dialog.dled.filelist.listlength. $+ $2
        hadd filesend dialog.dled.filelist.type. $+ %id %type
        hadd filesend dialog.dled.filelist.size. $+ %id %size
      }
      hadd filesend dialog.dled.filelist.name. $+ %id %fname
      var %pos = $hget(filesend,dialog.dled.filelist.listlength. $+ $2)
      hadd filesend dialog.dled.filelist.status. $+ %id $iif($1 == getfile.done,Ok,Corrupt)
      hadd filesend $+(dialog.dled.filelist.pos-id.,%pos,.,$2) $3
      hadd filesend dialog.dled.filelist.id-pos. $+ %id %pos
      
      if ($hget(filesend,dialog.dl.filelist.id-pos. $+ %id)) {
        hadd filesend dialog.dl.filelist.status. $+ %id $iif($1 == getfile.done,Done,Failed)
        if ($hget(filesend,dialog.cur.con) == $2) {
          var %pos = $hget(filesend,dialog.dl.filelist.id-pos. $+ %id)
          did $iif($did(filesend,114,%pos).state,-cko,-o) filesend 114 %pos $iif($1 == getfile.done,Done,Failed)
        }
      }
      if ($hget(filesend,dialog.cur.con) == $2) {
        did -a filesend 141 %fname
        did -a filesend 142 %type
        did -a filesend 143 $bytes(%size,3).suf
        did -a filesend 144 $iif($1 == getfile.done,Ok,Corrupt)
      }
    }
    hdel filesend dialog.dl.curfile.size. $+ $2
  }
  
  
;;;;;;; SEND FILE ;;;;;;;
  
  if ($1 == sendfile.start) || ($1 == sendfile.missing) {
; $2 = sockname   $3 = fileID
    var %s = $iif($1 == sendfile.start,1)
    if (%s) {
      hadd filesend dialog.ul.curfile.size. $+ $2 $hget(filesend,dialog.ul.filelist.size. $+ $3)
      hadd filesend dialog.ul.curfile.id. $+ $2 $3
    }
    hadd filesend $+(dialog.ul.filelist.status.,$3,.,$2) $iif(%s,Uploading,File missing)
    if ($hget(filesend,dialog.cur.con) == $2) {
      did -o filesend 24 1 $str(:,30)
      var %pos = $hget(filesend,dialog.ul.filelist.id-pos. $+ $3)
      did $iif($did(filesend,124,%pos).state,-cko,-o) filesend 124 %pos $iif(%s,Uploading,File missing)
    }
    fs.dlg.addlog $2 $iif(%s,Starting,Couldn't start) upload of $hget(filesend,dialog.ul.filelist.name. $+ $3) $+ $iif($hget(filesend,dialog.ul.filelist.type. $+ $3) !== $null,. $+ $v1) $iif(%s,$bytes($hget(filesend,dialog.ul.filelist.size. $+ $3),3).suf,(file missing))
  }
  if ($1 == sendfile.done) {
; $2 = sockname   $3- = path\filename
    var %fid = $hget(filesend,dialog.ul.curfile.id. $+ $2) , %id = $+(%fid,.,$2) , %file = $nopath($3-) , %size = $hget(filesend,dialog.ul.curfile.size. $+ $2)
    hdel filesend dialog.ul.curfile.size. $+ $2
    hdel filesend dialog.ul.curfile.id. $+ $2
    fs.dlg.addlog $2 Done uploading of $3- $bytes(%size,3).suf
    hinc filesend dialog.uled.filelist.listlength. $+ $2
    if ($hget(filesend,dialog.ul.filelist.id-pos. $+ %fid)) {
      hadd filesend dialog.ul.filelist.status. $+ %id Done
      if ($hget(filesend,dialog.cur.con) == $2) {
        var %pos = $hget(filesend,dialog.ul.filelist.id-pos. $+ %fid)
        did $iif($did(filesend,124,%pos).state,-cko,-o) filesend 124 %pos Done
      }
    }
  }
  
  
;;;;;;; QUEUE ;;;;;;;
  
  if ($1 == queue) {
; $2 = sockname   $3 = status (idle/requesting/listing/sending)   $4- = queue
    var %i = 1 , %max = $numtok($4-,44) , %items = 0 , %sf.first
    if ($hget(filesend,dialog.cur.con) == $2) { did -r filesend 131 }
    while (%i <= %max) {
      var %it = $gettok($4-,%i,44)
      if ($gettok(%it,1,32) == sl) { var %it = Send list of shared files }
      elseif ($gettok(%it,1,32) == rl) { var %it = Request list of downloadable files }
      elseif ($gettok(%it,1,32) == rf) {
        var %id = $+($gettok(%it,2,32),.,$2)
        if ($3 !== requesting) || (%i > 1) {
          var %it = Request file $hget(filesend,dialog.dl.filelist.name. $+ %id) $+ $iif($hget(filesend,dialog.dl.filelist.type. $+ %id) !== $null,. $+ $v1)
          hadd filesend dialog.dl.filelist.status. $+ %id Queued
          if ($hget(filesend,dialog.cur.con) == $2) {
            var %pos = $hget(filesend,dialog.dl.filelist.id-pos. $+ %id)
            did $iif($did(filesend,114,%pos).state,-cko,-o) filesend 114 %pos Queued
          }
        }
        else { var %it }
      }
      elseif ($gettok(%it,1,32) == sf) {
        var %id = $gettok(%it,2,32)
        if (%sf.first == done) || ($3 !== sending) {
          var %it = Send file $hget(filesend,dialog.ul.filelist.name. $+ %id) $+ $iif($hget(filesend,dialog.ul.filelist.type. $+ %id) !== $null,. $+ $v1)
          hadd filesend $+(dialog.ul.filelist.status.,%id,.,$2) Queued
          if ($hget(filesend,dialog.cur.con) == $2) {
            var %pos = $hget(filesend,dialog.ul.filelist.id-pos. $+ %id)
            did $iif($did(filesend,124,%pos).state,-cko,-o) filesend 124 %pos Queued
          }
        }
        else { var %it , %sf.first = done }
      }
      if (%it !== $null) {
        inc %items
        hadd filesend $+(dialog.queue.,%items,.,$2) %it
        if ($hget(filesend,dialog.cur.con) == $2) { did -a filesend 131 %it }
      }
      inc %i
    }
    hadd filesend dialog.queue.0. $+ $2 %items
  }
  if ($1 == requestedfile) {
; $2 = sockname   $3 = fileID
    var %id = $+($3,.,$2)
    hadd filesend dialog.dl.filelist.status. $+ %id Requested
    if ($hget(filesend,dialog.cur.con) == $2) {
      var %pos = $hget(filesend,dialog.dl.filelist.id-pos. $+ %id)
      did $iif($did(filesend,114,%pos).state,-cko,-o) filesend 114 %pos Requested
    }
    fs.dlg.addlog $2 Requested file $hget(filesend,dialog.dl.filelist.name. $+ %id) $+ $iif($hget(filesend,dialog.dl.filelist.type. $+ %id) !== $null,. $+ $v1)
  }
  if ($1 == requestedlist) {
; $2 = sockname
    fs.dlg.addlog $2 Requested downloadable files list
  }
  if ($1 == sendlist) {
; $2 = sockname
    fs.dlg.addlog $2 Sending list of shared files
  }
  
  
;;;;;;; ERRORS ;;;;;;;
  
  if ($1 == error) {
    if ($2 == sock.notfree) {
      ; $3 = sockname
      fs.dlg.adderrlog $gettok($3,2,46) unable open connection: sockname $3 is in use.
    }
    elseif ($2 == dl.path) {
      ; $3 = sockname   $4- = dl path
      fs.dlg.adderrlog $gettok($3,2,46) invalid folder: $4-
    }
    elseif ($2 == port.notfree) {
      ; $3 = sockname  $4 = port  $5 = port.retry.cur  $6 = retry.port
      if ($5 <= $6) { fs.dlg.adderrlog $gettok($3,2,46) Port $4 is not free. Autoretry ( $+ $5 $+ / $+ $6 $+ ) in $calc($5 * 10) seconds. }
      else { fs.dlg.adderrlog $gettok($3,2,46) Port $4 is not free. No more autoretry. }
    }
    elseif ($2 == sockopen) {
      ; $3 = sockname  $4- = sock error message
      fs.dlg.adderrlog $gettok($3,2,46) unable to connect ( $+ $4- $+ )
    }
    elseif ($2 == reconnect) {
      ; $3 = sockname  $4 = sockerr.nr  $5 = retry.con.client
      fs.dlg.adderrlog $gettok($3,2,46) reconnecting ( $+ $4 $+ / $+ $5 $+ )
    }
    elseif ($2 == change.flist) {
      noop $input(You can't change the shared file list at this moment $+ $chr(44) try again later.,ou,Filesend)
    }
    elseif ($2 == addfile) {
      ; $3- = filename
      fs.dlg.adderrlog Error can't add file $qt($3-) it doesn't exist, or contains double spaces.
    }
    else {
      ; $2 = sockname
      fs.dlg.adderrlog $gettok($3,2,46) error
    }
  }
}

; $1 = sockname   $2 = fileID   $3 = bytesleft   $4 = bytes read
on *:SIGNAL:filesend.getfile:{
  if ($hget(filesend,dialog.dl.speed. $+ $1) == $null) { .timer $+ filesend.dl. $+ $1 -o 1 2 fs.dlg.dl.speed $1 }
  hinc filesend dialog.dl.speed. $+ $1 $4
  if ($hget(filesend,dialog.cur.con) !== $1) { return }
  var %n = $int($calc(30 * $3 / $hget(filesend,dialog.dl.curfile.size. $+ $1)))
  did -o filesend 23 1 $str(|,$calc(30 - %n)) $+ $str(:,%n)
}

; $1 = sockname   $2 = pos (total bytes read)   $3 = bytes sent
on *:SIGNAL:filesend.sendfile:{
  if ($hget(filesend,dialog.ul.speed. $+ $1) == $null) { .timer $+ filesend.ul. $+ $1 -o 1 2 fs.dlg.ul.speed $1 }
  hinc filesend dialog.ul.speed. $+ $1 $3
  if ($hget(filesend,dialog.cur.con) !== $1) { return }
  var %n = $int($calc(30 * $2 / $hget(filesend,dialog.ul.curfile.size. $+ $1)))
  did -o filesend 24 1 $str(|,%n) $+ $str(:,$calc(30 - %n))
}

; $1 = sockname
alias -l fs.dlg.dl.speed {
  if (!$hget(filesend)) { return }
  var %dl = $hget(filesend,dialog.dl.speed. $+ $1)
  hadd filesend dialog.dl.lastspeed. $+ $1 $iif(%dl,$v1,0)
  if (%dl) {
    if ($hget(filesend,dialog.cur.con) == $1) { did -o filesend 25 1 $bytes($calc(%dl / 2),3).suf $+ /s }
    hadd filesend dialog.dl.speed. $+ $1 0
    .timer $+ filesend.dl. $+ $1 -o 1 2 fs.dlg.dl.speed $1
  }
  elseif (%dl == 0) {
    if ($hget(filesend,dialog.cur.con) == $1) { did -o filesend 25 1 0B/s }
    hdel filesend dialog.dl.speed. $+ $1
  }
}

; $1 = sockname
alias -l fs.dlg.ul.speed {
  if (!$hget(filesend)) { return }
  var %ul = $hget(filesend,dialog.ul.speed. $+ $1)
  hadd filesend dialog.ul.lastspeed. $+ $1 $iif(%ul,$v1,0)
  if (%ul) {
    if ($hget(filesend,dialog.cur.con) == $1) { did -o filesend 26 1 $bytes($calc(%ul / 2),3).suf $+ /s }
    hadd filesend dialog.ul.speed. $+ $1 0
    .timer $+ filesend.ul. $+ $1 -o 1 2 fs.dlg.ul.speed $1
  }
  elseif (%ul == 0) {
    if ($hget(filesend,dialog.cur.con) == $1) { did -o filesend 26 1 0B/s }
    hdel filesend dialog.ul.speed. $+ $1
  }
}

alias -l fs.dlg.version { return v1.100 }

on *:LOAD:{
  if ($toolbar(filesend)) { toolbar -d filesend }
  if ($readini($fs.settings.file,settings,menus) !== 0) {
    writeini $qt($fs.settings.file) settings menus 1
    if ($exists($fs.icon.file)) { fs.dlg.toolbar }
  }
  if ($filesend.version == $null) { noop $input(To run filesend you need to load filesend.mrc first,wo,Filesend) | return }
  if ($filesend.version !=== $fs.dlg.version) { noop $input(Filesend version ( $+ $filesend.version $+ ) differs from Filesend dialog version ( $+ $fs.dlg.version $+ ),ow,filesend) | return }
  if ($input(Welcome to filesend $filesend.version $crlf $+ Would you like to set up filesend now?,yk60,Filesend)) { filesend settings }
}

on *:UNLOAD:{ if ($toolbar(filesend)) { toolbar -d filesend } }

on *:START:{
  if ($readini($fs.settings.file,settings,menus)) && (!$toolbar(filesend)) && ($exists($fs.icon.file)) { fs.dlg.toolbar }
}

alias -l fs.dlg.toolbar { toolbar -az1 filesend Filesend $qt($fs.icon.file) /filesend @filesend }

MENU @filesend {
  Start filesend { filesend }
  Settings { if ($dialog(filesend)) { did -f filesend 106 | did -h filesend 91-96 | did -h filesend 14 | did -tvo filesend 15 1 Apply } | else { filesend settings } }
  Start server { if ($dialog(filesend)) { fs.dlg.server } | else { filesend server } }
}

MENU nicklist {
  $iif($readini($fs.settings.file,settings,menus) && ($status == connected) && ($1),Filesend)
  . $+ $iif($readini($fs.settings.file,settings,menus),version) { ctcp $1 Filesend version }
  . $+ $iif($readini($fs.settings.file,settings,menus),invite) { fs.dlg.invite $1 $cid }
}

alias -l fs.dlg.invite {
; $1 = nick   $2 = cid
  var %ip = $nocontrol($iif($hget(filesend.set),$hget(filesend.set,server.ip),$readini($fs.settings.file,settings,server.ip)))
  if (%ip == $null) || (%ip == fill_in_your_own_address) {
    if ($dialog(filesend)) { dialog -v filesend }
    var %ip = $nocontrol($input(Enter your own address/ip,$iif($dialog(filesend),eou,eo),filesend))
    if (%ip == $null) { noop $input(Invalid address,$iif($dialog(filesend),owu,ow),filesend) | return }
    writeini $qt($fs.settings.file) settings server.ip %ip
    if ($dialog(filesend)) { did -o filesend 646 1 %ip }
    if ($hget(filesend.set)) { hadd filesend.set server.ip %ip }
  }
  if ($sock(filesend.listen)) && ($hget(filesend,dialog.conlist.name-pos.socklisten)) {
    notice $1 Filesend invite %ip $hget(filesend,port.filesend.listen) $hget(filesend,pw.filesend.listen)
    return
  }
  if ($dialog(filesend)) { fs.dlg.server }
  else { filesend server }
  hadd filesend dialog.invite $1 $2 %ip
}

on *:KICK:#:{
  tokenize 32 $hget(filesend,dialog.invite)
  if ($cid == $2) && (($knick == $1) || ($knick == $me)) && (!$comchan($1,2)) { hdel filesend dialog.invite }
}
on *:PART:#:{
  tokenize 32 $hget(filesend,dialog.invite)
  if ($cid == $2) && (($nick == $1) || ($nick == $me)) && (!$comchan($1,2)) { hdel filesend dialog.invite }
}
on *:QUIT:{
  tokenize 32 $hget(filesend,dialog.invite)
  if ($cid == $2) && ($nick == $1) && ($hget(filesend)) { hdel filesend dialog.invite }
}
on *:NICK:{
  tokenize 32 $hget(filesend,dialog.invite)
  if ($cid == $2) && ($nick == $1) { hadd filesend dialog.invite $newnick $2- }
}
on *:DISCONNECT:{ if ($cid == $gettok($hget(filesend,dialog.invite),2,32)) { hdel filesend dialog.invite } }

on *:NOTICE:Filesend invite & & &:?:{
  if (!$dialog(fs.invited)) {
    dialog -m fs.invited fs.invited
    did -o fs.invited 1 1 $nick invites you to connect to his server.
    did -o fs.invited 2 1 Address: $3
    did -o fs.invited 3 1 Port: $4
    did -oh fs.invited 7 1 $5
  }
}

dialog -l fs.invited {
  title "Filesend"
  icon $fs.icon.file ,0
  size -1 -1 150 58
  option dbu
  text " invites you to connect to his server.",  1, 5  5  140 8
  text "Address:",                                2, 5  12 140 8 ,nowrap
  text "Port:",                                   3, 5  19 140 8
  text "Do you want to connect now?",             4, 5  26 140 8
  button "Yes",                                   5, 35 41 35  12
  button "No",                                    6, 80 41 35  12
  text "" ,                                       7, 0  50 1   1
}

on *:DIALOG:fs.invited:sclick:6:{ dialog -x $dname }
on *:DIALOG:fs.invited:sclick:5:{
  if ($dialog(filesend)) { fs.dlg.invited $gettok($did(2),2,32) $gettok($did(3),2,32) $did(7) }
  else { filesend connect $gettok($did(2),2,32) $gettok($did(3),2,32) $did(7) }
  dialog -x $dname
}