#!/bin/sh
#####################################################################
#   File:         /srv/www/admin/phonebook.cgi                      #
#   Creationn:    20.06.2007 jk                                     #
#   Last Update:  $Id$                                              #
#####################################################################
. /srv/www/include/cgi-helper
show_html_header "Phonebook"
. /var/run/phonebook.conf
if [ ! -f /var/run/phonebook.cgi.option-$REMOTE_USER ]
then
 cp /var/run/phonebook.cgi.option /var/run/phonebook.cgi.option-$REMOTE_USER 2> /dev/null
fi
 if [ "$FORM_action" != "" ]
 then
  echo $( sed "s/&action=[^&]*//g;s/\$/\&action=$FORM_action/" /var/run/phonebook.cgi.option-$REMOTE_USER ) > /var/run/phonebook.cgi.option-$REMOTE_USER
 else
  FORM_action=$( sed -n "s/.*&action=\([^&]*\).*/\1/p" /var/run/phonebook.cgi.option-$REMOTE_USER )
  if [ "$FORM_action" = "" ]
  then
   FORM_action="opt_nr2name"
  fi
 fi
_opt_nr2name="Nummer zu Name"
_opt_phonebook="Phonebook"
_opt_statistik="Statistik"
_opt_log="Log"
show_tab_header "$_opt_nr2name" "$myname?action=opt_nr2name" \
                "$_opt_phonebook" "$myname?action=opt_phonebook" \
                "$_opt_statistik" "$myname?action=opt_statistik" \
                "$_opt_log" "$myname?action=opt_log"
if [ "$FORM_action" != "opt_nr2name" ]
 then echo "
"
fi
if [ "$FORM_action" = "opt_log" ]
 then echo ""
fi
if [ "$FORM_action" = "opt_nr2name" ]
then
Controll="ok"
 if [ "$FORM_Nummer" != "" ]
 then
  wert=$(echo "$FORM_Nummer"  | sed -e 's/[^1234567890+]//g;s/^+49/0/;s/^+/00/;s/+//g' )
  echo "Schlage $wert nach...
"
  if [ "$FORM_suchen_phonebook" = "Nein" -a "$FORM_suchen_internet" = "Nein" ]
  then
  show_error "" "...wenn ich nirgendwo suchen soll, kann ich auch nichts finden! ;-)"
  fi
   if [ "$FORM_suchen_phonebook" != "Nein" ]
   then
    echo "Schlage im Phonebook nach...
"
    grep "^$wert=" /etc/phonebook
    if [ "$?" = "1" ]
    then
    show_error "" "...im Phonebook konnte nichts gefunden werden!
"
    else
     echo "
"
    fi
    phonebook_checkbox_J="checked"
    phonebook_checkbox_N=""
   else
    phonebook_checkbox_J=""
    phonebook_checkbox_N="checked"
   fi
   if [ "$FORM_suchen_internet" != "Nein" ]
   then
    echo "Schlage im Internet nach...
"
    ergebnis=$( phonebookInetSearch.sh "$wert" -azh  2> /tmp/phonebook.error-$$ )
    fehler=$( sed "s/ä/\ä/g;s/Ä/\Ä/g;s/ö/\ö/g;s/Ö/\ö/g;s/ü/\ü/g;s/Ü/\Ü/g;s/ß/\ß/g;" /tmp/phonebook.error-$$ )
    rm /tmp/phonebook.error-$$
    if [ "$fehler" != "" ]
    then
     echo "$fehler
"
     show_error "" "...im Internet konnte nichts gefunden werden!
"
    else
     echo "$ergebnis
"
     button="Ins Phonebook eintragen"
     grep -q "^$wert=" /etc/phonebook
     if [ "$?" = "0" ]
     then
      echo "Achtung:Im Phonebook befinden sich bereits Einträge mit dieser Nummer. Es wird empfohlen,"
      echo "diese zu löchen bevor sie die gefundenen Daten übernehmen. Es handelt sich um folgende Einträge:
"
      grep "^$wert=" /etc/phonebook | sed "s/^/     /"
      echo ""
      echo "
"
      button="Trotzdem ins Phonebook eintragen"
     fi
     echo ""
     #echo "
"
    fi
    internet_checkbox_J="checked"
    internet_checkbox_N=""
   else
    internet_checkbox_J=""
    internet_checkbox_N="checked"
   fi
  echo "
