#!/bin/csh
clear
echo "--------------------------------------------------------------"
echo "                             CSHMail"
echo "--------------------------------------------------------------"
echo ""
echo ""
set user = `whoami`
echo "Bem-vindo, $user"

# ----------------------------------------------------------------
# Verificar se existe a directoria mymail

if (! -d ~/mymail) then

# Cria a directoria mymail

  mkdir ~/mymail
endif

# ----------------------------------------------------------------
# Verificar se existe o ficheiro inbox

if (-e ~/mymail/inbox) then

# Atravs do comando diff, compara os ficheiros para verificar
# se existem mensagens novas. Desta forma, compara apenas o conteudo
# dos ficheiros. Os ficheiros podem ser iguais em tamanho e diferentes em
# conteudo.

  set d = "`diff -q ~/mymail/inbox /var/spool/mail/$user`"
  if ("$d" != "") then
    echo "Tem novas mensagens"
    cp /var/spool/mail/$user ~/mymail/inbox
  else
    echo "Nao tem novas mensagens"
  endif
else

# criar ficheiro inbox em ~/mymail/

  cp /var/spool/mail/$user ~/mymail/inbox
endif

# ----------------------------------------------------------------
# -------------------------Menu Principal-------------------------
# ----------------------------------------------------------------

set opcao = "x"
while ("$opcao" != "q")
  echo ""
  echo "----------------------Menu Principal---------------------"
  echo ""
  echo ""
  echo "c - Compor Mensagem"
  echo "i - Index das mensagens Inbox"
  echo "h - Index das mensagens Inbox HTML"
  echo "l - Listar mymail - Index de Savedbox e Outbox"
  echo "a - Lista de endereos - Address book"
  echo "q - Sair do programa"
  echo ""
  echo "Opcao:"
  echo ""
  set opcao = "$<"
  switch ("$opcao")

# ----------------------------------------------------------------
# -----------------------------Compor-----------------------------
# ----------------------------------------------------------------

  case "c":
    clear
    echo "Endereco:"
    set ender="$<"
    if (-e ~/mymail/addressbook) then
      foreach x (`cat ~/mymail/addressbook | grep ":" | cut -f1 -d ":"`)
        if ("$x" == "$ender") then
          set ender = `cat ~/mymail/addressbook | grep ^"$ender" | cut -f2 -d ":"`
          echo "Addressbook: $ender"
        endif
      end
    endif
    echo "Assunto:"
    set assunto="$<"
    echo "Mensagem texto (para acabar a mensagem insira: EOM):"

# A mensagem de texto contem varias linhas. S  possivel a insercao
# linha a linha. Para identificar o final da mensagem de texto 
# ento  introduzido uma s linha com "EOM".

    set texto = "$<"
    echo "" > msg.tmp
    while ( "$texto" != "EOM" )
      echo "$texto" >> ~/msg.tmp
      set texto = "$<"
    end
    echo "A enviar mail.."
    mail $ender -s "$assunto" < ~/msg.tmp
    echo "Mail enviado"
    set date = `date +%a," "%e" "%b" "%Y" "%T" "%z`

# Uma copia do mail enviado  concatenada ao ficheiro mymail/outbox
# inclui tambem a data e hora de envio. A data tem o mesmo formato da
# data usada no programa mail.

    echo "To: $ender">> ~/mymail/outbox
    echo "Date: $date" >> ~/mymail/outbox
    echo "Subject: $assunto" >> ~/mymail/outbox
    echo "Mensagem texto:" >> ~/mymail/outbox
    cat ~/msg.tmp >> ~/mymail/outbox
    echo "-------------------------------------------" >> ~/mymail/outbox
    rm ~/msg.tmp
    echo "Uma copia do mail foi adicionada a savedbox"
    echo "Prima Enter para regressar ao menu principal"
    $<
    breaksw

# ----------------------------------------------------------------
# ------------------------------Index-----------------------------
# ----------------------------------------------------------------

  case "i":
    clear
    if (-e ~/msgidx) rm ~/msgidx
    if (-e ~/msg.tmp) rm ~/msg.tmp

