<?php

////////////////////////////////////////////////////////////////////////////////
//
//  canon.php
//
//  This application queries an SQL database to select Canon lenses
//  based on requirements that the user provides via a CGI form.
//
////////////////////////////////////////////////////////////////////////////////

require_once '../../lib/php/db_session.php';
require_once 
'../../lib/php/db_canon.php';

////////////////////////////////////////
//
//  This function takes a form variable
//  name, tries to locate a value in the
//  form submission or the session table,
//  and rejects all values that are not
//  simple numbers.
//
function fetch_num$name ) {
   if ( isset( 
$_POST$name ] ) &&
        
ereg'^([0-9]*.?[0-9]+)?$'substr$_POST$name ], 0) ) )
   {
      
$value $_SESSION$name ] = $_POST$name ];
   } elseif ( isset( 
$_SESSION$name ] ) &&
        
ereg'^([0-9]*.?[0-9]+)?$'substr$_SESSION$name ], 04  ) ) )
   {
      
$value $_POST$name ] = $_SESSION$name ];
   } else {
      
$value 0;
   }
   return 
$value;
}

echo <<<EOT
<html>
<head>
<title>Canon Lens Specification Search</title>
</head>
<body bgcolor="#ffffff">

<table border=0 cellpadding=5 cellspacing=0 width="100%">
<tr>
<td><h4>Canon Lens Specification Search</h4></td>
<td align=right><a href="src.html"><em>source code available here</em></a></td>
</tr>
</table>

EOT;

////////////////////////////////////////
//
//  Fetch values from form submission
//  and/or session table.
//
$requested_ap intvalfetch_num('ap') * 100 );
$wide         fetch_num('wide');
$tele         fetch_num('tele');
if ( 
$wide && $tele && $tele $wide ) {
   
$_SESSION['tele'] = $tele $wide;
}
if ( isset( 
$_POST['search'] ) ) {
   
$_SESSION['focus'] = ("checked" == $_POST['focus']) ? "checked" "";
   
$_SESSION['is']    = ("checked" == $_POST['is'])    ? "checked" "";
   
$_SESSION['l']     = ("checked" == $_POST['l'])     ? "checked" "";
} else {
   
$_POST['focus'] = ("checked" == $_SESSION['focus']) ? "checked" "";
   
$_POST['is']    = ("checked" == $_SESSION['is'])    ? "checked" "";
   
$_POST['l']     = ("checked" == $_SESSION['l'])     ? "checked" "";
}

////////////////////////////////////////
//
//  Build WHERE clause for SQL Query
//  for selecting desired lenses.
//
$where "";
$focal_length "";
if ( 
$wide ) {
   if ( 
"" != $where ) {
      
$where .= " AND";
   }
   
$where .= " wide <= $wide";
   
$focal_length $wide;
}
if ( 
$tele ) {
   if ( 
"" != $where ) {
      
$where .= " AND";
   }
   
$where .= " tele >= $tele";
   
$focal_length $tele;
}
if ( 
"checked" == $_POST['focus'] ) {
   if ( 
"" != $where ) {
      
$where .= " AND";
   }
   
$where .= " focus='FT-M'";
}
if ( 
"checked" == $_POST['is'] ) {
   if ( 
"" != $where ) {
      
$where .= " AND";
   }
   
$where .= " istab='Y'";
}
if ( 
"checked" == $_POST['l'] ) {
   if ( 
"" != $where ) {
      
$where .= " AND";
   }
   
$where .= " series='L'";
}
if ( 
"" != $where ) {
   
$where "WHERE $where";
}

////////////////////////////////////////
//
//  Set default values for form fields
//  from session data and display form.
//
$last_wide  $_SESSION['wide'];
$last_tele  $_SESSION['tele'];
$last_ap    $_SESSION['ap'];
$last_focus $_SESSION['focus'];
$last_is    $_SESSION['is'];
$last_l     $_SESSION['l'];
echo <<<EOT
<p><form action="$_SERVER[PHP_SELF]" method="post">
<table border=0 cellpadding=5 cellspacing=0>
<tr>
   <td>Wide Angle:</td>
   <td>&lt;= <input type="text" align="right" name="wide" value="
$last_wide" size=4 maxlength=4> mm</td>
   <td width=20>&nbsp;</td>
   <td><input type="checkbox" name="focus" value="checked" 
$last_focus></td>
   <td>FT-M (full-time manual focus)</td>
