ircZP — File Browser

ircZPv1.1 / ircZPv1.1 / zpdir / kte / kte.mrc

kte.mrc — 63.8 KB — Download this file

; Kte - Kamek's Theme Engine v1.3
; MTS-compatible theme engine (standard v1.0/1.1) -- homepage: http://www3.brinkster.com/ircweb/mts/
; Dialogs made using Dialog Studio

on *:CONNECT:kte_v connected 1
on *:DISCONNECT:hdel -w Kte.Data $+(c, $cid, :*)
on *:EXIT:hdel -w Kte.Data c*:* | _savedata

alias kte_start {
  hmake Kte.Theme 16
  if ($isfile($ktedir $+ Kte-Theme.dat)) { hload -b Kte.Theme $+(", $ktedir, Kte-Theme.dat") }
  elseif ($isfile($ktedir $+ Kte-DefTheme.dat)) { hload -b Kte.Theme $+(", $ktedir, Kte-DefTheme.dat") }
  hmake Kte.Data 8 | if ($isfile($ktedir $+ Kte-Data.dat)) { hload -b Kte.Data $+(", $ktedir, Kte-Data.dat") }
  hmake Kte.Events 8 | .kte.refresh -n
  hdel -w Kte.Data c*:*
  if ($hget(Kte.Data, Hide) !isnum) { hadd Kte.Data Hide 8 }
  if ($hget(Kte.Data, Cache) !isnum) { hadd Kte.Data Cache 3 }
  if ($hget(Kte.Data, Apply) !isnum) { hadd Kte.Data Apply 959 }
  if ($hget(Kte.Data, FRep.Status) = $null) {
    ; add some font replacements
    var %rep = 0, %bestrep = Terminal, %msss = Microsoft Sans Serif
    if ($width(A, IBMPC, -20) != $width(i, IBMPC, -20)) { hadd Kte.Data FRep.Rep.IBMPC Terminal | %rep = 1 }
    else { %bestrep = IBMPC }
    if ($width(A, GwdTE_437, -9) != $width(i, GwdTE_437, -9)) { hadd Kte.Data FRep.Rep.GwdTE_437 %bestrep | %rep = 1 }
    if ($width(A, PC8X16, -12) != $width(i, PC8X16, -12)) { hadd Kte.Data FRep.Rep.PC8X16 %bestrep | %rep = 1 }
    if ($width(Kte test, MS Sans Serif, -30) = $width(Kte test, %msss, -30)) { hadd Kte.Data FRep.Rep.MS\~Sans\~Serif %msss | %rep = 1 }
    hadd Kte.Data FRep.Status %rep
  }
  if ($hget(Kte.Data, TimestampFormat) != $null) { .timestamp -f $ifmatch }
  if ($lock(dll)) { kte.echo -aet Please enable the /dll command in mIRC Options (Alt+O), General\Lock section. }
  unset %kte._* %_kte.*
}

on *:LOAD:{
  if ($version < 5.91) { echo -ati2 Please use this add-on on mIRC 5.91 or greater. | .timer -o 1 0 .unload -nrs $+(", $script, ") | return }
  .enable #Kte.DefTheme
  if ($hget(Kte.Theme)) { hfree Kte.Theme } | if ($hget(Kte.Data)) { hfree Kte.Data } | if ($hget(Kte.Events)) { hfree Kte.Events }
}
on *:UNLOAD:{
  var %p
  if ($isfile($ktedir $+ Kte-Restore.dat)) { %p = $crlf $+ Your settings will be restored. }
  if ($hget(Kte.Data, CurTheme)) && ($input(Unload current theme before unloading Kte? $+ %p, 8)) { theme.unload }
  else {
    if ($script($ktedir $+ Kte-Dyn.mrc)) { .unload -rs $+(", $ifmatch, ") }
    hdel Kte.Data CurTheme
    hdel Kte.Data Extracted
  }
  if ($dll($ktedir $+ Kte.dll)) { dll -u $+(", $ktedir, Kte.dll") }
  hfree Kte.Theme | _savedata | hfree Kte.Data
  .remove $+(", $ktedir, Kte-Theme.dat")
  .remove $+(", $ktedir, Kte-Restore.dat")
  .remove $+(", $ktedir, Kte-Dyn.mrc")
  unset %kte.* %_kte.*
}

alias -l kte.ver return 1.3
alias -l kte.dynver return 1.3
alias -l kte.mtsver return 1.1
alias mtsversion return $kte.mtsver
alias kte.load if (!$isid) { theme.load $1- }
alias kte.unload if (!$isid) { theme.unload $1- }
alias kte.scheme if (!$isid) { theme.scheme $1- }
alias kte.refresh {
  if ($isid) { return }
  if ($1 != -n) { saveini }
  hdel -w Kte.Events *
  hadd Kte.Events Active.Invites $gettok($readini($mircini, options, n3), 26, 44)
  hadd Kte.Events Active.Queries $gettok($readini($mircini, options, n4), 5, 44)
  hadd Kte.Events Active.Notices $gettok($readini($mircini, options, n5), 13, 44)
  hadd Kte.Events Active.Whois $gettok($readini($mircini, options, n2), 26, 44)
  hadd Kte.Events Active.CTCPs $gettok($readini($mircini, options, n4), 19, 44)
  if ($version >= 6.01) { hadd Kte.Events Active.Away $gettok($readini($mircini, options, n4), 32, 44) }
  else { hadd Kte.Events Active.Away 0 }
  var %def = $readini($mircini, events, default), %i = $numtok(%def, 44), %set
  if (!%def) { %def = 1,1,1,1,1,1,1,1 }
  else { while (%i) { %def = $puttok(%def, $calc($gettok(%def, %i, 44) + 1), %i, 44) | dec %i } }
  %i = $chan(0)
  while (%i) {
    %set = $readini($mircini, events, $chan(%i))
    if (!%set) { %set = %def }
    else { while ($findtok(%set, 0, 1, 44)) { %set = $puttok(%set, $gettok(%def, $ifmatch, 44), $ifmatch, 44) } }
    hadd Kte.Events $chan(%i) %set
    dec %i
  }
  kte.echo -a Settings were updated from $+(', $nopath($mircini), '.)
}

