Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code:102) in /var/www/iplanru/data/www/intesco.ru/d59ed/index.php(1) : eval()'d code(2) : eval()'d code on line 4
router.php000066600000006705150773113710006616 0ustar00getMenu(); } /* * First, handle menu item routes first. When the menu system builds a * route, it only provides the option and the menu item id. We don't have * to do anything to these routes. */ if (count($query) === 2 && isset($query['Itemid']) && isset($query['option'])) { return $segments; } /* * Next, handle a route with a supplied menu item id. All system generated * routes should fall into this group. We can assume that the menu item id * is the best possible match for the query but we need to go through and * see which variables we can eliminate from the route query string because * they are present in the menu item route already. */ if (!empty($query['Itemid'])) { // Get the menu item. $item = $menu->getItem($query['Itemid']); // Check if the view matches. if ($item && @$item->query['view'] === @$query['view']) { unset($query['view']); } // Check if the search query filter matches. if ($item && @$item->query['f'] === @$query['f']) { unset($query['f']); } // Check if the search query string matches. if ($item && @$item->query['q'] === @$query['q']) { unset($query['q']); } return $segments; } /* * Lastly, handle a route with no menu item id. Fortunately, we only need * to deal with the view as the other route variables are supposed to stay * in the query string. */ if (isset($query['view'])) { // Add the view to the segments. $segments[] = $query['view']; unset($query['view']); } $total = count($segments); for ($i = 0; $i < $total; $i++) { $segments[$i] = str_replace(':', '-', $segments[$i]); } return $segments; } /** * Parse the segments of a URL. * * @param array &$segments The segments of the URL to parse. * * @return array The URL attributes to be used by the application. * * @since 3.3 */ public function parse(&$segments) { $total = count($segments); $vars = array(); for ($i = 0; $i < $total; $i++) { $segments[$i] = preg_replace('/-/', ':', $segments[$i], 1); } // Check if the view segment is set and it equals search or advanced. if (@$segments[0] === 'search' || @$segments[0] === 'advanced') { $vars['view'] = $segments[0]; } return $vars; } } /** * Finder router functions * * These functions are proxys for the new router interface * for old SEF extensions. * * @deprecated 4.0 Use Class based routers instead */ function FinderBuildRoute(&$query) { $router = new FinderRouter; return $router->build($query); } function FinderParseRoute($segments) { $router = new FinderRouter; return $router->parse($segments); } views/index.html000066600000000036150773113710007706 0ustar00views/search/view.html.php000066600000015130150773113710011605 0ustar00getParams(); // Get view data. $state = $this->get('State'); $query = $this->get('Query'); JDEBUG ? $GLOBALS['_PROFILER']->mark('afterFinderQuery') : null; $results = $this->get('Results'); JDEBUG ? $GLOBALS['_PROFILER']->mark('afterFinderResults') : null; $total = $this->get('Total'); JDEBUG ? $GLOBALS['_PROFILER']->mark('afterFinderTotal') : null; $pagination = $this->get('Pagination'); JDEBUG ? $GLOBALS['_PROFILER']->mark('afterFinderPagination') : null; // Check for errors. if (count($errors = $this->get('Errors'))) { JError::raiseError(500, implode("\n", $errors)); return false; } // Configure the pathway. if (!empty($query->input)) { $app->getPathWay()->addItem($this->escape($query->input)); } // Push out the view data. $this->state = &$state; $this->params = &$params; $this->query = &$query; $this->results = &$results; $this->total = &$total; $this->pagination = &$pagination; // Check for a double quote in the query string. if (strpos($this->query->input, '"')) { // Get the application router. $router =& $app->getRouter(); // Fix the q variable in the URL. if ($router->getVar('q') !== $this->query->input) { $router->setVar('q', $this->query->input); } } // Log the search JSearchHelper::logSearch($this->query->input, 'com_finder'); // Push out the query data. JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $this->suggested = JHtml::_('query.suggested', $query); $this->explained = JHtml::_('query.explained', $query); // Escape strings for HTML output $this->pageclass_sfx = htmlspecialchars($params->get('pageclass_sfx')); // Check for layout override only if this is not the active menu item // If it is the active menu item, then the view and category id will match $active = $app->getMenu()->getActive(); if (isset($active->query['layout'])) { // We need to set the layout in case this is an alternative menu item (with an alternative layout) $this->setLayout($active->query['layout']); } $this->prepareDocument($query); JDEBUG ? $GLOBALS['_PROFILER']->mark('beforeFinderLayout') : null; parent::display($tpl); JDEBUG ? $GLOBALS['_PROFILER']->mark('afterFinderLayout') : null; } /** * Method to get hidden input fields for a get form so that control variables * are not lost upon form submission * * @return string A string of hidden input form fields * * @since 2.5 */ protected function getFields() { $fields = null; // Get the URI. $uri = JUri::getInstance(JRoute::_($this->query->toURI())); $uri->delVar('q'); $uri->delVar('o'); $uri->delVar('t'); $uri->delVar('d1'); $uri->delVar('d2'); $uri->delVar('w1'); $uri->delVar('w2'); $elements = $uri->getQuery(true); // Create hidden input elements for each part of the URI. foreach ($elements as $n => $v) { if (is_scalar($v)) { $fields .= ''; } } return $fields; } /** * Method to get the layout file for a search result object. * * @param string $layout The layout file to check. [optional] * * @return string The layout file to use. * * @since 2.5 */ protected function getLayoutFile($layout = null) { // Create and sanitize the file name. $file = $this->_layout . '_' . preg_replace('/[^A-Z0-9_\.-]/i', '', $layout); // Check if the file exists. jimport('joomla.filesystem.path'); $filetofind = $this->_createFileName('template', array('name' => $file)); $exists = JPath::find($this->_path['template'], $filetofind); return ($exists ? $layout : 'result'); } /** * Prepares the document * * @param FinderIndexerQuery $query The search query * * @return void * * @since 2.5 */ protected function prepareDocument($query) { $app = JFactory::getApplication(); $menus = $app->getMenu(); $title = null; // Because the application sets a default page title, // we need to get it from the menu item itself $menu = $menus->getActive(); if ($menu) { $this->params->def('page_heading', $this->params->get('page_title', $menu->title)); } else { $this->params->def('page_heading', JText::_('COM_FINDER_DEFAULT_PAGE_TITLE')); } $title = $this->params->get('page_title', ''); if (empty($title)) { $title = $app->getCfg('sitename'); } elseif ($app->getCfg('sitename_pagetitles', 0) == 1) { $title = JText::sprintf('JPAGETITLE', $app->getCfg('sitename'), $title); } elseif ($app->getCfg('sitename_pagetitles', 0) == 2) { $title = JText::sprintf('JPAGETITLE', $title, $app->getCfg('sitename')); } $this->document->setTitle($title); if ($layout = $this->params->get('article_layout')) { $this->setLayout($layout); } // Configure the document meta-description. if (!empty($this->explained)) { $explained = $this->escape(html_entity_decode(strip_tags($this->explained), ENT_QUOTES, 'UTF-8')); $this->document->setDescription($explained); } // Configure the document meta-keywords. if (!empty($query->highlight)) { $this->document->setMetadata('keywords', implode(', ', $query->highlight)); } if ($this->params->get('robots')) { $this->document->setMetadata('robots', $this->params->get('robots')); } // Add feed link to the document head. if ($this->params->get('show_feed_link', 1) == 1) { // Add the RSS link. $props = array('type' => 'application/rss+xml', 'title' => 'RSS 2.0'); $route = JRoute::_($this->query->toURI() . '&format=feed&type=rss'); $this->document->addHeadLink($route, 'alternate', 'rel', $props); // Add the ATOM link. $props = array('type' => 'application/atom+xml', 'title' => 'Atom 1.0'); $route = JRoute::_($this->query->toURI() . '&format=feed&type=atom'); $this->document->addHeadLink($route, 'alternate', 'rel', $props); } } } views/search/tmpl/default_form.php000066600000007152150773113710013320 0ustar00 views/search/tmpl/default.php000066600000002202150773113710012264 0ustar00
params->get('show_page_heading')) : ?>

escape($this->params->get('page_heading'))) : ?> escape($this->params->get('page_heading')); ?> escape($this->params->get('page_title')); ?>

params->get('show_search_form', 1)) : ?>
loadTemplate('form'); ?>
query->search === true): ?>
loadTemplate('results'); ?>
views/search/tmpl/default.xml000066600000014770150773113710012312 0ustar00
views/search/tmpl/index.html000066600000000036150773113710012127 0ustar00views/search/tmpl/default_results.php000066600000005565150773113710014064 0ustar00query->highlight) && $this->params->get('highlight_terms', 1)) { JHtml::_('behavior.highlighter', $this->query->highlight); } // Get the application object. $app = JFactory::getApplication(); // Display the suggested search if it is different from the current search. if (($this->suggested && $this->params->get('show_suggested_query', 1)) || ($this->explained && $this->params->get('show_explained_query', 1))): ?>
suggested && $this->params->get('show_suggested_query', 1)) { // Replace the base query string with the suggested query string. $uri = JUri::getInstance($this->query->toURI()); $uri->setVar('q', $this->suggested); // Compile the suggested query link. $link = '' . $this->escape($this->suggested) . ''; echo JText::sprintf('COM_FINDER_SEARCH_SIMILAR', $link); } // Display the explained search query. elseif ($this->explained && $this->params->get('show_explained_query', 1)) { echo $this->explained; } ?>
total == 0): ?>

getLanguageFilter()) : ?>

escape($this->query->input)); ?>

escape($this->query->input)); ?>

pagination->get('limitstart') + 1; $total = (int) $this->pagination->get('total'); $limit = (int) $this->pagination->get('limit') * $this->pagination->pagesTotal; $limit = (int) ($limit > $total ? $total : $limit); $pages = JText::sprintf('COM_FINDER_SEARCH_RESULTS_OF', $start, $limit, $total); ?>

