<?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; 
    } 
} 
 
?>
 
 |