# O ficheiro /var/spool/mail/$user que contm os mails do utilizador
# j foi copiado para ~/mymail/inbox. $num_msg representa o nmero total
# de mensagens na caixa de correio. Para obter $num_msg,  contado o
# numero de linhas do ficheiro ~/mymail/inbox que comecam por "Date:"

    set num_msg = `cat ~/mymail/inbox | grep ^"Date:" | wc -l`
    set arrow = 1
    set i = 0
    if ($num_msg == 0) then
      echo "Nao tem mensagens!"
      echo "Prima Enter para regressar ao menu principal"
      $<
    endif
    while ("$i" != "q" && $num_msg != 0)

# Dentro deste ciclo  criado o index das mensagens.  contado o numero de mensagens
# outra vez porque, dentro deste ciclo,  possivel apagar mensagens.

      set num_msg = `cat ~/mymail/inbox | grep ^"Date:" | wc -l`

# $arrow contm a posicao da seta que selecciona a mensagem. Se a ultima mensagem for
# apagada, a seta ($arrow) fica com um valor maior que $num_msg. Esta instruo
# corrige esse problema

      if ($arrow > $num_msg) set arrow = $num_msg
      set c = 1

# Para fabricar o index  criado um ficheiro temporrio ~/msgidx

      echo "-------------------Index de Mensagens------------------" > ~/msgidx
      while ($c <= $num_msg)

# Para cada mensagem (de 1($c) at $num_msg)  copiada a data,
# o endereco de origem e o assunto de cada mensagem 

        set date = `cat ~/mymail/inbox | grep ^Date: | head -$c | tail -1`
        set from = `cat ~/mymail/inbox | grep ^From: | head -$c | tail -1`
        set subj = `cat ~/mymail/inbox | grep ^Subject: | head -$c | tail -1`

# Se a mensagem seleccionada com a seta ($arrow)  a mesma que
# est a ser copiada ($c) ento  assinalado com uma seta "=>"
# para identificar a mensagem seleccionada.

        if ($arrow == $c) then
          echo "=> $c - $from" >> ~/msgidx
          echo "=>     $date" >> ~/msgidx
          echo "=>     $subj" >> ~/msgidx
        else
          echo "$c - $from" >> ~/msgidx
          echo "    $date" >> ~/msgidx
          echo "    $subj" >> ~/msgidx
        endif
        echo "------------------------------------------------" >> ~/msgidx
        @ c = $c + 1
      end
      echo "" >> ~/msgidx
      echo " +  ->  Proxima mensagem" >> ~/msgidx
      echo " -  ->  Anterior mensagem" >> ~/msgidx
      echo " d  ->  Apagar mensagem seleccionada" >> ~/msgidx
      echo " s  ->  Guardar mensagem seleccionada" >> ~/msgidx
      echo " q  ->  Sair para o menu principal" >> ~/msgidx
      echo "Para visualizar:" >> ~/msgidx
      echo "  Prima Enter para visualizar a mensagem seleccionada" >> ~/msgidx
      echo "  ou introduza o numero correspondente  mensagem" >> ~/msgidx
      echo "Que mensagem deseja?" >> ~/msgidx
      clear

# Se no houver mensagens ento  mostrado o respectivo aviso.
# Se houver mensagens  mostrado o index ~/msgidx

      if ($num_msg == 0) then
        echo "Nao tem mensagens!"
        echo "Prima Enter para regressar ao menu principal"
      else
        cat ~/msgidx | more
      endif

# $i  contm a opo seleccionada

      set i = "$<"

# Estes ciclos "if" determinam o prximo valor de $arrow consoante a opcao
# seleccionada (+ ou -). Desta maneira, $arrow est sempre no intervalo de
# valores de 1 at $num_msg

      if ("$i" == "+") if ($arrow < $num_msg) @ arrow = $arrow + 1
      if ("$i" == "-") if ($arrow > 1) @ arrow = $arrow - 1

# Se $i (opcao seleccionada) for uma string nula ento  necessrio mostrar
# a mensagem com o valor de $arrow. Para isso  copiado para $i o valor de
# $arrow, como se o utilizador tivesse introduzido o numero da mensagem.

      if ("$i" == "" && $num_msg != 0) set i = $arrow

# ----------------------------------------------------------------
# Ver Mensagens Inbox
# ----------------------------------------------------------------
# O primeiro ciclo "if" serve para evitar que no segundo "if" compare uma 
# string com um nmero. No  perfeito mas evita muitos problemas.

      if ("$i" != "q" && "$i" != "s" && "$i" != "d" && "$i" != "+" && "$i" != "-" && "$i" != "") then

