| 
<?php
 // Include the original TM::Apeform class to be extended.
 require_once("Apeform.class.php");
 
 /**
 * Extended TM::Apeform class providing some special form elements with build in
 * error checking.
 */
 class ExtendedApeform extends Apeform
 {
 /**
 * Creates an ISO-date input field, e.g. "2003-12-31".
 *
 * @param label string
 * @param help string
 * @param defaultValue string
 * @return string
 */
 function &date($label = "<u>D</u>ate", $help = "Year-Month-Day",
 $defaultValue = "")
 {
 // Use the actual date as defaultValue.
 if (empty($defaultValue)) $defaultValue = date("Y-m-d");
 // Calculate default element maxLength (and size too).
 $maxLength = strlen($defaultValue);
 // Call the parent method.
 $date = &$this->text($label, $help, $defaultValue, $maxLength);
 // Try to fetch three numbers from the string, the year first.
 if (! preg_match('/(\d+)\D+(\d+)\D+(\d+)/s', $date, $m))
 {
 $this->error("Please enter a date");
 }
 else
 {
 // Extend years with missing century.
 if ($m[1] <= 38) $m[1] += 2000;
 elseif ($m[1] <= 99) $m[1] += 1900;
 // Check validity, e.g. 2003-02-29 is forbidden.
 if (! checkdate($m[2], $m[3], $m[1]))
 {
 $this->error("Please enter a valid <u>d</u>ate");
 }
 else
 {
 // Well-form the value.
 $date = sprintf("%04s-%02s-%02s", $m[1], $m[2], $m[3]);
 }
 }
 return $date;
 }
 
 /**
 * Creates an ISO-date input field, e.g. "2003-12-31".
 *
 * @param label string
 * @param help string
 * @param defaultValue string
 * @return string
 */
 function &dateSelector($label = "<u>D</u>ate", $help = "Year-Month-Day",
 $defaultValue = "")
 {
 static $count = 0;
 $count++;
 $name = "element" . count($this->_rows);
 $help .= <<<CALENDAR
 \t <a href="#" onclick="return calendar$count()">Calendar...</a>
 <script type="text/javascript">
 function calendar$count()
 {
 var c = '<html><head><title>Calendar</title></head><body>This is just an example<br><code>';
 for (i = 1; i <= 31; i++)
 {
 v = i <= 9 ? '0' + i : i;
 c += '<a href="#" onclick="e=opener.document.forms[\'form\'].elements[\'$name\'];';
 c += 'e.value=e.value.substr(0,8)+\'' + v + '\';self.close();return false">' + v + '</a> ';
 if (i % 7 == 0) c += '<br>';
 }
 c += '</code></body></html>';
 var w = 250;
 var h = 130;
 var p = "";
 if (typeof event == "object" && typeof event.screenX == "number")
 {
 p = ",left=" + event.screenX + ",top=" + event.screenY;
 }
 var f = window.open("", "Calendar", "width=" + w + ",height=" + h + p + ",location=no,menubar=no,status=no,toolbar=no");
 f.document.open("text/html", "replace");
 f.document.write(c);
 f.document.close();
 f.focus();
 return false;
 }
 </script>
 CALENDAR;
 // Call the parent method.
 return $this->date($label, $help, $defaultValue);
 }
 
 /**
 * Creates an email input field, e.g. "[email protected]".
 *
 * @param label string
 * @param help string
 * @param defaultValue string
 * @param isRequired bool
 * @return string
 */
 function &email($label = "<u>E</u>mail", $help = "", $defaultValue = "",
 $isRequired = true)
 {
 // Call the parent method.
 $email = &$this->text($label, $help, $defaultValue);
 if ($isRequired && ! $email)
 {
 $this->error("Please enter your <u>e</u>mail adress");
 }
 // Check for a single At sign, no spaces, top level domain and so on.
 elseif ($email && ! preg_match(
 '/^[^\s"\'<>()@,;:]+@[^\s"\'<>()@,;:]+\.[a-z]{2,6}$/is', $email))
 {
 $this->error("Please enter a valid <u>e</u>mail adress");
 }
 return $email;
 }
 
 /**
 * Creates a price input field, e.g. "99.95".
 *
 * @param label string
 * @param help string
 * @param defaultValue float
 * @param min float
 * @param max float
 * @return string
 */
 function &price($label = "<u>P</u>rice", $help = "\t Euro",
 $defaultValue = "0.00", $min = 0.01, $max = 999999.99)
 {
 // Calculate maximum string length.
 $maxLength = max(strlen(sprintf("%.2f", $min)),
 strlen(sprintf("%.2f", $max)));
 // Call the parent method.
 $price = &$this->text($label, $help, $defaultValue, $maxLength,
 $maxLength);
 // Remove any special character.
 $price = preg_replace('/[^\d.-]+/s', '', $price);
 // Check boundaries.
 if ($price < $min)
 {
 $this->error("Please enter a larger <u>p</u>rice");
 }
 elseif ($price > $max)
 {
 $this->error("Please enter a lower <u>p</u>rice");
 }
 else
 {
 // Well-form the value.
 $price = sprintf("%.2f", $price);
 }
 return $price;
 }
 
 /**
 * Creates an extended file upload field.
 *
 * @param label string
 * @param help string
 * @param allowedType string
 * @param maxKB int
 * @param isRequired bool
 * @return array
 */
 function &filetype($label = "<u>F</u>ile", $help = "", $allowedType = "*/*",
 $maxKB = 2048, $isRequired = false)
 {
 // Call the parent method.
 $file = &$this->file($label, $help);
 $pattern = '{^' . str_replace("*", ".*", $allowedType) . '$}is';
 if ($isRequired && ! $file)
 {
 $this->error("Please select a file");
 }
 elseif ($file && $allowedType && ! preg_match($pattern, $file['type']))
 {
 $this->error("Please select a file of another type");
 }
 elseif ($file && $maxKB && $file['size'] > $maxKB * 1024)
 {
 $this->error("Please select a smaller file (max. " .
 number_format($maxKB) . "KB)");
 }
 return $file;
 }
 }
 
 ?>
 |