function find($selector, $idx = null, $lowercase = false)
{
$selectors = $this->parse_selector($selector);
if (($count = count($selectors)) === 0) {
return array();
}
$found_keys = array();
// find each selector
for ($c = 0; $c < $count; ++$c) {
// The change on the below line was documented on the sourceforge code tracker id 2788009
// used to be: if (($levle=count($selectors[0]))===0) return array();
if (($levle = count($selectors[$c])) === 0) {
return array();
}
if (!isset($this->_[HDOM_INFO_BEGIN])) {
return array();
}
$head = array($this->_[HDOM_INFO_BEGIN] => 1);
// handle descendant selectors, no recursive!
for ($l = 0; $l < $levle; ++$l) {
$ret = array();
foreach ($head as $k => $v) {
$n = $k === -1 ? $this->dom->root : $this->dom->nodes[$k];
//PaperG - Pass this optional parameter on to the seek function.
$n->seek($selectors[$c][$l], $ret, $lowercase);
}
$head = $ret;
}
foreach ($head as $k => $v) {
if (!isset($found_keys[$k])) {
$found_keys[$k] = 1;
}
}
}
// sort keys
ksort($found_keys);
$found = array();
foreach ($found_keys as $k => $v) {
$found[] = $this->dom->nodes[$k];
}
// return nth-element or array
if (is_null($idx)) {
return $found;
} else {
if ($idx < 0) {
$idx = count($found) + $idx;
}
}
return isset($found[$idx]) ? $found[$idx] : null;
}