# Neste ponto $i contm apenas o nmero da mensagem pretendida para visualizao

        if ($i <= $num_msg) then
          clear

# As prximas linhas de cdigo contm vrios mtodos para mostrar a mensagem
# pretendida consoante a sua posicao dentro de ~/mymail/inbox

# A prxima instruo guarda uma lista com o numero da linha do ficheiro 
# ~/mymail/inbox que corresponde ao inicio (iniciadas por "From ") de cada mensagem.

          cat ~/mymail/inbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
          set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`

# $head_msg contm o nmero da 1linha da mensagem pretendida. Atravs
# da instrucao `grep -n ""` numera-se a lista e com `grep ^"$i"` encontra-se a 
# linha correspondente.

          if ($i == $num_msg) then
            set num_lin = `cat ~/mymail/inbox | wc -l`

# $num_lin contm o numero total de linhas de ~/mymail/inbox
        
            set itail = 0
            @ itail = $num_lin - $head_msg - 1
            cat ~/mymail/inbox | tail -$itail | more
          else
            if ($i == 1) then
              set head_msg = 0
              @ head_msg = $i + 1
              set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$head_msg" | cut -f2 -d ":"`
              @ ihead = $ihead - 1
              cat ~/mymail/inbox | head -$ihead | more
            else
              set h_tmp = 0
              @ h_tmp = $i + 1
              set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
              @ ihead = $ihead - 1
              set num_lin = `cat ~/mymail/inbox | head -$ihead | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/inbox | head -$ihead | tail -$itail | more
            endif
          endif

# No final da mensagem  apresentado um pequeno menu de opes.

          echo "------------------------------------------------"
          echo ""          
          echo " d  ->  Apagar esta mensagem"
          echo " s  ->  Guardar esta mensagem"
          echo " Prima Enter para regressar ao index"
          set x = "$<"

# Para apagar ou guardar, so alterados os valores de $arrow e de $i
# de modo a entrar nos proximos ciclos responsveis por essas funes.

          if ($x == "d") then
            set arrow = $i
            set i = "d"
          endif
          if ($x == "s") then
            set arrow = $i
            set i = "s"
          endif
        endif
      endif

# ----------------------------------------------------------------
# Apagar Mensagens Inbox
# ----------------------------------------------------------------
# Se a opcao ($i)  igual a "d" (apagar mensagem escolhida) ento 
# executado um conjunto de instrues que elimina a mensagem pretendida
# do ficheiro ~/mymail/inbox consoante a sua posio.

      if ("$i" == "d") then

# A mensagem que se pretende apagar  a que est seleccionada com a seta ($arrow).

        set i = $arrow

# As prximas linhas de cdigo contm vrios mtodos para eliminar a mensagem
# pretendida consoante a sua posicao dentro de ~/mymail/inbox

        cat ~/mymail/inbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
        set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
        if ($i == $num_msg) then
          @ head_msg = $head_msg - 1
          cat ~/mymail/inbox | head -$head_msg > ~/mymail/inbox_tmp
        else
          if ($i == 1) then
            set h_tmp = 0
            @ h_tmp = $i + 1
            set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
            set num_lin = `cat ~/mymail/inbox | wc -l`
            set itail = 0
            @ itail = $num_lin - $head_msg - 1
            cat ~/mymail/inbox | tail -$itail > ~/mymail/inbox_tmp
          else
            @ head_msg = $head_msg - 1
            cat ~/mymail/inbox | head -$head_msg > ~/mymail/inbox_tmp
            set h_tmp = 0
            @ h_tmp = $i + 1
            set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
            set num_lin = `cat ~/mymail/inbox | wc -l`
            set itail = 0
            @ itail = $num_lin - $head_msg - 1
            cat ~/mymail/inbox | tail -$itail >> ~/mymail/inbox_tmp
          endif
        endif
        cp ~/mymail/inbox_tmp ~/mymail/inbox
        rm ~/mymail/inbox_tmp
      endif

# ----------------------------------------------------------------
# Guardar Mensagens Inbox
# ----------------------------------------------------------------
# Se a opcao ($i)  igual a "s" (guardar mensagem escolhida) ento 
# executado um conjunto de instrues que guarda a mensagem pretendida
# em ~/mymail/savedbox

      if ($i == "s") then

# A mensagem que se pretende guardar  a que est seleccionada com a seta ($arrow).

        set i = $arrow

# As prximas linhas de cdigo contm os mesmos mtodos para visualizar a mensagem
# s que a mensagem  enviada para ~/mymail/savedbox

        cat ~/mymail/inbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
        set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
        if ($i == $num_msg) then
          set num_lin = `cat ~/mymail/inbox | wc -l`
          set itail = 0
          @ itail = $num_lin - $head_msg - 1
          cat ~/mymail/inbox | tail -$itail >> ~/mymail/savedbox
        else
          if ($i == 1) then
            set head_msg = 0
            @ head_msg = $i + 1
            set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$head_msg" | cut -f2 -d ":"`
            @ ihead = $ihead - 1
            cat ~/mymail/inbox | head -$ihead >> ~/mymail/savedbox
          else
            set h_tmp = 0
            @ h_tmp = $i + 1
            set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
            @ ihead = $ihead - 1
            set num_lin = `cat ~/mymail/inbox | head -$ihead | wc -l`
            set itail = 0
            @ itail = $num_lin - $head_msg - 1
            cat ~/mymail/inbox | head -$ihead | tail -$itail >> ~/mymail/savedbox
          endif
        endif
      endif
    end
    breaksw

