/**
  * Create the necessary regEx expressions to deal with xxxx / xxxx-yy / xxxx-yy-zz numbers
  */
 private function _constructRegEx()
 {
     # Construct RegEx
     $DBunits = SELF::_decodeUnitsForRegEx();
     $blank = "\\s*";
     # just whitespace
     $justSeparator = "-";
     # just hyphen
     $separator = $blank . $justSeparator . $blank;
     # separator hypen, with or without blanks
     $mainNumber = "\\d{1,10}";
     # 1 to 10 digits for main number
     $middleNumber = $lastNumber = "\\d{1,4}";
     # 1 or four digits for middle and last number
     $middleLastNumber = "{$middleNumber}(?:{$justSeparator}{$lastNumber})?";
     # middle number - possibly with last number
     $unitlessNumber = "{$mainNumber}(?:{$justSeparator}{$middleLastNumber})?\\b";
     # main number - possible with middle and possible with last number
     $unitlessNumberNumberRange = "{$unitlessNumber}(?:{$justSeparator}{$unitlessNumber})?";
     # one number or two numbers with separator in-between
     $singleRegEx = array();
     $combinedRegEx = false;
     $unitRegEx = array();
     if ($DBunits) {
         $longMiddleShort = array();
         $longMiddleShortRange = array();
         foreach ($DBunits as $unit) {
             $unitId = implode("-", $unit);
             $mainUnit = "{$mainNumber}" . $unit[0];
             $middleUnit = "{$middleNumber}" . $unit[1];
             $lastUnit = "{$lastNumber}" . $unit[2];
             $optionalLastUnit = "(?:{$justSeparator}{$lastUnit})?";
             $optionalMiddleUnit = "(?:{$justSeparator}{$middleUnit}{$optionalLastUnit})?";
             $unitRegEx[$unitId] = "{$mainUnit}{$optionalMiddleUnit}";
             $short = "{$mainUnit}";
             $shortMiddle = "{$short}{$justSeparator}{$middleUnit}";
             $shortMiddleLong = "{$shortMiddle}{$justSeparator}{$lastUnit}";
             $thisLongMiddleShort = array($shortMiddleLong, $shortMiddle, $short);
             $thisLongMiddleShortRange = array();
             foreach ($thisLongMiddleShort as $front) {
                 // ABC|AB|A cross-product ...
                 foreach ($thisLongMiddleShort as $back) {
                     // ... with ABC|AB|A
                     $thisLongMiddleShortRange[] = "{$front}{$separator}{$back}";
                 }
             }
             foreach ($thisLongMiddleShort as $single) {
                 $thisLongMiddleShortRange[] = "{$single}";
             }
             // ABC|AB|A single
             $longMiddleShort[$unitId] = $thisLongMiddleShort;
             $longMiddleShortRange[$unitId] = $thisLongMiddleShortRange;
         }
         $maxidx = 12;
         // 9 == ABC|AB|A cross product ABC|AB|A + 3 == ABC|AB|A single
         for ($i = 0; $i < $maxidx; $i++) {
             foreach (array_keys($longMiddleShortRange) as $unitID) {
                 $singleRegEx["{$unitID}/{$i}"] = $longMiddleShortRange[$unitID][$i];
             }
         }
         $combinedRegEx = "(?:" . implode("|", $singleRegEx) . ")";
     }
     #echo "<pre>longMiddleShort\n" .  print_r($longMiddleShort,true). "</pre>";
     #echo "<pre>longMiddleShortRange\n" .  print_r($longMiddleShortRange,true). "</pre>";
     #echo "<pre>combinedRegEx\n$combinedRegEx</pre>";
     $result = array("justSeparator" => $justSeparator, "separator" => $separator, "blank" => $blank, "mainNumber" => $mainNumber, "middleNumber" => $middleNumber, "lastNumber" => $lastNumber, "middleLastNumber" => $middleLastNumber, "unitlessNumber" => $unitlessNumber, "unitlessNumberNumberRange" => $unitlessNumberNumberRange, "unitRegEx" => $unitRegEx, "singleRegEx" => $singleRegEx, "combinedRegEx" => $combinedRegEx);
     # echo "<pre>" .  print_r($result,true). "</pre>";
     # die();
     return $result;
 }
 /**
  * Filter for a measurement after search page submission.
  *
  * @param array $args
  */
 public function hookItemsBrowseSql($args)
 {
     $select = $args['select'];
     $params = $args['params'];
     $regEx = SELF::_constructRegEx();
     foreach ($regEx as $key => $val) {
         ${$key} = $val;
     }
     if (isset($params['measurement_search_term']) and preg_match("({$oneOrTwoNumbers})", $params['measurement_search_term'])) {
         # echo "<pre>" . $params['measurement_search_term'] . " / " . $oneOrTwoNumbers . "</pre>";
         $singleCount = preg_match_all("({$oneNumber})", $params['measurement_search_term'], $singleNumbers);
         # echo "<pre>$singleCount: " . print_r($singleNumbers,true) . "</pre>";
         $lower = $singleNumbers[0][0];
         $higher = isset($singleNumbers[0][1]) ? $singleNumbers[0][1] : $lower;
         $lower = str_pad($lower, MEASUREMENTSEARCH_NUM_MAXLEN, "0", STR_PAD_LEFT);
         $higher = str_pad($higher, MEASUREMENTSEARCH_NUM_MAXLEN, "0", STR_PAD_LEFT);
         # echo "<pre>$lower / $higher</pre>";
         $db = get_db();
         $select->join(array('measurement_search_values' => $db->MeasurementSearchValues), "measurement_search_values.item_id = items.id", array())->where("('{$higher}' >= measurement_search_values.height and '{$lower}' <= measurement_search_values.height) or " . "('{$higher}' >= measurement_search_values.width  and '{$lower}' <= measurement_search_values.width) or " . "('{$higher}' >= measurement_search_values.depth  and '{$lower}' <= measurement_search_values.depth)");
         # echo "<pre>$select</pre>";
         if (isset($params['measurement_search_unit']) and is_array($params['measurement_search_unit'])) {
             $measurementSearchFormUnits = array();
             foreach ($params['measurement_search_unit'] as $unit) {
                 $measurementSearchFormUnits[] = intval($unit);
             }
             if ($measurementSearchFormUnits) {
                 $validUnits = SELF::_decodeUnitsForRegEx();
                 if ($validUnits) {
                     $MeasurementSearchUnits = array_keys($validUnits);
                     $dbUnits = array();
                     foreach ($measurementSearchFormUnits as $unit) {
                         if (isset($MeasurementSearchUnits[$unit])) {
                             $dbUnits[] = addslashes($validUnits[$unit]);
                         }
                     }
                     #echo "<pre>" . print_r($dbUnits, true) . "</pre>"; die();
                     if ($dbUnits) {
                         $dbUnits = "'" . implode("','", $dbUnits) . "'";
                         $select->where("measurement_search_values.unit in ({$dbUnits})");
                     }
                 }
                 # if ($validUnits)
             }
             # if ($measurementSearchFormUnits)
         }
         # if ( (isset($params['measurement_search_unit']))
     }
     # if (	(isset($params['measurement_search_term'])) ...
 }