<?php
// puhlu.php

// Muuttujien käyttöönotto
$nimi   '';
$puhnro '';
$id     '';
$action '';

// Ulkoisista muuttujista on käytössä eri tilanteissa
// erilaisia kombinaatioita, siksi eri testejä
if (isset($_REQUEST['action'])) {
   
$action $_REQUEST['action'];
}
if (isset(
$_GET['nimi'])) {
   
$nimi   $_GET['nimi'];
   
$puhnro $_GET['puhnro'];
}
if (isset(
$_GET['id'])) {
   
$id     $_GET['id'];
}

// Erilaisia parametreja,  tavallisesti sijoitetaan 
// erilliseen config.php-tiedostoon
$serverpath dirname($_SERVER['SCRIPT_FILENAME']);
$datapath "/data/";
$datadir "$serverpath"$datapath";
$datafilename "puhlu.txt";
$filename "$datadir"$datafilename";
$erotin "\t"//Tabulaattori (TSV = Tab Separated Values)

// Tulostetaan alkumuodollisuudet
do_header();
do_navbar();
do_title("Puhelinluettelo");

// Sovelluksen keskeinen rakenne
switch ($action) {
   case 
"OtaMuokattavaksi":
      echo 
"<h3>Muokkaa</h3>\n";
      
lomake($nimi$puhnro$id);
      break;
   case 
"Tallenna muutokset":
      if ((
poista($filename$id)) AND
          (
tallenna($filename$erotin$nimi$puhnro)))
         echo 
"$nimi$puhnro muokattiin!";
      break;
   case 
"Tallenna":
      if (
tallenna($filename$erotin$nimi$puhnro))
         echo 
"$nimi$puhnro tallennettiin!";
      break;
   case 
"LisaaPuhnro":
      echo 
"<h3>Lisää puhelinnumero</h3>\n";
      
lomake($nimi$puhnro$id);
      break;
   case 
"Poista":
      if (
poista($filename$id))
         echo 
"$nimi$puhnro poistettiin!";
      break;
   default:
      echo 
"<small><em>Muokkaa valitsemalla " .
           
"henkilö</em><small>";
      
listaa_puhnrot($filename$erotin);
}


// Syöttölomake; käytetään sekä uuden tietueen syöttämiseen
// että vanhojen muokkaamiseen ja poistamiseen
function lomake($nimi$puhnro$id) {
?>
<form method="get" action="<?php echo $_SERVER['PHP_SELF']?>"
style=color:#000;background-color:#eeeeee>
Nimi:<br><input type="text" name="nimi" size="30"
value="<?php echo htmlspecialchars($nimi); ?>"><br>
Puhelinnumero:<br><input type="text" name="puhnro" size="30"
value="<?php echo htmlspecialchars($puhnro); ?>"><br>
<?php echo (painikkeet()) ?>
</form>
<hr>
<?php
}

// Painikkeiden valinta syöttölomakkeeseen toiminnon mukaan
function painikkeet() {
   if (isset (
$_REQUEST['id'])) { // seurattu linkkiä -> halutaan muokata
      
$mjono "<input type='hidden' ";
      
$mjono .= "name='id' value='{$_REQUEST['id']}'>\n";
      
$mjono .= "<input type='submit' name='action' ";
      
$mjono .= "value='Tallenna muutokset'>\n";
      
$mjono .= "<input type='submit' name='action' ";
      
$mjono .= "value='Poista'><br>\n";
   } else { 
// Uuden tietueen syöttäminen
      
$mjono  "<input type='submit' ";
      
$mjono .= "name='action' value='Tallenna'><br>\n";
   }
  return 
$mjono;
}

// Taustavärin vaihto puhelinluettelon rivejä varten
// Funktio palauttaa joka toinen kutsukerta vaihtuvan värin
function anna_vari() {
   static 
$varikoodi;

   
// Ensimmäinen rivi "beige"
   
if($varikoodi == "#ffeedd") {
      
$varikoodi "#ffffff";
   }
   else {
      
$varikoodi "#ffeedd";
   }
   return 
$varikoodi;
}

// Näyttää puhelinluettelon HTML-taulukossa
function listaa_puhnrot($filename$erotin) {
   if (
is_file($filename))  {
      
$taulu file($filename);
   }
   if (
is_array($taulu)) {
      echo 
"<table border='0'>\n";
      foreach(
$taulu as $rivinro => $rivi) {
          
$kentat split$erotinchop($rivi));
         
// htmlspecialchars, koska lomakedataan
         
$nimi htmlspecialchars($kentat[0]);
         
$puhnro htmlspecialchars($kentat[1]);
         
$vkoodi anna_vari();
         
$aika time();
         
         
// URLin kyselyosa, jossa parametrit välitetään:
         
$qstr "{$_SERVER['PHP_SELF']}?" .
                 
"tt=$aika&" .
                 
"action=OtaMuokattavaksi&" // Haluttu toiminto
                 
"id=$rivinro&" // id välittää rivinumeron
                 
"nimi=$nimi&" .
                 
"puhnro=$puhnro";
         
         echo 
"<tr bgcolor='$vkoodi'>\n";
         echo 
"<td><a href='$qstr'>$nimi</a></td>\n";
         echo 
"<td>$puhnro</td>\n";
         echo 
"</tr>\n";
      }
      echo 
"</table>";
   }
}

// Tietueen (rivin) poistaminen puhelinluettelosta
function poista($filename$id) {
   
$poisto FALSE;
   
$taulu file($filename);
   
$fp avaa($filename"w+");
   foreach(
$taulu as $rivinro => $rivi) {
      if (
$rivinro != $id) {
         
fwrite$fp$rivi);
      } else { 
// poistettavaa riviä ei kirjoiteta uudelleen
         
$poisto TRUE;
      }
   }
   
fclose$fp );
   return 
$poisto;
}

// Tiedoston avaaminen halutussa moodissa
function avaa($filename$mode) {
   if (!
$filename == "") {
      
$fp = @fopen$filename$mode )
         or die (
"Tiedoston $filename avausvirhe. Toiminto
           keskeytynyt.\n"
);
      return 
$fp;
    } else {
        return 
FALSE;
    }
}

// Tietueen (rivin) tallentaminen viimeiseksi
function tallenna($filename$erotin$nimi$puhnro) {
   if ((
$nimi <> "") AND ($puhnro <> "")) {
      
$fp avaa($filename"a+"); //Lisätään loppuun
      
fwrite$fp$nimi $erotin chop($puhnro) . "\n" );
      
fclose$fp );
      return 
TRUE;
   } else {
      return 
FALSE;
   }
}

// Alkumuodollisuudet
function do_header() {
?>
<head>
<title>Puhelinluettelo</title>
<style type="text/css">
h2 { border-top: solid thin black;
color:#000;background-color:#fed }
h3 { border-top: solid thin black;
color:#000;background-color:#eee }
</style>
</head>
<?php
}

// Navigointivalikot tuoreustakuineen (tt)
function do_navbar() {
   
$aika time();
   echo 
"<a href='{$_SERVER['PHP_SELF']}?tt=$aika'>";
   echo 
"Näytä puhelinnumerot</a> | ";
   echo 
"<a href='{$_SERVER['PHP_SELF']}?tt=$aika";
   echo 
"&action=LisaaPuhnro'>";
   echo 
"Lisää puhelinnumero</a>\n";
}

// Otsikkotietojen tulostus
function do_title($otsikko) {
   echo 
"<h2>$otsikko</h2>\n";
}
?>