# ----------------------------------------------------------------
# ------------------------------Index HTML------------------------
# ----------------------------------------------------------------

  case "h":
    clear

# Verificar se existem as directorias public_html e webmail

    if (! -d ~/public_html) mkdir ~/public_html
    if (! -d ~/public_html/webmail) mkdir ~/public_html/webmail

# Apagar quaisquer mensagens j existentes

    if (-e ~/public_html/webmail/msg1.html) rm ~/public_html/webmail/msg*

# ----------------------------------------------------------------
# Criao do ficheiro ~/public_html/webmail/index.html

    echo " A criar ficheiro html..."
    echo "<html><title> Index de Mensagens HTML </title><center>" > ~/public_html/webmail/index.html
    echo "<H1> Index de Mensagens </H1><h2> Bem-vindo, $user </h2><br>" >> ~/public_html/webmail/index.html

#  contado o numero de linhas do ficheiro ~/mymail/inbox que comecam por "Date:"
# $num_msg representa o nmero total de mensagens na caixa de correio (inbox).

    set num_msg = `cat ~/mymail/inbox | grep ^"Date:" | wc -l`
    set i = 1

# Se no houver mensagens ento  mostrado o respectivo aviso.
# Se houver mensagens ento  criado o index

    if ($num_msg == 0) then
      echo "</center>Nao tem mensagens!<br></html>" >> ~/public_html/webmail/index.html
    else
      echo "</center><ol>" >> ~/public_html/webmail/index.html

# Para criar o index,  usado uma lista numerada em HTML que vai de $i (que neste
# momento  1) at $num_msg. Cada ponto desta lista contm os links para a respectiva
# mensagem. Os links contm a data, o endereo e o assunto da mensagem.

      while ($i <= $num_msg)
        set date = `cat ~/mymail/inbox | grep ^Date: | head -$i | tail -1`
        set from = `cat ~/mymail/inbox | grep ^From: | head -$i | tail -1`
        set subj = `cat ~/mymail/inbox | grep ^Subject: | head -$i | tail -1`
        echo "<br><li><a href="msg$i.html">$from</a><br>" >> ~/public_html/webmail/index.html
        echo "<a href="msg$i.html">$date</a><br>" >> ~/public_html/webmail/index.html
        echo "<a href="msg$i.html">$subj</a><br>" >> ~/public_html/webmail/index.html

