emulate -L zsh

if [[ $1 != -n ]]; then
   zmodload -i zsh/net/tcp || return 1
   zmodload -ia zsh/zftp zftp || return 1
fi

if zmodload -i zsh/zutil; then
  local arr
  # Set defaults for styles if none set.
  zstyle -g arr ':zftp:*' progress || zstyle ':zftp:*' progress bar
  zstyle -g arr ':zftp:*' update   || zstyle ':zftp:*' update   1
  zstyle -g arr ':zftp:*' titlebar || zstyle ':zftp:*' titlebar true
  if functions chpwd >&/dev/null && ! zstyle -g arr ':zftp:*' chpwd; then
    zstyle ':zftp:*' chpwd true
  fi

  typeset -gA zfconfig
  zfconfig=(lastsession default)
fi

alias zfcd='noglob zfcd'
alias zfget='noglob zfget'
alias zfls='noglob zfls'
alias zfdir='noglob zfdir'
alias zfuget='noglob zfuget'

autoload -U zfanon zfautocheck zfcd zfcd_match zfcget zfclose zfcput
autoload -U zfdir zffcache zfgcp zfget zfget_match zfgoto zfhere zfinit zfls
autoload -U zfmark zfopen zfparams zfpcp zfput zfrglob zfrtime zfsession
autoload -U zfstat zftp_chpwd zftp_progress zftransfer zftype zfuget zfuput

#
# zftp completions: only use these if new-style completion is not
# active.
#
if [[ ${#_patcomps} -eq 0 || -z ${_patcomps[(r)_zf*]} ]]; then
  # only way of getting that noglob out of the way: this is unnecessary with
  # widget-based completion
  setopt completealiases

  compctl -f -x 'p[1]' \
    -k '(open params user login type ascii binary mode put putat
    get getat append appendat ls dir local remote mkdir rmdir delete
    close quit)'  - \
    'w[1,cd][1,ls][1,dir][1,rmdir]' -K zfcd_match -S/ -q - \
    'W[1,get*]' -K zfget_match - 'w[1,delete][1,remote]' -K zfget_match - \
    'w[1,open][1,params]' -k hosts - \
    'w[1,session]' -s '${$(zftp session):#$ZFTP_SESSION}' -- zftp
  compctl -K zfcd_match -S/ -q zfcd zfdir zfls
  compctl -K zfget_match zfget zfgcp zfuget zfcget
  compctl -k hosts zfanon zfopen zfparams
  compctl -s \
    '$(awk '\''{print $1}'\'' ${ZFTP_BMFILE:-${ZDOTDIR:-$HOME}/.zfbkmarks})' \
    -x 'W[1,-*n*]' \
    -s '$(awk -F, '\''NR > 2 { print $1 }'\'' ~/.ncftp/bookmarks)' -- \
    zfgoto zfmark
  compctl -s '${$(zftp session):#$ZFTP_SESSION}' zfsession
  # in _zftp for new completion, but hard to inline into a compctl
  zftransfer_match() {
    local sess=${1%%:*} oldsess=$ZFTP_SESSION
    [[ -n $sess ]] && zftp session $sess
    zfget_match ${1#*:} $2
    [[ -n $sess && -n $oldsess ]] && zftp session $oldsess
    reply=(${sess}:${^reply})
  }
  compctl -s '$(zftp session)' -S : -x 'C[0,*:*]' \
    -K zftransfer_match -- zftransfer
fi

return 0