"
 fi
 #Fr sinnvolle Werte bei den Ja/Nein Checkboxen zur Suche in Internet und Phonebook sorgen
 if [ "$internet_checkbox_J$internet_checkbox_N" != "checked" ]; then internet_checkbox_J="checked"; internet_checkbox_N=""; fi
 if [ "$phonebook_checkbox_J$phonebook_checkbox_N" != "checked" ]; then phonebook_checkbox_J="checked"; phonebook_checkbox_N=""; fi
 #Die Eingabemaske zum suchen
 echo "
"
fi
if [ "$FORM_action" = "opt_phonebook" ]
then
Controll="ok"
 
 FORM_zeile=$( echo "$FORM_zeile" | sed "s/[^0-9]//g" )  #Zur Sicherheit
 if [ "$FORM_change$FORM_changename" != "" -a "$FORM_zeile" != "" ]
 then
  change="$FORM_change=$FORM_changename"
  #?dert die Zeile $FORM_zeile zu $change
  show_info "" "Zeile $FORM_zeile wird geändert zu: $change
"
  echo "Ändere Zeile $FORM_zeile vorher: $( sed -n "$FORM_zeile p" /etc/phonebook ) Zu: $change" >> $PHONEBOOK_LOG
sed -e "$FORM_zeile a\
$change" /etc/phonebook > /tmp/phonebookneu-$$
  sed "$FORM_zeile d" /tmp/phonebookneu-$$ > /etc/phonebook
  rm /tmp/phonebookneu-$$
 fi
 FORM_view=$( echo "$FORM_view" | sed "s/[^0-9]//g" )  #Zur Sicherheit
 if [ "$FORM_view" != "" ]
 then
  zeile=$( sed -n "$FORM_view p" /etc/phonebook | sed "s/&/\&/g;s/\"/\"/g;s/\</g;s/>/\>/g" )
  #?derungs Eingabemaske
  zeilenummer=$( echo "$zeile" | sed "s/^\([^#=]*\)=.*$/\1/" )
  zeilename=$( echo "$zeile" | sed "s/^\([^#=]*=\)//" )
  echo "| Bearbeiten: | "
  echo ""
  echo " | 
 | "
  echo ""
  echo " | 
"
  $FORM_kill=""   #Da sich beim Killen die Zeilennummern ?dern wrden.
 fi
 FORM_kill=$( echo "$FORM_kill" | sed "s/[^0-9]//g" )  #Zur Sicherheit
 if [ "$FORM_kill" != "" ]
 then
  #Löchen einer Zeile - definiert über Zeilennummer
  zeile=$( sed -n "$FORM_kill p" /etc/phonebook )
  echo "Lösche Zeile: $zeile" >> $PHONEBOOK_LOG
  sed "$FORM_kill d" /etc/phonebook > /tmp/phonebookneu-$$
  cat /tmp/phonebookneu-$$ > /etc/phonebook
  rm /tmp/phonebookneu-$$
  zeile=$( echo "$zeile" | sed "s/&/\&/g;s/\"/\"/g;s/\</g;s/>/\>/g;s/'/&39;/g" )
show_info "" "Lösche Zeile: $zeile"
  echo "
'
 fi
 if [ "$FORM_neuerEintrag" = "ja" ]
 then
  #Formular für neuen Eintrag:
  echo "Neuen Eintrag ins Phonebook einfügen:"
  echo "