# ----------------------------------------------------------------
# Criar ficheiro html com mensagem
#  criado um novo ficheiro html por cada mensagem em ~/mymail/inbox
# As prximas linhas de cdigo contm os mesmos mtodos para visualizar a mensagem
# s que a mensagem  enviada para o ficheiro html ~/public_html/webmail/msg$i.html
# em que $i corresponde ao numero da mensagem.

        echo "<html><title>Mensagem $i</title><h2>Mensagem $i</h2><br><pre>" > ~/public_html/webmail/msg$i.html
        cat ~/mymail/inbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
        set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
        if ($i == $num_msg) then
          set num_lin = `cat ~/mymail/inbox | wc -l`
          set itail = 0
          @ itail = $num_lin - $head_msg - 1
          cat ~/mymail/inbox | tail -$itail >> ~/public_html/webmail/msg$i.html
        else
          if ($i == 1) then
            set head_msg = 0
            @ head_msg = $i + 1
            set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$head_msg" | cut -f2 -d ":"`
            @ ihead = $ihead - 1
            cat ~/mymail/inbox | head -$ihead >> ~/public_html/webmail/msg$i.html
          else
            set h_tmp = 0
            @ h_tmp = $i + 1
            set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
            @ ihead = $ihead - 1
            set num_lin = `cat ~/mymail/inbox | head -$ihead | wc -l`
            set itail = 0
            @ itail = $num_lin - $head_msg - 1
            cat ~/mymail/inbox | head -$ihead | tail -$itail >> ~/public_html/webmail/msg$i.html
          endif
        endif
        echo "</pre></html>" >> ~/public_html/webmail/msg$i.html
        @ i = $i + 1
      end
      echo "</ol>" >> ~/public_html/webmail/index.html
    endif
    echo "</html>" >> ~/public_html/webmail/index.html
    echo " Ficheiro Criado!"
    echo " Para consultar: http://alumni.ipt.pt/~$user/webmail/index.html"
    echo "Prima Enter para regressar ao menu principal"
    $<
    breaksw

# ----------------------------------------------------------------
# --------------------Index Savedbox e Outbox---------------------
# ----------------------------------------------------------------

  case "l":
    clear

# O utilizador  questionado se quer consultar ~/mymail/savedbox ou ~/mymail/outbox

    echo "Deseja consultar (S)avedBox ou (O)utBox?"
    set box = "$<"

# ----------------------------------------------------------------
# Index SavedBox
# ----------------------------------------------------------------
#  criado um index semelhante ao usado no index inbox. Todas as funcionalidades
# do index inbox esto presentes aqui excepto o de guardar mensagens. O cdigo
#  exactamente igual s que em vez de ~/mymail/inbox tem ~/mymail/savedbox

    if ($box == "S" || $box == "s") then

# Se o ficheiro ~/mymail/savedbox no existem ento no existem mensagens

      if (-e ~/mymail/savedbox) then
        set num_msg = `cat ~/mymail/savedbox | grep ^"Date:" | wc -l`
      else
        set num_msg = 0
      endif
      set arrow = 1
      set i = 0
      if ($num_msg == 0) then
        echo "Nao tem mensagens!"
        echo "Prima Enter para regressar ao menu principal"
        $<
      endif
      while ("$i" != "q" && $num_msg != 0)
        set num_msg = `cat ~/mymail/savedbox | grep ^"Date:" | wc -l`
        if ($arrow > $num_msg) set arrow = $num_msg
        set c = 1
        echo "-------------------Index de Mensagens------------------" > ~/msgidx
        while ($c <= $num_msg)
          set date = `cat ~/mymail/savedbox | grep ^Date: | head -$c | tail -1`
          set from = `cat ~/mymail/savedbox | grep ^From: | head -$c | tail -1`
          set subj = `cat ~/mymail/savedbox | grep ^Subject: | head -$c | tail -1`
          if ($arrow == $c) then
            echo "=> $c - $from" >> ~/msgidx
            echo "=>     $date" >> ~/msgidx
            echo "=>     $subj" >> ~/msgidx
          else
            echo "$c - $from" >> ~/msgidx
            echo "    $date" >> ~/msgidx
            echo "    $subj" >> ~/msgidx
          endif
          echo "------------------------------------------------" >> ~/msgidx
          @ c = $c + 1
        end
        echo "" >> ~/msgidx
        echo " +  ->  Proxima mensagem" >> ~/msgidx
        echo " -  ->  Anterior mensagem" >> ~/msgidx
        echo " d  ->  Apagar mensagem seleccionada" >> ~/msgidx
        echo " q  ->  Sair para o menu principal" >> ~/msgidx
        echo "Para visualizar:" >> ~/msgidx
        echo "  Prima Enter para visualizar a mensagem seleccionada" >> ~/msgidx
        echo "  ou introduza o numero correspondente  mensagem" >> ~/msgidx
        echo "Que mensagem deseja?" >> ~/msgidx
        clear
        if ($num_msg == 0) then
          echo "Nao tem mensagens!"
          echo "Prima Enter para regressar ao menu principal"
        else
          cat ~/msgidx | more
        endif
        set i = "$<"
        if ("$i" == "+") if ($arrow < $num_msg) @ arrow = $arrow + 1
        if ("$i" == "-") if ($arrow > 1) @ arrow = $arrow - 1
        if ("$i" == "" && $num_msg != 0) set i = $arrow

