10Syaroslav@ivinco.com<?php
20Syaroslav@ivinco.com/**
312Syaroslav@ivinco.com * Script to search in dokuwiki documents
40Syaroslav@ivinco.com *
512Syaroslav@ivinco.com * @author Yaroslav Vorozhko <yaroslav@ivinco.com>
60Syaroslav@ivinco.com */
70Syaroslav@ivinco.com
80Syaroslav@ivinco.comif(!defined('DOKU_INC')) die();
90Syaroslav@ivinco.comif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
100Syaroslav@ivinco.com
116Syaroslav@ivinco.comrequire_once(DOKU_INC.'inc/parser/parser.php');
126Syaroslav@ivinco.com
130Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'action.php');
140Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/sphinxapi.php');
150Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/PageMapper.php');
160Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/SphinxSearch.php');
176Syaroslav@ivinco.comrequire_once(DOKU_PLUGIN . 'sphinxsearch/functions.php');
180Syaroslav@ivinco.com
190Syaroslav@ivinco.com
200Syaroslav@ivinco.comclass action_plugin_sphinxsearch extends DokuWiki_Action_Plugin {
2143Syaroslav@ivinco.com    var $_search = null;
220Syaroslav@ivinco.com
23110Syaroslav    var $_helpMessage = '';
24110Syaroslav    var $_versionNumber = '0.3.6';
25110Syaroslav
26110Syaroslav    /**
27110Syaroslav	* return some info
28110Syaroslav	*/
29110Syaroslav    function getInfo() {
30110Syaroslav        return confToHash(dirname(__FILE__).'/plugin.info.txt');
31110Syaroslav	}
32110Syaroslav
33110Syaroslav    function getHelpInfo(){
34110Syaroslav	$this->_helpMessage = "
3582Syaroslav@ivinco.com===== DokuWiki Sphinx Search plugin features=====
3682Syaroslav@ivinco.com
3785Syaroslav@ivinco.comTo use the search you need to just enter your search keywords into the searchbox at the top right corner of the DokuWiki. When basic simple search is not enough you can try using the methods listed below:
3882Syaroslav@ivinco.com
3982Syaroslav@ivinco.com=== Phrase search (\"\") ===
4082Syaroslav@ivinco.comPut double quotes around a set of words to enable phrase search mode. For example:
4182Syaroslav@ivinco.com<code>\"James Bond\"</code>
4282Syaroslav@ivinco.com
4382Syaroslav@ivinco.com=== Search within a namespace ===
4482Syaroslav@ivinco.comYou can add \"@ns\" parameter to limit the search to some namespace. For exapmle:
4582Syaroslav@ivinco.com<code>hotel @ns personal:mike:travel</code>
4682Syaroslav@ivinco.comSuch query will return only results from \"personal:mike:travel\" namespace for keyword \"hotel\".
4782Syaroslav@ivinco.com
4882Syaroslav@ivinco.com=== Excluding keywords or namespaces from search ===
4982Syaroslav@ivinco.comYou can add a minus sign to a keyword or a category name exclude it from search. For example:
5082Syaroslav@ivinco.com<code>hotel @ns -personal:mike</code>
5182Syaroslav@ivinco.comSuch query will look for \"hotel\" everywhere except the \"personal:mike\" namespace.
5282Syaroslav@ivinco.com<code>blog -post</code>
5382Syaroslav@ivinco.comSuch query will look for documents that have keyword \"blog\" but don't have keyword \"post\".
54115Syaroslav
55116Syaroslav
56*117Syaroslav===== =====
57115SyaroslavDokuWiki Sphinx Search plugin (version $this->_versionNumber) by [[http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/|Ivinco]].
5882Syaroslav@ivinco.com";
59111Syaroslav@ivinco.com	return $this->_helpMessage;
60110Syaroslav    }
610Syaroslav@ivinco.com
620Syaroslav@ivinco.com    /**
630Syaroslav@ivinco.com	* Register to the content display event to place the results under it.
640Syaroslav@ivinco.com	*/
650Syaroslav@ivinco.com    /**
660Syaroslav@ivinco.com     * register the eventhandlers
670Syaroslav@ivinco.com     */
680Syaroslav@ivinco.com    function register(&$controller){
6987Syaroslav@ivinco.com        $controller->register_hook('TPL_CONTENT_DISPLAY',   'BEFORE', $this, 'handle_act_unknown', array());
700Syaroslav@ivinco.com    }
710Syaroslav@ivinco.com
720Syaroslav@ivinco.com    /**
7397Syaroslav@ivinco.com     * If our own action was given we produce our content here
740Syaroslav@ivinco.com     */
750Syaroslav@ivinco.com    function handle_act_unknown(&$event, $param){
7627Syaroslav@ivinco.com        global $ACT;
7727Syaroslav@ivinco.com        global $QUERY;
7827Syaroslav@ivinco.com        if($ACT != 'search') return; // nothing to do for us
790Syaroslav@ivinco.com
800Syaroslav@ivinco.com        // we can handle it -> prevent others
810Syaroslav@ivinco.com        $event->stopPropagation();
820Syaroslav@ivinco.com        $event->preventDefault();
830Syaroslav@ivinco.com
8491Syaroslav@ivinco.com/*        if (!extension_loaded('sqlite')) {
8587Syaroslav@ivinco.com            echo "SQLite extension is not loaded!";
8687Syaroslav@ivinco.com            return;
8791Syaroslav@ivinco.com        }*/
8887Syaroslav@ivinco.com
8982Syaroslav@ivinco.com        if(!empty($_REQUEST['ssplugininfo'])){
9082Syaroslav@ivinco.com            $info = array();
91111Syaroslav@ivinco.com            echo p_render('xhtml',p_get_instructions($this->getHelpInfo()), $info);
9282Syaroslav@ivinco.com            return;
9382Syaroslav@ivinco.com        }
9427Syaroslav@ivinco.com
9543Syaroslav@ivinco.com        $this->_search($QUERY,$_REQUEST['start'],$_REQUEST['prev']);
960Syaroslav@ivinco.com    }
970Syaroslav@ivinco.com
980Syaroslav@ivinco.com    /**
990Syaroslav@ivinco.com     * do the search and displays the result
1000Syaroslav@ivinco.com     */
10143Syaroslav@ivinco.com    function _search($query, $start, $prev) {
10226Syaroslav@ivinco.com        global $conf;
1030Syaroslav@ivinco.com
1040Syaroslav@ivinco.com        $start = (int) $start;
10544Syaroslav@ivinco.com        if($start < 0){
10644Syaroslav@ivinco.com            $start = 0;
10744Syaroslav@ivinco.com        }
10844Syaroslav@ivinco.com        if(empty($prev)){
10944Syaroslav@ivinco.com            $prev = 0;
11044Syaroslav@ivinco.com        }
1110Syaroslav@ivinco.com
11263Syaroslav@ivinco.com        $categories = $this->_getCategories($query);
11367Syaroslav@ivinco.com        $keywords = $this->_getKeywords($query);
1140Syaroslav@ivinco.com
1150Syaroslav@ivinco.com        $search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index'));
11616Syaroslav@ivinco.com        $search->setSnippetSize($this->getConf('snippetsize'));
11731Syaroslav@ivinco.com        $search->setArroundWordsCount($this->getConf('aroundwords'));
11819Syaroslav@ivinco.com        $search->setTitlePriority($this->getConf('title_priority'));
11919Syaroslav@ivinco.com        $search->setBodyPriority($this->getConf('body_priority'));
12080Syaroslav@ivinco.com        $search->setNamespacePriority($this->getConf('namespace_priority'));
12180Syaroslav@ivinco.com        $search->setPagenamePriority($this->getConf('pagename_priority'));
12269Syaroslav@ivinco.com
12369Syaroslav@ivinco.com        if (!empty($keywords) && empty($categories)){
12469Syaroslav@ivinco.com            $search->setSearchAllQuery($keywords, $categories);
12579Syaroslav@ivinco.com        } elseif (!empty($keywords)) {
12679Syaroslav@ivinco.com            $search->setSearchAllQueryWithCategoryFilter($keywords, $categories);
12769Syaroslav@ivinco.com        } else {
12882Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br>
12982Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
13079Syaroslav@ivinco.com            return;
13169Syaroslav@ivinco.com        }
13269Syaroslav@ivinco.com        $result = $search->search($start, $this->getConf('maxresults'));
13343Syaroslav@ivinco.com        $this->_search = $search;
13428Syaroslav@ivinco.com
13588Syaroslav@ivinco.com        if ($search->getError()){
13689Syaroslav@ivinco.com            echo "Could not connect to Sphinx search engine.";
13728Syaroslav@ivinco.com            return;
13828Syaroslav@ivinco.com        }
13969Syaroslav@ivinco.com
14093Syaroslav@ivinco.com        if(!$result){
14193Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
14293Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
14393Syaroslav@ivinco.com            return;
14493Syaroslav@ivinco.com        }
14593Syaroslav@ivinco.com
14677Syaroslav@ivinco.com        $pagesList = $search->getPages($keywords);
1474Syaroslav@ivinco.com
1480Syaroslav@ivinco.com        $totalFound = $search->getTotalFound();
14993Syaroslav@ivinco.com        if(empty($pagesList) || 0 == $totalFound){
15082Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
15182Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
15227Syaroslav@ivinco.com            return;
15327Syaroslav@ivinco.com        } else {
15427Syaroslav@ivinco.com            echo '<style type="text/css">
15551Syaroslav@ivinco.com                div.dokuwiki .search{
15651Syaroslav@ivinco.com                    width:1024px;
15751Syaroslav@ivinco.com                }
15827Syaroslav@ivinco.com                div.dokuwiki .search_snippet{
15927Syaroslav@ivinco.com                    color:#000000;
16027Syaroslav@ivinco.com                    margin-left:0px;
16139Syaroslav@ivinco.com                    font-size: 13px;
16239Syaroslav@ivinco.com                }
16339Syaroslav@ivinco.com                div.dokuwiki .search_result{
16451Syaroslav@ivinco.com                    width:600px;
16539Syaroslav@ivinco.com                    float:left;
16639Syaroslav@ivinco.com                }
16750Syaroslav@ivinco.com                div.dokuwiki .search_result a.title{
16850Syaroslav@ivinco.com                    font:16px Arial,Helvetica,sans-serif;
16950Syaroslav@ivinco.com                }
17050Syaroslav@ivinco.com                div.dokuwiki .search_result span{
17151Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
17250Syaroslav@ivinco.com                }
17339Syaroslav@ivinco.com                div.dokuwiki .search_sidebar{
17450Syaroslav@ivinco.com                    width:300px;
17539Syaroslav@ivinco.com                    float:right;
17639Syaroslav@ivinco.com                    margin-right: 30px;
17739Syaroslav@ivinco.com                }
17839Syaroslav@ivinco.com                div.dokuwiki .search_result_row{
17939Syaroslav@ivinco.com                    color:#000000;
18039Syaroslav@ivinco.com                    margin-left:0px;
18150Syaroslav@ivinco.com                    width:600px;
18250Syaroslav@ivinco.com                    text-align:left;
18339Syaroslav@ivinco.com                }
18439Syaroslav@ivinco.com                div.dokuwiki .search_result_row_child{
18539Syaroslav@ivinco.com                    color:#000000;
18639Syaroslav@ivinco.com                    margin-left:30px;
18750Syaroslav@ivinco.com                    width:600px;
18850Syaroslav@ivinco.com                    text-align:left;
18950Syaroslav@ivinco.com                }
19050Syaroslav@ivinco.com                div.dokuwiki .hide{
19150Syaroslav@ivinco.com                    display:none;
19227Syaroslav@ivinco.com                }
19327Syaroslav@ivinco.com                div.dokuwiki .search_cnt{
19450Syaroslav@ivinco.com                    color:#909090;
19551Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
19627Syaroslav@ivinco.com                }
19727Syaroslav@ivinco.com                div.dokuwiki .search_nmsp{
19827Syaroslav@ivinco.com                    font-size: 10px;
19927Syaroslav@ivinco.com                }
20039Syaroslav@ivinco.com                div.dokuwiki .sphinxsearch_nav{
20139Syaroslav@ivinco.com                    clear:both;
20239Syaroslav@ivinco.com                }
20327Syaroslav@ivinco.com                </style>
20450Syaroslav@ivinco.com                <script type="text/javascript">
20550Syaroslav@ivinco.comfunction sh(id)
20650Syaroslav@ivinco.com{
20750Syaroslav@ivinco.com    var e = document.getElementById(id);
20850Syaroslav@ivinco.com    if(e.style.display == "block")
20950Syaroslav@ivinco.com        e.style.display = "none";
21050Syaroslav@ivinco.com    else
21150Syaroslav@ivinco.com        e.style.display = "block";
21250Syaroslav@ivinco.com}
21351Syaroslav@ivinco.com</script>
21450Syaroslav@ivinco.com';
21527Syaroslav@ivinco.com
21652Syaroslav@ivinco.com            echo '<h2>Found '.$totalFound . ($totalFound == 1  ? ' match ' : ' matches ') . ' for query "' . hsc($query).'"</h2>';
21751Syaroslav@ivinco.com            echo '<div class="search">';
21827Syaroslav@ivinco.com            echo '<div class="search_result">';
21927Syaroslav@ivinco.com            // printout the results
22043Syaroslav@ivinco.com            $pageListGroupByPage = array();
22143Syaroslav@ivinco.com            foreach ($pagesList as $row) {
22227Syaroslav@ivinco.com                $page = $row['page'];
22343Syaroslav@ivinco.com                if(!isset ($pageListGroupByPage[$page])){
22443Syaroslav@ivinco.com                    $pageListGroupByPage[$page] = $row;
22527Syaroslav@ivinco.com                } else {
22643Syaroslav@ivinco.com                    $pageListGroupByPage[$page]['subpages'][] = $row;
22727Syaroslav@ivinco.com                }
22843Syaroslav@ivinco.com            }
22943Syaroslav@ivinco.com            foreach ($pageListGroupByPage as $row) {
23050Syaroslav@ivinco.com                $this->_showResult($row, $keywords, false);
23143Syaroslav@ivinco.com                if(!empty($row['subpages'])){
23250Syaroslav@ivinco.com                    echo '<div id="more'.$row['page'].'" class="hide">';
23343Syaroslav@ivinco.com                    foreach($row['subpages'] as $sub){
23449Syaroslav@ivinco.com                        $this->_showResult($sub, $keywords, true);
23527Syaroslav@ivinco.com                    }
23650Syaroslav@ivinco.com                    echo '</div>';
23727Syaroslav@ivinco.com                }
23843Syaroslav@ivinco.com
2394Syaroslav@ivinco.com            }
24027Syaroslav@ivinco.com            echo '</div>';
24153Syaroslav@ivinco.com            echo '<div class="search_sidebar">';
24275Syaroslav@ivinco.com            printNamespacesNew($this->_getMatchingPagenames($keywords, $categories));
24339Syaroslav@ivinco.com            echo '</div>';
24427Syaroslav@ivinco.com            echo '<div class="sphinxsearch_nav">';
24543Syaroslav@ivinco.com            if ($start > 1){
24643Syaroslav@ivinco.com                if(false !== strpos($prev, ',')){
24746Syaroslav@ivinco.com                    $prevArry = explode(",", $prev);
24846Syaroslav@ivinco.com                    $prevNum = $prevArry[count($prevArry)-1];
24946Syaroslav@ivinco.com                    unset($prevArry[count($prevArry)-1]);
25046Syaroslav@ivinco.com                    $prevString = implode(",", $prevArry);
25143Syaroslav@ivinco.com                } else {
25243Syaroslav@ivinco.com                    $prevNum = 0;
25343Syaroslav@ivinco.com                }
2544Syaroslav@ivinco.com
25546Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prevNum, 'prev'=>$prevString),'false','&'),
25643Syaroslav@ivinco.com                                          'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
25718Syaroslav@ivinco.com            }
25827Syaroslav@ivinco.com            echo ' ';
25943Syaroslav@ivinco.com
26039Syaroslav@ivinco.com            //if($start + $this->getConf('maxresults') < $totalFound){
26139Syaroslav@ivinco.com                //$next = $start + $this->getConf('maxresults');
26243Syaroslav@ivinco.com            if($start + $search->getOffset()< $totalFound){
26339Syaroslav@ivinco.com                $next = $start + $search->getOffset();
26445Syaroslav@ivinco.com                if($start > 1){
26546Syaroslav@ivinco.com                    $prevString = $prev.','.$start;
26645Syaroslav@ivinco.com                }
26746Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next,'prev'=>$prevString),'false','&'),
26827Syaroslav@ivinco.com                                          'next','wikilink1 gs_next',$conf['target']['interwiki']);
26927Syaroslav@ivinco.com            }
27027Syaroslav@ivinco.com            echo '</div>';
271111Syaroslav@ivinco.com            echo '<a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>. ';
272111Syaroslav@ivinco.com 	    echo 'DokuWiki Sphinx Search plugin (version '.$this->_versionNumber.') by <a href="http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/">Ivinco</a>.';
27351Syaroslav@ivinco.com            echo '</div>';
2740Syaroslav@ivinco.com        }
27551Syaroslav@ivinco.com
2760Syaroslav@ivinco.com
2770Syaroslav@ivinco.com    }
2780Syaroslav@ivinco.com
27949Syaroslav@ivinco.com    function _showResult($row, $keywords, $subpages = false)
28043Syaroslav@ivinco.com    {
28143Syaroslav@ivinco.com        $page = $row['page'];
28243Syaroslav@ivinco.com        $bodyExcerpt = $row['bodyExcerpt'];
28343Syaroslav@ivinco.com        $titleTextExcerpt = $row['titleTextExcerpt'];
28443Syaroslav@ivinco.com        $hid = $row['hid'];
28543Syaroslav@ivinco.com
28643Syaroslav@ivinco.com        $metaData = p_get_metadata($page);
28743Syaroslav@ivinco.com
28843Syaroslav@ivinco.com        if (!empty($titleTextExcerpt)){
28943Syaroslav@ivinco.com            $titleText = $titleTextExcerpt;
29043Syaroslav@ivinco.com        } elseif(!empty($row['title_text'])){
29143Syaroslav@ivinco.com            $titleText = $row['title_text'];
29243Syaroslav@ivinco.com        } elseif(!empty($metaData['title'])){
29343Syaroslav@ivinco.com            $titleText = hsc($metaData['title']);
29443Syaroslav@ivinco.com        } else {
29543Syaroslav@ivinco.com            $titleText = hsc($page);
29643Syaroslav@ivinco.com        }
29743Syaroslav@ivinco.com
29843Syaroslav@ivinco.com        $namespaces = getNsLinks($page, $keywords, $this->_search);
29943Syaroslav@ivinco.com        $href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page);
30043Syaroslav@ivinco.com
30146Syaroslav@ivinco.com        if($subpages){
30246Syaroslav@ivinco.com            echo '<div class="search_result_row_child">';
30343Syaroslav@ivinco.com        } else {
30446Syaroslav@ivinco.com            echo '<div class="search_result_row">';
30543Syaroslav@ivinco.com        }
30643Syaroslav@ivinco.com
30750Syaroslav@ivinco.com        echo '<a class="wikilink1 title" href="'.$href.'" title="" >'.$titleText.'</a><br/>';
30843Syaroslav@ivinco.com        echo '<div class="search_snippet">';
30943Syaroslav@ivinco.com        echo strip_tags($bodyExcerpt, '<b>,<strong>');
31043Syaroslav@ivinco.com        echo '</div>';
31143Syaroslav@ivinco.com        $sep=':';
31243Syaroslav@ivinco.com        $i = 0;
31343Syaroslav@ivinco.com        echo '<span class="search_nmsp">';
31443Syaroslav@ivinco.com        foreach ($namespaces as $name){
31543Syaroslav@ivinco.com            $link = $name['link'];
31643Syaroslav@ivinco.com            $pageTitle = $name['title'];
31751Syaroslav@ivinco.com            tpl_link($link, $pageTitle);
31843Syaroslav@ivinco.com            if ($i++ < count($namespaces)-1){
31943Syaroslav@ivinco.com                echo $sep;
32043Syaroslav@ivinco.com            }
32143Syaroslav@ivinco.com        }
32243Syaroslav@ivinco.com        if (!empty($hid)){
32343Syaroslav@ivinco.com            echo '#'.$hid;
32443Syaroslav@ivinco.com        }
32543Syaroslav@ivinco.com        echo '</span>';
32657Syaroslav@ivinco.com
32757Syaroslav@ivinco.com        if (!empty($metaData['last_change']['date'])){
32857Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['last_change']['date']).'</span> ';
32957Syaroslav@ivinco.com        } else if (!empty($metaData['date']['created'])){
33057Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['date']['created']).'</span> ';
33157Syaroslav@ivinco.com        }
33257Syaroslav@ivinco.com
33357Syaroslav@ivinco.com        if(!empty($metaData['last_change']['user'])){
33457Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['last_change']['user'].'</span> ';
33557Syaroslav@ivinco.com        } else if(!empty($metaData['creator'])){
33657Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['creator'].'</span> ';
33757Syaroslav@ivinco.com        }
33857Syaroslav@ivinco.com
33950Syaroslav@ivinco.com        if (!empty($row['subpages'])){
34050Syaroslav@ivinco.com            echo '<br />';
34151Syaroslav@ivinco.com            echo '<div style="text-align:right;font:12px Arial,Helvetica,sans-serif;text-decoration:underline;"><a href="javascript:void(0)" onClick="sh('."'more".$page."'".');" >More matches in this document</a></div>';
34250Syaroslav@ivinco.com        }else {
34350Syaroslav@ivinco.com            echo '<br />';
34450Syaroslav@ivinco.com        }
34543Syaroslav@ivinco.com        echo '<br />';
34643Syaroslav@ivinco.com        echo '</div>';
34743Syaroslav@ivinco.com    }
34843Syaroslav@ivinco.com
34982Syaroslav@ivinco.com     function searchform()
35082Syaroslav@ivinco.com    {
3510Syaroslav@ivinco.com          global $lang;
3520Syaroslav@ivinco.com          global $ACT;
3530Syaroslav@ivinco.com          global $QUERY;
3540Syaroslav@ivinco.com
3550Syaroslav@ivinco.com          // don't print the search form if search action has been disabled
35627Syaroslav@ivinco.com          if (!actionOk('search')) return false;
3570Syaroslav@ivinco.com
3580Syaroslav@ivinco.com          print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">';
35927Syaroslav@ivinco.com          print '<input type="hidden" name="do" value="search" />';
3600Syaroslav@ivinco.com          print '<input type="text" ';
36127Syaroslav@ivinco.com          if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" ';
3620Syaroslav@ivinco.com          print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />';
3630Syaroslav@ivinco.com          print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
3640Syaroslav@ivinco.com          print '</div></form>';
3650Syaroslav@ivinco.com          return true;
3660Syaroslav@ivinco.com    }
36715Syaroslav@ivinco.com
36815Syaroslav@ivinco.com    function _getCategories($query)
36915Syaroslav@ivinco.com    {
37015Syaroslav@ivinco.com        $categories = '';
37115Syaroslav@ivinco.com        $query = urldecode($query);
37282Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "@ns"))){;
37382Syaroslav@ivinco.com            $categories = substr($query, $pos + strlen("@ns"));
37415Syaroslav@ivinco.com        }
37515Syaroslav@ivinco.com        return trim($categories);
37615Syaroslav@ivinco.com    }
37715Syaroslav@ivinco.com
37815Syaroslav@ivinco.com    function _getKeywords($query)
37915Syaroslav@ivinco.com    {
38015Syaroslav@ivinco.com        $keywords = $query;
38115Syaroslav@ivinco.com        $query = urldecode($query);
38282Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "-@ns"))){;
38315Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
38482Syaroslav@ivinco.com        }else if (false !== ($pos = strpos($query, "@ns"))){;
38563Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
38663Syaroslav@ivinco.com        }
38715Syaroslav@ivinco.com        return trim($keywords);
38815Syaroslav@ivinco.com    }
38969Syaroslav@ivinco.com
39070Syaroslav@ivinco.com    function _getMatchingPagenames($keywords, $categories)
39169Syaroslav@ivinco.com    {
39270Syaroslav@ivinco.com        $this->_search->setSearchCategoryQuery($keywords, $categories);
39380Syaroslav@ivinco.com        $this->_search->setNamespacePriority($this->getConf('mp_namespace_priority'));
39480Syaroslav@ivinco.com        $this->_search->setPagenamePriority($this->getConf('mp_pagename_priority'));
39580Syaroslav@ivinco.com
39677Syaroslav@ivinco.com        $res = $this->_search->search(0, 10);
39769Syaroslav@ivinco.com        if (!$res){
39869Syaroslav@ivinco.com            return false;
39969Syaroslav@ivinco.com        }
40069Syaroslav@ivinco.com        $pageIds = $this->_search->getPagesIds();
40169Syaroslav@ivinco.com
40269Syaroslav@ivinco.com        $matchPages = array();
40369Syaroslav@ivinco.com        foreach($pageIds as $page){
40477Syaroslav@ivinco.com            $matchPages[$page['page']] = $page['hid'];
40569Syaroslav@ivinco.com        }
40669Syaroslav@ivinco.com        return array_unique($matchPages);
40769Syaroslav@ivinco.com    }
4080Syaroslav@ivinco.com}
4090Syaroslav@ivinco.com
4100Syaroslav@ivinco.com?>
411