alias theme.load {
  if ($isid) { return }
  if ($lock(dll)) { kte.error -a You must first enable the /dll command in mIRC Options (Alt+O), General\Lock section. | return }
  var %h = Kte.Theme, %dat = Kte.Data, %fn, %ofn, %ngz = $kte.gzdir $+ ngzipn.dll, %xthmdir = $kte.xthmtmpdir
  if (!$isdir($kte.cachedir)) { mkdir $+(", $kte.cachedir, ") }
  if (!$0) { dlg -md kte.load | return }
  if ($0 > 1) && ($regex($1, /-s\d+/i)) { var %sch = $int($mid($1, 3)) | tokenize 32 $2- }
  set -n %fn $1-
  if ("*" iswm %fn) { %fn = $mid(%fn, 2, -1) }
  if (*.mts !iswm %fn) && (*.mts.gz !iswm %fn) && (*.vpk !iswm %fn) && (*.vpk.gz !iswm %fn) { %fn = %fn $+ .mts }
  if (\* !iswm %fn) && (?:\* !iswm %fn) {
    var %tfn = $kte.thmdir $+ %fn
    if ($isfile(%tfn)) { %fn = %tfn }
    elseif ($kte.trydir(%fn)) { %fn = $ifmatch }
    elseif ($findfile($kte.thmdir, %fn, 1, 2)) { %fn = $ifmatch }
  }
  if (!$isfile(%fn)) { kte.error -a File not found | return }
  if (*.mts.gz iswm %fn) {
    %ofn = %fn | %fn = $left(%fn, -3)
    if (!$isfile(%ngz)) { kte.error -a nGZIPn is needed to decompress this file | goto end }
    if (!$dll(%ngz, unzip, $left(%ofn, -3))) { kte.error -a nGZIPn was unable to decompress this file | goto end }
    if (!$isdir(%xthmdir)) { mkdir $+(", %xthmdir, ") }
    .rename $+(", %fn, ") $+(", %xthmdir, $nopath(%fn), ")
    %fn = %xthmdir $+ $nopath(%fn)
  }
  elseif (*.vpk iswm %fn) || (*.vpk.gz iswm %fn) {
    var %nfn = %fn
    if (*.gz iswm %fn) {
      %nfn = $left(%fn, -3)
      if (!$isfile(%ngz)) { kte.error -a nGZIPn is needed to decompress this file | goto end }
      if (!$dll(%ngz, unzip, $left(%fn, -3))) { kte.error -a nGZIPn was unable to decompress this file | goto end }
    }
    vPak.extract $+(", %nfn, ") $+(", $kte.xthmtmpdir, ") | if (*.gz iswm %fn) { .remove $+(", %nfn, ") }
    var %killtmp = $true
    if ($result) { kte.error -a vPak error ( $+ $ifmatch $+ ) | goto end }
    var %ofn = %fn, %fn = $findfile($kte.xthmtmpdir, *.mts, 1, 9)
    if (!%fn) { kte.error -a No theme file was found on the specified vPak archive | goto end }
  }
  %fn = $+(", %fn, ")
  ; ok, file exists... check if it's valid...
  if (!$read(%fn, nw, [mts])) { kte.error -a Invalid theme file (main theme section not found) | goto end }
  var %ver = $read(%fn, ns, MTSVersion)
  if (!%ver) { kte.error -a Invalid theme file (no MTS version declared) | goto end }
  elseif (!$istok(1 1.1, $calc(%ver), 32)) { kte.error -a Invalid theme file (standard v $+ %ver is not supported) | goto end }
  if (%sch != $null) && ((%sch = 0) || (!$read(%fn, nw, $+([Scheme, %sch, ])))) {
    kte.error -a Invalid parameter (there's no scheme $chr(35) $+ %sch $+ ) | goto end
  }
  ; if the file is in the temp dir, move it to the extracted dir
  if (%ofn) {
    var %x
    killxthm
    if (!$isdir($kte.xthmdir)) { mkdir $+(", $kte.xthmdir, ") }
    %x = $finddir($kte.xthmtmpdir, *, 0, 9, .mkdir $+(", $kte.xthmdir, $mid($1-, $calc($len($kte.xthmtmpdir) + 1)), "))
    %x = $findfile($kte.xthmtmpdir, *, 0, 9, .rename $+(", $1-, ") $+(", $kte.xthmdir, $mid($1-, $calc($len($kte.xthmtmpdir) + 1)), "))
    %fn = $mid(%fn, 2, -1)
    %fn = $+(", $kte.xthmdir, $mid(%fn, $calc($len($kte.xthmtmpdir) + 1)), ")
    %_kte.killedtmp = 1
  }
  ; now, theme WILL load
  %_kte.ofn = %ofn
  %_kte.fn = %fn
  %_kte.sch = %sch
  doload
  _savedata
  :end
  if (%ofn) { var %x = $findfile($kte.xthmtmpdir, *, 0, 9, .remove $+(", $1-, ")) } | if (%killtmp) { killtmp }
  unset %_kte.*
}

alias theme.scheme {
  if ($isid) { return }
  var %thm = $hget(Kte.Data, CurTheme), %i = 1
  if (!%thm) { kte.error -a There's no theme loaded. | return }
  if (!$isfile(%thm)) { kte.error -a The theme file was not found. | return }
  if (!$0) {
    var %r | while ($hget(Kte.Theme, Scheme $+ %i) != $null) { %r = %r $ifmatch $+ , | inc %i }
    if (%r = $null) { kte.echo -a The current theme has no schemes }
    else { kte.echo -a Schemes from the current theme: $left(%r, -1) } | return
  }
  if ($0 = 1) && ($1 isnum) && (. !isin $1) && ($hget(Kte.Theme, Scheme $+ $int($1)) != $null) { set -u %_kte.sch $int($1) }
  elseif ($1- != -d) { while ($hget(Kte.Theme, Scheme $+ %i) != $null) { if ($ifmatch == $1-) { set -u %_kte.sch %i | break } | inc %i } }
  if (!%_kte.sch) && ($1 != -d) { kte.error -a The requested scheme was not found | return }
  set -u %_kte.fn %thm
  set -u %_kte.chscheme $true
  doload
  _savedata
}

alias theme.unload {
  if ($isid) { return }
  if (!$isfile($ktedir $+ Kte-Restore.dat)) && (!$hget(Kte.Data, CurTheme)) && ($1 != -f) { kte.error -a You're not currently using a theme. | return }
  if (!%_kte.loading) && ($isfile($ktedir $+ Kte-Restore.dat)) {
    status.open | status.show 0 Unloading current theme...
    if ($hget(Kte.Restore)) { hdel -w Kte.Restore * } | else { hmake Kte.Restore 8 } | hload -b Kte.Restore $+(", $ktedir, Kte-Restore.dat")
  }
  dounload
  if ($script($ktedir $+ Kte-Dyn.mrc)) { .unload -rs $+(", $ifmatch, ") | .remove $+(", $ifmatch, ") }
  .enable #Kte.DefTheme
  if ($hget(Kte.Restore)) { hfree Kte.Restore | .remove $+(", $ktedir, Kte-Restore.dat") | status.close }
}

alias theme.setting return $hget(Kte.Theme, $1)

alias -l _savedata {
  if ($hget(Kte.Theme)) { hsave -ob Kte.Theme $+(", $ktedir, Kte-Theme.dat") } | hsave -ob Kte.Data $+(", $ktedir, Kte-Data.dat")
}

alias -l kte.thmdir if ($hget(Kte.Data, ThmDir)) { return $ifmatch } | return $ktedir $+ Themes\
alias -l kte.gzdir if ($hget(Kte.Data, GZipDir)) { return $ifmatch } | return $ktedir
alias -l kte.cachedir return $ktedir $+ Cache\
alias -l kte.xthmdir return $ktedir $+ Extracted theme\
alias -l kte.xthmtmpdir return $ktedir $+ Extracted theme.tmp\

alias -l _rmdir var %x = $finddir($1-, *, 0, 1, _rmdir $1-) | .rmdir $+(", $1-, ")

alias -l kte.trydir if (\ isin $1) { return } | var %fn = $+($kte.thmdir, $iif((*.mts iswm %fn), $left(%fn, -4), %fn), \, $1) | if ($isfile(%fn)) { return %fn }

alias kte.echo _out Echo $color(info) $1-
alias kte.error _out Error $color(info) $1-
; /_out str <type>, int <color>, str <target>, str <text>
alias -l _out {
  if ($3 == -a) && (@* !iswm $active) { var %f = a }
  elseif ($3 == -a) || ($3 == -s) { var %f = s } | else { var %p = $3 }
  set -u %:echo echo $2 -qti2 $+ %f %p
  set -nu %::text $4- | theme.text $1
}

alias -l dobackup {
  var %base, %i = 1, %t = 27, %rgb, %f, %font, %fsize, %base-d = back;action;ctcp;high;info;info2;invite;join;kick;mode;nick;normal;notice; $+ $&
    notify;other;own;part;quit;topic;wallops;whois;edit;editbox t;list;listbox t;gray
  saveini
  if (!$hget(Kte.Restore)) { hmake Kte.Restore 8 }
  while (%i <= %t) { %base = %base $+ , $+ $color($gettok(%base-d, %i, 59)) | inc %i }
  %i = 0 | %t = 15 | while (%i <= %t) { %rgb = %rgb $rgb($color(%i)) | inc %i }
  hadd Kte.Restore Colors $gettok(%base, 1-, 44)
  hadd Kte.Restore RGBColors %rgb
  %i = 1 | %t = $cnick(0)
  while (%i <= %t) {
    %f = $+(-, $iif(($cnick(%i).anymode), a), $iif(($cnick(%i).nomode), n), $iif(($cnick(%i).ignore), i), $iif(($cnick(%i).op), o), $iif(($cnick(%i).voice), v), $&
      $iif(($cnick(%i).protect), p), $iif(($cnick(%i).notify), y), m, $cnick(%i).method)
    hadd Kte.Restore CNick- $+ %i %f $iif(($cnick(%i) != $null), $cnick(%i), *) $cnick(%i).color $cnick(%i).modes $cnick(%i).levels
    inc %i
  }
  hadd Kte.Restore Timestamp $iif(($window(Status Window).stamp), ON, OFF)
  hadd Kte.Restore TimestampFormat $readini($mircini, text, timestamp)
  hadd Kte.Restore FontDefault $+($window(Status Window).font, $chr(44), $window(Status Window).fontsize, $&
    $iif(($window(Status Window).fontbold), $chr(44) $+ b))
  %font = $readini($mircini, fonts, fchannel) | %fsize = $gettok(%font, 2, 44)
  hadd Kte.Restore FontChan $gettok(%font, 1, 44) $+ , $+ $right(%fsize, 2) $+ $iif((%fsize > 700), $chr(44) $+ b)
  %font = $readini($mircini, fonts, fquery) | %fsize = $gettok(%font, 2, 44)
  hadd Kte.Restore FontQuery $gettok(%font, 1, 44) $+ , $+ $right(%fsize, 2) $+ $iif((%fsize > 700), $chr(44) $+ b)
  hsave -ob Kte.Restore $+(", $ktedir, Kte-Restore.dat")
  hfree Kte.Restore
}

; /doload
alias -l doload {
  var %h = Kte.Theme, %dat = Kte.Data, %fn = %_kte.fn, %w = @Kte.Theme, %i = 1, %t, %sch = %_kte.sch, %ofn = %_kte.ofn, $&
    %chscheme = %_kte.chscheme, %apply = $hget(Kte.Data, Apply)
  status.open
  status.show 0 Preparing to load...
  %_kte.loading = $true
  if ($isbit(%apply, 1)) || (!%apply) { %apply = 1023 }
  if (!%_kte.chscheme) {
    if ($hget(%dat, CurTheme)) { dounload }
    else { dobackup }
    if (%ofn) { hadd %dat Extracted $true } | else { hdel %dat Extracted }
  }
  .disable #Kte.DefTheme
  window -lhBi %w
  hdel -w %h * | if ($isfile($ktedir $+ Kte-DefTheme.dat)) { hload -ob %h $+(", $ktedir, Kte-DefTheme.dat") }
  loadbuf -tmts %w %fn
  if (%sch) { loadbuf -tScheme $+ %sch %w %fn }
  filter -cwwg %w %w /^[^\x20;]/
  %t = $line(%w, 0)
  while (%i <= %t) { hadd %h $line(%w, %i) | inc %i }
  close -@ %w
  if ($hget(%h, BaseColors) != $null) {
    tokenize 44 $ifmatch
    hadd %h BaseColors $replace($~($1) $~($2) $~($3) $~($4), $chr(32), $chr(44))
  }
  %_kte.apply = %apply
  if ($isbit(%apply, 3)) || ($isbit(%apply, 6)) { apply.colors }
  if ($isbit(%apply, 5)) { apply.fonts }
  if ($isbit(%apply, 2)) || ($isbit(%apply, 9)) || ($isbit(%apply, 10)) { apply.bg %fn }
  if ($isbit(%apply, 8)) {
    if ($hget(%h, MTSVersion) == 1.0) {
      var %ts = $hget(%h, Timestamp) | if (%ts != $null) && (%ts != off) { hadd %h TimestampFormat $ifmatch | hadd %h Timestamp ON }
    }
    if ($istok(on off, $hget(%h, Timestamp), 32)) { .timestamp $hget(%h, Timestamp) }
    if ($hget(%h, TimestampFormat) != $null) {
      var %ts | set -n %ts $__cl($ifmatch)
      .timestamp -f %ts
      hadd Kte.Data TimestampFormat %ts
    }
  }
  if (* !iswm $hget(%h, ParenText)) { hadd %h ParenText (<text>) }
  if ($isbit(%apply, 4)) {
    var %script = $hget(%h, Script), %fscript = $+(", $nofile(%fn), %script, ")
    if (%script != $null) && ($isfile(%fscript)) { hadd %dat Script %fscript | .reload -rs %fscript }
    set -u %_kte.fn %fn
    var %cached = 0, %cfn = $+(", $kte.cachedir, Kte-Dyn-, $nopath(%fn), $iif((%sch), -S $+ %sch), .mrc"), %ln
    if ($isfile(%cfn)) {
      %ln = $read(%cfn, 3)
      if (%ln == ; Kte-Dyn $kte.dynver $crc($ktedir $+ Kte-Dyn.dat) $crc(%fn)) {
        .copy -o %cfn $+(", $ktedir, Kte-Dyn.mrc")
        write -l3 $+(", $ktedir, Kte-Dyn.mrc, ") ;
        %cached = 1
      }
    }
    if (!%cached) {
      kte.buildfile
      if ($isbit($hget(Kte.Data, Cache), 2)) {
        .copy -o $+(", $ktedir, Kte-Dyn.mrc") %cfn
        write -l3 %cfn ; Kte-Dyn $kte.dynver $crc($ktedir $+ Kte-Dyn.dat) $crc(%_kte.fn)
      }
    }
    status.show 0 Loading theme script...
    .reload -rs $+ $calc($script(0) + 1) $+(", $ktedir, Kte-Dyn.mrc")
  }
  else { .enable #Kte.DefTheme | if ($script($ktedir $+ Kte-Dyn.mrc)) { .unload -rs $+(", $ifmatch, ") } }
  unset %_kte.loading %_kte.apply
  status.close
  if (!%chscheme) {
    hadd %dat CurTheme %fn | hadd %dat CurOTheme $iif((%ofn), %ofn, %fn)
    if ($show) { set -u %:echo echo $color(info) -ati2 | linesep -a }
    else { set -u %:echo _kte.void }
    theme.text Load
    if ($show) { linesep -a }
  }
}
alias -l ~ return $right(0 $+ $int($calc($1 % 16)), 2)

alias -l dounload {
  if ($show) { set -u %:echo echo $color(info) -ati2 } | else { set -u %:echo _kte.void }
  if (!$isalias(theme.text)) { .enable #Kte.DefTheme }
  theme.text Unload
  if ($script($longfn($hget(Kte.Data, Script)))) { .unload -rs $+(", $ifmatch, ") }
  if ($hget(Kte.Data, Extracted)) && (!%_kte.killedtmp) { killxthm }
  hdel -w Kte.Theme *
  var %i = 1, %item
  while ($hget(Kte.Data, %i).item) {
    %item = $ifmatch
    if ($istok(ThmDir GZipDir Hide Cache Apply, %item, 32)) || (FRep.* iswm %item) { inc %i }
    else { hdel Kte.Data %item }
  }
  %_kte.apply = 1023
  ; restoring nicklist...
  var %i = $cnick(0) | while (%i) { .cnick -r 1 | dec %i }
  if (!%_kte.loading) { %i = 1 | while ($hget(Kte.Restore, CNick- $+ %i)) { .cnick $ifmatch | inc %i } }
  if (!%_kte.loading) && ($hget(Kte.Restore)) {
    ; restoring colors...
    hadd Kte.Theme Colors $hget(Kte.Restore, Colors)
    hadd Kte.Theme RGBColors $hget(Kte.Restore, RGBColors)
    apply.colors
    ; restoring fonts...
    hadd Kte.Theme FontDefault $hget(Kte.Restore, FontDefault)
    hadd Kte.Theme FontChan $hget(Kte.Restore, FontChan)
    hadd Kte.Theme FontQuery $hget(Kte.Restore, FontQuery)
    apply.fonts
    ; restoring timestamp...
    if ($hget(Kte.Restore, Timestamp)) { .timestamp $ifmatch }
    if ($hget(Kte.Restore, TimestampFormat)) { .timestamp -f $ifmatch }
    hdel -w Kte.Theme *
  }
  ; removing background... channels
  %i = $chan(0)
  if (%i) { while (%i) { background -ex $chan(%i) | dec %i } }
  else { remini $mircini background wchannel }
  ; query windows
  %i = $query(0)
  if (%i) { while (%i) { background -ex $query(%i) | dec %i } }
  else { remini $mircini background wquery }
  %i = $chat(0) | while (%i) { background -dx $chat(%i) | dec %i }
  ; others
  background -sx | background -gx | background -mx | background -dx | background -lx | background -hx | background -ux
  ; finishing...
  if (!%_kte.loading) && ($isfile($ktedir $+ Kte-DefTheme.dat)) { hload -ob Kte.Theme $+(", $ktedir, Kte-DefTheme.dat") }
  unset %_kte.apply
}

alias -l kte.buildfile {
  var %w = @Kte.File, %a = aline %w, %i = 1, %t, %lnt, %rawt, %realt, %ln, %x
  status.show 1 Compiling theme script...
  window -hliB %w
  loadbuf %w $+(", $ktedir, Kte-Dyn.dat")
  rline %w 3 ;
  set -n %kte._pre $dll($ktedir $+ kte.dll, MTSPrecompile, $__cl($remove($hget(Kte.Theme, Prefix), <pre>)))
  %lnt = $line(%w, 0)
  %t = %lnt
  %rawt = $hmatch(Kte.Theme, Raw.???, 0)
  %realt = $calc(%t + %rawt)
  while (%i <= %t) {
    :continue1
    status.prog %i %realt
    %ln = $line(%w, %i)
    if (kte:: isin %ln) { %x = $wildtok(%ln, kte::?*, 1, 32) }
    elseif ($gettok(%ln, 1, 32) == #KteDyn#) { rline %w %i $_ktedyn:: [ $+ [ $gettok(%ln, 2, 32) ] ] }
    if (%x) {
      %x = $numtok(%ln, 32)
      while (%x) {
        if (kte::?* iswm $gettok(%ln, %x, 32)) {
          if ($_pcomp($mid($gettok(%ln, %x, 32), 6)) != $null) { %ln = $puttok(%ln, $ifmatch, %x, 32) }
          else { %ln = $deltok(%ln, %x, 32) | if ($gettok(%ln, $calc(%x - 1), 32) == |) { %ln = $deltok(%ln, $calc(%x - 1), 32) | dec %x } }
          ; dang, mIRC 6.0 broke /break
          goto break2
        }
        ; /break inner loop
        :break2
        dec %x
      }
      %x =
      if (* !iswm %ln) || (%ln == $chr(32)) { dline %w %i | goto continue1 }
      rline %w %i %ln
    }
    inc %i
  }

  var %list = Echo EchoTarget Error, %i = 1, %t = $numtok(%list, 32), %item
  while (%i <= %t) {
    %item = $gettok(%list, %i, 32)
    aline %w alias -l kte:: $+ %item $_pcomp(%item)
    inc %i
  }
  %i = 1
  while ($hmatch(Kte.Theme, Raw.???, %i)) {
    status.prog $calc(%lnt + %i - 1) %realt
    %item = $ifmatch
    aline %w alias -l kte:: $+ %item $_pcomp(%item)
    inc %i
  }
  savebuf %w $+(", $ktedir, Kte-Dyn.mrc")
  close -@ %w
  unset %kte._*
}
alias -l _pcomp {
  var %v | set -n %v $hget(Kte.Theme, $1)
  if ($gettok(%v, 1, 32) == !Script) { set -n %v $_cl($gettok(%v, 2-, 32)) }
  elseif (* iswm %v) { %v = % $+ :echo $dll($ktedir $+ kte.dll, MTSPrecompile, $__cl(%v)) $!+  % $+ :comment }
  if ($istok(%v, % $+ ::pre, 32)) && (* iswm %kte._pre) {
    while ($findtok(%v, % $+ ::pre, 1, 32)) { set -n %v $puttok(%v, %kte._pre, $ifmatch, 32) }
  }
  while ($regsub(%v, /((\s|\A)[^$%\x28,][^\x20\x29,]*) \$\+ ([^$%]\S*(\s|\Z))/, $!1$3, %v) > 0) { }
  return %v
}

; $_cl(str <text>)  - replaces base colors for script code
alias -l _cl {
  var %v | set -n %v $1
  tokenize 44 $hget(Kte.Theme, BaseColors)
  while ($findtok(%v, % $+ ::c1, 1, 32)) { set -n %v $puttok(%v, $1, $ifmatch, 32) }
  while ($findtok(%v, % $+ ::c2, 1, 32)) { set -n %v $puttok(%v, $2, $ifmatch, 32) }
  while ($findtok(%v, % $+ ::c3, 1, 32)) { set -n %v $puttok(%v, $3, $ifmatch, 32) }
  while ($findtok(%v, % $+ ::c4, 1, 32)) { set -n %v $puttok(%v, $4, $ifmatch, 32) }
  return %v
}
; $__cl(str <text>)  - replaces base colors for simple event lines
alias -l __cl {
  var %v | set -n %v $1
  tokenize 44 $hget(Kte.Theme, BaseColors)
  return $replace(%v, <c1>, $1, <c2>, $2, <c3>, $3, <c4>, $4)
}

alias -l _ktedyn::SetCl {
  if ($hget(Kte.Theme, BaseColors) != $null) {
    tokenize 44 $ifmatch
    return $+(set -u %, ::c1 $1 $| set -u %, ::c2 $2 $| set -u %, ::c3 $3 $| set -u %, ::c4 $4)
  }
  return ;
}
alias -l _ktedyn::Pt {
  var %pt | set -n %pt $dll($ktedir $+ kte.dll, MTSPrecompile, $__cl($hget(Kte.Theme, ParenText)))
  return alias -l _pt if (* iswm % $+ ::text) $chr(123) set -nu % $+ ::parentext %pt $chr(125) $| else $chr(123) unset % $+ ::parentext $chr(125)
}
alias -l _ktedyn::Pre {
  if ($hget(Kte.Theme, Prefix) != $null) { return set -nu % $+ ::pre $dll($ktedir $+ kte.dll, MTSPrecompile, $__cl($ifmatch)) }
  return ;
}
alias -l _ktedyn::Timestamp {
  if ($hget(Kte.Theme, TimestampFormat) != $null) {
    return var % $+ ts = $_cl($dll($ktedir $+ kte.dll, MTSPrecompile, $ifmatch)) $chr(124) set -nu % $+ ::timestamp $!time(%ts)
  }
  return ;
}
alias -l | return $chr(124)

; Loading...

alias -l apply.colors {
  var %h = Kte.Theme, %hx = Kte.Data, %i, %colors = back action ctcp high info info2 invite join kick mode nick normal notice notify other own $&
    part quit topic wallops whois edit editbox-t list listbox-t gray $iif(($version >= 6), title inactive)
  if ($isbit(%_kte.apply, 3)) {
    status.show 1 $iif((%_kte.loading), Applying, Restoring) colors...
    if ($hget(%h, Colors)) {
      var %cl = $ifmatch, %i = 1, %t = $numtok(%cl, 44)
      if ($numtok(%colors, 32) < %t) { %t = $ifmatch }
      while (%i <= %t) { status.prog %i %t | _color $gettok(%colors, %i, 32) $gettok(%cl, %i, 44) | inc %i }
    }
    else {
      var %i = 1, %t = $numtok(%colors, 32)
      while (%i <= %t) { _color $gettok(%colors, %i, 32) $gettok(0 6 4 5 2 3 3 3 3 3 3 1 5 7 6 1 3 2 3 5 1 0 1 0 1 15 6 0, %i, 32) | inc %i }
    }
    status.show 1 Defining RGB values...
    if ($hget(%h, RGBColors)) {
      var %cl = $ifmatch, %i = 0, %ccl, %re | %re = /^[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}$/
      while (%i <= 15) {
        status.prog %i %t | %ccl = $gettok(%cl, $calc(%i + 1), 32)
        if ($regex(%ccl, %re)) { _color %i $rgb( [ %ccl ] ) } | else { _color -r %i }
        inc %i
      }
    }
  }
  ; do not apply nicklist if restoring previous colors
  if (%_kte.loading) && ($isbit(%_kte.apply, 6)) {
    status.show 0 Applying nicklist colors...
    var %i = $cnick(0) | while (%i) { .cnick -r 1 | dec %i }
    if ($hget(%h, CLineMe) isnum) { .cnick -an $!me $calc($ifmatch % 16) }
    if ($hget(%h, CLineEnemy) isnum) { .cnick -i * $calc($ifmatch % 16) }
    if ($hget(%h, CLineFriend) isnum) {
      .cnick -o * $calc($ifmatch % 16) | .cnick -v * $calc($ifmatch % 16)
      .cnick -p * $calc($ifmatch % 16) | .cnick -y * $calc($ifmatch % 16)
    }
    apply.colors.modes
    if ($hget(%h, CLineRegular) isnum) { .cnick -n * $calc($ifmatch % 16) }
  }
}
alias -l apply.colors.modes {
  ; mixes up modes that use the same color
  var %h = Kte.Theme, %modes = Owner .;Op @;HOp % $+ ;Voice +, %i = 1, %t = $numtok(%modes, 59), %cl, %cllist
  while (%i <= %t) {
    tokenize 32 $gettok(%modes, %i, 59)
    if ($hget(%h, CLine $+ $1) isnum) {
      %cl = $calc($ifmatch % 16)
      ; blah S2FtZWsgbWFkZSBpdA== ;)
      if ($wildtok(%cllist, %cl *, 1, 59)) { %cllist = $instok($remtok(%cllist, $ifmatch, 1, 59), $ifmatch $+ $2, 1, 59) }
      else { %cllist = $instok(%cllist, %cl $2, 1, 59) }
    }
    inc %i
  }
  %i = $numtok(%cllist, 59) | while (%i) { .cnick * $gettok(%cllist, %i, 59) | dec %i }
}
alias -l _color tokenize 46 $+($replace($1, -, $chr(32)), ., $2) | if ($color($1) != $2) { color $1-2 }

alias -l apply.fonts {
  var %h = Kte.Theme, %write = writeini $+(", $mircini, ") fonts, %nserv, %i, %j, %k, %p
  status.show 0 Applying fonts...
  if ($hget(%h, FontDefault)) {
    var %font = $ifmatch, %f = $iif((b isin $gettok(%font, 3, 44)), b), %fnt = $gettok(%font, 2, 44) $gettok(%font, 1, 44), %fini = $mkinifont(%font)
    if ($hget(Kte.Data, FRep.Status)) && ($hget(Kte.Data, FRep.Rep. $+ $replace($gettok(%font, 1, 44), $chr(32), \~)) != $null) {
      %fnt = $ifmatch | %font = $puttok(%font, %fnt, 1, 44)
    }
    if ($version >= 6) { %nserv = $scon(0) }
    else { %nserv = 1 }
    while (%nserv) {
      if ($version >= 6) { scon %nserv }
      font $+(-s, %f) %fnt
      dec %nserv
    }
    if ($window(Finger Window)) { font -g $+ %f %fnt } | else { %write ffinger %fini }
    %write flinks %fini | %write flist %fini | %write fwwwlist %fini | %write fnotify %fini
    if (!$hget(%h, FontChan)) { hadd %h FontChan %font }
    if (!$hget(%h, FontQuery)) { hadd %h FontQuery %font }
  }
  if ($hget(%h, FontChan)) {
    var %font = $ifmatch
    if ($hget(Kte.Data, FRep.Status)) && ($hget(Kte.Data, FRep.Rep. $+ $replace($gettok(%font, 1, 44), $chr(32), \~)) != $null) {
      %font = $puttok(%font, $ifmatch, 1, 44)
    }
    if ($version >= 6) { %nserv = $scon(0) }
    else { %nserv = 1 }
    %p = -d
    if (b isin $gettok(%font, 3, 44)) { %p = %p $+ b }
    while (%nserv) {
      if ($version >= 6) { scon %nserv }
      %i = $chan(0)
      while (%i) { font %p $chan(%i) $gettok(%font, 2, 44) $gettok(%font, 1, 44) | dec %i }
      dec %nserv
    }
    else { %write fchannel $mkinifont(%font) }
  }
  if ($hget(%h, FontQuery)) {
    var %font = $ifmatch
    if ($hget(Kte.Data, FRep.Status)) && ($hget(Kte.Data, FRep.Rep. $+ $replace($gettok(%font, 1, 44), $chr(32), \~)) != $null) {
      %font = $puttok(%font, $ifmatch, 1, 44)
    }
    if ($version >= 6) { %nserv = $scon(0) }
    else { %nserv = 1 }
    %p = -d
    if (b isin $gettok(%font, 3, 44)) { %p = %p $+ b }
    while (%nserv) {
      if ($version >= 6) { scon %nserv }
      var %i = $query(0), %j = $chat(0), %k = $fserv(0)
      while (%i) { font %p $query(%i) $gettok(%font, 2, 44) $gettok(%font, 1, 44) | dec %i }
      while (%j) { font %p = $+ $chat(%j) $gettok(%font, 2, 44) $gettok(%font, 1, 44) | dec %j }
      while (%j) { font %p = $+ $fserv(%k) $gettok(%font, 2, 44) $gettok(%font, 1, 44) | dec %j }
      dec %nserv
    }
    else { %write fquery $mkinifont(%font) }
    %write fmessage $mkinifont(%font)
  }
}
alias -l mkinifont {
  tokenize 44 $1
  var %weight = $iif((b isin $3), 700, 400), %h = $2
  if (%h < 0) {
    ; my attemp to convert negative size -> height -> real size...
    var %h = $int($calc($2 * $height(A, $1, 1000) / -1000 + 0.999)), %n = 10, %diff
    while (%n) {
      %diff = $calc($height(A, $1, %h) - $height(A, $1, $2))
      if (!%diff) { break } | elseif (%diff > 0) { dec %h } | else { inc %h }
      dec %n
    }
  }
  return $+($1, $chr(44), $calc(%weight + %h), $chr(44), 1)
}

alias -l apply.bg {
  var %h = Kte.Theme, %dir = $nofile($1-), %fn, %i, %write = writeini $+(", $mircini, ") background
  status.show 1 Applying background pictures...
  if ($isbit(%_kte.apply, 2)) {
    ; channels
    status.prog 1 5
    if ($hget(%h, ImageChan)) {
      var %ln = $ifmatch, %p = -e $+ $imgpos(%ln), %fn = $+(", %dir, $gettok(%ln, 2-, 32), ")
      %i = $chan(0)
      if (%i) { while (%i) { $bg(%p $chan(%i), %fn) | dec %i } }
      else { %write wchannel $+($shortfn(%fn), $chr(44), $calc($findtok(center fill normal stretch tile photo, $gettok(%ln, 1, 32), 1, 32) - 1)) }
    }
    ; query windows
    status.prog 2 5
    if ($hget(%h, ImageQuery)) {
      var %ln = $ifmatch, %p = -e $+ $imgpos(%ln) | %fn = $+(", %dir, $gettok(%ln, 2-, 32), ")
      $bg(%p $+ g, %fn)
      %i = $query(0)
      if (%i) { while (%i) { $bg(%p $query(%i), %fn) | dec %i } }
      else { %write wquery $+($shortfn(%fn), $chr(44), $calc($findtok(center fill normal stretch tile photo, $gettok(%ln, 1, 32), 1, 32) - 1)) }
      %i = $chat(0) | while (%i) { $bg(%p $chat(%i), %fn) | dec %i }
    }
    ; status, finger and mdi
    status.prog 3 5
    if ($hget(%h, ImageStatus)) { $bg(-sg $+ $imgpos($ifmatch), $+(", %dir, $gettok($ifmatch, 2-, 32), ")) }
    if ($hget(%h, ImageMirc)) { $bg(-m $+ $imgpos($ifmatch), $+(", %dir, $gettok($ifmatch, 2-, 32), ")) }
  }
  if ($isbit(%_kte.apply, 10)) {
    ; toolbar, switchbar
    status.prog 4 5
    if ($hget(%h, ImageToolbar)) { $bg(-l, $+(", %dir, $gettok($ifmatch, 2-, 32), ")) }
    if ($hget(%h, ImageSwitchbar)) { $bg(-h, $+(", %dir, $gettok($ifmatch, 2-, 32), ")) }
  }
  if ($isbit(%_kte.apply, 9)) {
    status.prog 5 5
    if ($hget(%h, ImageButtons)) { $bg(-u, $+(", %dir, $ifmatch, ")) }
  }
  else { status.prog 5 5 }
}
alias -l bg if ($isfile($2)) { background $1- }
alias -l imgpos return $mid(cfnrtp, $findtok(center fill normal stretch tile photo, $gettok($1, 1, 32), 1, 32), 1)

alias -l status.open {
  var %w = @Kte.Status, %cw = $calc($dbuw * 100), %ch = $calc($dbuh * 24)
  window -hndkpfCBi +fL %w -1 -1 %cw %ch
  drawrect -rf %w $rgb(face) 0  0 0 %cw %ch
  window -o %w
  window -hpBi +d @Kte.Cover 0 0 $window(-3).w $window(-3).h
  drawrect -nrf @Kte.Cover $rgb(128, 128, 128) 0  0 0 $window(-3).w $window(-3).h
  window -a @Kte.Cover
}
alias -l status.close close -@ @Kte.Status @Kte.Cover
alias -l status.show {
  var %w = @Kte.Status, %cw = $window(@Kte.Status).dw
  drawrect -nrf %w $rgb(face) 0  0 0 %cw $window(@Kte.Status).dh
  drawtext -nro %w $rgb(text)  Tahoma -8  $calc((%cw - $width($2-, Tahoma, -8, 1, 0)) / 2) $calc(4 * $dbuh)  $2-
  if ($1) {
    var %rx = $calc(3 * $dbuw), %ry = $calc(15 * $dbuh), %rw = $calc(94 * $dbuw), %rh = $calc(5 * $dbuh), %xywh = %rx %ry %rw %rh
    drawrect -nrf %w $rgb(hilight) 0 %xywh
    drawrect -nr %w $rgb(shadow) 0 %xywh
    drawline -nr %w $rgb(hilight) 0  $calc(%rx + %rw - 1) $calc(%ry + 1)  $calc(%rx + %rw - 1) $calc(%ry + %rh - 1)  %rx $calc(%ry + %rh - 1)
    ;drawrect -nr %w $rgb(frame) 0 %xywh
  }
  drawdot %w
}
alias -l status.prog {
  var %w = @Kte.Status
  drawrect -rf %w $rgb(0, 0, 128) 0 $calc(3 * $dbuw + 1) $calc(15 * $dbuh + 1) $calc((94 * $dbuw - 2) * $1 / $2) $calc(5 * $dbuh - 2)
}

; the dialog

alias -l dlg if ($dialog($2)) { dialog -v $2 } | else { dialog $1-2 $2 }

dialog kte.load {
  title ":: KTE :: Load theme ::"
  ; bad fix, but it's the best I have for now
  size -1 -1 209 $iif(($version >= 6), 140, 149)
  option dbu
  box "", 1, -1 -3 215 4
  button "&...", 3, 51 3 10 10
  text "", 4, 0 0 0 0, hide
  text "&Themes available:", 24, 3 5 43 7
  list 2, 3 14 59 85, sort size vsbar
  text "Apply &scheme:", 20, 3 102 35 7, disable
  combo 21, 3 110 59 80, disable drop
  tab "Information", 1000, 66 2 140 118
  text "Name:", 5, 72 35 16 7, disable tab 1000
  text "", 6, 100 35 100 7, disable tab 1000
  text "Version:", 7, 72 46 19 7, disable tab 1000
  text "", 8, 100 46 100 7, disable tab 1000
  text "Author:", 9, 72 57 17 7, disable tab 1000
  text "", 10, 100 57 100 7, disable tab 1000
  link "", 11, 100 64 100 7, disable tab 1000
  text "URL:", 12, 72 75 13 7, disable tab 1000
  link "", 13, 100 75 100 7, disable tab 1000
  edit "", 14, 72 91 129 24, disable tab 1000 read multi vsbar
  text "", 19, 72 20 128 7, tab 1000
  box "", 26, 72 27 128 4, tab 1000
  tab "Preview", 1001
  text "Preview:", 15, 72 21 21 7, disable tab 1001
  button "Generate &preview", 16, 151 19 49 10, disable tab 1001
  box "", 17, 73 29 127 85, tab 1001
  icon 18, 73 32 127 82, $mircexe, 0, hide tab 1001 noborder
  tab "Apply", 1002
  text "When loading, apply:", 28, 72 21 50 7, tab 1002
  check "&Everything", 29, 134 21 35 7, tab 1002
  box "", 30, 72 28 128 4, hide tab 1002
  check "&Background images", 33, 72 36 57 7, tab 1002
  check "&Colors", 34, 72 45 24 7, tab 1002
  check "Event &messages", 35, 72 54 49 7, tab 1002
  check "F&onts", 36, 72 63 23 7, tab 1002
  check "&Nicklist colors", 37, 134 36 42 7, tab 1002
  check "Soun&ds", 38, 72 72 28 7, hide disable tab 1002
  check "T&imestamp", 39, 134 45 35 7, tab 1002
  check "Toolbar b&uttons", 40, 134 54 47 7, tab 1002
  check "Too&lbar/switchbar bgs", 41, 134 63 63 7, tab 1002
  text "", 32, 72 82 130 20, tab 1002
  box "", 2900, -1 121 211 20
  button "Load", 2901, 124 128 40 10, disable default ok
  button "Close", 2902, 167 128 40 10, cancel
  menu "&File", 43
  item "Change &folder...", 22, 43
  item "E&xplore this folder", 45, 43
  item break, 44, 43
  item "&Settings...", 23, 43
  item break, 47, 43
  item "&Edit theme file", 46, 43
  item break, 48, 43
  item "&Close	Esc", 25, 43
  menu "&Help", 49
  item "&Readme", 31, 49
  item "&About...", 27, 49
}
on *:DIALOG:kte.load:init:0:{
  load.list $kte.thmdir
  if (!$isfile($ktedir $+ Kte-Readme.txt)) { did -b $dname 31 }
  did -f $dname 2
  var %did = 29 33 34 35 36 37 38 39 40 41, %i = $numtok(%did, 32), %set = $hget(Kte.Data, Apply)
  while (%i) { if ($isbit(%set, %i)) { did -c $dname $gettok(%did, %i, 32) } | dec %i }
  if ($did($dname, 29).state) { did -b $dname 33,34,35,36,37,38,39,40,41 }
  did -o $dname 32 1 It is highly recommended that you apply the theme's event messages; also, most themes look weird if you don't apply their $&
    color settings.
  var %dir = $r.get(kte,dir)
  did -f $dname 2
  if (!$isdir(%dir)) { return }
  load.list %dir
}
on *:DIALOG:kte.load:sclick,menu:3,22:{
  var %dir = $sdir($did($dname, 4), Choose theme directory) | did -f $dname 2 | if (!$isdir(%dir)) { return }
  r.set kte dir %dir | load.list %dir
}
on *:DIALOG:kte.load:sclick:2:load.sel
on *:DIALOG:kte.load:dclick:2:if ($did($dname, 2901).enabled) { dialog -k $dname } | else { beep }
on *:DIALOG:kte.load:sclick:11:var %e = $did($dname, 11) | if (?*@?*.?* iswm %e) { .run mailto: $+ %e } | else { beep }
on *:DIALOG:kte.load:sclick:13:{
  var %url = $did($dname, 13) | if ($chr(32) isin %url) || (!%url) { beep | return }
  if (*:/* !iswm %url) { %url = http:// $+ %url } | .run %url
}
on *:DIALOG:kte.load:sclick:16:{
  var %f = $gettok($did($dname, 2, $did($dname, 2, 1).sel), 2, 63), %ngz = $kte.gzdir $+ ngzipn.dll
  if ($dialog($dname).focus = 16) { did -f $dname 2 }
  if (!$isfile(%f)) { beep | return }
  did -b $dname 16
  if (*.mts.gz iswm %f) {
    if (!$isfile(%ngz)) { beep | return }
    if (!$dll(%ngz, unzip, $left(%f, -3))) { beep | return }
    var %of = %f, %f = $left(%f, -3)
  }
  elseif (*.vpk iswm %f) || (*.vpk.gz iswm %f) {
    var %nf = %f
    if (*.gz iswm %f) {
      %nf = $left(%f, -3)
      if (!$isfile(%ngz)) { beep | return }
      if (!$dll(%ngz, unzip, $left(%f, -3))) { beep | return }
    }
    vPak.extract $+(", %nf, ") $+(", $kte.xthmtmpdir, ") | if (*.gz iswm %f) { .remove $+(", %nf, ") }
    var %killtmp = $true
    if ($result) { beep | goto clear }
    var %of = %f, %f = $findfile($kte.xthmtmpdir, *.mts, 1, 9)
    if (!%f) { beep | goto clear }
  }
  set -u %_kte.realname %of
  load.preview %f
  :clear | did -e $dname 16 | if (%of) { .remove $+(", %f, ") } | if (%killtmp) { killtmp }
}
on *:DIALOG:kte.load:sclick:21:load.sel.preview
on *:DIALOG:kte.load:menu:23:dlg -am kte.settings
on *:DIALOG:kte.load:menu:25:dialog -c $dname
on *:DIALOG:kte.load:menu:27:$dialog(kte.about, kte.about, -4)
on *:DIALOG:kte.load:sclick:29:did $iif(($did($dname, 29).state), -b, -e) $dname 33,34,35,36,37,39,40,41
on *:DIALOG:kte.load:menu:31:run $+(", $ktedir, Kte-Readme.txt")
on *:DIALOG:kte.load:menu:45:run explorer /n,/e, $+ $did($dname, 4)
on *:DIALOG:kte.load:menu:46:{
  var %fn = $gettok($did($dname, 2, $did($dname, 2, 1).sel), 2, 63)
  if (!$isfile(%fn)) { beep | load.sel } | elseif ($isalias(kthm)) { kthm %fn } | else { run notepad %fn }
}
on *:DIALOG:kte.load:sclick:1000,1001:did -f $dname 2
on *:DIALOG:kte.load:sclick:1002:did -f $dname 29
on *:DIALOG:kte.load:sclick:2901:{
  var %sch, %apply = $base($+($ds(41), $ds(40), $ds(39), $ds(38), $ds(37), $ds(36), $ds(35), $ds(34), $ds(33), $ds(29)), 2, 10)
  if ($did($dname, 21, 1).sel > 1) { %sch = -s $+ $calc($ifmatch - 1) }
  ; 29 33 34 35 36 37 38 39 40 41
  if (!%apply) { %apply = 1 }
  hadd Kte.Data Apply %apply
  .timer -oi 1 0 if ($isfile( $+ $gettok($did($dname, 2, $did($dname, 2, 1).sel), 2, 63) $+ )) $chr(123) $&
    theme.load %sch $gettok($did($dname, 2, $did($dname, 2, 1).sel), 2, 63) $chr(125)
}

alias -l load.list {
  var %d = kte.load, %s
  did -r %d 2
  %s = $findfile($1-, *.mts, 0, 9, did -a %d 2 $nopath($1-) $+($str( , 30), ?, $1-))
  inc %s $findfile($1-, *.mts.gz, 0, 9, did -a %d 2 $nopath($1-) $+($str( , 30), ?, $1-))
  inc %s $findfile($1-, *.vpk, 0, 9, did -a %d 2 $nopath($1-) $+($str( , 30), ?, $1-))
  inc %s $findfile($1-, *.vpk.gz, 0, 9, did -a %d 2 $nopath($1-) $+($str( , 30), ?, $1-))
  if (%s) {
    if ($didwm(%d, 2, $+(*, $str( , 30), ?, $longfn($hget(Kte.Data, CurOTheme))))) { did -c %d 2 $ifmatch }
    else { did -c %d 2 1 }
    load.sel
  }
  else { did -b %d 5,6,7,8,9,10,11,12,13,14,15,16,20,21,2901 | did -r %d 6,8,10,11,13,14,19,21 }
  did -o %d 4 1 $1-
}

alias -l load.sel {
  var %d = kte.load, %f = $gettok($did(%d, 2, $did(%d, 2, 1).sel), 2, 63), %mtsver, %ln, %ln = $readn, %df = %f, $&
    %ngz = $kte.gzdir $+ ngzipn.dll, %cache = $kte.cachedir $+ thminfo.ini, %top = $hash($lower($longfn(%f)), 32), $&
    %t.gotinfo = $false, %t.name, %t.version, %t.author, %t.email, %t.website, %t.description
  did $iif((*.mts iswm %f), -e, -b) %d 46
  if ($width(%df, MS Shell Dlg, -8, 0, 0) > $calc($dbuw * 128)) {
    %df = $puttok(%df, ..., 2, 92)
    while ($width(%df, MS Shell Dlg, -8, 0, 0) > $calc($dbuw * 128)) { %df = $deltok(%df, 3, 92) | if ($numtok(%df, 92) <= 3) { break } }
  }
  did -o %d 19 1 %df
  did -r %d 6,8,10,11,13,14
  if (!$isfile(%f)) { did -o %d 6 1 (file not found) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | return }
  if ($readini(%cache, %top, Filename) == $gettok($longfn(%f), 1-, 32)) && ($readini(%cache, %top, CRC) == $crc(%f)) {
    %t.gotinfo = $true
    %mtsver = $readini(%cache, %top, MTSVersion)
    %t.name = $readini(%cache, %top, Name)
    %t.version = $readini(%cache, %top, Version)
    %t.author = $readini(%cache, %top, Author)
    %t.email = $readini(%cache, %top, EMail)
    %t.website = $readini(%cache, %top, Website)
    %t.description = $readini(%cache, %top, Description)
    var %schi = 1
    while ($readini(%cache, %top, Scheme $+ %schi) != $null) { var %t.scheme [ $+ [ %schi ] ] | %t.scheme [ $+ [ %schi ] ] = $ifmatch | inc %schi }
  }
  elseif (*.mts.gz iswm %f) {
    if (!$isfile(%ngz)) {
      did -o %d 6 1 (nGZIPn is needed to open this file) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | return
    }
    if (!$dll(%ngz, unzip, $left(%f, -3))) {
      did -o %d 6 1 (nGZIPn was unable to extract this file) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | return
    }
    var %of = %f, %f = $left(%f, -3)
  }
  elseif (*.vpk iswm %f) || (*.vpk.gz iswm %f) {
    var %nf = %f
    if (*.gz iswm %f) {
      %nf = $left(%f, -3)
      if (!$isfile(%ngz)) {
        did -o %d 6 1 (nGZIPn is needed to open this file) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | return
      }
      if (!$dll(%ngz, unzip, $left(%f, -3))) {
        did -o %d 6 1 (nGZIPn was unable to extract this file) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | return
      }
    }
    vPak.extract -t $+(", %nf, ") $+(", $kte.xthmtmpdir, ") | if (*.gz iswm %f) { .remove $+(", %nf, ") }
    var %killtmp = $true
    if ($result) { did -o %d 6 1 ( $+ $ifmatch $+ ) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | goto clear }
    var %of = %f, %f = $findfile($kte.xthmtmpdir, *.mts, 1, 9)
    if (!%f) { did -o %d 6 1 (invalid theme vPak) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21 | goto clear }
  }
  if (!%t.gotinfo) {
    %ln = $read(%f, nw, [mts])
    set -n %mtsver $gettok($read(%f, nw, MTSVersion *, %ln), 2-, 32)
    if (!%ln) || (!$istok(1 1.1, $calc(%mtsver), 32)) { goto inv }
    %t.name = $gettok($read(%f, nw, Name *, %ln), 2-, 32)
    %t.version = $gettok($read(%f, nw, Version *, %ln), 2-, 32)
    %t.author = $gettok($read(%f, nw, Author *, %ln), 2-, 32)
    %t.email = $gettok($read(%f, nw, EMail *, %ln), 2-, 32)
    %t.website = $gettok($read(%f, nw, Website *, %ln), 2-, 32)
    %t.description = $gettok($read(%f, nw, Description *, %ln), 2-, 32)
    var %schi = 1
    while ($gettok($read(%f, nw, Scheme $+ %schi *, %ln), 2-, 32) != $null) {
      var %t.scheme [ $+ [ %schi ] ] | %t.scheme [ $+ [ %schi ] ] = $ifmatch | inc %schi
    }
  }
  did -e %d 5,6,7,8,9,10,11,12,13,14,15
  if (!$istok(1 1.1, $calc(%mtsver), 32)) { goto inv }
  if (%t.name != $null) { did -o %d 6 1 %t.name } | else { goto inv }
  did -o %d 8 1 %t.version (standard v $+ %mtsver $+ )
  did -o %d 10 1 %t.author
  did -o %d 11 1 %t.email
  did -o %d 13 1 %t.website
  did -a %d 14 %t.description
  did -c %d 14 1
  did -rac %d 21 <default scheme>
  var %schi = 1
  while ($var(%t.scheme*, %schi).value != $null) { did -a %d 21 $ifmatch | inc %schi }
  did $iif((%schi > 1), -e, -b) %d 20,21
  if (%of) {
    .remove $+(", %f, ") | if (%killtmp) { killtmp }
    %f = %of
    %cache = $+(", %cache, ")
    writeini %cache %top Filename %f
    writeini %cache %top CRC $crc(%f)
    writeini %cache %top MTSVersion %mtsver
    if (%t.name != $null) { writeini %cache %top Name %t.name }
    if (%t.version != $null) { writeini %cache %top Version %t.version }
    if (%t.author != $null) { writeini %cache %top Author %t.author }
    if (%t.email != $null) { writeini %cache %top EMail %t.email }
    if (%t.website != $null) { writeini %cache %top Website %t.website }
    if (%t.description != $null) { writeini %cache %top Description %t.description }
    var %schi = 1
    while ($var(%t.scheme*, %schi).value != $null) { writeini %cache %top Scheme $+ %schi $ifmatch | inc %schi }
  }
  load.sel.preview
  did -e %d 16,2901
  return
  :inv | did -o %d 6 1 (invalid theme file) | did -b %d 14,16,20,21,2901 | did -v %d 17 | did -h %d 18 | did -r %d 21
  :clear | if (%of) { .remove $+(", %f, ") } | if (%killtmp) { killtmp }
}

alias -l load.sel.preview {
  var %d = kte.load, %sch, %f = $gettok($did(%d, 2, $did(%d, 2, 1).sel), 2, 63)
  if ($did(%d, 21, 1).sel > 1) { %sch = -S $+ $calc($ifmatch - 1) }
  var %pfn = $+(", $kte.cachedir, $nopath(%f), %sch, .bmp")
  if ($isfile(%pfn)) { did -h %d 17 | did -g %d 18 %pfn | did -v %d 18 }
  else { did -v %d 17 | did -h %d 18 }
}

alias -l killxthm var %x = $findfile($kte.xthmdir, *, 0, 9, .remove $+(", $1-, ")) | _rmdir $kte.xthmdir
alias -l killtmp var %x = $findfile($kte.xthmtmpdir, *, 0, 9, .remove $+(", $1-, ")) | _rmdir $kte.xthmtmpdir

; preview

alias -l load.preview {
  var %sch
  if ($did($dname, 21, 1).sel > 1) { %sch = $calc($ifmatch - 1) }
  var %pfn = $+(", $kte.cachedir, $nopath($iif((%_kte.realname), %_kte.realname, $1-)), $iif((%sch), -S $+ %sch), .bmp"), $&
    %w = @Kte.Preview, %lw = @Kte.Preview-, %cw = $calc(127 * $dbuw), %ch = $calc(82 * $dbuh)
  if (!$isdir($kte.cachedir)) { mkdir $+(", $kte.cachedir, ") }
  window -hkliB %lw
  ; on preview, we must load the scheme first, not after
  if (%sch) && ($read($1-, w, $+([Scheme, %sch, ]))) { loadbuf -tScheme $+ %sch %lw $+(", $1-, ") }
  loadbuf -tmts %lw $shortfn($1-)
  if ($fline(%lw, ?* !Script ?*, 1)) && ($_set(Script)) {
    var %scriptf = $+(", $nofile($1-), $ifmatch, ") | if ($isfile(%scriptf)) && (!$script($longfn(%scriptf))) { .reload -rs %scriptf } | else { %scriptf = }
  }
  var %cl = $_set(Colors), %rgb = $_set(RGBColors)
  if ($numtok(%cl, 44) = 25) { %cl = %cl $+ ,15 }
  elseif ($numtok(%cl, 44) != 26) { %cl = 0,6,4,5,2,3,3,3,3,3,3,1,5,7,6,1,3,2,3,5,1,0,1,0,1,15 }
  if ($numtok(%rgb, 32) != 16) {
    %rgb = 255,255,255 0,0,0 0,0,128 0,144,0 255,0,0 128,0,0 160,0,160 255,128,0 255,255,0 0,255,0 0,144,144 0,255,255 0,0,255 255,0,255 $&
      128,128,128 208,208,208
  }
  pv Init %cw %ch
  if ($isfile($nofile($1-) $+ $gettok($_set(ImageChan), 2-, 32))) {
    window -hpfkniB +d %w -1 -1 %cw %ch
    drawrect -nrf %w $_rgb(%cl, %rgb, 1) 0  2 2 %cw %ch
    preview.bg %w $1-
    drawsave %w %pfn
    close -@ %w
    pv SetBg $_rgb(%cl, %rgb, 1) %pfn
  }
  else { pv SetBg $_rgb(%cl, %rgb, 1) }
  if ($_set(FontChan)) || ($_set(FontDefault)) {
    var %f, %fsize = $gettok($ifmatch, 2, 44), %fb = $gettok($ifmatch, 3, 44)
    set -n %f $gettok($ifmatch, 1, 44)
    if ("*" iswm %f) { set -n %f $mid(%f, 2, -1) }
    if ($hget(Kte.Data, FRep.Status)) && ($hget(Kte.Data, FRep.Rep. $+ $replace(%f, $chr(32), \~)) != $null) { set -n %f $ifmatch }
    if (%fsize !isnum) { %fsize = -10 }
    if (%fb != b) { var %fb }
    pv SetFont %fb %fsize %f
  }
  else { pv SetFont $iif(($window(Status Window).fontbold), b) $window(Status Window).fontsize $window(Status Window).font }
  pv SetColors %rgb
  preview.text - %lw %cl %rgb
  pv DrawBorder
  pv Save %pfn
  pv Cleanup
  close -@ %lw
  if ($script($longfn(%scriptf))) { .unload -rsn %scriptf }
  did -h $dname 17 | did -g $dname 18 %pfn | did -v $dname 18
  if (!$isbit($hget(Kte.Data, Cache), 1)) { .remove %pfn }
  unset %_kte.*
}
alias -l _rgb return $rgb( [ $gettok($2, $calc($gettok($1, $3, 44) + 1), 32) ] )

; /preview.bg str <pwnd>, str <filename>
alias -l preview.bg {
  var %set = $_set(ImageChan), %style = $gettok(%set, 1, 32), %fn = $+(", $nofile($2-), $gettok(%set, 2-, 32), "), $&
    %dw = $calc($window($1).dw - 4), %dh = $calc($window($1).dh - 4), %px = 2, %py = 2, %pw, %ph
  if (!%set) || (!$istok(center fill normal stretch tile photo, %style, 32)) || (!$pic(%fn).width) { return $false }
  %pw = $pic(%fn).width | %ph = $pic(%fn).height
  if (%style == center) { %px = $calc(2 + (%dw - %pw) / 2) | %py = $calc(2 + (%dh - %ph) / 2) }
  elseif ($istok(fill tile, %style, 32)) { %pw = %dw | %ph = %dh }
  elseif (%style == stretch) {
    if (%pw > %dw) { %ph = $calc(%ph * %dw / %pw) | %pw = %dw }
    if (%ph > %dh) { %pw = $calc(%pw * %dh / %ph) | %ph = %dh }
    %px = $calc(2 + (%dw - %pw) / 2) | %py = $calc(2 + (%dh - %ph) / 2)
  }
  elseif (%style == photo) {
    var %hdw = $calc(%dw * 0.5), %hdh = $calc(%dh * 0.5)
    if (%pw > %hdw) { %ph = $calc(%ph * %hdw / %pw) | %pw = %hdw }
    if (%ph > %hdh) { %pw = $calc(%pw * %hdh / %ph) | %ph = %hdh }
    %px = $calc(2 + %dw - %pw)
  }
  drawpic -ns $+ $iif((%style == tile), l) $1 $int(%px) $int(%py) $int(%pw) $int(%ph) %fn
  unset %_kte.*
  return $true
}

; /preview.text str <pwnd>, str <lwnd>, int[](44) <colors>, (int[3](44))[](32) <rgb>
alias -l preview.text {
  var %ch = $calc($window($1).dh - 4)

  %_kte.time = $calc($ctime - $r(0, 86400))
  var %bcl = $_set(BaseColors)
  %::c1 = $gettok(%bcl, 1, 44) | %::c2 = $gettok(%bcl, 2, 44) | %::c3 = $gettok(%bcl, 3, 44) | %::c4 = $gettok(%bcl, 4, 44)
  if ($_set(MTSVersion) = 1.1) && ($_set(Timestamp) == on) && ($_set(TimestampFormat)) { set -n %_kte.timestamp $ifmatch }
  elseif ($calc($_set(MTSVersion)) = 1) && ($_set(Timestamp)) { if ($ifmatch != off) { set -n %_kte.timestamp $ifmatch } }
  if (*<c*>* iswm %_kte.timestamp) { set -n %_kte.timestamp $replace(%_kte.timestamp, <c1>, %::c1, <c2>, %::c2, <c3>, %::c3, <c4>, %::c4) }
  %::me = $me | if (!%::me) || ($istok(Dude GuY pal, %::me, 32)) { %::me = Myself }
  %::server = irc.kte.kamek.net | %::port = 6667
  .timer.kte 1 0 % $+ ::pre = $dll($ktedir $+ kte.dll, MTSPrecompile, $_set(Prefix)) | .timer.kte -e
  %::chan = #Preview | %::target = #Preview
  %:echo = _kte.drawpreview

  %_kte.color = $_rgb($3, $4-, 8)
  %::nick = %::me
  _show JoinSelf

  %_kte.color = $_rgb($3, $4-, 12)
  inc %_kte.time $r(1, 5)
  %::nick = Dude | %::cmode = @
  %::text = $gettok(hi welcome wb, $r(1, 3), 32) %::me :)
  _show TextChan

  %_kte.color = $_rgb($3, $4-, 16)
  inc %_kte.time $r(5, 10)
  %::nick = %::me | %::cmode =
  %::text = $gettok(hi howdy hello, $r(1, 3), 32) Dude
  _show TextChanSelf

  %_kte.color = $_rgb($3, $4-, 8)
  inc %_kte.time $r(30, 50)
  %::nick = pal
  %::address = $+(palscript@, $r(1, 255), ., $r(0, 255), ., $r(0, 255), ., $r(0, 255))
  _show Join

  %_kte.color = $_rgb($3, $4-, 21)
  inc %_kte.time $r(10, 20)
  %::realname = Your pal | %::chan = #Preview @#Pals
  %::wserver = %::server | %::serverinfo = Preview server | %::text = | %::isregd = is not | %::isoper = is not
  %::idletime = $duration($r(1, 30)) | %::signontime = $asctime($calc(%_kte.time - $r(360, 7200)))
  if ($_set(Whois)) { _show Whois | _show Raw.311 | _show Raw.319 | _show Raw.312 | _show Raw.317 | _show Raw.318 }
  else { _showr 311 | _showr 319 | _showr 312 | _showr 317 | _showr 318 }

  %_kte.color = $_rgb($3, $4-, 12)
  inc %_kte.time $r(10, 20)
  %::text = what's up guys?
  %::chan = #Preview
  _show TextChan

  inc %_kte.time $r(3, 10)
  %::nick = GuY | %::cmode = + | %::address =
  %::text = the sky, pal
  _show TextChan

  %_kte.color = $_rgb($3, $4-, 9)
  inc %_kte.time $r(3, 10)
  %::nick = Dude | %::cmode = @ | %::knick = GuY
  %::text = sample kick!
  if ($_set(ParenText)) { set -n %::parentext $ifmatch } | else { %::parentext = (<text>) }
  set -n %::parentext $eval($dll($ktedir $+ kte.dll, MTSPrecompile, $ifmatch), 2)
  _show Kick | %::knick = | %::parentext =

  %_kte.color = $_rgb($3, $4-, 2)
  inc %_kte.time $r(40, 180)
  %::text = is away (brb)
  _show ActionChan

  :end
  unset %:echo %::*
}
alias -l pv dll $+(", $ktedir, Kte.dll") Preview $+ $1-
alias _kte.drawpreview pv DrawText %_kte.color %::timestamp $1-
alias -l _set return $gettok($line(@Kte.Preview-, $fline(@Kte.Preview-, $1 *)), 2-, 32)
alias -l _show {
  if (* iswm $_set($1)) {
    var %ln | set -n %ln $_set($1) | if (%_kte.timestamp) { %::timestamp = $asctime(%_kte.time, %_kte.timestamp) }
    if ($gettok(%ln, 1, 32) == !Script) { set -n %ln $gettok(%ln, 2-, 32) }
    else { set -n %ln % $+ :echo $dll($ktedir $+ kte.dll, MTSPrecompile, %ln) }
    if (%ln) { .timer.theme 1 0 %ln | .timer.theme -e }
    return 1
  }
}
alias -l _showr _show Raw. $+ $1 | if (!$result) { _show Raw.Other }

; about

dialog kte.about {
  title ":: KTE :: About ::"
  size -1 -1 100 47
  option dbu
  icon $mircexe, 16
  check "3", 1, 0 0 0 0
  icon 2, 3 3 16 16, $mircexe, 0, noborder
  text "Kamek's Theme Engine", 3, 27 3 56 7
  text "", 4, 27 12 70 7
  link "Kamek's MTS page", 5, 27 21 47 7
  box "", 2900, -1 28 102 20
  button "OK", 2902, 58 35 40 10, default ok cancel
}
on *:DIALOG:kte.about:init:0:did -o $dname 4 1 Version $kte.ver for MTS $kte.mtsver
on *:DIALOG:kte.about:rclick:0:.timer.kte.about -om 12 100 kte.about.ck
on *:DIALOG:kte.about:sclick:1:var %v = $calc($did($dname, 1) - 1) | did -o $dname 1 1 %v | if (!%v) { dialog -t $dname Cookie! }
on *:DIALOG:kte.about:sclick,dclick:2:did -g $dname 2 $xor($gettok($did($dname, 2), 1, 32), 2) $+(", $mircexe, ")
on *:DIALOG:kte.about:sclick:5:.run http://www3.brinkster.com/ircweb/mts/

alias -l kte.about.ck {
  var %d = kte.about
  if (!$dialog(%d)) { .timer.kte.about off | return }
  if (. isin $did(%d, 4)) { did -o %d 4 1 $replace($did(%d, 4), ., ·) }
  elseif (· isin $did(%d, 4)) { did -o %d 4 1 $replace($did(%d, 4), ·, -) }
  elseif (- isin $did(%d, 4)) { did -o %d 4 1 $replace($did(%d, 4), -, $chr(44)) }
  elseif (, isin $did(%d, 4)) { did -o %d 4 1 $replace($did(%d, 4), $chr(44), .) }
}

; settings

dialog kte.settings {
  title ":: KTE :: Settings ::"
  size -1 -1 136 104
  option dbu
  icon $mircexe, 16
  check "", 1, 0 0 0 0
  tab "Paths", 1000, 3 0 130 84
  text "&Themes path:", 2, 8 22 33 7, tab 1000
  edit "", 5, 48 20 68 11, tab 1000 read autohs
  button "...", 6, 118 21 10 10, tab 1000
  text "n&GZIPn path:", 3, 8 38 32 7, tab 1000
  edit "", 4, 48 36 68 11, tab 1000 read autohs
  button "...", 9, 118 37 10 10, tab 1000
  tab "Cache", 1001
  text "Cache:", 10, 8 18 17 7, tab 1001
  check "&Previews", 11, 15 28 31 7, tab 1001
  check "Compiled &scripts", 15, 56 28 48 7, tab 1001
  box "", 18, 8 40 121 4, tab 1001
  text "", 7, 8 51 121 13, tab 1001
  button "&Clear cache", 8, 48 69 40 10, tab 1001
  tab "Events", 1002
  text "You can hide the following events by checking their boxes:", 19, 8 18 120 13, tab 1002
  text "On connect:", 20, 8 38 30 7, tab 1002
  check "&Welcome messages", 12, 8 47 57 7, tab 1002
  check "&Statistics (/lusers)", 13, 8 56 51 7, tab 1002
  check "&Message of the day", 14, 8 65 56 7, tab 1002
  text "On join:", 21, 75 38 18 7, tab 1002
  check "&User list (/names)", 16, 75 47 51 7, tab 1002
  check "&Channel info", 17, 75 56 39 7, tab 1002
  tab "Fonts", 1003
  check "&Enable font replacement", 22, 8 18 67 7, tab 1003
  box "", 23, 8 24 53 13, tab 1003
  text "Font", 24, 11 29 11 7, tab 1003
  box "", 25, 60 24 68 13, tab 1003
  text "Replacement", 26, 63 29 32 7, tab 1003
  list 27, 8 38 120 29, tab 1003 sort size vsbar
  button "&Add...", 28, 31 70 30 10, tab 1003
  button "E&dit...", 29, 64 70 30 10, disable tab 1003
  button "&Remove", 30, 97 70 30 10, disable tab 1003
  box "", 2900, -1 85 138 20
  button "OK", 2901, 51 92 40 10, default ok
  button "Cancel", 2902, 94 92 40 10, cancel
}
on *:DIALOG:kte.settings:init:0:{
  var %size = 0, %nf = $findfile($ktedir $+ Cache\, *, 0, 1, inc %size $file($1-).size), %i
  did -o $dname 5 1 $kte.thmdir
  did -o $dname 4 1 $kte.gzdir
  if (%nf) {
    did -o $dname 7 1 There $iif((%nf = 1), is, are) currently %nf file $+ $iif((%nf != 1), s) on your cache directory, wasting $_size(%size) of $&
      disk space.
  }
  else { did -o $dname 7 1 There are no files on your cache directory. | did -b $dname 8 }
  var %did = 12 13 14 16 17, %i = $numtok(%did, 32), %set = $hget(Kte.Data, Hide)
  while (%i) { if ($isbit(%set, %i)) { did -c $dname $gettok(%did, %i, 32) } | dec %i }
  var %did = 11 15, %i = $numtok(%did, 32), %set = $hget(Kte.Data, Cache)
  while (%i) { if ($isbit(%set, %i)) { did -c $dname $gettok(%did, %i, 32) } | dec %i }
  if ($hget(Kte.Data, FRep.Status)) { did -c $dname 22 }
  else { did -b $dname 27,28 }
  %i = 1 | while ($hmatch(Kte.Data, FRep.Rep.*, %i)) { did -a $dname 27 $frep.disp($mid($ifmatch, 10), $hget(Kte.Data, $ifmatch)) | inc %i }
}
on *:DIALOG:kte.settings:sclick:6:{
  var %dir = $sdir($did($dname, 5), Choose theme directory) | if (!$isdir(%dir)) { return }
  did -o $dname 5 1 %dir | did -c $dname 5 1 $len(%dir + 1)
}
on *:DIALOG:kte.settings:sclick:8:{
  var %x = $findfile($ktedir $+ Cache\, *, 0, 1, .remove $+(", $1-, "))
  did -o $dname 7 1 There are no files on your cache directory. | did -b $dname 8
}
on *:DIALOG:kte.settings:sclick:9:{
  var %dir = $sdir($did($dname, 4), Choose nGZIPn.dll directory) | if (!$isdir(%dir)) { return }
  did -o $dname 4 1 %dir | did -c $dname 4 1 $len(%dir + 1)
}
on *:DIALOG:kte.settings:sclick:22:{
  if ($did($dname, 22).state) { did -e $dname 27,28 }
  else { did -b $dname 27,28,29,30 | did -u $dname 27 }
}
on *:DIALOG:kte.settings:sclick:27:did -e $dname 29,30
on *:DIALOG:kte.settings:dclick:27:$dialog(kte.frep.edit, kte.frep, -4)
on *:DIALOG:kte.settings:sclick:28:$dialog(kte.frep.add, kte.frep, -4) | did -f $dname 27
on *:DIALOG:kte.settings:sclick:29:$dialog(kte.frep.edit, kte.frep, -4) | did -f $dname 27
on *:DIALOG:kte.settings:sclick:30:{
  var %s = $did($dname, 27, 1).sel
  did -d $dname 27 %s
  if ($did($dname, 27).lines >= %s) { did -c $dname 27 %s }
  elseif ($did($dname, 27).lines) { did -c $dname 27 $calc(%s - 1) }
  else { did -b $dname 29,30 }
}
on *:DIALOG:kte.settings:sclick:1000:did -f $dname 1
on *:DIALOG:kte.settings:sclick:1001:did -f $dname 11
on *:DIALOG:kte.settings:sclick:1002:did -f $dname 12
on *:DIALOG:kte.settings:sclick:1003:did -f $dname 22
on *:DIALOG:kte.settings:sclick:2901:{
  var %refresh = 0, %i, %ln
  if ($shortfn($did(kte.load, 4)) == $shortfn($kte.thmdir)) && ($shortfn($did(kte.load, 4)) != $did($dname, 5)) { %refresh = 1 }
  hadd Kte.Data ThmDir $did($dname, 5) | hadd Kte.Data GZipDir $did($dname, 4)
  hadd Kte.Data Hide $base($+($ds(17), $ds(16), $ds(14), $ds(13), $ds(12)), 2, 10)
  hadd Kte.Data Cache $base($+($ds(15), $ds(11)), 2, 10)
  hadd Kte.Data FRep.Status $ds(22)
  hdel -w Kte.Data FRep.Rep.*
  %i = $did($dname, 27).lines
  while (%i) { %ln = $did($dname, 27, %i) | hadd Kte.Data FRep.Rep. $+ $replace($gettok(%ln, 2, 124), $chr(32), \~) $gettok(%ln, 3, 124) | dec %i }
  if (%refresh) && ($isdir($did($dname, 5))) { load.list $did($dname, 5) }
}
alias -l ds return $did($dname, $1).state
alias -l _size {
  var %l = $1, %s = bytes
  if (%l = 1) { return 1 byte }
  if (%l > 900) { %l = %l / 1024 | %s = KB }
  if (%l > 900) { %l = %l / 1024 | %s = MB }
  if (%l > 900) { %l = %l / 1024 | %s = GB }
  return $round(%l, 2) %s
}
alias -l frep.disp {
  var %a = $replace($1, \~, $chr(32)), %b = $2, %s
  if ($calc($calc(53 * $dbuw) - $width(%a, MS Shell Dlg, -8)) > 5) { %s = $str( , $int($calc($ifmatch / $width( , MS Shell Dlg, -8) - 1.99999))) }
  else { %s = / }
  return %a %s %b $str( , 40) $+(|, %a, |, %b)
}

; add/edit font replacement

dialog kte.frep {
  title ""
  size -1 -1 114 46
  option dbu
  icon $mircexe, 16
  text "&Original font:", 1, 3 3 30 7
  combo 2, 39 1 72 50, edit drop
  text "&Replacement:", 3, 3 17 33 7
  combo 4, 39 15 72 30, edit drop
  box "", 2900, -1 27 116 20
  button "OK", 2901, 29 34 40 10, disable default ok
  button "Cancel", 2902, 72 34 40 10, cancel
  text "", 5, 0 0 0 0, hide
}
on *:DIALOG:kte.frep.*:init:0:{
  if ($gettok($dname, 3, 46) == add) { dialog -t $dname Add replacement }
  else {
    dialog -t $dname Edit replacement
    tokenize 124 $did(kte.settings, 27, $did(kte.settings, 27, 1).sel)
    did -o $dname 2 0 $2 | did -o $dname 4 0 $3
    did -o $dname 5 1 $2 | did -e $dname 2901
  }
  didtok $dname 2 59 GwdTE_437;IBMPC;PC8X16;Tahoma
}
on *:DIALOG:kte.frep.*:edit,sclick:2,4:{
  var %txt, %rep, %i = $did($dname, 4).lines | set -n %txt $remove($did($dname, 2), |, \~) | set -n %rep $remove($did($dname, 4), |, \~)
  if ($did = 2) {
    while (%i) { did -d $dname 4 %i | dec %i }
    if ($istok(GwdTE_437;IBMPC;PC8X16, %txt, 59)) { did -a $dname 4 Terminal }
    if (%txt == Tahoma) { did -a $dname 4 Verdana }
  }
  if (%txt = $null) || (%rep = $null) || ((%txt != $did($dname, 5)) && ($didwm(kte.settings, 27, %txt *| $+ %txt $+ |*))) || (%txt == %rep) {
    did -b $dname 2901
  }
  else { did -e $dname 2901 }
}
on *:DIALOG:kte.frep.add:sclick:2901:{
  did -fac kte.settings 27 $frep.disp($remove($did($dname, 2), |, \~), $remove($did($dname, 4), |, \~)) | did -e kte.settings 29,30
}
on *:DIALOG:kte.frep.edit:sclick:2901:{
  did -foc kte.settings 27 $did(kte.settings, 27, 1).sel $frep.disp($remove($did($dname, 2), |, \~), $remove($did($dname, 4), |, \~))
}



; vPak support
; based on Variant's code

; /vPak.extract [-t] [filename.vpk] [Path]
;   This is a MUCH simpler and customized /vPak alias. If you want the original one, look for it at http://www.mircscripts.org/
;   -t  - extract only the first .mts file found
alias -l vPak.extract {
  if ($left($1,1) == -) { var %Options = $1 | tokenize 32 $2- }
  ;Parse command line for long filenames
  if (" isin $1-) { tokenize 34 $1- | set -u %vPakFile $1 | set -u %vPakPath $3 }
  else { set -u %vPakFile $1 | set -u %vPakPath $2- }
  if ($right(%vPakPath,1) != \) { set -u %vPakPath $+(%vPakPath,\) }
  if (!$isfile(%vPakFile)) { return }
  var %Total = $ExtractFileList, %Counter = 1, %Line
  if (%Total == BadFile) { return }
  while (%Counter <= %Total) {
    %Line = $hget(vPakFileList,%Counter)
    if (t !isin %Options) || (($gettok(%Line, 1, 32) isnum) && (*.mts iswm $gettok(%Line, 3-, 32))) {
      if ($gettok(%Line,1,32) == DIR) { mkpath $+(%vPakPath,$gettok(%Line,2-,32)) }
      else { mkpath $nofile($+(%vPakPath,$gettok(%Line,3-,32))) | ExtractFile $gettok(%Line,1-2,32) $+(%vPakPath,$gettok(%Line,3-,32)) }
      if (t isin %Options) { break }
    }
    inc %Counter
  }
  hfree -w vPak*
}

alias -l vPakVersion return 1.1
alias -l vPakFileVersion return 2
alias -l d2h return $base($longip($replace($1, $chr(32), .)), 10, 16)
;alias -l d2h {
;  dec2hex function
;  var %Text, %Counter = 1
;  while (%Counter <= $numtok($1,32)) { %Text = %Text $base($gettok($1-,%Counter,32),10,16,2) | inc %Counter }
;  return $remove(%Text,$chr(32))
;}
alias -l mkpath {
  var %counter = 1
  while (%counter <= $numtok($1-,92)) {
    if (!$isdir($gettok($1-,$+(1-,%counter),92))) { mkdir $+(",$gettok($1-,$+(1-,%counter),92),") }
    inc %counter
  }
}
alias -l ExtractFileList {
  ;Read file list to hash table
  if ($hget(vPakFileList)) { hfree vPakFileList } | hmake vPakFileList 20
  bread $+(",%vPakFile,") 0 20 &Header
  var %FilePos = $base($d2h($bvar(&Header,1,4)),16,10), %FileSize = $file(%vPakFile).size,%Counter = 1,%Len
  if ($bvar(&Header,11,1).text != $vPakFileVersion) { return BadFile }
  while (%FilePos < %FileSize) {
    bread $+(",%vPakFile,") %FilePos 1000 &Data
    %Len = $base($d2h($bvar(&Data,1,2)),16,10)
    hadd vPakFileList %Counter $bvar(&Data,3,%Len).text
    inc %FilePos $calc(%Len + 2)
    inc %Counter
  }
  return $calc(%Counter - 1)
}
alias -l ExtractFile {
  if ($left($1,1) == -) { var %Options = $1 | tokenize 32 $2- }
  var %BytePos = 0,%BytesRead
  while (%BytePos < $2) {
    bread $+(",%vPakFile,") $calc($1 + %BytePos) 8192 &Bytes
    %BytesRead = $iif($calc(%BytePos + 8192) < $2,8192,$calc($2 - %BytePos))
    bwrite $+(",$3-,") %BytePos %BytesRead &Bytes
    inc %BytePos %BytesRead
  }
}

; event hiding
raw 001:*:kte_hidewcome
raw 002:*:kte_hidewcome
raw 003:*:kte_hidewcome
raw 004:*:kte_hidewcome
raw 005:*:if (!$kte_v(connected)) { kte_hidewcome }
alias -l kte_hidewcome if ($isbit($hget(Kte.Data, Hide), 1)) { haltdef }

raw 250:*:kte_hidelusers
raw 251:*:kte_hidelusers
raw 252:*:kte_hidelusers
raw 253:*:kte_hidelusers
raw 254:*:kte_hidelusers
raw 255:*:kte_hidelusers
raw 256:*:kte_hidelusers
raw 265:*:kte_hidelusers
raw 266:*:kte_hidelusers
alias -l kte_hidelusers if (!$kte_v(connected)) && ($isbit($hget(Kte.Data, Hide), 2)) { haltdef }

raw 372:*:kte_hidemotd
raw 375:*:kte_hidemotd
raw 376:*:kte_hidemotd
raw 377:*:kte_hidemotd
raw 378:*:kte_hidemotd
raw 422:*:kte_hidemotd
alias -l kte_hidemotd if (!$kte_v(connected)) && ($isbit($hget(Kte.Data, Hide), 3)) { haltdef }

on *:JOIN:#:if ($nick == $me) && ($hget(Kte.Data, Hide)) { kte_v joining $kte_v(joining) $chan }
on *:PART:#:kte_left $chan
on *:KICK:#:if ($knick == $me) { kte_left $chan }
alias -l kte_left var %jn = $kte_v(joining) | if ($istok(%jn, $1, 32)) { kte_v joining $remtok(%jn, $1, 1, 32) }

raw 353:*:kte_hidenames $3
raw 366:*:kte_hidenames $2
alias -l kte_hidenames if ($istok($kte_v(joining), $1, 32)) && ($isbit($hget(Kte.Data, Hide), 4)) { haltdef }

raw 331:*:kte_hidejinfo $2
raw 332:*:kte_hidejinfo $2
raw 333:*:kte_hidejinfo $2
raw 324:*:kte_hidejinfo $2
raw 329:*:kte_hidejinfo $2 | var %jn = $kte_v(joining) | if ($findtok(%jn, $2, 1, 32)) { kte_v joining $deltok(%jn, $ifmatch, 32) }
alias -l kte_hidejinfo if ($istok($kte_v(joining), $1, 32)) && ($isbit($hget(Kte.Data, Hide), 5)) { haltdef }


alias -l kte_v {
  var %n = $+(c, $cid, :, $1)
  if ($isid) { return $hget(Kte.Data, %n) }
  if ($0 = 1) { hdel Kte.Data %n }
  else { hadd Kte.Data %n $2- }
}

; default /theme.text
#Kte.DefTheme on
alias theme.text {
  var %ln | set -n %ln $hget(Kte.Theme, $1)
  if (!$var(%:echo)) || (* !iswm %ln) { return $false }
  set -nu %::me $me | set -u %::server $server | set -u %::port $port
  set -u %::Pre *** | set -nu %::Timestamp $timestamp
  if ($gettok(%ln, 1, 32) == !Script) { set -n %ln $deltok(%ln, 1, 32) }
  else { set -n %ln % $+ :echo $dll($ktedir $+ kte.dll, MTSPrecompile, %ln) $!+  % $+ :comment }
  if ($istok(%ln, |, 32)) { .timer.theme 1 0 %ln | .timer.theme -e }
  else { $eval(%ln, 2) }
  return $true
}
alias _kte.void
#Kte.DefTheme end