# ----------------------------------------------------------------
# Ver Mensagens SavedBox
# ----------------------------------------------------------------

        if ("$i" != "q" && "$i" != "d" && "$i" != "+" && "$i" != "-" && "$i" != "") then
          if ($i <= $num_msg) then
            clear
            cat ~/mymail/savedbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
            set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
            if ($i == $num_msg) then
              set num_lin = `cat ~/mymail/savedbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/savedbox | tail -$itail | more
            else
              if ($i == 1) then
                set head_msg = 0
                @ head_msg = $i + 1
                set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$head_msg" | cut -f2 -d ":"`
                @ ihead = $ihead - 1
                cat ~/mymail/savedbox | head -$ihead | more
              else
                set h_tmp = 0
                @ h_tmp = $i + 1
                set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
                @ ihead = $ihead - 1
                set num_lin = `cat ~/mymail/savedbox | head -$ihead | wc -l`
                set itail = 0
                @ itail = $num_lin - $head_msg - 1
                cat ~/mymail/savedbox | head -$ihead | tail -$itail | more
              endif
            endif
            echo "------------------------------------------------"
            echo ""
            echo " d  ->  Apagar esta mensagem"
            echo " Prima Enter para regressar ao index"
            set x = "$<"
            if ($x == "d") then
              set arrow = $i
              set i = "d"
            endif
          endif
        endif

# ----------------------------------------------------------------
# Apagar Mensagens SavedBox
# ----------------------------------------------------------------

        if ("$i" == "d") then
          set i = $arrow
          cat ~/mymail/savedbox | grep -n ^"From " | cut -f1 -d ":" > ~/msg.tmp
          set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
          if ($i == $num_msg) then
            @ head_msg = $head_msg - 1
            cat ~/mymail/savedbox | head -$head_msg > ~/mymail/savedbox_tmp
          else
            if ($i == 1) then
              set h_tmp = 0
              @ h_tmp = $i + 1
              set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
              set num_lin = `cat ~/mymail/savedbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/savedbox | tail -$itail > ~/mymail/savedbox_tmp
            else
              @ head_msg = $head_msg - 1
              cat ~/mymail/savedbox | head -$head_msg > ~/mymail/savedbox_tmp
              set h_tmp = 0
              @ h_tmp = $i + 1
              set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
              set num_lin = `cat ~/mymail/savedbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/savedbox | tail -$itail >> ~/mymail/savedbox_tmp
            endif
          endif
          cp ~/mymail/savedbox_tmp ~/mymail/savedbox
          rm ~/mymail/savedbox_tmp
        endif
      end
    endif

# ----------------------------------------------------------------
# Index OutBox
# ----------------------------------------------------------------
#  criado um index semelhante ao usado no index inbox. Todas as funcionalidades
# do index inbox esto presentes aqui excepto o de guardar mensagens. O cdigo
#  exactamente igual s que em vez de ~/mymail/inbox tem ~/mymail/outbox

    if ($box == "O" || $box == "o") then
      if (-e ~/mymail/outbox) then
        set num_msg = `cat ~/mymail/outbox | grep ^"Date:" | wc -l`
      else
        set num_msg = 0
      endif
      set num_msg = `cat ~/mymail/outbox | grep ^"Date:" | wc -l`
      set arrow = 1
      set i = 0
      if ($num_msg == 0) then
        echo "Nao tem mensagens!"
        echo "Prima Enter para regressar ao menu principal"
        $<
      endif
      while ("$i" != "q" && $num_msg != 0)
        set num_msg = `cat ~/mymail/outbox | grep ^"Date:" | wc -l`
        if ($arrow > $num_msg) set arrow = $num_msg
        set c = 1
        echo "-------------------Index de Mensagens------------------" > ~/msgidx
        while ($c <= $num_msg)
          set date = `cat ~/mymail/outbox | grep ^Date: | head -$c | tail -1`
          set to = `cat ~/mymail/outbox | grep ^To: | head -$c | tail -1`
          set subj = `cat ~/mymail/outbox | grep ^Subject: | head -$c | tail -1`
          if ($arrow == $c) then
            echo "=> $c - $to" >> ~/msgidx
            echo "=>     $date" >> ~/msgidx
            echo "=>     $subj" >> ~/msgidx
          else
            echo "$c - $to" >> ~/msgidx
            echo "    $date" >> ~/msgidx
            echo "    $subj" >> ~/msgidx
          endif
          echo "------------------------------------------------" >> ~/msgidx
          @ c = $c + 1
        end
        echo "" >> ~/msgidx
        echo " + Proxima mensagem" >> ~/msgidx
        echo " - Anterior mensagem" >> ~/msgidx
        echo " d apagar mensagem seleccionada" >> ~/msgidx
        echo " q Sair para o menu principal" >> ~/msgidx
        echo "Que mensagem deseja?" >> ~/msgidx
        clear
        if ($num_msg == 0) then
          echo "Nao tem mensagens!"
          echo "Prima Enter para regressar ao menu principal"
        else
          cat ~/msgidx | more
        endif
        set i = "$<"
        if ("$i" == "+") if ($arrow < $num_msg) @ arrow = $arrow + 1
        if ("$i" == "-") if ($arrow > 1) @ arrow = $arrow - 1
        if ("$i" == "" && $num_msg != 0) set i = $arrow