'
 else
  echo ""
 fi
 # Hinzufügen einer übergebenen Zeile am Ende des Phonebooks
 if [ "$FORM_addname$FORM_addnummer" != "" ] 
 then
  phonebookeintrag="$FORM_addnummer=$FORM_addname"
  show_info "" "Füge Zeile ein: $phonebookeintrag"
  echo "Füge Zeile ein: $phonebookeintrag" >> $PHONEBOOK_LOG
  echo -e "$phonebookeintrag" >> /etc/phonebook
 fi
 #Phonebook anzeigen:
 #Die Sortierung eventuell aus der Datei /var/run/phonebook.cgi.option-$REMOTE_USER nachladen
 if [ "$FORM_sort" != "" ]
 then
  echo $( sed "s/&sort=[^&]*//g;s/\$/\&sort=$FORM_sort/" /var/run/phonebook.cgi.option-$REMOTE_USER ) > /var/run/phonebook.cgi.option-$REMOTE_USER
 else
  FORM_sort=$( sed -n "s/.*&sort=\([^&]*\).*/\1/p" /var/run/phonebook.cgi.option-$REMOTE_USER )
 fi
 # Die Ansicht-Checkboxen interpretieren eventuell aus /var/run/phonebook.cgi.option-$REMOTE_USER und anzeigen
 if [ "$FORM_ansicht" = "" ]
 then
  FORM_ansicht=$( sed -n "s/.*&ansicht=\([^&]*\).*/\1/p" /var/run/phonebook.cgi.option-$REMOTE_USER )
 else
  if [ "$FORM_ansicht" != "klassisch" ]
   then FORM_ansicht="komfort"
  fi
  echo $( sed "s/&ansicht=[^&]*//g;s/\$/\&ansicht=$FORM_ansicht/" /var/run/phonebook.cgi.option-$REMOTE_USER ) > /var/run/phonebook.cgi.option-$REMOTE_USER
 fi
 if [ "$FORM_ansicht" != "klassisch" ]
  then ansicht_checkbox_Ko="checked"; ansicht_checkbox_Kl=""
  else ansicht_checkbox_Ko=""; ansicht_checkbox_Kl="checked"
 fi
 # Die Suchanfrage eventuell aus der Datei /var/run/phonebook.cgi.option-$REMOTE_USER nachladen und erweitern, damit sie 
 # nicht durch die Nummerierung gestöt wird.
 # Keine Suche wird duch "&grep=.*" bzw. "&grep=.%2A" ausgedrckt, da grep="" nicht von ungesetztem grep=...
 # unterschieden werden kann.
 if [ "$FORM_grep" = "" ]
  then FORM_grep=$( sed -n "s/.*&grep=\([^&]*\).*/\1/p" /var/run/phonebook.cgi.option-$REMOTE_USER )
  else echo $( sed "s/&grep=[^&]*//g;s/\$/\&grep=$FORM_grep/" /var/run/phonebook.cgi.option-$REMOTE_USER ) > /var/run/phonebook.cgi.option-$REMOTE_USER
 fi
 grepstring=$( echo "$FORM_grep" | sed "s/^[^^]/.*&/;s/^^//;s/^/[ 	]*[0-9][0-9]* /" )
 if [ "$FORM_maps" = "" ]
  then FORM_maps=$( sed -n "s/.*&maps=\([^&]*\).*/\1/p" /var/run/phonebook.cgi.option-$REMOTE_USER )
  else echo $( sed "s/&maps=[^&]*//g;s/\$/\&maps=$FORM_maps/" /var/run/phonebook.cgi.option-$REMOTE_USER ) > /var/run/phonebook.cgi.option-$REMOTE_USER
 fi
 # Suchfeld anzeigen
 echo " | "
 #Direktsuche Hanynummern
 echo " | "
 #Alle anzeigen = Suche beenden
 echo ""
 echo " | 
"
 #kenntlich machen, da?nicht alle Datens?ze angezeigt werden
 if [ "$FORM_grep" != ".*" ]
  then  echo "Suchergebnis für: '$FORM_grep'
"
 fi
 echo "| Zum Sortieren bitte auf 'Nummer' oder 'Name' im Tabellenkopf klicken. | "
 echo " | 
"
 if [ -f "/etc/phonebook" ]
 then
  # Nach NamenSortiertes Phonebook:  sed "h;s/^[^=]*=//;s/\$/==/;y/abcdefghijklmnopqrstuvwxyzäöüß/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜS/;s/^/~/;G" /etc/phonebook  | tr -d "\n\r" | tr "~" "\n" | sort | sed "s/.*==//"
  # z-a Sortierung mit sort -r    Soriteren von Nummern mit sort-n
  # Ansicht greift nach der Sortierung
  if [ "$FORM_ansicht" != "klassisch" ]
   then ansichtErzeuger=";s/^[ 	]*//;s#\([0-9][0-9]*\)[ 	]\(.*\)#\2 | #;s!^\([^=#<]*\)\([#<]\)!\1=\2!;s!=! | !;s/^/ | | /;s!\(#[^<]*\)\1 | "
        pregrepstring="[ 	]*[0-9][0-9]* [^#=]*[^#0][^#=]*="
   else ansichtErzeuger=";s/^[ 	]*//;s#\([0-9][0-9]*\)[ 	]\(.*\)# | 
