";
// Return meta data
return ("".$content);
}
function query()
{
global $class_mapping;
$result= array();
// Return empty list if initial is not set
if (!$this->initial) {
$this->initial= true;
return $result;
}
// Go thru all queries and merge results
foreach ($this->query as $query) {
if (!isset($query['backend']) || !isset($query['filter'])) {
die("No backend specified in search config.");
}
// Is backend available?
$backend= "filter".$query['backend'];
if (!isset($class_mapping["$backend"])) {
die("Invalid backend specified in search config.");
}
// Load filter and attributes
$filter= $query['filter'];
// Handle converters if present
if ($this->converter) {
preg_match('/([^:]+)::(.*)$/', $this->converter, $m);
if ($this->value == "") {
$filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', "*", $filter));
} else {
$filter= call_user_func(array($m[1], $m[2]), preg_replace('/\$/', $this->value, $filter));
}
}
// Do not replace escaped \$ - This is required to be able to search for e.g. windows machines.
if ($this->value == "") {
$filter= preg_replace("/\\$/", '*', $filter);
} else {
$filter= preg_replace("/\\$/", "*".normalizeLdap($this->value)."*", $filter);
}
$result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $this->attributes, $this->category, $this->objectStorage));
}
return ($result);
}
function update()
{
if (isset($_POST['FILTER_PID']) && $_POST['FILTER_PID'] == $this->pid) {
// Save input field
if (isset($_POST['search_filter'])) {
$this->value= validate($_POST['search_filter']);
}
// Save scope if needed
if ($this->scopeMode == "auto" && isset($_POST['filter']) && $_POST['filter'] == "toggle-subtree") {
$this->scope= ($this->scope == "one")?"sub":"one";
}
// Switch filter?
if (isset($_POST['filter'])) {
foreach ($this->searches as $tag => $cfg) {
if ($_POST['filter'] == "filter-$tag") {
$this->setSearch($tag);
break;
}
}
}
}
}
function getCompletitionList($config, $value="*")
{
global $class_mapping;
$res= array();
// Load result attributes
$attributes= $config['autocomplete']['attribute'];
if (!is_array($attributes)) {
$attributes= array($attributes);
}
// Do the query
$result= array();
// Is backend available?
# FIXME
$queries= $config['query'];
if (!isset($queries[0])){
$queries= array($queries);
}
foreach ($queries as $query) {
$backend= "filter".$query['backend'];
if (!isset($class_mapping["$backend"])) {
die("Invalid backend specified in search config.");
}
$filter= preg_replace("/\\$/", "*".normalizeLdap($value)."*", $query['filter']);
$result= array_merge($result, call_user_func(array($backend, 'query'), $this->base, $this->scope, $filter, $attributes,
$this->category, $this->objectStorage));
}
foreach ($result as $entry) {
foreach ($attributes as $attribute) {
if (is_array($entry[$attribute])) {
for ($i= 0; $i<$entry[$attribute]['count']; $i++) {
if (mb_stristr($entry[$attribute][$i], $value)) {
$res[]= $entry[$attribute][$i];
}
}
} else {
$res[]= $entry[$attribute];
}
}
}
return $res;
}
function processAutocomplete()
{
global $class_mapping;
$result= array();
// Introduce maximum number of entries
$max= 25;
if(isset($this->searches[$this->search]['autocomplete'])){
$result= $this->getCompletitionList($this->searches[$this->search], $_POST['search_filter']);
$result= array_unique($result);
asort($result);
echo '
';
foreach ($result as $entry) {
echo '
'.mark($_POST['search_filter'], $entry).'
';
if ($max-- == 0) {
break;
}
}
echo '
';
}
}
function getObjectBase($dn)
{
global $config;
$base= "";
// Try every object storage
$storage= $this->objectStorage;
if (!is_array($storage)){
$storage= array($storage);
}
foreach ($storage as $location) {
$pattern= "/^[^,]+,".preg_quote($location, '/')."/i";
$base= preg_replace($pattern, '', $dn);
}
/* Set to base, if we're not on a correct subtree */
if (!isset($config->idepartments[$base])){
$base= $config->current['BASE'];
}
return $base;
}
function renderFilterMenu()
{
// Load shortcut
$result= "".
"