# ----------------------------------------------------------------
# Ver Mensagens OutBox
# ----------------------------------------------------------------

        if ("$i" != "q" && "$i" != "d" && "$i" != "+" && "$i" != "-" && "$i" != "") then
          if ($i <= $num_msg) then
            clear
            cat ~/mymail/outbox | grep -n ^"To: " | cut -f1 -d ":" > ~/msg.tmp
            set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
            if ($i == $num_msg) then
              set num_lin = `cat ~/mymail/outbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/outbox | tail -$itail | more
            else
              if ($i == 1) then
                set head_msg = 0
                @ head_msg = $i + 1
                set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$head_msg" | cut -f2 -d ":"`
                @ ihead = $ihead - 1
                cat ~/mymail/outbox | head -$ihead | more
              else
                set h_tmp = 0
                @ h_tmp = $i + 1
                set ihead = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
                @ ihead = $ihead - 1
                set num_lin = `cat ~/mymail/outbox | head -$ihead | wc -l`
                set itail = 0
                @ itail = $num_lin - $head_msg - 1
                cat ~/mymail/outbox | head -$ihead | tail -$itail | more
              endif
            endif
            echo "------------------------------------------------"
            echo ""          
            echo " d  ->  Apagar esta mensagem"
            echo " Prima Enter para regressar ao index"
            set x = "$<"
            if ($x == "d") then
              set arrow = $i
              set i = "d"
            endif
          endif
        endif