|---|
| \2 | bearbeiten | l\öschen | 
#;s!\(#[^<]*\)\1\1|"
  fi
  #Die Erzugung der Phonebook-Ansicht erfolgt nach einem bestimmten Schema:
  # 0) Die HTML-Tabellenkopfzeile erzuegen
  # 1) Nummerierung (da später über die Zeilennummer das Bearbeiten und Löschen funktioniert
  # 2) Filterung von Kommentarzeilen mit pregrepstring und gemäß der Suchabfrage mit grepstring
  # 3) Voranstellen eines Sortierstrings (suboptimal, da die Zeichen nicht aufgefüllt werden)
  # 4) Sortieren mit sort
  # 5) Aufräumen und dann den ansichtErzeuger zur HTMl-Erzeugung verwenden
  echo "" 
  case "$FORM_sort" in
   "name")
     echo "| Nummer"
     echo "$ansichtTrenner"
     echo "Name ↓ | "
     echo "bearbeiten | löchen | 
"
     nl -ba -s" " /etc/phonebook | grep "$pregrepstring" | grep "$grepstring" |
     sed "s/~/_/g;h;s/#.*//;s/^[^=]*//;s/=//;s/\$/==/;y/abcdefghijklmnopqrstuvwxyzäöüß/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜS/;G;s/\$/~/" | tr -d "\n" | tr "~" "\n"  | sort | 
     sed "s/.*==//$ansichtErzeuger"
   ;;
   "nameR")
     echo "| Nummer"
     echo "$ansichtTrenner"
     echo "Name ↑ | "
     echo "bearbeiten | löchen | 
"
     nl -ba -s" " /etc/phonebook | grep "$pregrepstring" | grep "$grepstring" |
     sed "s/~/_/g;h;s/#.*//;s/^[^=]*//;s/=//;s/\$/==/;y/abcdefghijklmnopqrstuvwxyzäöüß/ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜS/;G;s/\$/~/" | tr -d "\n" | tr "~" "\n"  | sort -r | 
     sed "s/.*==//$ansichtErzeuger" 
   ;;
   "number")
     echo "| Nummer ↓"
     echo "$ansichtTrenner"
     echo "Name | "
     echo "bearbeiten | löchen | 
"
     nl -ba -s" " /etc/phonebook | grep "$pregrepstring" | grep "$grepstring" | 
     sed "s#^ *\([0-9][0-9]*\) *\([^ ].*\)\$#\2 \1#" | sort -n |
     sed "s#\(.*\) \([0-9][0-9]*\)#\2 \1#$ansichtErzeuger"
   ;;
   "numberR")
     echo "| Nummer ↑"
     echo "$ansichtTrenner"
     echo "Name | "
     echo "bearbeiten | löchen | 
"
     nl -ba -s" " /etc/phonebook | grep "$pregrepstring" | grep "$grepstring" |
     sed "s#^ *\([0-9][0-9]*\) *\([^ ].*\)\$#\2 \1#" | sort -nr |
     sed "s#\(.*\) \([0-9][0-9]*\)#\2 \1#$ansichtErzeuger"
   ;;
   *)
     echo "| Nummer"
     echo "$ansichtTrenner"
     echo "Name | "
     echo "bearbeiten | löchen | 
"
     nl -ba -s" " /etc/phonebook | grep "$pregrepstring" | grep "$grepstring" | sed "$ansichtErzeuger"
   ;;
  esac
  echo "
"
 else
  show_error "" "Es konnte kein Phonebook auf dem Server gefunden werden!"
 fi
 # Auswahl Klassisch oder Komfort
 echo "
"
 echo ""
 if [ "$FORM_maps" = "on" ]
  then maps_on="checked"; maps_off=""
  else maps_on=""; maps_off="checked"
 fi
 echo ""
