/** * Shows the advanced search page */ function displayAdvancedSearchPage() { $url = new TableEditor_URL(); $url->addQueryString('asearch', '2'); $searchURL = $url->getURL(true); $url->addRawQueryString(''); $cancelURL = $url->getURL(); $searchFields = $this->getConfig('searchableFields'); // No searching permitted if (empty($searchFields)) { $url->removeQueryString('asearch'); header('Location: ' . $url->getURL()); exit; } // Define the various operators $operators[] = array('value' => '%', 'text' => 'Contains'); $operators[] = array('value' => '=', 'text' => 'Matches Exactly'); $operators[] = array('value' => '>', 'text' => 'Greater Than'); $operators[] = array('value' => '>=', 'text' => 'Greater Than or Equal to'); $operators[] = array('value' => '<', 'text' => 'Less Than'); $operators[] = array('value' => '<=', 'text' => 'Less Than or Equal to'); // Check querystring for potential search modifications $criteria = array(); if (!empty($_GET['fields'])) { foreach ($_GET['fields'] as $i => $f) { $criteria[] = array('field' => $f, 'operator' => $_GET['operators'][$i], 'value' => $_GET['values'][$i]); } } else { $criteria[] = array('field' => '', 'operator' => '', 'value' => ''); } $this->displayHeader(); ?> <script language="javascript" type="text/javascript"> <!-- /** * Adds an extra criteria row to the search form */ function addCriteria() { var tableObj = document.getElementById('searchCriteriaTable'); var trObj = document.getElementById('searchCriteriaRow'); var lastRow = document.getElementById('searchCriteriaTable_lastRow'); // Insert new row var insertedRow = lastRow.parentNode.insertBefore(trObj.cloneNode(true), lastRow); // Lose the button from the top row var buttonObj = trObj.getElementsByTagName('button')[0]; buttonObj.parentNode.removeChild(buttonObj); // Move the id trObj.id = ''; insertedRow.id = 'searchCriteriaRow'; // Reset values on the newly inserted row (needed when modifying a search) inputs = insertedRow.getElementsByTagName('input'); inputs[0].value = ''; selects = insertedRow.getElementsByTagName('select'); selects[0].selectedIndex = 0; selects[1].selectedIndex = 0; return false; } /** * Performs the search */ function search() { var selects = document.getElementsByTagName('select'); var inputs = document.getElementsByTagName('input'); var fields = []; var operators = []; var values = []; // Separate field names from operators for (var i=0; i<selects.length; ++i) { if (selects[i].name.substr(0, 5) == 'field') { fields[fields.length] = selects[i]; } else if (selects[i].name.substr(0, 8) == 'operator') { operators[operators.length] = selects[i]; } } // Separate out values from all inputs for (var i=0; i<inputs.length; ++i) { if (inputs[i].name.substr(0, 5) == 'value') { values[values.length] = inputs[i]; } } /** * Now construct the url */ var parameters = []; for (i=0; i<fields.length; ++i) { var f_val = fields[i].options[fields[i].selectedIndex].value; // Field value var o_val = operators[i].options[operators[i].selectedIndex].value; // Operator value var v_val = values[i].value; // Value value if (f_val) { // "Contains" must have a non-empty v_val if (o_val == '%' && v_val == '') { alert('When using the "Contains" operator, you must enter some text to search for'); return; } parameters[parameters.length] = 'fields[]=' + encodeURIComponent(f_val) + '&operators[]=' + encodeURIComponent(o_val) + '&values[]=' + encodeURIComponent(v_val); } } if (parameters.length == 0) { alert('Please enter some search criteria!'); return; } // Add the match type to the parameters array if (document.getElementById('match_any').checked) { parameters[parameters.length] = 'match=any'; } else { parameters[parameters.length] = 'match=all'; } location.href = '<?php echo $searchURL; ?> &' + parameters.join('&'); } // --> </script> <h2>Advanced Search</h2> <table border="0" id="searchCriteriaTable"> <?foreach($criteria as $i => $c):?> <tr <?if($i == count($criteria) - 1):?>id="searchCriteriaRow"<?endif?> > <td> <?if($i == count($criteria) - 1):?> <button onclick="addCriteria()">Add Criteria »</button> <?endif?> </td> <td> <select name="field[]"> <option value="">Select...</option> <?foreach($searchFields as $sf):?> <option value="<?php echo $sf; ?> " <?php echo $sf == $c['field'] ? 'selected' : ''; ?> ><?php echo $this->fields[$sf]['display']; ?> </option> <?endforeach?> </select> </td> <td> <select name="operator[]"> <?foreach($operators as $o):?> <option value="<?php echo $o['value']; ?> " <?php echo $o['value'] == $c['operator'] ? 'selected' : ''; ?> ><?php echo $o['text']; ?> </option> <?endforeach?> </select> </td> <td> <input type="text" name="value[]" value="<?php echo htmlspecialchars($c['value']); ?> "> </td> </tr> <?endforeach?> <tr id="searchCriteriaTable_lastRow"> <td align="right" valign="top" colspan="2"> Match: </td> <td> <input type="radio" name="match" value="any" id="match_any" <?php echo !isset($_GET['match']) || $_GET['match'] == 'any' ? 'checked' : ''; ?> > <label for="match_any">Any Criteria</label><br> <input type="radio" name="match" value="all" id="match_all" <?php echo isset($_GET['match']) && $_GET['match'] == 'all' ? 'checked' : ''; ?> > <label for="match_all">All Criteria</label> </td> <td valign="top" align="right"> <button onclick="location.href = '<?php echo $cancelURL; ?> '">Cancel</button> <button onclick="search()">Search »</button> </td> </tr> </table> <script language="javascript" type="text/javascript"> <!-- addCriteria(); addCriteria(); // --> </script> <?php $this->displayFooter(); exit; }