result->mime) ? 'mime-' . $this->result->mime : null; // Get the base url. $base = JUri::getInstance()->toString(array('scheme', 'host', 'port')); // Get the route with highlighting information. if (!empty($this->query->highlight) && empty($this->result->mime) && $this->params->get('highlight_terms', 1) && JPluginHelper::isEnabled('system', 'highlight')) { $route = $this->result->route . '&highlight=' . base64_encode(json_encode($this->query->highlight)); } else { $route = $this->result->route; } ?>
  • result->title; ?>

    params->get('show_description', 1)) : ?>

    result->description, $this->params->get('description_length', 255)); ?>

    params->get('show_url', 1)) : ?>
    result->route); ?>
  • views/search/metadata.xml000066600000000272150773113710011462 0ustar00 views/search/index.html000066600000000036150773113710011153 0ustar00views/search/view.opensearch.php000066600000002614150773113710012773 0ustar00setShortName($params->get('opensearch_name', $app->getCfg('sitename'))); $doc->setDescription($params->get('opensearch_description', $app->getCfg('MetaDesc'))); // Add the URL for the search $searchUri = JUri::base() . 'index.php?option=com_finder&q={searchTerms}'; // Find the menu item for the search $menu = $app->getMenu(); $items = $menu->getItems('link', 'index.php?option=com_finder&view=search'); if (isset($items[0])) { $searchUri .= '&Itemid=' . $items[0]->id; } $htmlSearch = new JOpenSearchUrl; $htmlSearch->template = JRoute::_($searchUri); $doc->addUrl($htmlSearch); } } views/search/view.feed.php000066600000005155150773113710011552 0ustar00input->set('limit', $app->getCfg('feed_limit')); // Get view data. $state = $this->get('State'); $params = $state->get('params'); $query = $this->get('Query'); $results = $this->get('Results'); // Push out the query data. JHtml::addIncludePath(JPATH_COMPONENT . '/helpers/html'); $explained = JHtml::_('query.explained', $query); // Set the document title. $title = $params->get('page_title', ''); if (empty($title)) { $title = $app->getCfg('sitename'); } elseif ($app->getCfg('sitename_pagetitles', 0) == 1) { $title = JText::sprintf('JPAGETITLE', $app->getCfg('sitename'), $title); } elseif ($app->getCfg('sitename_pagetitles', 0) == 2) { $title = JText::sprintf('JPAGETITLE', $title, $app->getCfg('sitename')); } $this->document->setTitle($title); // Configure the document description. if (!empty($explained)) { $this->document->setDescription(html_entity_decode(strip_tags($explained), ENT_QUOTES, 'UTF-8')); } // Set the document link. $this->document->link = JRoute::_($query->toURI()); // If we don't have any results, we are done. if (empty($results)) { return; } // Convert the results to feed entries. foreach ($results as $result) { // Convert the result to a feed entry. $item = new JFeedItem; $item->title = $result->title; $item->link = JRoute::_($result->route); $item->description = $result->description; $item->date = (int) $result->start_date ? JHtml::date($result->start_date, 'l d F Y') : $result->indexdate; // Get the taxonomy data. $taxonomy = $result->getTaxonomy(); // Add the category to the feed if available. if (isset($taxonomy['Category'])) { $node = array_pop($taxonomy['Category']); $item->category = $node->title; } // Loads item info into RSS array $this->document->addItem($item); } } } index.html000066600000000036150773113710006551 0ustar00finder.php000066600000000725150773113710006541 0ustar00execute(JFactory::getApplication()->input->get('task')); $controller->redirect(); controller.php000066600000003063150773113710007453 0ustar00input; $cachable = true; // Load plug-in language files. FinderHelperLanguage::loadPluginLanguage(); // Set the default view name and format from the Request. $viewName = $input->get('view', 'search', 'word'); $input->set('view', $viewName); // Don't cache view for search queries if ($input->get('q') || $input->get('f') || $input->get('t')) { $cachable = false; } $safeurlparams = array( 'f' => 'INT', 'lang' => 'CMD' ); return parent::display($cachable, $safeurlparams); } } controllers/index.html000066600000000036150773113710011117 0ustar00controllers/suggestions.json.php000066600000002476150773113710013167 0ustar00get('show_autosuggest', 1)) { // Get the suggestions. $model = $this->getModel('Suggestions', 'FinderModel'); $return = $model->getItems(); } // Check the data. if (empty($return)) { $return = array(); } // Use the correct json mime-type header('Content-Type: application/json'); // Send the response. echo json_encode($return); JFactory::getApplication()->close(); } } helpers/html/index.html000066600000000036150773113710011157 0ustar00helpers/html/query.php000066600000010561150773113710011044 0ustar00included as $token) { if ($token->required && (!isset($token->derived) || $token->derived == false)) { $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_REQUIRED', $token->term) . ''; } } // Process the optional tokens. foreach ($query->included as $token) { if (!$token->required && (!isset($token->derived) || $token->derived == false)) { $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_OPTIONAL', $token->term) . ''; } } // Process the excluded tokens. foreach ($query->excluded as $token) { if (!isset($token->derived) || $token->derived == false) { $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TOKEN_EXCLUDED', $token->term) . ''; } } // Process the start date. if ($query->date1) { $date = JFactory::getDate($query->date1)->format(JText::_('DATE_FORMAT_LC')); $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_START_DATE', $query->when1, $date) . ''; } // Process the end date. if ($query->date2) { $date = JFactory::getDate($query->date2)->format(JText::_('DATE_FORMAT_LC')); $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_END_DATE', $query->when2, $date) . ''; } // Process the taxonomy filters. if (!empty($query->filters)) { // Get the filters in the request. $t = JFactory::getApplication()->input->request->get('t', array(), 'array'); // Process the taxonomy branches. foreach ($query->filters as $branch => $nodes) { // Process the taxonomy nodes. $lang = JFactory::getLanguage(); foreach ($nodes as $title => $id) { // Translate the title for Types $key = FinderHelperLanguage::branchPlural($title); if ($lang->hasKey($key)) { $title = JText::_($key); } // Don't include the node if it is not in the request. if (!in_array($id, $t)) { continue; } // Add the node to the explanation. $parts[] = '' . JText::sprintf('COM_FINDER_QUERY_TAXONOMY_NODE', $title, JText::_(FinderHelperLanguage::branchSingular($branch))) . ''; } } } // Build the interpreted query. return count($parts) ? JText::sprintf('COM_FINDER_QUERY_TOKEN_INTERPRETED', implode(JText::_('COM_FINDER_QUERY_TOKEN_GLUE'), $parts)) : null; } /** * Method to get the suggested search query. * * @param FinderIndexerQuery $query A FinderIndexerQuery object. * * @return mixed String if there is a suggestion, false otherwise. * * @since 2.5 */ public static function suggested(FinderIndexerQuery $query) { $suggested = false; // Check if the query input is empty. if (empty($query->input)) { return $suggested; } // Check if there were any ignored or included keywords. if (count($query->ignored) || count($query->included)) { $suggested = $query->input; // Replace the ignored keyword suggestions. foreach (array_reverse($query->ignored) as $token) { if (isset($token->suggestion)) { $suggested = str_ireplace($token->term, $token->suggestion, $suggested); } } // Replace the included keyword suggestions. foreach (array_reverse($query->included) as $token) { if (isset($token->suggestion)) { $suggested = str_ireplace($token->term, $token->suggestion, $suggested); } } // Check if we made any changes. if ($suggested == $query->input) { $suggested = false; } } return $suggested; } } helpers/html/filter.php000066600000034730150773113710011170 0ustar00getQuery(true); $user = JFactory::getUser(); $groups = implode(',', $user->getAuthorisedViewLevels()); $html = ''; $filter = null; // Get the configuration options. $filterId = array_key_exists('filter_id', $options) ? $options['filter_id'] : null; $activeNodes = array_key_exists('selected_nodes', $options) ? $options['selected_nodes'] : array(); $classSuffix = array_key_exists('class_suffix', $options) ? $options['class_suffix'] : ''; $loadMedia = array_key_exists('load_media', $options) ? $options['load_media'] : true; // Load the predefined filter if specified. if (!empty($filterId)) { $query->select('f.data, f.params') ->from($db->quoteName('#__finder_filters') . ' AS f') ->where('f.filter_id = ' . (int) $filterId); // Load the filter data. $db->setQuery($query); try { $filter = $db->loadObject(); } catch (RuntimeException $e) { return null; } // Initialize the filter parameters. if ($filter) { $registry = new JRegistry; $registry->loadString($filter->params); $filter->params = $registry; } } // Build the query to get the branch data and the number of child nodes. $query->clear() ->select('t.*, count(c.id) AS children') ->from($db->quoteName('#__finder_taxonomy') . ' AS t') ->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS c ON c.parent_id = t.id') ->where('t.parent_id = 1') ->where('t.state = 1') ->where('t.access IN (' . $groups . ')') ->where('c.state = 1') ->where('c.access IN (' . $groups . ')') ->group('t.id, t.parent_id, t.state, t.access, t.ordering, t.title, c.parent_id') ->order('t.ordering, t.title'); // Limit the branch children to a predefined filter. if ($filter) { $query->where('c.id IN(' . $filter->data . ')'); } // Load the branches. $db->setQuery($query); try { $branches = $db->loadObjectList('id'); } catch (RuntimeException $e) { return null; } // Check that we have at least one branch. if (count($branches) === 0) { return null; } // Load the CSS/JS resources. if ($loadMedia) { JHtml::_('stylesheet', 'com_finder/sliderfilter.css', false, true, false); JHtml::_('script', 'com_finder/sliderfilter.js', false, true); } // Load plug-in language files. FinderHelperLanguage::loadPluginLanguage(); // Start the widget. $html .= '
    '; $html .= '
    '; $html .= '
    '; $html .= ''; $html .= '
    '; $html .= '
    '; // Iterate through the branches to build the branch selector. foreach ($branches as $bk => $bv) { // If the multi-lang plug-in is enabled then drop the language branch. if ($bv->title == 'Language' && JLanguageMultilang::isEnabled()) { continue; } $html .= ''; } $html .= '
    '; $html .= '
    '; $html .= '
    '; // Iterate through the branches and build the branch groups. foreach ($branches as $bk => $bv) { // If the multi-lang plug-in is enabled then drop the language branch. if ($bv->title == 'Language' && JLanguageMultilang::isEnabled()) { continue; } // Build the query to get the child nodes for this branch. $query->clear() ->select('t.*') ->from($db->quoteName('#__finder_taxonomy') . ' AS t') ->where('t.parent_id = ' . (int) $bk) ->where('t.state = 1') ->where('t.access IN (' . $groups . ')') ->order('t.ordering, t.title'); // Load the branches. $db->setQuery($query); try { $nodes = $db->loadObjectList('id'); } catch (RuntimeException $e) { return null; } // Translate node titles if possible. $lang = JFactory::getLanguage(); foreach ($nodes as $nk => $nv) { $key = FinderHelperLanguage::branchPlural($nv->title); if ($lang->hasKey($key)) { $nodes[$nk]->title = JText::_($key); } } // Start the group. $html .= '
    '; $html .= '
    '; $html .= ''; $html .= '
    '; $html .= '
    '; // Populate the group with nodes. foreach ($nodes as $nk => $nv) { // Determine if the node should be checked. $checked = in_array($nk, $activeNodes) ? ' checked="checked"' : ''; // Build a node. $html .= ''; } // Close the group. $html .= '
    '; $html .= '
    '; } // Close the widget. $html .= '
    '; $html .= '
    '; $html .= '
    '; return $html; } /** * Method to generate filters using select box drop down controls. * * @param FinderIndexerQuery $idxQuery A FinderIndexerQuery object. * @param array $options An array of options. * * @return mixed A rendered HTML widget on success, null otherwise. * * @since 2.5 */ public static function select($idxQuery, $options) { $user = JFactory::getUser(); $groups = implode(',', $user->getAuthorisedViewLevels()); $filter = null; // Get the configuration options. $classSuffix = $options->get('class_suffix', null); $loadMedia = $options->get('load_media', true); $showDates = $options->get('show_date_filters', false); // Try to load the results from cache. $cache = JFactory::getCache('com_finder', ''); $cacheId = 'filter_select_' . serialize(array($idxQuery->filter, $options, $groups, JFactory::getLanguage()->getTag())); // Check the cached results. if (!($branches = $cache->get($cacheId))) { $db = JFactory::getDbo(); $query = $db->getQuery(true); // Load the predefined filter if specified. if (!empty($idxQuery->filter)) { $query->select('f.data, ' . $db->quoteName('f.params')) ->from($db->quoteName('#__finder_filters') . ' AS f') ->where('f.filter_id = ' . (int) $idxQuery->filter); // Load the filter data. $db->setQuery($query); try { $filter = $db->loadObject(); } catch (RuntimeException $e) { return null; } // Initialize the filter parameters. if ($filter) { $registry = new JRegistry; $registry->loadString($filter->params); $filter->params = $registry; } } // Build the query to get the branch data and the number of child nodes. $query->clear() ->select('t.*, count(c.id) AS children') ->from($db->quoteName('#__finder_taxonomy') . ' AS t') ->join('INNER', $db->quoteName('#__finder_taxonomy') . ' AS c ON c.parent_id = t.id') ->where('t.parent_id = 1') ->where('t.state = 1') ->where('t.access IN (' . $groups . ')') ->where('c.state = 1') ->where('c.access IN (' . $groups . ')') ->group($db->quoteName('t.id')) ->order('t.ordering, t.title'); // Limit the branch children to a predefined filter. if (!empty($filter->data)) { $query->where('c.id IN(' . $filter->data . ')'); } // Load the branches. $db->setQuery($query); try { $branches = $db->loadObjectList('id'); } catch (RuntimeException $e) { return null; } // Check that we have at least one branch. if (count($branches) === 0) { return null; } // Iterate through the branches and build the branch groups. foreach ($branches as $bk => $bv) { // If the multi-lang plug-in is enabled then drop the language branch. if ($bv->title == 'Language' && JLanguageMultilang::isEnabled()) { continue; } // Build the query to get the child nodes for this branch. $query->clear() ->select('t.*') ->from($db->quoteName('#__finder_taxonomy') . ' AS t') ->where('t.parent_id = ' . (int) $bk) ->where('t.state = 1') ->where('t.access IN (' . $groups . ')') ->order('t.ordering, t.title'); // Limit the nodes to a predefined filter. if (!empty($filter->data)) { $query->where('t.id IN(' . $filter->data . ')'); } // Load the branches. $db->setQuery($query); try { $branches[$bk]->nodes = $db->loadObjectList('id'); } catch (RuntimeException $e) { return null; } // Translate branch nodes if possible. $language = JFactory::getLanguage(); foreach ($branches[$bk]->nodes as $node_id => $node) { $key = FinderHelperLanguage::branchPlural($node->title); if ($language->hasKey($key)) { $branches[$bk]->nodes[$node_id]->title = JText::_($key); } } // Add the Search All option to the branch. array_unshift($branches[$bk]->nodes, array('id' => null, 'title' => JText::_('COM_FINDER_FILTER_SELECT_ALL_LABEL'))); } // Store the data in cache. $cache->store($branches, $cacheId); } $html = ''; // Add the dates if enabled. if ($showDates) { $html .= JHtml::_('filter.dates', $idxQuery, $options); } $html .= '
    '; // Iterate through all branches and build code. foreach ($branches as $bk => $bv) { // If the multi-lang plug-in is enabled then drop the language branch. if ($bv->title == 'Language' && JLanguageMultilang::isEnabled()) { continue; } $active = null; // Check if the branch is in the filter. if (array_key_exists($bv->title, $idxQuery->filters)) { // Get the request filters. $temp = JFactory::getApplication()->input->request->get('t', array(), 'array'); // Search for active nodes in the branch and get the active node. $active = array_intersect($temp, $idxQuery->filters[$bv->title]); $active = count($active) === 1 ? array_shift($active) : null; } $html .= '
    '; $html .= ''; $html .= '
    '; $html .= JHtml::_( 'select.genericlist', $branches[$bk]->nodes, 't[]', 'class="inputbox"', 'id', 'title', $active, 'tax-' . JFilterOutput::stringUrlSafe($bv->title) ); $html .= '
    '; $html .= '
    '; } // Close the widget. $html .= '
    '; // Load the CSS/JS resources. if ($loadMedia) { JHtml::stylesheet('com_finder/sliderfilter.css', false, true, false); } return $html; } /** * Method to generate fields for filtering dates * * @param FinderIndexerQuery $idxQuery A FinderIndexerQuery object. * @param array $options An array of options. * * @return mixed A rendered HTML widget on success, null otherwise. * * @since 2.5 */ public static function dates($idxQuery, $options) { $html = ''; // Get the configuration options. $classSuffix = $options->get('class_suffix', null); $loadMedia = $options->get('load_media', true); $showDates = $options->get('show_date_filters', false); if (!empty($showDates)) { // Build the date operators options. $operators = array(); $operators[] = JHtml::_('select.option', 'before', JText::_('COM_FINDER_FILTER_DATE_BEFORE')); $operators[] = JHtml::_('select.option', 'exact', JText::_('COM_FINDER_FILTER_DATE_EXACTLY')); $operators[] = JHtml::_('select.option', 'after', JText::_('COM_FINDER_FILTER_DATE_AFTER')); // Load the CSS/JS resources. if ($loadMedia) { JHtml::stylesheet('com_finder/dates.css', false, true, false); } // Open the widget. $html .= ''; } return $html; } } helpers/index.html000066600000000036150773113710010213 0ustar00helpers/route.php000066600000007135150773113710010074 0ustar00 'search', 'q' => $q, 'f' => $f); $item = self::getItemid($query); // Get the base route. $uri = clone(JUri::getInstance('index.php?option=com_finder&view=search')); // Add the pre-defined search filter if present. if ($f !== null) { $uri->setVar('f', $f); } // Add the search query string if present. if ($q !== null) { $uri->setVar('q', $q); } // Add the menu item id if present. if ($item !== null) { $uri->setVar('Itemid', $item); } return $uri->toString(array('path', 'query')); } /** * Method to get the route for an advanced search page. * * @param integer $f The search filter id. [optional] * @param string $q The search query string. [optional] * * @return string The advanced search route. * * @since 2.5 */ public static function getAdvancedRoute($f = null, $q = null) { // Get the menu item id. $query = array('view' => 'advanced', 'q' => $q, 'f' => $f); $item = self::getItemid($query); // Get the base route. $uri = clone(JUri::getInstance('index.php?option=com_finder&view=advanced')); // Add the pre-defined search filter if present. if ($q !== null) { $uri->setVar('f', $f); } // Add the search query string if present. if ($q !== null) { $uri->setVar('q', $q); } // Add the menu item id if present. if ($item !== null) { $uri->setVar('Itemid', $item); } return $uri->toString(array('path', 'query')); } /** * Method to get the most appropriate menu item for the route based on the * supplied query needles. * * @param array $query An array of URL parameters. * * @return mixed An integer on success, null otherwise. * * @since 2.5 */ public static function getItemid($query) { static $items, $active; // Get the menu items for com_finder. if (!$items || !$active) { $app = JFactory::getApplication('site'); $com = JComponentHelper::getComponent('com_finder'); $menu = $app->getMenu(); $active = $menu->getActive(); $items = $menu->getItems('component_id', $com->id); $items = is_array($items) ? $items : array(); } // Try to match the active view and filter. if ($active && @$active->query['view'] == @$query['view'] && @$active->query['f'] == @$query['f']) { return $active->id; } // Try to match the view, query, and filter. foreach ($items as $item) { if (@$item->query['view'] == @$query['view'] && @$item->query['q'] == @$query['q'] && @$item->query['f'] == @$query['f']) { return $item->id; } } // Try to match the view and filter. foreach ($items as $item) { if (@$item->query['view'] == @$query['view'] && @$item->query['f'] == @$query['f']) { return $item->id; } } // Try to match the view. foreach ($items as $item) { if (@$item->query['view'] == @$query['view']) { return $item->id; } } return null; } } models/suggestions.php000066600000006771150773113710011136 0ustar00 $v) { $items[$k] = $v->term; } return $items; } /** * Method to build a database query to load the list data. * * @return JDatabaseQuery A database query * * @since 2.5 */ protected function getListQuery() { // Create a new query object. $db = $this->getDbo(); $query = $db->getQuery(true); // Select required fields $query->select('t.term') ->from($db->quoteName('#__finder_terms') . ' AS t') ->where('t.term LIKE ' . $db->quote($db->escape($this->getState('input'), true) . '%')) ->where('t.common = 0') ->where('t.language IN (' . $db->quote($db->escape($this->getState('language'), true)) . ', ' . $db->quote('*') . ')') ->order('t.links DESC') ->order('t.weight DESC'); return $query; } /** * Method to get a store id based on model the configuration state. * * This is necessary because the model is used by the component and * different modules that might need different sets of data or different * ordering requirements. * * @param string $id An identifier string to generate the store id. [optional] * * @return string A store id. * * @since 2.5 */ protected function getStoreId($id = '') { // Add the search query state. $id .= ':' . $this->getState('input'); $id .= ':' . $this->getState('language'); // Add the list state. $id .= ':' . $this->getState('list.start'); $id .= ':' . $this->getState('list.limit'); return parent::getStoreId($id); } /** * Method to auto-populate the model state. Calling getState in this method will result in recursion. * * @param string $ordering An optional ordering field. * @param string $direction An optional direction (asc|desc). * * @return void * * @since 2.5 */ protected function populateState($ordering = null, $direction = null) { // Get the configuration options. $app = JFactory::getApplication(); $input = $app->input; $params = JComponentHelper::getParams('com_finder'); $user = JFactory::getUser(); // Get the query input. $this->setState('input', $input->request->get('q', '', 'string')); // Set the query language $lang = FinderIndexerHelper::getDefaultLanguage(); $lang = FinderIndexerHelper::getPrimaryLanguage($lang); $this->setState('language', $lang); // Load the list state. $this->setState('list.start', 0); $this->setState('list.limit', 10); // Load the parameters. $this->setState('params', $params); // Load the user state. $this->setState('user.id', (int) $user->get('id')); } } models/index.html000066600000000036150773113710010034 0ustar00models/search.php000066600000103440150773113710010020 0ustar00query->search)) { return null; } // Check if we should return results. if (empty($this->includedTerms) && (empty($this->query->filters) || !$this->query->empty)) { return null; } // Get the store id. $store = $this->getStoreId('getResults'); // Use the cached data if possible. if ($this->retrieve($store)) { return $this->retrieve($store); } // Get the row data. $items = $this->getResultsData(); // Check the data. if (empty($items)) { return null; } // Create the query to get the search results. $db = $this->getDbo(); $query = $db->getQuery(true) ->select($db->quoteName('link_id') . ', ' . $db->quoteName('object')) ->from($db->quoteName('#__finder_links')) ->where($db->quoteName('link_id') . ' IN (' . implode(',', array_keys($items)) . ')'); // Load the results from the database. $db->setQuery($query); $rows = $db->loadObjectList('link_id'); // Set up our results container. $results = $items; // Convert the rows to result objects. foreach ($rows as $rk => $row) { // Build the result object. $result = unserialize($row->object); $result->weight = $results[$rk]; $result->link_id = $rk; // Add the result back to the stack. $results[$rk] = $result; } // Switch to a non-associative array. $results = array_values($results); // Push the results into cache. $this->store($store, $results); // Return the results. return $this->retrieve($store); } /** * Method to get the total number of results. * * @return integer The total number of results. * * @since 2.5 * @throws Exception on database error. */ public function getTotal() { // Check if the search query is valid. if (empty($this->query->search)) { return null; } // Check if we should return results. if (empty($this->includedTerms) && (empty($this->query->filters) || !$this->query->empty)) { return null; } // Get the store id. $store = $this->getStoreId('getTotal'); // Use the cached data if possible. if ($this->retrieve($store)) { return $this->retrieve($store); } // Get the results total. $total = $this->getResultsTotal(); // Push the total into cache. $this->store($store, $total); // Return the total. return $this->retrieve($store); } /** * Method to get the query object. * * @return FinderIndexerQuery A query object. * * @since 2.5 */ public function getQuery() { // Return the query object. return $this->query; } /** * Method to build a database query to load the list data. * * @return JDatabaseQuery A database query. * * @since 2.5 */ protected function getListQuery() { // Get the store id. $store = $this->getStoreId('getListQuery'); // Use the cached data if possible. if ($this->retrieve($store, false)) { return clone($this->retrieve($store, false)); } // Set variables $user = JFactory::getUser(); $groups = implode(',', $user->getAuthorisedViewLevels()); // Create a new query object. $db = $this->getDbo(); $query = $db->getQuery(true) ->select('l.link_id') ->from($db->quoteName('#__finder_links') . ' AS l') ->where('l.access IN (' . $groups . ')') ->where('l.state = 1'); // Get the null date and the current date, minus seconds. $nullDate = $db->quote($db->getNullDate()); $nowDate = $db->quote(substr_replace(JFactory::getDate()->toSQL(), '00', -2)); // Add the publish up and publish down filters. $query->where('(l.publish_start_date = ' . $nullDate . ' OR l.publish_end_date <= ' . $nowDate . ')') ->where('(l.publish_end_date = ' . $nullDate . ' OR l.publish_end_date >= ' . $nowDate . ')'); /* * Add the taxonomy filters to the query. We have to join the taxonomy * map table for each group so that we can use AND clauses across * groups. Within each group there can be an array of values that will * use OR clauses. */ if (!empty($this->query->filters)) { // Convert the associative array to a numerically indexed array. $groups = array_values($this->query->filters); // Iterate through each taxonomy group and add the join and where. for ($i = 0, $c = count($groups); $i < $c; $i++) { // We use the offset because each join needs a unique alias. $query->join('INNER', $db->quoteName('#__finder_taxonomy_map') . ' AS t' . $i . ' ON t' . $i . '.link_id = l.link_id') ->where('t' . $i . '.node_id IN (' . implode(',', $groups[$i]) . ')'); } } // Add the start date filter to the query. if (!empty($this->query->date1)) { // Escape the date. $date1 = $db->quote($this->query->date1); // Add the appropriate WHERE condition. if ($this->query->when1 == 'before') { $query->where($db->quoteName('l.start_date') . ' <= ' . $date1); } elseif ($this->query->when1 == 'after') { $query->where($db->quoteName('l.start_date') . ' >= ' . $date1); } else { $query->where($db->quoteName('l.start_date') . ' = ' . $date1); } } // Add the end date filter to the query. if (!empty($this->query->date2)) { // Escape the date. $date2 = $db->quote($this->query->date2); // Add the appropriate WHERE condition. if ($this->query->when2 == 'before') { $query->where($db->quoteName('l.start_date') . ' <= ' . $date2); } elseif ($this->query->when2 == 'after') { $query->where($db->quoteName('l.start_date') . ' >= ' . $date2); } else { $query->where($db->quoteName('l.start_date') . ' = ' . $date2); } } // Filter by language if ($this->getState('filter.language')) { $query->where('l.language IN (' . $db->quote(JFactory::getLanguage()->getTag()) . ', ' . $db->quote('*') . ')'); } // Push the data into cache. $this->store($store, $query, false); // Return a copy of the query object. return clone($this->retrieve($store, false)); } /** * Method to get the total number of results for the search query. * * @return integer The results total. * * @since 2.5 * @throws Exception on database error. */ protected function getResultsTotal() { // Get the store id. $store = $this->getStoreId('getResultsTotal', false); // Use the cached data if possible. if ($this->retrieve($store)) { return $this->retrieve($store); } // Get the base query and add the ordering information. $base = $this->getListQuery(); $base->select('0 AS ordering'); // Get the maximum number of results. $limit = (int) $this->getState('match.limit'); /* * If there are no optional or required search terms in the query, * we can get the result total in one relatively simple database query. */ if (empty($this->includedTerms)) { // Adjust the query to join on the appropriate mapping table. $query = clone($base); $query->clear('select') ->select('COUNT(DISTINCT l.link_id)'); // Get the total from the database. $this->_db->setQuery($query); $total = $this->_db->loadResult(); // Push the total into cache. $this->store($store, min($total, $limit)); // Return the total. return $this->retrieve($store); } /* * If there are optional or required search terms in the query, the * process of getting the result total is more complicated. */ $start = 0; $items = array(); $sorted = array(); $maps = array(); $excluded = $this->getExcludedLinkIds(); /* * Iterate through the included search terms and group them by mapping * table suffix. This ensures that we never have to do more than 16 * queries to get a batch. This may seem like a lot but it is rarely * anywhere near 16 because of the improved mapping algorithm. */ foreach ($this->includedTerms as $token => $ids) { // Get the mapping table suffix. $suffix = JString::substr(md5(JString::substr($token, 0, 1)), 0, 1); // Initialize the mapping group. if (!array_key_exists($suffix, $maps)) { $maps[$suffix] = array(); } // Add the terms to the mapping group. $maps[$suffix] = array_merge($maps[$suffix], $ids); } /* * When the query contains search terms we need to find and process the * result total iteratively using a do-while loop. */ do { // Create a container for the fetched results. $results = array(); $more = false; /* * Iterate through the mapping groups and load the total from each * mapping table. */ foreach ($maps as $suffix => $ids) { // Create a storage key for this set. $setId = $this->getStoreId('getResultsTotal:' . serialize(array_values($ids)) . ':' . $start . ':' . $limit); // Use the cached data if possible. if ($this->retrieve($setId)) { $temp = $this->retrieve($setId); } // Load the data from the database. else { // Adjust the query to join on the appropriate mapping table. $query = clone($base); $query->join('INNER', '#__finder_links_terms' . $suffix . ' AS m ON m.link_id = l.link_id') ->where('m.term_id IN (' . implode(',', $ids) . ')'); // Load the results from the database. $this->_db->setQuery($query, $start, $limit); $temp = $this->_db->loadObjectList(); // Set the more flag to true if any of the sets equal the limit. $more = (count($temp) === $limit) ? true : false; // We loaded the data unkeyed but we need it to be keyed for later. $junk = $temp; $temp = array(); // Convert to an associative array. for ($i = 0, $c = count($junk); $i < $c; $i++) { $temp[$junk[$i]->link_id] = $junk[$i]; } // Store this set in cache. $this->store($setId, $temp); } // Merge the results. $results = array_merge($results, $temp); } // Check if there are any excluded terms to deal with. if (count($excluded)) { // Remove any results that match excluded terms. for ($i = 0, $c = count($results); $i < $c; $i++) { if (in_array($results[$i]->link_id, $excluded)) { unset($results[$i]); } } // Reset the array keys. $results = array_values($results); } // Iterate through the set to extract the unique items. for ($i = 0, $c = count($results); $i < $c; $i++) { if (!isset($sorted[$results[$i]->link_id])) { $sorted[$results[$i]->link_id] = $results[$i]->ordering; } } /* * If the query contains just optional search terms and we have * enough items for the page, we can stop here. */ if (empty($this->requiredTerms)) { // If we need more items and they're available, make another pass. if ($more && count($sorted) < $limit) { // Increment the batch starting point and continue. $start += $limit; continue; } // Push the total into cache. $this->store($store, min(count($sorted), $limit)); // Return the total. return $this->retrieve($store); } /* * The query contains required search terms so we have to iterate * over the items and remove any items that do not match all of the * required search terms. This is one of the most expensive steps * because a required token could theoretically eliminate all of * current terms which means we would have to loop through all of * the possibilities. */ foreach ($this->requiredTerms as $token => $required) { // Create a storage key for this set. $setId = $this->getStoreId('getResultsTotal:required:' . serialize(array_values($required)) . ':' . $start . ':' . $limit); // Use the cached data if possible. if ($this->retrieve($setId)) { $reqTemp = $this->retrieve($setId); } // Check if the token was matched. elseif (empty($required)) { return null; } // Load the data from the database. else { // Setup containers in case we have to make multiple passes. $reqStart = 0; $reqTemp = array(); do { // Get the map table suffix. $suffix = JString::substr(md5(JString::substr($token, 0, 1)), 0, 1); // Adjust the query to join on the appropriate mapping table. $query = clone($base); $query->join('INNER', '#__finder_links_terms' . $suffix . ' AS m ON m.link_id = l.link_id') ->where('m.term_id IN (' . implode(',', $required) . ')'); // Load the results from the database. $this->_db->setQuery($query, $reqStart, $limit); $temp = $this->_db->loadObjectList('link_id'); // Set the required token more flag to true if the set equal the limit. $reqMore = (count($temp) === $limit) ? true : false; // Merge the matching set for this token. $reqTemp = $reqTemp + $temp; // Increment the term offset. $reqStart += $limit; } while ($reqMore == true); // Store this set in cache. $this->store($setId, $reqTemp); } // Remove any items that do not match the required term. $sorted = array_intersect_key($sorted, $reqTemp); } // If we need more items and they're available, make another pass. if ($more && count($sorted) < $limit) { // Increment the batch starting point. $start += $limit; // Merge the found items. $items = $items + $sorted; continue; } // Otherwise, end the loop. { // Merge the found items. $items = $items + $sorted; $more = false; } // End do-while loop. } while ($more === true); // Set the total. $total = count($items); $total = min($total, $limit); // Push the total into cache. $this->store($store, $total); // Return the total. return $this->retrieve($store); } /** * Method to get the results for the search query. * * @return array An array of result data objects. * * @since 2.5 * @throws Exception on database error. */ protected function getResultsData() { // Get the store id. $store = $this->getStoreId('getResultsData', false); // Use the cached data if possible. if ($this->retrieve($store)) { return $this->retrieve($store); } // Get the result ordering and direction. $ordering = $this->getState('list.ordering', 'l.start_date'); $direction = $this->getState('list.direction', 'DESC'); // Get the base query and add the ordering information. $base = $this->getListQuery(); $base->select($this->_db->escape($ordering) . ' AS ordering'); $base->order($this->_db->escape($ordering) . ' ' . $this->_db->escape($direction)); /* * If there are no optional or required search terms in the query, we * can get the results in one relatively simple database query. */ if (empty($this->includedTerms)) { // Get the results from the database. $this->_db->setQuery($base, (int) $this->getState('list.start'), (int) $this->getState('list.limit')); $return = $this->_db->loadObjectList('link_id'); // Get a new store id because this data is page specific. $store = $this->getStoreId('getResultsData', true); // Push the results into cache. $this->store($store, $return); // Return the results. return $this->retrieve($store); } /* * If there are optional or required search terms in the query, the * process of getting the results is more complicated. */ $start = 0; $limit = (int) $this->getState('match.limit'); $items = array(); $sorted = array(); $maps = array(); $excluded = $this->getExcludedLinkIds(); /* * Iterate through the included search terms and group them by mapping * table suffix. This ensures that we never have to do more than 16 * queries to get a batch. This may seem like a lot but it is rarely * anywhere near 16 because of the improved mapping algorithm. */ foreach ($this->includedTerms as $token => $ids) { // Get the mapping table suffix. $suffix = JString::substr(md5(JString::substr($token, 0, 1)), 0, 1); // Initialize the mapping group. if (!array_key_exists($suffix, $maps)) { $maps[$suffix] = array(); } // Add the terms to the mapping group. $maps[$suffix] = array_merge($maps[$suffix], $ids); } /* * When the query contains search terms we need to find and process the * results iteratively using a do-while loop. */ do { // Create a container for the fetched results. $results = array(); $more = false; /* * Iterate through the mapping groups and load the results from each * mapping table. */ foreach ($maps as $suffix => $ids) { // Create a storage key for this set. $setId = $this->getStoreId('getResultsData:' . serialize(array_values($ids)) . ':' . $start . ':' . $limit); // Use the cached data if possible. if ($this->retrieve($setId)) { $temp = $this->retrieve($setId); } // Load the data from the database. else { // Adjust the query to join on the appropriate mapping table. $query = clone($base); $query->join('INNER', $this->_db->quoteName('#__finder_links_terms' . $suffix) . ' AS m ON m.link_id = l.link_id') ->where('m.term_id IN (' . implode(',', $ids) . ')'); // Load the results from the database. $this->_db->setQuery($query, $start, $limit); $temp = $this->_db->loadObjectList('link_id'); // Store this set in cache. $this->store($setId, $temp); // The data is keyed by link_id to ease caching, we don't need it till later. $temp = array_values($temp); } // Set the more flag to true if any of the sets equal the limit. $more = (count($temp) === $limit) ? true : false; // Merge the results. $results = array_merge($results, $temp); } // Check if there are any excluded terms to deal with. if (count($excluded)) { // Remove any results that match excluded terms. for ($i = 0, $c = count($results); $i < $c; $i++) { if (in_array($results[$i]->link_id, $excluded)) { unset($results[$i]); } } // Reset the array keys. $results = array_values($results); } /* * If we are ordering by relevance we have to add up the relevance * scores that are contained in the ordering field. */ if ($ordering === 'm.weight') { // Iterate through the set to extract the unique items. for ($i = 0, $c = count($results); $i < $c; $i++) { // Add the total weights for all included search terms. if (isset($sorted[$results[$i]->link_id])) { $sorted[$results[$i]->link_id] += (float) $results[$i]->ordering; } else { $sorted[$results[$i]->link_id] = (float) $results[$i]->ordering; } } } /* * If we are ordering by start date we have to add convert the * dates to unix timestamps. */ elseif ($ordering === 'l.start_date') { // Iterate through the set to extract the unique items. for ($i = 0, $c = count($results); $i < $c; $i++) { if (!isset($sorted[$results[$i]->link_id])) { $sorted[$results[$i]->link_id] = strtotime($results[$i]->ordering); } } } /* * If we are not ordering by relevance or date, we just have to add * the unique items to the set. */ else { // Iterate through the set to extract the unique items. for ($i = 0, $c = count($results); $i < $c; $i++) { if (!isset($sorted[$results[$i]->link_id])) { $sorted[$results[$i]->link_id] = $results[$i]->ordering; } } } // Sort the results. natcasesort($items); if ($direction === 'DESC') { $items = array_reverse($items, true); } /* * If the query contains just optional search terms and we have * enough items for the page, we can stop here. */ if (empty($this->requiredTerms)) { // If we need more items and they're available, make another pass. if ($more && count($sorted) < ($this->getState('list.start') + $this->getState('list.limit'))) { // Increment the batch starting point and continue. $start += $limit; continue; } // Push the results into cache. $this->store($store, $sorted); // Return the requested set. return array_slice($this->retrieve($store), (int) $this->getState('list.start'), (int) $this->getState('list.limit'), true); } /* * The query contains required search terms so we have to iterate * over the items and remove any items that do not match all of the * required search terms. This is one of the most expensive steps * because a required token could theoretically eliminate all of * current terms which means we would have to loop through all of * the possibilities. */ foreach ($this->requiredTerms as $token => $required) { // Create a storage key for this set. $setId = $this->getStoreId('getResultsData:required:' . serialize(array_values($required)) . ':' . $start . ':' . $limit); // Use the cached data if possible. if ($this->retrieve($setId)) { $reqTemp = $this->retrieve($setId); } // Check if the token was matched. elseif (empty($required)) { return null; } // Load the data from the database. else { // Setup containers in case we have to make multiple passes. $reqStart = 0; $reqTemp = array(); do { // Get the map table suffix. $suffix = JString::substr(md5(JString::substr($token, 0, 1)), 0, 1); // Adjust the query to join on the appropriate mapping table. $query = clone($base); $query->join('INNER', $this->_db->quoteName('#__finder_links_terms' . $suffix) . ' AS m ON m.link_id = l.link_id') ->where('m.term_id IN (' . implode(',', $required) . ')'); // Load the results from the database. $this->_db->setQuery($query, $reqStart, $limit); $temp = $this->_db->loadObjectList('link_id'); // Set the required token more flag to true if the set equal the limit. $reqMore = (count($temp) === $limit) ? true : false; // Merge the matching set for this token. $reqTemp = $reqTemp + $temp; // Increment the term offset. $reqStart += $limit; } while ($reqMore == true); // Store this set in cache. $this->store($setId, $reqTemp); } // Remove any items that do not match the required term. $sorted = array_intersect_key($sorted, $reqTemp); } // If we need more items and they're available, make another pass. if ($more && count($sorted) < ($this->getState('list.start') + $this->getState('list.limit'))) { // Increment the batch starting point. $start += $limit; // Merge the found items. $items = array_merge($items, $sorted); continue; } // Otherwise, end the loop. else { // Set the found items. $items = $sorted; $more = false; } // End do-while loop. } while ($more === true); // Push the results into cache. $this->store($store, $items); // Return the requested set. return array_slice($this->retrieve($store), (int) $this->getState('list.start'), (int) $this->getState('list.limit'), true); } /** * Method to get an array of link ids that match excluded terms. * * @return array An array of links ids. * * @since 2.5 * @throws Exception on database error. */ protected function getExcludedLinkIds() { // Check if the search query has excluded terms. if (empty($this->excludedTerms)) { return array(); } // Get the store id. $store = $this->getStoreId('getExcludedLinkIds', false); // Use the cached data if possible. if ($this->retrieve($store)) { return $this->retrieve($store); } // Initialize containers. $links = array(); $maps = array(); /* * Iterate through the excluded search terms and group them by mapping * table suffix. This ensures that we never have to do more than 16 * queries to get a batch. This may seem like a lot but it is rarely * anywhere near 16 because of the improved mapping algorithm. */ foreach ($this->excludedTerms as $token => $id) { // Get the mapping table suffix. $suffix = JString::substr(md5(JString::substr($token, 0, 1)), 0, 1); // Initialize the mapping group. if (!array_key_exists($suffix, $maps)) { $maps[$suffix] = array(); } // Add the terms to the mapping group. $maps[$suffix][] = (int) $id; } /* * Iterate through the mapping groups and load the excluded links ids * from each mapping table. */ // Create a new query object. $db = $this->getDbo(); $query = $db->getQuery(true); foreach ($maps as $suffix => $ids) { // Create the query to get the links ids. $query->clear() ->select('link_id') ->from($db->quoteName('#__finder_links_terms' . $suffix)) ->where($db->quoteName('term_id') . ' IN (' . implode(',', $ids) . ')') ->group($db->quoteName('link_id')); // Load the link ids from the database. $db->setQuery($query); $temp = $db->loadColumn(); // Merge the link ids. $links = array_merge($links, $temp); } // Sanitize the link ids. $links = array_unique($links); JArrayHelper::toInteger($links); // Push the link ids into cache. $this->store($store, $links); return $links; } /** * Method to get a subquery for filtering link ids mapped to specific * terms ids. * * @param array $terms An array of search term ids. * * @return JDatabaseQuery A database object. * * @since 2.5 */ protected function getTermsQuery($terms) { // Create the SQL query to get the matching link ids. // TODO: Impact of removing SQL_NO_CACHE? $db = $this->getDbo(); $query = $db->getQuery(true) ->select('SQL_NO_CACHE link_id') ->from('#__finder_links_terms') ->where('term_id IN (' . implode(',', $terms) . ')'); return $query; } /** * Method to get a store id based on model the configuration state. * * This is necessary because the model is used by the component and * different modules that might need different sets of data or different * ordering requirements. * * @param string $id An identifier string to generate the store id. [optional] * @param boolean $page True to store the data paged, false to store all data. [optional] * * @return string A store id. * * @since 2.5 */ protected function getStoreId($id = '', $page = true) { // Get the query object. $query = $this->getQuery(); // Add the search query state. $id .= ':' . $query->input; $id .= ':' . $query->language; $id .= ':' . $query->filter; $id .= ':' . serialize($query->filters); $id .= ':' . $query->date1; $id .= ':' . $query->date2; $id .= ':' . $query->when1; $id .= ':' . $query->when2; if ($page) { // Add the list state for page specific data. $id .= ':' . $this->getState('list.start'); $id .= ':' . $this->getState('list.limit'); $id .= ':' . $this->getState('list.ordering'); $id .= ':' . $this->getState('list.direction'); } return parent::getStoreId($id); } /** * Method to auto-populate the model state. Calling getState in this method will result in recursion. * * @param string $ordering An optional ordering field. [optional] * @param string $direction An optional direction. [optional] * * @return void * * @since 2.5 */ protected function populateState($ordering = null, $direction = null) { // Get the configuration options. $app = JFactory::getApplication(); $input = $app->input; $params = $app->getParams(); $user = JFactory::getUser(); $filter = JFilterInput::getInstance(); $this->setState('filter.language', JLanguageMultilang::isEnabled()); // Setup the stemmer. if ($params->get('stem', 1) && $params->get('stemmer', 'porter_en')) { FinderIndexerHelper::$stemmer = FinderIndexerStemmer::getInstance($params->get('stemmer', 'porter_en')); } $request = $input->request; $options = array(); // Get the query string. $options['input'] = !is_null($request->get('q')) ? $request->get('q', '', 'string') : $params->get('q'); $options['input'] = $filter->clean($options['input'], 'string'); // Get the empty query setting. $options['empty'] = $params->get('allow_empty_query', 0); // Get the query language. $options['language'] = !is_null($request->get('l')) ? $request->get('l', '', 'cmd') : $params->get('l'); $options['language'] = $filter->clean($options['language'], 'cmd'); // Get the static taxonomy filters. $options['filter'] = !is_null($request->get('f')) ? $request->get('f', '', 'int') : $params->get('f'); $options['filter'] = $filter->clean($options['filter'], 'int'); // Get the dynamic taxonomy filters. $options['filters'] = !is_null($request->get('t', '', 'array')) ? $request->get('t', '', 'array') : $params->get('t'); $options['filters'] = $filter->clean($options['filters'], 'array'); JArrayHelper::toInteger($options['filters']); // Get the start date and start date modifier filters. $options['date1'] = !is_null($request->get('d1')) ? $request->get('d1', '', 'string') : $params->get('d1'); $options['date1'] = $filter->clean($options['date1'], 'string'); $options['when1'] = !is_null($request->get('w1')) ? $request->get('w1', '', 'string') : $params->get('w1'); $options['when1'] = $filter->clean($options['when1'], 'string'); // Get the end date and end date modifier filters. $options['date2'] = !is_null($request->get('d2')) ? $request->get('d2', '', 'string') : $params->get('d2'); $options['date2'] = $filter->clean($options['date2'], 'string'); $options['when2'] = !is_null($request->get('w2')) ? $request->get('w2', '', 'string') : $params->get('w2'); $options['when2'] = $filter->clean($options['when2'], 'string'); // Load the query object. $this->query = new FinderIndexerQuery($options); // Load the query token data. $this->excludedTerms = $this->query->getExcludedTermIds(); $this->includedTerms = $this->query->getIncludedTermIds(); $this->requiredTerms = $this->query->getRequiredTermIds(); // Load the list state. $this->setState('list.start', $input->get('limitstart', 0, 'uint')); $this->setState('list.limit', $input->get('limit', $app->getCfg('list_limit', 20), 'uint')); // Load the sort ordering. $order = $params->get('sort_order', 'relevance'); switch ($order) { case 'date': $this->setState('list.ordering', 'l.start_date'); break; case 'price': $this->setState('list.ordering', 'l.list_price'); break; case ($order == 'relevance' && !empty($this->includedTerms)): $this->setState('list.ordering', 'm.weight'); break; default: $this->setState('list.ordering', 'l.link_id'); break; } // Load the sort direction. $dirn = $params->get('sort_direction', 'desc'); switch ($dirn) { case 'asc': $this->setState('list.direction', 'ASC'); break; default: case 'desc': $this->setState('list.direction', 'DESC'); break; } // Set the match limit. $this->setState('match.limit', 1000); // Load the parameters. $this->setState('params', $params); // Load the user state. $this->setState('user.id', (int) $user->get('id')); $this->setState('user.groups', $user->getAuthorisedViewLevels()); } /** * Method to retrieve data from cache. * * @param string $id The cache store id. * @param boolean $persistent Flag to enable the use of external cache. [optional] * * @return mixed The cached data if found, null otherwise. * * @since 2.5 */ protected function retrieve($id, $persistent = true) { $data = null; // Use the internal cache if possible. if (isset($this->cache[$id])) { return $this->cache[$id]; } // Use the external cache if data is persistent. if ($persistent) { $data = JFactory::getCache($this->context, 'output')->get($id); $data = $data ? unserialize($data) : null; } // Store the data in internal cache. if ($data) { $this->cache[$id] = $data; } return $data; } /** * Method to store data in cache. * * @param string $id The cache store id. * @param mixed $data The data to cache. * @param boolean $persistent Flag to enable the use of external cache. [optional] * * @return boolean True on success, false on failure. * * @since 2.5 */ protected function store($id, $data, $persistent = true) { // Store the data in internal cache. $this->cache[$id] = $data; // Store the data in external cache if data is persistent. if ($persistent) { return JFactory::getCache($this->context, 'output')->store(serialize($data), $id); } return true; } } submit-find.png000066600000011667150773314030007515 0ustar00PNG  IHDRA)jPDr EiCCPICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ5bKGD pHYs  tIME-+F*IDAThZ_H]̙5] XY ##DO·> o P. .B3B0|+)n̜]>,]ܙ=s$䤷t: u:Lc s01˲I1&~{I 2lۆ,p,1&IqyM{3[QHNepΡ( @QXEQ 2t]Ν;QYY)Ɩd!  H$t::ivv6&ğ%%%(++ܓeY0I΃!I8XZZBmm$MMMym}6[^^FUU4MeYPUn߈A>"`޽KR())q,wg(d2BkNKh.HB"ض Fʲ,BPuFBMY$0D4 mK0xAQp΅,88]C9GB4TUUرchiipu-77vD(k`6\ׅ,y$IPUy&Ѐr$I ޽{xP]]- -(p]|2|f0MS~<|idJpahh2 9B̞|mmmB(B&("N777DB8q+"n} 8uTVa6Lӄc߾}8s SLEA&9DQ=]ݻQ]]Qz 333>z{{9GGG \v سgrT+O>'"<iq;0`5<åKP[[usΉR`_J2Blt˲ +TWى:pىzdBbf?J0 ?T}ݨ CW;/V\x'N@EEtmF0\ԆK/Wí 4oHt#pB(/Whzh4MQ\/*&Z$$ , "LXiQ[ ߩa9G iuHUUJ: @qq1oaa555YvхhȒO}ICϢrwPZZ 㒢(MT4vh/˲#~ I> hllDQLOO#H uj E䶣i>rn 뺈FW;77x< J7C%ָYڵ t\ jIENDB`js/autocompleter.js000066600000037574150773314030010430 0ustar00var Observer = new Class({ Implements: [Options, Events], options: { periodical: false, delay: 1000 }, initialize: function (el, onFired, options) { this.element = document.id(el) || $document.id(el); this.addEvent('onFired', onFired); this.setOptions(options); this.bound = this.changed.bind(this); this.resume(); }, changed: function () { var value = this.element.get('value'); if ($equals(this.value, value)) return; this.clear(); this.value = value; this.timeout = this.onFired.delay(this.options.delay, this); }, setValue: function (value) { this.value = value; this.element.set('value', value); return this.clear(); }, onFired: function () { this.fireEvent('onFired', [this.value, this.element]); }, clear: function () { clearTimeout(this.timeout || null); return this; }, pause: function () { if (this.timer) clearTimeout(this.timer); else this.element.removeEvent('keyup', this.bound); return this.clear(); }, resume: function () { this.value = this.element.get('value'); if (this.options.periodical) this.timer = this.changed.periodical(this.options.periodical, this); else this.element.addEvent('keyup', this.bound); return this; } }); var $equals = function (obj1, obj2) { return (obj1 == obj2 || JSON.encode(obj1) == JSON.encode(obj2)); }; var Autocompleter = new Class({ Implements: [Options, Events], options: { minLength: 1, markQuery: true, width: 'inherit', maxChoices: 10, injectChoice: null, customChoices: null, emptyChoices: null, visibleChoices: true, className: 'autocompleter-choices', zIndex: 1000, delay: 400, observerOptions: {}, fxOptions: {}, autoSubmit: false, overflow: false, overflowMargin: 25, selectFirst: false, filter: null, filterCase: false, filterSubset: false, forceSelect: false, selectMode: true, choicesMatch: null, multiple: false, separator: ', ', separatorSplit: /\s*[,;]\s*/, autoTrim: false, allowDupes: false, cache: true, relative: false }, initialize: function (element, options) { this.element = document.id(element); this.setOptions(options); this.build(); this.observer = new Observer(this.element, this.prefetch.bind(this), Object.merge({}, { 'delay': this.options.delay }, this.options.observerOptions)); this.queryValue = null; if (this.options.filter) this.filter = this.options.filter.bind(this); var mode = this.options.selectMode; this.typeAhead = (mode == 'type-ahead'); this.selectMode = (mode === true) ? 'selection' : mode; this.cached = []; }, build: function () { if (document.id(this.options.customChoices)) { this.choices = this.options.customChoices; } else { this.choices = new Element('ul', { 'class': this.options.className, 'styles': { 'zIndex': this.options.zIndex } }).inject(document.body); this.relative = false; if (this.options.relative) { this.choices.inject(this.element, 'after'); this.relative = this.element.getOffsetParent(); } this.fix = new OverlayFix(this.choices); } if (!this.options.separator.test(this.options.separatorSplit)) { this.options.separatorSplit = this.options.separator; } this.fx = (!this.options.fxOptions) ? null : new Fx.Tween(this.choices, Object.merge({}, { 'property': 'opacity', 'link': 'cancel', 'duration': 200 }, this.options.fxOptions)).addEvent('onStart', Chain.prototype.clearChain).set(0); this.element.setProperty('autocomplete', 'off').addEvent((Browser.ie || Browser.safari || Browser.chrome) ? 'keydown' : 'keypress', this.onCommand.bind(this)).addEvent('click', this.onCommand.bind(this, [false])).addEvent('focus', this.toggleFocus.pass({ bind: this, arguments: true, delay: 100 })).addEvent('blur', this.toggleFocus.pass({ bind: this, arguments: false, delay: 100 })); }, destroy: function () { if (this.fix) this.fix.destroy(); this.choices = this.selected = this.choices.destroy(); }, toggleFocus: function (state) { this.focussed = state; if (!state) this.hideChoices(true); this.fireEvent((state) ? 'onFocus' : 'onBlur', [this.element]); }, onCommand: function (e) { if (!e && this.focussed) return this.prefetch(); if (e && e.key && !e.shift) { switch (e.key) { case 'enter': if (this.element.value != this.opted) return true; if (this.selected && this.visible) { this.choiceSelect(this.selected); return !!(this.options.autoSubmit); } break; case 'up': case 'down': if (!this.prefetch() && this.queryValue !== null) { var up = (e.key == 'up'); this.choiceOver((this.selected || this.choices)[(this.selected) ? ((up) ? 'getPrevious' : 'getNext') : ((up) ? 'getLast' : 'getFirst')](this.options.choicesMatch), true); } return false; case 'esc': case 'tab': this.hideChoices(true); break; } } return true; }, setSelection: function (finish) { var input = this.selected.inputValue, value = input; var start = this.queryValue.length, end = input.length; if (input.substr(0, start).toLowerCase() != this.queryValue.toLowerCase()) start = 0; if (this.options.multiple) { var split = this.options.separatorSplit; value = this.element.value; start += this.queryIndex; end += this.queryIndex; var old = value.substr(this.queryIndex).split(split, 1)[0]; value = value.substr(0, this.queryIndex) + input + value.substr(this.queryIndex + old.length); if (finish) { var tokens = value.split(this.options.separatorSplit).filter(function (entry) { return this.test(entry); }, /[^\s,]+/); if (!this.options.allowDupes) tokens = [].combine(tokens); var sep = this.options.separator; value = tokens.join(sep) + sep; end = value.length; } } this.observer.setValue(value); this.opted = value; if (finish || this.selectMode == 'pick') start = end; this.element.selectRange(start, end); this.fireEvent('onSelection', [this.element, this.selected, value, input]); }, showChoices: function () { var match = this.options.choicesMatch, first = this.choices.getFirst(match); this.selected = this.selectedValue = null; if (this.fix) { var pos = this.element.getCoordinates(this.relative), width = this.options.width || 'auto'; this.choices.setStyles({ 'left': pos.left, 'top': pos.bottom, 'width': (width === true || width == 'inherit') ? pos.width : width }); } if (!first) return; if (!this.visible) { this.visible = true; this.choices.setStyle('display', ''); if (this.fx) this.fx.start(1); this.fireEvent('onShow', [this.element, this.choices]); } if (this.options.selectFirst || this.typeAhead || first.inputValue == this.queryValue) this.choiceOver(first, this.typeAhead); var items = this.choices.getChildren(match), max = this.options.maxChoices; var styles = { 'overflowY': 'hidden', 'height': '' }; this.overflown = false; if (items.length > max) { var item = items[max - 1]; styles.overflowY = 'scroll'; styles.height = item.getCoordinates(this.choices).bottom; this.overflown = true; }; this.choices.setStyles(styles); this.fix.show(); if (this.options.visibleChoices) { var scroll = document.getScroll(), size = document.getSize(), coords = this.choices.getCoordinates(); if (coords.right > scroll.x + size.x) scroll.x = coords.right - size.x; if (coords.bottom > scroll.y + size.y) scroll.y = coords.bottom - size.y; window.scrollTo(Math.min(scroll.x, coords.left), Math.min(scroll.y, coords.top)); } }, // TODO: No $arguments in MT 1.3 hideChoices: function (clear) { if (clear) { var value = this.element.value; if (this.options.forceSelect) value = this.opted; if (this.options.autoTrim) { value = value.split(this.options.separatorSplit).filter($arguments(0)).join(this.options.separator); } this.observer.setValue(value); } if (!this.visible) return; this.visible = false; if (this.selected) this.selected.removeClass('autocompleter-selected'); this.observer.clear(); var hide = function () { this.choices.setStyle('display', 'none'); this.fix.hide(); }.bind(this); if (this.fx) this.fx.start(0).chain(hide); else hide(); this.fireEvent('onHide', [this.element, this.choices]); }, prefetch: function () { var value = this.element.value, query = value; if (this.options.multiple) { var split = this.options.separatorSplit; var values = value.split(split); var index = this.element.getSelectedRange().start; var toIndex = value.substr(0, index).split(split); var last = toIndex.length - 1; index -= toIndex[last].length; query = values[last]; } if (query.length < this.options.minLength) { this.hideChoices(); } else { if (query === this.queryValue || (this.visible && query == this.selectedValue)) { if (this.visible) return false; this.showChoices(); } else { this.queryValue = query; this.queryIndex = index; if (!this.fetchCached()) this.query(); } } return true; }, fetchCached: function () { return false; if (!this.options.cache || !this.cached || !this.cached.length || this.cached.length >= this.options.maxChoices || this.queryValue) return false; this.update(this.filter(this.cached)); return true; }, update: function (tokens) { this.choices.empty(); this.cached = tokens; var type = tokens && typeOf(tokens); if (!type || (type == 'array' && !tokens.length) || (type == 'hash' && !tokens.getLength())) { (this.options.emptyChoices || this.hideChoices).call(this); } else { if (this.options.maxChoices < tokens.length && !this.options.overflow) tokens.length = this.options.maxChoices; tokens.each(this.options.injectChoice || function (token) { var choice = new Element('li', { 'html': this.markQueryValue(token) }); choice.inputValue = token; this.addChoiceEvents(choice).inject(this.choices); }, this); this.showChoices(); } }, choiceOver: function (choice, selection) { if (!choice || choice == this.selected) return; if (this.selected) this.selected.removeClass('autocompleter-selected'); this.selected = choice.addClass('autocompleter-selected'); this.fireEvent('onSelect', [this.element, this.selected, selection]); if (!this.selectMode) this.opted = this.element.value; if (!selection) return; this.selectedValue = this.selected.inputValue; if (this.overflown) { var coords = this.selected.getCoordinates(this.choices), margin = this.options.overflowMargin, top = this.choices.scrollTop, height = this.choices.offsetHeight, bottom = top + height; if (coords.top - margin < top && top) this.choices.scrollTop = Math.max(coords.top - margin, 0); else if (coords.bottom + margin > bottom) this.choices.scrollTop = Math.min(coords.bottom - height + margin, bottom); } if (this.selectMode) this.setSelection(); }, choiceSelect: function (choice) { if (choice) this.choiceOver(choice); this.setSelection(true); this.queryValue = false; this.hideChoices(); }, filter: function (tokens) { return (tokens || this.tokens).filter(function (token) { return this.test(token); }, new RegExp(((this.options.filterSubset) ? '' : '^') + this.queryValue.escapeRegExp(), (this.options.filterCase) ? '' : 'i')); }, markQueryValue: function (str) { return (!this.options.markQuery || !this.queryValue) ? str : str.replace(new RegExp('(' + ((this.options.filterSubset) ? '' : '^') + this.queryValue.escapeRegExp() + ')', (this.options.filterCase) ? '' : 'i'), '$1'); }, addChoiceEvents: function (el) { return el.addEvents({ 'mouseover': this.choiceOver.bind(this, el), 'click': this.choiceSelect.bind(this, el) }); } }); var OverlayFix = new Class({ initialize: function (el) { if (Browser.ie) { this.element = document.id(el); this.relative = this.element.getOffsetParent(); this.fix = new Element('iframe', { 'frameborder': '0', 'scrolling': 'no', 'src': 'javascript:false;', 'styles': { 'position': 'absolute', 'border': 'none', 'display': 'none', 'filter': 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)' } }).inject(this.element, 'after'); } }, show: function () { if (this.fix) { var coords = this.element.getCoordinates(this.relative); delete coords.right; delete coords.bottom; this.fix.setStyles(Object.append(coords, { 'display': '', 'zIndex': (this.element.getStyle('zIndex') || 1) - 1 })); } return this; }, hide: function () { if (this.fix) this.fix.setStyle('display', 'none'); return this; }, destroy: function () { if (this.fix) this.fix = this.fix.destroy(); } }); Element.implement({ getSelectedRange: function () { if (!Browser.ie) return { start: this.selectionStart, end: this.selectionEnd }; var pos = { start: 0, end: 0 }; var range = this.getDocument().selection.createRange(); if (!range || range.parentElement() != this) return pos; var dup = range.duplicate(); if (this.type == 'text') { pos.start = 0 - dup.moveStart('character', -100000); pos.end = pos.start + range.text.length; } else { var value = this.value; var offset = value.length - value.match(/[\n\r]*$/)[0].length; dup.moveToElementText(this); dup.setEndPoint('StartToEnd', range); pos.end = offset - dup.text.length; dup.setEndPoint('StartToStart', range); pos.start = offset - dup.text.length; } return pos; }, selectRange: function (start, end) { if (Browser.ie) { var diff = this.value.substr(start, end - start).replace(/\r/g, '').length; start = this.value.substr(0, start).replace(/\r/g, '').length; var range = this.createTextRange(); range.collapse(true); range.moveEnd('character', start + diff); range.moveStart('character', start); range.select(); } else { this.focus(); this.setSelectionRange(start, end); } return this; } }); Autocompleter.Base = Autocompleter; Autocompleter.Request = new Class({ Extends: Autocompleter, options: { postData: {}, ajaxOptions: {}, postVar: 'value' }, query: function () { var data = this.options.postData.unlink || {}; data[this.options.postVar] = this.queryValue; var indicator = document.id(this.options.indicator); if (indicator) indicator.setStyle('display', ''); var cls = this.options.indicatorClass; if (cls) this.element.addClass(cls); this.fireEvent('onRequest', [this.element, this.request, data, this.queryValue]); this.request.send({ 'data': data }); }, queryResponse: function () { var indicator = document.id(this.options.indicator); if (indicator) indicator.setStyle('display', 'none'); var cls = this.options.indicatorClass; if (cls) this.element.removeClass(cls); return this.fireEvent('onComplete', [this.element, this.request]); } }); Autocompleter.Request.JSON = new Class({ Extends: Autocompleter.Request, initialize: function (el, url, options) { this.parent(el, options); this.request = new Request.JSON(Object.merge({}, { 'url': url, 'link': 'cancel' }, this.options.ajaxOptions)).addEvent('onComplete', this.queryResponse.bind(this)); }, queryResponse: function (response) { this.parent(); this.update(response); } }); Autocompleter.Request.HTML = new Class({ Extends: Autocompleter.Request, initialize: function (el, url, options) { this.parent(el, options); this.request = new Request.HTML(Object.merge({}, { 'url': url, 'link': 'cancel', 'update': this.choices }, this.options.ajaxOptions)).addEvent('onComplete', this.queryResponse.bind(this)); }, queryResponse: function (tree, elements) { this.parent(); if (!elements || !elements.length) { this.hideChoices(); } else { this.choices.getChildren(this.options.choicesMatch).each(this.options.injectChoice || function (choice) { var value = choice.innerHTML; choice.inputValue = value; this.addChoiceEvents(choice.set('html', this.markQueryValue(value))); }, this); this.showChoices(); } } }); Autocompleter.Ajax = { Base: Autocompleter.Request, Json: Autocompleter.Request.JSON, Xhtml: Autocompleter.Request.HTML }; js/index.html000066600000000036150773314030007163 0ustar00js/sliderfilter.js000066600000011461150773314030010220 0ustar00FinderFilter = new Class({ Extends: Fx.Elements, options: { onActive: Class.empty, onBackground: Class.empty, height: false, width: true, opacity: true, fixedHeight: false, fixedWidth: 220, wait: true }, initialize: function (togglers, elements, container, frame) { this.togglers = togglers || []; this.elements = elements || []; this.container = document.id(container); this.frame = document.id(frame); this.effects = {}; if (this.options.opacity) this.effects.opacity = 'fullOpacity'; if (this.options.width) this.effects.width = this.options.fixedWidth ? 'fullWidth' : 'offsetWidth'; this.container.setStyle('width', '230px'); this.addEvent('onActive', function (toggler, element) { element.set('styles', { 'border-top': '1px solid #ccc', 'border-right': '1px solid #ccc', 'border-bottom': '1px solid #ccc', 'overflow': 'auto' }); this.container.set('styles', { width: this.container.getStyle('width').toInt() + element.fullWidth }); coord = element.getCoordinates([this.frame]); scroller = new Fx.Scroll(frame); scroller.start(coord.top, coord.left); }); this.addEvent('onBackground', function () { el = this.elements[this.active]; el.getElements('input').each(function (n) { n.removeProperty('checked'); }); }); this.addEvent('onComplete', function () { el = this.elements[this.active]; if (!el.getStyle('width').toInt()) { this.container.set('styles', { 'width': this.container.getStyle('width').toInt() - el.fullWidth }); } this.active = null; }); for (var i = 0, l = this.togglers.length; i < l; i++) this.addSection(this.togglers[i], this.elements[i]); this.elements.each(function (el, i) { var cbs = el.getElements('input.selector').length; var cba = 0; el.getElements('input.selector').each(function (n) { if (n.getProperty('checked')) { this.togglers[i].setProperty('checked', 'checked'); cba += 1; } }, this); if (cbs > 0 && cbs === cba && el.getElement('input.branch-selector') != null) { el.getElement('input.branch-selector').setProperty('checked', 'checked'); } if (cba) { this.fireEvent('onActive', [this.togglers[i], el]); } else { for (var fx in this.effects) el.setStyle(fx, 0); } el.getElement('dt').getElement('input').addEvent('change', function (e) { if (e.target.getProperty('checked')) { el.getElements('div').each(function (div) { div.getElements('input').setProperty('checked', 'checked'); }); } else { el.getElements('div').each(function (div) { div.getElements('input').removeProperty('checked'); }); } }); }, this); }, addSection: function (toggler, element, pos) { toggler = document.id(toggler); element = document.id(element); var test = this.togglers.contains(toggler); var len = this.togglers.length; this.togglers.include(toggler); this.elements.include(element); if (len && (!test || pos)) { pos = Array.pick(pos, len - 1); toggler.inject(this.togglers[pos], 'before'); element.inject(toggler, 'after'); } else if (this.container && !test) { toggler.inject(this.container); element.inject(this.container); } var idx = this.togglers.indexOf(toggler); toggler.addEvent('click', this.toggle.bind(this, idx)); if (this.options.width) element.set('styles', { 'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none' }); element.fullOpacity = 1; if (this.options.fixedWidth) element.fullWidth = this.options.fixedWidth; if (this.options.fixedHeight) element.fullHeight = this.options.fixedHeight; element.set('styles', {'overflow': 'hidden'}); return this; }, toggle: function (index) { index = (typeOf(index) == 'element') ? this.elements.indexOf(index) : index; if (this.timer && this.options.wait) return this; this.active = index; var obj = {}; obj[index] = {}; var el = this.elements[index]; if (this.togglers[index].getProperty('checked')) { for (var fx in this.effects) obj[index][fx] = el[this.effects[fx]]; this.start(obj); this.fireEvent('onActive', [this.togglers[index], el]); } else { for (var fx in this.effects) obj[index][fx] = 0; this.start(obj); this.fireEvent('onBackground', [this.togglers[index], el]); } return this; } }); window.addEvent('domready', function () { Filter = new FinderFilter(document.getElements('input.toggler'), document.getElements('dl.checklist'), document.id('finder-filter-container'), document.id('finder-filter-window')); document.id('tax-select-all').addEvent('change', function () { if (document.id('tax-select-all').getProperty('checked')) { document.id('finder-filter-window').getElements('input').each(function (input) { if (input.getProperty('id') != 'tax-select-all') { input.removeProperty('checked'); } }); } }); }); js/indexer.js000066600000006144150773314030007170 0ustar00var FinderIndexer = function(){ var totalItems= null; var batchSize= null; var offset= null; var progress= null; var optimized= false; var pb; var $ = jQuery.noConflict(); var path = 'index.php?option=com_finder&tmpl=component&format=json'; var initialize = function () { offset = 0; progress = 0; pb = new Fx.ProgressBar(document.getElementById('finder-progress-container')); path = path + '&' + $('#finder-indexer-token').attr('name') + '=1'; getRequest('indexer.start'); }; var getRequest= function (task) { $.ajax({ type : "GET", url : path, data : 'task=' + task, dataType : 'json', success : handleResponse, error : handleFailure }); }; var handleResponse = function (json, resp) { try { if (json === null) { throw resp; } if (json.error) { throw json; } if (json.start) { totalItems = json.totalItems; } offset += json.batchOffset; updateProgress(json.header, json.message); if (offset < totalItems) { getRequest('indexer.batch'); } else if (!optimized) { optimized = true; getRequest('indexer.optimize'); } } catch (error) { if (pb) { $(pb.element).remove(); } try { if (json.error) { $('#finder-progress-header').text(json.header).addClass('finder-error'); $('#finder-progress-message').html(json.message).addClass('finder-error'); } } catch (ignore) { if (error === '') { error = Joomla.JText._('COM_FINDER_NO_ERROR_RETURNED'); } $('#finder-progress-header').text(Joomla.JText._('COM_FINDER_AN_ERROR_HAS_OCCURRED')).addClass('finder-error'); $('#finder-progress-message').html(error).addClass('finder-error'); } } return true; }; var handleFailure= function (xhr) { json = (typeof xhr == 'object' && xhr.responseText) ? xhr.responseText : null; json = json ? JSON.decode(json, true) : null; if (pb) { $(pb.element).remove(); }; if (json) { json = json.responseText != null ? Json.evaluate(json.responseText, true) : json; } var header = json ? json.header : Joomla.JText._('COM_FINDER_AN_ERROR_HAS_OCCURRED'); var message = json ? json.message : Joomla.JText._('COM_FINDER_MESSAGE_RETURNED') + '
    ' + json; $('#finder-progress-header').text(header).addClass('finder-error'); $('#finder-progress-message').html(message).addClass('finder-error'); }; var updateProgress = function (header, message) { progress = (offset / totalItems) * 100; $('#finder-progress-header').text(header); $('#finder-progress-message').html(message); if (pb && progress < 100) { pb.set(progress); } else if (pb) { $(pb.element).remove(); pb = false; } }; initialize(); }; jQuery(function ($) { Indexer = new FinderIndexer(); if (typeof window.parent.SqueezeBox == 'object') { $(window.parent.SqueezeBox).on('close', function () { window.parent.location.reload(true); }); } }); submit-find.jpg000066600000015250150773314030007501 0ustar00JFIFHHlExifMM*bj(1 r2~iHHGIMP 2.8.42013:08:21 14:30:27021001008'"*(22HHJFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222'" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?0U;^MXc$lqFϲM'X:Zo/W|ea}9 f7lukd<Ȯ#hfBQ*\\yM>K{w %?s϶=ER >mmDh hv 0*d*co|,u{ -ȥ "v6͢(http://ns.adobe.com/xap/1.0/ Adobe Photoshop CS6 (Windows) 2013-08-19T20:05:28+03:00 2013-08-19T20:25:36+03:00 2013-08-19T20:25:36+03:00 image/jpeg xmp.iid:7A497B5CF408E311BD28AC595322EEED xmp.did:108F4F5BED08E311BD28AC595322EEED xmp.iid:7A497B5CF408E311BD28AC595322EEED xmp.did:108F4F5BED08E311BD28AC595322EEED 3 sRGB IEC61966-2.1 XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC C      '8 @QU%>| UTu8/4$jMSLdTԓx<L 1 &xb{dy|u5kb6j lc5TĹt;ҥ(KZ4Lp"!A 1Qa0?!!cn`hʼ ,@ #8j7uɼs E"}<&MGB%sP0P||Fj鮚鮚_ $H$P?P? q!1QA a?9@1]6"gj +9e2ڠ *VЄ<_>nQљLs9cf#` Ѵ&S~Q R3V~3'bNĊRlѤғ'bObg-finder-form.png000066600000047726150773314030010077 0ustar00PNG  IHDR<H}A3 pHYs  6iCCPPhotoshop ICC profilexڭJP@ϋP+qpx((`Ƥ-E!֤Ji^^~[wQpP@q!ruaakn:|9 S n$+yӮ; |* Ln *@B0~A:i@<^/@) ()A|f|03}0utjI:RgS-eI<e:dr?&.bn:rjY{3ޏXz,ZA8T*xoazR+ـ뢭V/OZOb cHRMz%RX:oZNIDATxnٕg5~yU0fR"X;R=6~A2w:Ɗu_߿+޽{w~~wvև~x~~'oooOm~/s{{wggg777~?ϟ/..u\/ۗ{Nkor;_$c/3_?1! {8...m{||<ZGNŗպ^2wc~1՜p~p8777OOOOOO=r}Tsy <ظ&Ws'?ysss 8rKlvsssvv i`.$^_PWxyy9;;'?U̹Ge:Ͼf=WgDbSRړK -zU(T[ %I=l6>߾}>~ÇoxlRcg1e-pGE [Xkr-%W,Gķ{||Ǥ6ˊ(b8Qm4h0Y$!8Gs3܇&lz>gggju }o޼ٶM??}ݬ7O?ѿRRZPm>; o^0ZyJ>Y+$e+c)]=<<\^^+(scP[':o! K{bn%gBzC5Sʲ,u|?|-=}z1!I% Ǎzx&J3?wݬ~7o(, Tc(,s8Cs+M'̟X7`F6+FJۙ2vŅOѨlH'ҡ ؂mY~ŕ#ciB7N~Iw,pv;n3C7z6k6AžQN+Nܝ}[?܏o{/aîo#6w{0cyK\]]y|-Et#JwWzu jyzzwM8=~j}ѭ1$J蹽 M" h_{iIxHƎm?~/| u2=w:bWa LNoLN.t'ܣY5{Qb;??*ȡԞm+h2j]<&-]BLN)=>}$5 R3`iO?ٳacF@:%z޸iQ=r{.//?~8+-)4}S_!%i11I^H g/^k~6 FUQ`A?&n+uz||trM 2!0G'}ׅB~ tqqSoUc BRMvU֢<8}̗ʽx,43|g ֭"Is- aM/SN\H/>Ã=Z~W##򢽪-AK6eFE&Jzp8I-6J4Ì^3elT3NhAlmXx Mؘ. hI_zZ>* xřd`ÊNjZk4qzKvCyblhnl̊XgpT]Z-u$ZCG/ ;KLHRL0D*6p2x!\c1f`d cn%Ԙ(|Ã6N^Bğ^޿*++ƣziYm-CwjV z6sw Gױz9`-eև#}{p]vaKO6r'u,s mB7 _W_O}DÍ1㣱,n=\cM!vxIk]wa>ۺu jC_Ǣ:F\)h,17e$h_ XD <^t|eB:ncQ%xtԄP#[uɶ\|VhkCwlɻpR۠`|K|SVg}Z"MMn+AO1RɭUC8s5 -FSAp[Jw^G@1_`D~:o~jxtfS\Dx8b~x8xAʜGF1_z $v1 e>MX:$CdX=p30;zڐ~z9>ԉbb -JYx, 8aթJQ[+beSZr~chر{=S[4m !Ō*B{G U"5Ѱ(bxOM1CPVy{ %ܯ_8!:zŅS>qF̐Qg9{[V!wyq[nt:/\ Lo)Qau a+Չ|&6e$, Ao a6wa8N"McUhVpCdOkWqGM2"<E!9h$T0QIr0HXI'P˱m=ȶ~mJ-ki(>DQ<>1^de7EΟJ+\ΫyIg,$(sf?48RABF>9PL t]"9M;AA۾-cq9hLk#ߨV63}L¨.F^v}}mh40#R;;;SL(,,0va22 پqS^zEy)R:q>YJo73֧+#ೈ3VWnT^.{m}|Fcgcv\Q5#BH C0O7j"tNK ?n (q}<ǂfLZs,ƳG!c*y:VWq*dzS7GP,7v6l__UpV)d _NQƭ҄#Elc(rC܆ζd(KbdS*$N.`!3[xm'>fUz*ydgXc;* X81Sz:ג0p ڗ}ݝ'rZ1; O SJƲ 6n2|#!>}ur 'Qqb'70eǚi怀?pUtرuo$4 r:1ћT-eG**Qe7]`'sbTѡJoQ8:7Fxt'x3ƅXť-*S31C@8NE^GCФFs uݻ@S rn :G;M<8-T daVu, D4 cS&&&Cxbf0^xcqd.G?J`>#ģb"&1W3h'<-L{TJg(ZԆӐPrM6ѣUL6@&sv+GU*z++ l}?œV:/juCKZI8b $_ae1LD ]il7殸* ,yDQ>EEBivl=rjxe6]n%b=ߢmw5+4 \lYQn.'MϝeQbXfwӢ&w媂{ 3G(.#(!MǜC%kbZ @#=<*` [>rph?ƔĜ?: ><<dMLe__VX7by2x kTY#!E9#XU큷C 2h5hR(P<гg0QpZt͕M=Ɗ;l!#n R&)QF3Fz&|_"BaTD ߘmMtIz}}"(f-3?ڂ;>:b." Z,QGǎ\6cos-a0piZGjdV-Qe GQ"y"kTrQ˚PCKT )rCƊE:FXT($J.snS]4.v'77<ĵYʳ 1T10TR&0'OazN;ޑՅ;b̌h[w4$TxN#Ve03;z6jLv:tf]x'L7gos9u)&1/щz4Oﮰ: 1v׎@hw4VPl1DމtKlHRR7o^"}GT aᎰ2I%б +yUAwm(à !yIf*|^X`-z4܎ WUuD4y<7t 3kۢqǢb˘5>_DK08|E XJ"[%KȈi5yD"j|veb1b{"iF 9((49$ODÒ$PZV5<xnGT%ǭbIx& ʘ3I.^c;LRY*+=RtJ!/7>Svpy[h(D.P4"Q*o<;M4ޱ #L=<<8 z6. uG\WD7]8qF%mƐixl+:nSRG5X@N% E']crbˡQ"cʾ wN* yPk3Z~#A/zi bƶM(:Uڥ!t+8]\L,G2n!^1P7~$+rb#Zak>tldvI aMqj&W,L`Ώ Fqةf8L^N=EI/OlLpxVv\YNh\{;V6H[PνٮY Zmf7.涷 cؘ EMj3il|馑L4x;c2Fe`I@޺L;ÿ#V[raOiR%hGk\}D.& LM SѰysӶY+Ui;{vun \U3m=,%{Y/%7qLo8"AߘFL[dqfU6yv{l&k6U5n*c6xq(K#W#/ Y;ykrkz-QgHsss2~\DmD_r5iX-|rg.J!@[2'{RwK%(Dy1死;N؎7h{#`;*_rwwV PdS47o׿.sZ{SшȶOPc֕2sT]֙րdVj}140Eي{BB nxVvi@57k@#b6zd VJ89DOzmhÖ@Ȼ0ょPkD dOƌlhs D1+I1d4! V{'LDYr|y$Wiܵ];vl5, ]Mi;&&pi?,µ[4 2(u ."Fu& $2nDm,]E;BK֒5 y #X)-VQwpJr-D&@LG:G"Xt$auʮ3.equ-H2`L44cv.w ,z^Mcgp m {1`p!mU.Ias;3pݓ9U2IT ގ;hh^aZv Jbc؜QaI!XjKO}EuF88%dKg*%&AZ|E[ŪH1 "-+J&kܒ7VT70`A޷ w{t!+f[IFX\]])E4LLT7Xq"91tА1 cDŽ># 35ҝAnm-{Ff'ܦZتtm Կr>2ⴆ2f[@{J"5Γgd>H|fTR.*kBӇA&Y>A(pXHJxV^hAeoA{jnߘ ʍb9T <])ξ)Y<`&ɑh®y{$~!" LDJhpúݑ ǛBޱ %#󸗣WGf. q<`YG)-l㌄rF! 3m:ߟ' 6]YV`U7МT^&V\XEO\6w=Ǹi?FheNw;C& G4{ RGK4YqcofЫ9^ &7dq[;&eS׺!ZUVxw] 0+$#'s#z1?RV$Kzl8# *!4o[{v`I݁A? _n`~8vXFF mEy–7R64ͱ5 a#j̤|+8g3v挮aM$؈S٧c"?Mn ;po~Rcs>xp_X}He@m=Ҫ3q"QǦbQVpb(g|u$g bVɔ66]RxUk;cdA+@?m2@F.,tB"Uؽm"NÇSaP}7 CRvJnVj'ZItEx8_ΔeJr/cۭ*:oSU,9kXӘ{:JJzV5b @GHTYFVnxN2Soh]7)g4Zv`0zfNٱ7,R{;ZCf^~W 9-f,mb>5Q<=D60;y2xHy֮ T`\q7Iu!uUJn55,m5FKĝڦ( ME1{Fwط 0#r¶~2yQ!+k[Q$ l*AHt]~7mE4dqѷgOGb [oM6Ft >u.FWiLG=Hz[# 7nC,Xo?ʜV0DP}=g6QK7ؼĶE)E8D 2&{oDp~ճ-(I sqS8 !I!ń ,njxؓa'M#EUlgAk uYGʎFft2uJ=$`A @"o%s>k:zch35=>>OVS,Oyؚ ?l4I!c.ne19B \q^cmL[eB&WnX39%bp`fF[HJ"}zJ~oKmI~:Vm>h)>vk\8wY"7bV=µS4rɵE`,ت4PF&i~@Yӕg+ftcQ /$1|3# s"`PCdE?#`3j2q4\**-} ݟ% zr%&.i\3 Y8D':Nb#q*;v@xhpF~F).jwY=SCFe1F u q3ZvCІ 0I rZ pcPzyLܪyNrD(t$U=oQL7POS7Qv@Aft|AZUE $>)0(c"zG@0 _$!%ݲi3%zOtێ8Rʼ!%ª6![0M0Aogv `;鲪f[t;:ƝFM4D>)M ^yD # n=3k >1Z%"hA۳[q[jyD'| see1[oG1㏞SW{؊iCAƌv,T 4;<҂B2u"4Q7kVI-ʣr=N1lX~x);: ,͖(<nscQ[& sĢHhʼnNJxKCl` (FЕs#skϿP\>jE)FOVhj:a菥h3;qw2n#I=?ͅ,<4?λdF93xj[4fcV: :.) 形ϧ=Q Ա όe(blIt|/ 5 J^GC'LϰwњƱu-һݳ2qX̤yF{X̔ft5+BWp[uC> Os; L3ggU3IXA+uNJ}#+(|\.qkFݭ(]}zt2bnfw՞xo)6ĸ(Տj bӴ+3n>.NH4@ݶc=6k@־c9zm4]\Le:kWF6vex&U 8Xо$1 wcfߕds'nhGo]"X z_pE]bxwj\򲣂Mjz Pݼ8dFB0fW>cP ::hv nQ[yczcovc)ѾxAZ_ 4Ǝ{<-)gbb,Ĉ1th,i74!T?Sc@؊)suuxhZʾ\ ;^o}^MK[G*~'}!ZX|xx5C%L_at!@|6=ڷzB4 'fR>Plb_ǔX?T)_/ u/ٙ{M##El:l<) =N|]r&\rغ'*(uA@^A#^+o]Y96NV%-Kr䈣2ީ).K*[>.l/ MBd?]G\!&;VCJ> 4Yjulώ#ᬇ5gWܳsmL]WuKcr>bQAOډ 4>\h޲PF- uPUf wZ9>RDɸJۭI|W2$/l00IRcqw/ `qX}v#Ob{] v;C!FFQ|Χ"D*m>:pn\9߭o,|J2F-NC`%VYYxeHL#/0eT[_ghwNMMjQ.QF)jЋ&a-d# mKg^ 5Rs8yhܬݻwIF fnCu)ǞC 2^{)<)lk}ytt@pS,uu "/Inؔ渉0&A$ a-U2c/Q~4G2&uH1T!<'AKrM27Z맢UĥF +l);Rdz{_\rL N1(௞Hgltr,( Th;Q4շ7Q! PcSJnW;KF Y΂Hˏ8&o0k_ "YMOk}G{oh ٛ09OigCѦAF?رPѝvo$#wcWJd7|ɧPH}l'S;H)6ϝ(a#`!4:V`. uw">x2_}Lq )xfxH' UOW?L/G#9ԋG(Lo7+;_BÈ+혝s ^v$Njb(#zm"IQ E(n`l&h"GcӎO}` +uۆ4۱h!Dz1X${K4ťH66vx'&RXyE:'Ekp]clE 7XEd9;iL)&SL1JMnIgtHܓv UYVo&V_%H!mL1"_ip&F=p.kYfrgt2`-X7+: ȔF7X&)t^;GީGji(3!BQHE8#ml޸>E#Xڍh!%q2L+]$,ht:i߫I\,ێ[KShH,okt:PyJ[1!ey1HL -E1qX۱il)Rgf>hKb*N^VAJn+ha,XH oA3?~dߩpx"Y} XuEJP. wa@WwGSwJ|7Yq%4~osYQh#n.M"uCTcT#U.%QogDzNET1o#jaߎ{7UːNgR,(t0Q>7r! o}PBl яݡVƜ9$IJ0n"&yO~;iNlhEEEg\Ksĩu{, ݲ  ]D oENc06жmq>"}DXȔoi؆6گn,kúgMU l$Y7235,a/uI7Is-{n_d=Q$g6v]ThnJZA#ur/&Zе^N(\茽[P}$E5;[0fB Di 3ƭ#W X/^t[)Cu ."67LZir|qQr:6Xux37e[c}s2GDuwwuT#]1;49ρ*<3@pO,3G lgԻ,UM|uu /1Y; S"~xܱf} tX!BPF|vr_1qP׎tOt_J-|le- Bsê};Nbeog#QY(ԕ͹sXI ZrWD]* @)Q̡wsDQOODG:'A`PfܗwH-[jܺC g]㎇ k$# ڔJmno;BM31P 8pGI@ybzQ>I}ҧEq 9"6HHmU$oў a)އ}J^S"݃KwǴ\[:J l-+y} +:8D3ZGIbwS[(Cv41fP9 cpJ]6W?ʊSAEIh,&ǒmjw'Fi*!7փ2_!!Tqv;JRʷvn}rwwwwwÇ9?Ï?6/[𱾞a92z[5d""XNϑJgV&[2!^ƦV`9BHG 7膭>/CcmqRn9/s$"u.3w⋀y2lsd/>#~ϑ:9mX ;WJ n Ʉr#m~zXEM;tf,dَ{=c.{oqLѶ "F4z"v]|?Ͽɉ?O///rKI1^>1v϶)zwq9}_`8+w|w]v+oџ/.T?M9:igaFv|2ݻw?3+\+~Z-^ۨsw^GV+MyRƿ^3]+!Ys񝓟_ _?/RNPi:_$O~8>(N/EJCFe|xok׼~`Z)ϨAC[R l\@(ԕ[Vc_^wR~|!術*ﵗZuUuzSK;HՆ;Bm_+k߉!TQ+?JwF5GRQ+REV{7ߔ֯>|ЪZgGQFV:Z<ͼRP:7ϰH?_s׿ 9W _釭5*Up:>i?ku GfIoiw~I7wVx"i⡫v><ꀝtPv۹0v3q[Q_$^iVSJj0o Ҿj'O>IY7/~IR6'e!kofFw~Oʔ}k~TN藸q'css/selectfilter.css000066600000000716150773314030010546 0ustar00#finder-filter-window { width:100%; padding:0; margin:10px 0 10px; overflow:auto; } #finder-filter-select-list { clear: left; list-style: none; padding:0; margin:0; overflow:auto; } #finder-filter-select-list li, #finder-filter-select-list li.filter-branch { list-style: none; padding:5px 10px 5px 0; margin:0; float: left; width:49%; background: none; text-align: left; } #finder-filter-select-list li label { display:block; clear:right; } css/sliderfilter.css000066600000001452150773314030010547 0ustar00#finder-filter-window { width: 100%; padding: 0; margin: 10px 0 10px; overflow: auto; } .checklist, #branch-selectors { border: 1px solid #ccc; height: 220px; overflow: auto; width: 220px; float: left; margin: 0; } #finder-filter-window dl { padding: 0; margin: 0; width: 220px; } .checklist { border-left-width: 0; } #filter_lists div { float: left; } .checklist dt, #branch-selectors dt { background-color: #F6F6F6; border-bottom: 1px solid #ccc; padding: 0 0 2px 2px; width: 100%; text-align: left; } .checklist, .checklist dd, #branch-selectors dd, .checklist div.control-group, #branch-selectors div.control-group { margin: 0; padding: 0 0 0 2px; width: 100%; text-align: left; } .checklist label:hover, #branch-selectors label:hover { background: #F6F6F6; color: #000; } css/indexer.css000066600000000321150773314030007507 0ustar00#finder-indexer-container { text-align: center; } #finder-progress-container { width: 350px; margin: 0 auto; } h1.finder-error { color: #FF0000; } p.finder-error { color: #FF0000; font-weight:bold; } css/finder.css000066600000005257150773314030007335 0ustar00#advanced-search { text-align:left; width:100%; padding:5px 0 15px; } #advanced-search-toggle { cursor:pointer; } #search-query-explained { padding:10px 0; } #search-query-explained span.term, #search-query-explained span.date, #search-query-explained span.when, #search-query-explained span.branch, #search-query-explained span.node, #search-query-explained span.op { font-weight:bold; } #search-query-explained span.op { text-transform:uppercase; } #search-results li.search-result .mime-pdf { padding-left:20px; background:url(../images/mime/pdf.png) no-repeat; } #search-results .search-pagination, #search-results .pagination, #search-results .search-pages-counter { clear:both; margin:0 auto; } #highlighter-start, #highlighter-end { display:none; height:0; opacity:0; } span.highlight { background-color:#FFFFCC; font-weight:bold; padding:0px 4px; border-radius: 10px; } .term{ color: #70B424; text-decoration: underline; font-style: italic; } ul.autocompleter-choices { position:absolute; margin:0; padding:0; list-style:none; border:1px solid #EEEEEE; background-color:white; border-right-color:#DDDDDD; border-bottom-color:#DDDDDD; text-align:left; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; z-index:50; } ul.autocompleter-choices li { background:none; position:relative; padding:0.1em 1.5em 0.1em 1em; cursor:pointer; font-weight:normal; font-size:1em; } ul.autocompleter-choices li.autocompleter-selected { background-color:#444; color:#fff; } ul.autocompleter-choices span.autocompleter-queried { font-weight:bold; } ul.autocompleter-choices li.autocompleter-selected span.autocompleter-queried { color:#9FCFFF; } ul#finder-filter-select-list { top: 4em !important; } #system .items .item p{ color: #70B424; } #finder-search fieldset { border: none; background:url(../bg-finder-form.png) 50% no-repeat transparent; } #finder-search fieldset div { float: left; } #finder-search fieldset legend { color: #fff; } #finder-search fieldset div label { font-size: 16px; padding-left: 50px; padding-right: 65px; } #finder-search fieldset div #q { width: 246px; height: 37px; border-radius: 3px; box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.506) inset; font-size: 16px; margin-right: 10px; border: medium none currentColor; padding-left: 10px } #finder-search fieldset div .button { font-size: 16px; height: 41px; width: 65px; background:url(../submit-find.png) 50% no-repeat transparent; color: rgba(0,0,0,0); border: medium none currentColor; border-radius: 5px; } #system .items { border-top: 2px ##70B424 solid; } /* #finder-search > p { font-size: 12px; text-align: center; border-bottom: 2px #70B424 solid; }*/