fi
if [ "$FORM_action" = "opt_statistik" ]
 then
 Controll="ok"
 grep "^[0-9][0-9]*=" /etc/phonebook > /tmp/phonebook.1-$$
 AnzahlGesamt=$( grep -c "" /tmp/phonebook.1-$$ )
 AnzahlIntern=$( grep -c "^[0-9][0-9][0-9]=" /tmp/phonebook.1-$$ )
 grep -v "^[0-9][0-9][0-9]=" /tmp/phonebook.1-$$ > /tmp/phonebook.2-$$
 AnzahlSond1=$( grep -c "^0*0[8-9]00" /tmp/phonebook.2-$$ )
 AnzahlSond2=$( grep -c "^0*013" /tmp/phonebook.2-$$ )
 AnzahlSond3=$( grep -c "^0*018" /tmp/phonebook.2-$$ )
 grep -v "^0*0[8-9]00" /tmp/phonebook.2-$$ | grep -v "^0*018" | grep -v "^0*013" > /tmp/phonebook.1-$$
 AnzahlSond=$( expr "$AnzahlSond1" "+" "$AnzahlSond2" "+" "$AnzahlSond3" )
 AnzahlHandy=$( grep -c "^0*01[5-7][0-9][0-9]*=" /tmp/phonebook.1-$$ )
 grep -v "^0*01[5-7][0-9][0-9]*=" /tmp/phonebook.1-$$ > /tmp/phonebook.2-$$
 AnzahlRest=$( grep -c "" /tmp/phonebook.2-$$ )
 rm /tmp/phonebook.1-$$ /tmp/phonebook.2-$$
 #show_info "" "| Gesamt: | $AnzahlGesamt | 
| Handynummer: | $AnzahlHandy | 
| Sonderrufnummern: | $AnzahlSond | 
| Interne Nummern: | $AnzahlIntern | 
| Festnetz und Rest: | $AnzahlRest | 
"
 echo "| Gesamt: | $AnzahlGesamt | 
"
 echo "| Handynummer: | $AnzahlHandy | anzeigen | 
"
 echo "| Sonderrufnummern: | $AnzahlSond | 
"
 echo "| Interne Nummern: | $AnzahlIntern | anzeigen | 
"
 echo "| Festnetz und Rest: | $AnzahlRest | 
"
 echo "
"
fi
if [ "$FORM_action" = "opt_log" ]
then
 Controll="ok"
 if [ "$FORM_log" = "del" ]
 then
  echo "" >$PHONEBOOK_LOG
show_info "" "Log gelöscht"
 fi
 cat $PHONEBOOK_LOG | sed 's/$/
/' | sed "s!Lösche.*\$!&!" | sed "s!Füge.*\$!&!" | sed "s!Ändere.*\$!&!" | sed "s!:.*\$!&!"
fi
if [ "$FORM_action" = "createphonebook" ]
then
Controll="ok"
show_info "" "Phonebook wurde erstellt"
echo "0=no number" >/etc/phonebook
echo "00=no number" >>/etc/phonebook
fi
# Reparieren von Phonebooks mit alten Sonderzeichen
if [ "$FORM_repair" = "semikolon" ]
then sed "s/;/ /g" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Wandle Semikola in Leerzeichen."
fi
if [ "$FORM_repair" = "vertical" ]
then sed "s/|/ /g" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Wandle '|' in Leerzeichen."
fi
if [ "$FORM_repair" = "alt255" ]
then sed "s// /g" /etc/phonebook > /tmp/phonebook-$$         #komisches Sonderzeichen Alt-255 ""
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Wandle Alt+255 in Leerzeichen."
fi
if [ "$FORM_repair" = "komischezeile" ]
then cat /etc/phonebook | tr -d"" > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Entferne komische Zeile, die manchmal auftritt."
fi
if [ "$FORM_repair" = "html" ]
then sed "s/<[^>]*>//g" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Entferne HTML-Code aus /etc/phonebook."
fi
if [ "$FORM_repair" = "leerzeichen" ]
then sed "s/  */ /g" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Fasse mehrfache Leerzeichen zusammen."
fi
if [ "$FORM_repair" = "kommata_semikola" ]
then sed "/^[^#]/ s/,/;/g" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Alle Kommata werden in Semikola umgewandelt (außer in Kommentarzeilen)."
fi
if [ "$FORM_repair" = "kill_CR" ]
then cat /etc/phonebook | tr -d "\r" > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Alle "CR" = "\r" Returns werden entfernt."
fi
if [ "$FORM_repair" = "konvert_LF_CRLF" ]
then sed "s/$/$( echo -e "\r\n" )/" /etc/phonebook > /tmp/phonebook-$$
     cat /tmp/phonebook-$$ > /etc/phonebook
     rm /tmp/phonebook-$$
     Controll="ok"
     show_info "" "Alle "LF" = "\n" Returns werden zu (Windows kompatiblen) "CR LF" = "\r\n" konvertiert."
fi
if [ "$Controll" = "" ]
then
show_error "" "Link Existiert nicht!
Eventuell waren nicht alle notwendigen Felder ausgefüllt"
fi
show_tab_footer
show_html_footer