# ----------------------------------------------------------------
# Apagar Mensagens OutBox
# ----------------------------------------------------------------

        if ("$i" == "d") then
          set i = $arrow
          cat ~/mymail/outbox | grep -n ^"To: " | cut -f1 -d ":" > ~/msg.tmp
          set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$i" | cut -f2 -d ":"`
          if ($i == $num_msg) then
            @ head_msg = $head_msg - 1
            cat ~/mymail/outbox | head -$head_msg > ~/mymail/outbox_tmp
          else
            if ($i == 1) then
              set h_tmp = 0
              @ h_tmp = $i + 1
              set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
              set num_lin = `cat ~/mymail/outbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/outbox | tail -$itail > ~/mymail/outbox_tmp
            else
              @ head_msg = $head_msg - 1
              cat ~/mymail/outbox | head -$head_msg > ~/mymail/outbox_tmp
              set h_tmp = 0
              @ h_tmp = $i + 1
              set head_msg = `cat ~/msg.tmp | grep -n "" | grep ^"$h_tmp" | cut -f2 -d ":"`
              set num_lin = `cat ~/mymail/outbox | wc -l`
              set itail = 0
              @ itail = $num_lin - $head_msg - 1
              cat ~/mymail/outbox | tail -$itail >> ~/mymail/outbox_tmp
            endif
          endif
          cp ~/mymail/outbox_tmp ~/mymail/outbox
          rm ~/mymail/outbox_tmp
        endif
      end
    endif
    breaksw

# ----------------------------------------------------------------
# ---------------------------Address Book-------------------------
# ----------------------------------------------------------------
# Para a lista de endereos  criada um index parecido com o index inbox
# mas com funcionalidades reduzidas.

  case "a":
    clear

# Se o ficheiro ~/mymail/addressbook no contm endereos ento  apagado

    if (-z ~/mymail/addressbook) rm ~/mymail/addressbook

# $num_end contm o nmero total de endereos em ~/mymail/addressbook
# Para calcular $num_end,  efectuada uma contagem de todas as linhas com o 
# caracter ":" (cada endereo est separado pelo nome por um caracter ":")

    if (-e ~/mymail/addressbook) then
      set num_end = `cat ~/mymail/addressbook | grep ":" | wc -l`
    else
      set num_end = 0
    endif
    set arrow = 1
    set i = 0

# Se no existirem endereos ento o utilizador s pode sair ou introduzir o 1
# endereo.

    if ($num_end == 0) then
      echo "Nao tem endereos!"
      echo "Prima Enter para regressar ao menu principal ou introduza"
      echo " a  ->  Adicionar novo endereo"
      set i = "$<"
      if ("$i" == "a") then
        clear
        echo "Introduza o nome"
        set name = "$<"
        echo "Introduza o endereo de email de $name"
        set end = "$<"
        echo "$name":"$end" >> ~/mymail/addressbook
      endif
    endif
    while ("$i" != "q" && "$i" != "")
      set num_end = `cat ~/mymail/addressbook | grep ":" | wc -l`
      if ($arrow > $num_end) set arrow = $num_end
      if ($arrow == 0) set arrow = 1
      set c = 1
      echo "-------------------Lista de Endereos------------------" > ~/endidx
      while ($c <= $num_end)

# Para cada endereo (de 1($c) at $num_end)  copiado o nome e o endereo

        set name = `cat ~/mymail/addressbook | grep ":" | cut -f1 -d ":" | head -$c | tail -1`
        set end = `cat ~/mymail/addressbook | grep ":" | cut -f2 -d ":" | head -$c | tail -1`

# Se o endereo seleccionado com a seta ($arrow)  o mesmo que
# est a ser copiado ($c) ento  assinalado com uma seta "=>"
# para identificar o endereo seleccionado.

        if ($arrow == $c) then
          echo "=> $c - $name" >> ~/endidx
          echo "=>     $end" >> ~/endidx
        else
          echo "$c - $name" >> ~/endidx
          echo "    $end" >> ~/endidx
        endif
        echo "------------------------------------------------" >> ~/endidx
        @ c = $c + 1
      end
      echo "" >> ~/endidx
      echo " +  ->  Proximo endereo" >> ~/endidx
      echo " -  ->  Anterior endereo" >> ~/endidx
      echo " d  ->  Apagar endereo seleccionado" >> ~/endidx
      echo " a  ->  Adicionar novo endereo" >> ~/endidx
      echo " q  ->  Sair para o menu principal" >> ~/endidx
      echo "Que deseja?" >> ~/endidx
      clear
      if ($num_end == 0) then
        echo "Nao tem endereos!"
        echo "Prima Enter para regressar ao menu principal ou"
        echo " a adicionar novo endereo"
      else
        cat ~/endidx | more
      endif
      set i = "$<"
      if ("$i" == "+") if ($arrow < $num_end) @ arrow = $arrow + 1
      if ("$i" == "-") if ($arrow > 1) @ arrow = $arrow - 1
      if ("$i" == "d" && $num_end != 0) then

# No ficheiro addressbook, cada linha corresponde a um endereo. Assim,
# para apagar um endereo, basta exibir todos os outros endereos excepto
# o endereo seleccionado por $arrow. cut -f2- -d ":" mostra todos os campos
# a partir do segundo campo at ao final da linha, campos delimitados por ":"

        cat ~/mymail/addressbook | grep -n ":" | grep -v ^"$arrow" | cut -f2- -d ":" > ~/mymail/a.tmp
        cat ~/mymail/a.tmp > ~/mymail/addressbook
        rm ~/mymail/a.tmp
      endif
      if ("$i" == "a") then
        clear
        echo "Introduza o nome"
        set name = "$<"
        echo "Introduza o endereo de email de $name"
        set end = "$<"
        echo "$name"':'"$end" >> ~/mymail/addressbook
      endif
    end
    if (-e ~/endidx) rm ~/endidx
    breaksw
  default:
    breaksw
  endsw
  clear
end
if (-e ~/msgidx) rm ~/msgidx
if (-e ~/msg.tmp) rm ~/msg.tmp
clear
exit
# Realizado por Eduardo Dias, n7135