</tr>
<tr>
   <td>Telephoto:</td>
   <td>&gt;= <input type="text" align="right" name="tele" value="
$last_tele" size=4 maxlength=4> mm</td>
   <td width=20>&nbsp;</td>
   <td><input type="checkbox" name="is" value="checked" 
$last_is></td>
   <td>IS (image stabilization)</td>
</tr>
<tr>
   <td>Max. Aperture:</td>
   <td>&gt;= f/<input type="text" align="left" name="ap" value="
$last_ap" size=4 maxlength=4></td>
   <td width=20>&nbsp;</td>
   <td><input type="checkbox" name="l" value="checked" 
$last_l></td>
   <td>L Series (luxury series)</td>
</tr>
</table>
<input type="hidden" name="search" value="start">
<p><input type="submit">
</form>

EOT;

////////////////////////////////////////
//
//  Query the database for lenses that
//  satisfy user's requirements.
//
if ( isset( $_POST['search'] ) ) {
   print 
"<p><hr>\n";
   
$sth $s->_dbh->query(
      
"SELECT    mount, wide, tele, ap_wide, ap_tele, focus,
                 istab, macro, filter, series, price
       FROM      lenses
       
$where
       ORDER BY  price"
   
);
   if (
DB::IsError($sth)) {
      print 
"\n<!-- Select from problems had problems: " .
            
DB::errorMessage($sth) . " -->\n";
      print 
"<h4>Programming Error.  Sorry for the inconvenience.</h4>\n";
      print 
"</body>\n</html>\n";
      exit;
   }
   print 
"<p><table border=1 cellpadding=5 cellspacing=0>\n";
   print 
"<tr><th>Description</th><th>Filter Size</th><th>Street Price</th></tr>\n";

   
/////////////////////////////////////
   //
   //  Display each lens as a row in
   //  the table.  Skip lenses that
   //  do not meet the calculated speed
   //  requirement.
   //
   
while ( ($ob $sth->fetchRow(DB_FETCHMODE_OBJECT)) ) {
      if ( 
$requested_ap ) {
         if ( 
$focal_length ) {  # User is looking for a specific focal length
            
if ( $ob->wide == $ob->tele || $ob->ap_wide == $ob->ap_tele ) {
               
$effective_ap $ob->ap_tele;  # Fixed aperture lens
            
} else {  # Variable aperture, so interpolate based on focal length
               
$effective_ap $ob->ap_wide +  ($ob->ap_tele $ob->ap_wide) *
                  (
$focal_length $ob->wide) / ($ob->tele $ob->wide);
            }
         } else {  
# No focal length specified; use aperture at telephoto
            
$effective_ap $ob->ap_tele;
         }
         if ( 
$requested_ap $effective_ap ) {
            continue;
         }
      }
      print 
"<tr>\n";

      
//////////////////////////////////
      //
      //  Build up the description of
      //  the lens from several
      //  database columns.
      //
      
print "   <td";
      if ( 
'L' == $ob->series ) {
         print 
" bgcolor=\"#FFAAAA\"";
      } elseif ( 
'G' == $ob->series ) {
         print 
" bgcolor=\"#EEE8AA\"";
      } elseif ( 
'DO' == $ob->series ) {
         print 
" bgcolor=\"#98FB98\"";
      }
      print 
">";
      
printf"%s %d"$ob->mount$ob->wide );
      if ( 
$ob->wide != $ob->tele ) {
         
printf"-%d"$ob->tele );
      }
      print 
"mm";
      
printf" f/%.1f"$ob->ap_wide/100 );
      if ( 
$ob->ap_wide != $ob->ap_tele ) {
         
printf"-%.1f"$ob->ap_tele/100 );
      }
      if ( 
'L' == $ob->series ) {
         print 
"L";
      } elseif ( 
'DO' == $ob->series ) {
         print 
" DO";
      }
      if ( 
'Y' == $ob->istab ) {
         print 
" IS";
      }
      if ( 
'USM' == $ob->focus || 'FT-M' == $ob->focus ) {
         print 
" USM";
      }
      if ( 
'Y' == $ob->macro ) {
         print 
" Macro";
      }
      print 
"</td>\n";

      
//////////////////////////////////
      //
      //  Add filter size and price
      //
      
printf"   <td align=right>%dmm</td>\n"$ob->filter );
      
printf"   <td align=right>\$%d</td>\n"$ob->price );
      print 
"</tr>\n";
   }
   print 
"</table>\n";
}

print 
"</body>\n</html>\n";

?>