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
55*116Syaroslav
56*116Syaroslav==== ====
57*116Syaroslav----
58115SyaroslavDokuWiki Sphinx Search plugin (version $this->_versionNumber) by [[http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/|Ivinco]].
5982Syaroslav@ivinco.com";
60111Syaroslav@ivinco.com	return $this->_helpMessage;
61110Syaroslav    }
620Syaroslav@ivinco.com
630Syaroslav@ivinco.com    /**
640Syaroslav@ivinco.com	* Register to the content display event to place the results under it.
650Syaroslav@ivinco.com	*/
660Syaroslav@ivinco.com    /**
670Syaroslav@ivinco.com     * register the eventhandlers
680Syaroslav@ivinco.com     */
690Syaroslav@ivinco.com    function register(&$controller){
7087Syaroslav@ivinco.com        $controller->register_hook('TPL_CONTENT_DISPLAY',   'BEFORE', $this, 'handle_act_unknown', array());
710Syaroslav@ivinco.com    }
720Syaroslav@ivinco.com
730Syaroslav@ivinco.com    /**
7497Syaroslav@ivinco.com     * If our own action was given we produce our content here
750Syaroslav@ivinco.com     */
760Syaroslav@ivinco.com    function handle_act_unknown(&$event, $param){
7727Syaroslav@ivinco.com        global $ACT;
7827Syaroslav@ivinco.com        global $QUERY;
7927Syaroslav@ivinco.com        if($ACT != 'search') return; // nothing to do for us
800Syaroslav@ivinco.com
810Syaroslav@ivinco.com        // we can handle it -> prevent others
820Syaroslav@ivinco.com        $event->stopPropagation();
830Syaroslav@ivinco.com        $event->preventDefault();
840Syaroslav@ivinco.com
8591Syaroslav@ivinco.com/*        if (!extension_loaded('sqlite')) {
8687Syaroslav@ivinco.com            echo "SQLite extension is not loaded!";
8787Syaroslav@ivinco.com            return;
8891Syaroslav@ivinco.com        }*/
8987Syaroslav@ivinco.com
9082Syaroslav@ivinco.com        if(!empty($_REQUEST['ssplugininfo'])){
9182Syaroslav@ivinco.com            $info = array();
92111Syaroslav@ivinco.com            echo p_render('xhtml',p_get_instructions($this->getHelpInfo()), $info);
9382Syaroslav@ivinco.com            return;
9482Syaroslav@ivinco.com        }
9527Syaroslav@ivinco.com
9643Syaroslav@ivinco.com        $this->_search($QUERY,$_REQUEST['start'],$_REQUEST['prev']);
970Syaroslav@ivinco.com    }
980Syaroslav@ivinco.com
990Syaroslav@ivinco.com    /**
1000Syaroslav@ivinco.com     * do the search and displays the result
1010Syaroslav@ivinco.com     */
10243Syaroslav@ivinco.com    function _search($query, $start, $prev) {
10326Syaroslav@ivinco.com        global $conf;
1040Syaroslav@ivinco.com
1050Syaroslav@ivinco.com        $start = (int) $start;
10644Syaroslav@ivinco.com        if($start < 0){
10744Syaroslav@ivinco.com            $start = 0;
10844Syaroslav@ivinco.com        }
10944Syaroslav@ivinco.com        if(empty($prev)){
11044Syaroslav@ivinco.com            $prev = 0;
11144Syaroslav@ivinco.com        }
1120Syaroslav@ivinco.com
11363Syaroslav@ivinco.com        $categories = $this->_getCategories($query);
11467Syaroslav@ivinco.com        $keywords = $this->_getKeywords($query);
1150Syaroslav@ivinco.com
1160Syaroslav@ivinco.com        $search = new SphinxSearch($this->getConf('host'), $this->getConf('port'), $this->getConf('index'));
11716Syaroslav@ivinco.com        $search->setSnippetSize($this->getConf('snippetsize'));
11831Syaroslav@ivinco.com        $search->setArroundWordsCount($this->getConf('aroundwords'));
11919Syaroslav@ivinco.com        $search->setTitlePriority($this->getConf('title_priority'));
12019Syaroslav@ivinco.com        $search->setBodyPriority($this->getConf('body_priority'));
12180Syaroslav@ivinco.com        $search->setNamespacePriority($this->getConf('namespace_priority'));
12280Syaroslav@ivinco.com        $search->setPagenamePriority($this->getConf('pagename_priority'));
12369Syaroslav@ivinco.com
12469Syaroslav@ivinco.com        if (!empty($keywords) && empty($categories)){
12569Syaroslav@ivinco.com            $search->setSearchAllQuery($keywords, $categories);
12679Syaroslav@ivinco.com        } elseif (!empty($keywords)) {
12779Syaroslav@ivinco.com            $search->setSearchAllQueryWithCategoryFilter($keywords, $categories);
12869Syaroslav@ivinco.com        } else {
12982Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br>
13082Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
13179Syaroslav@ivinco.com            return;
13269Syaroslav@ivinco.com        }
13369Syaroslav@ivinco.com        $result = $search->search($start, $this->getConf('maxresults'));
13443Syaroslav@ivinco.com        $this->_search = $search;
13528Syaroslav@ivinco.com
13688Syaroslav@ivinco.com        if ($search->getError()){
13789Syaroslav@ivinco.com            echo "Could not connect to Sphinx search engine.";
13828Syaroslav@ivinco.com            return;
13928Syaroslav@ivinco.com        }
14069Syaroslav@ivinco.com
14193Syaroslav@ivinco.com        if(!$result){
14293Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
14393Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
14493Syaroslav@ivinco.com            return;
14593Syaroslav@ivinco.com        }
14693Syaroslav@ivinco.com
14777Syaroslav@ivinco.com        $pagesList = $search->getPages($keywords);
1484Syaroslav@ivinco.com
1490Syaroslav@ivinco.com        $totalFound = $search->getTotalFound();
15093Syaroslav@ivinco.com        if(empty($pagesList) || 0 == $totalFound){
15182Syaroslav@ivinco.com            echo 'Your search - <strong>' . $query . '</strong> - did not match any documents.<br/>
15282Syaroslav@ivinco.com                <a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>';
15327Syaroslav@ivinco.com            return;
15427Syaroslav@ivinco.com        } else {
15527Syaroslav@ivinco.com            echo '<style type="text/css">
15651Syaroslav@ivinco.com                div.dokuwiki .search{
15751Syaroslav@ivinco.com                    width:1024px;
15851Syaroslav@ivinco.com                }
15927Syaroslav@ivinco.com                div.dokuwiki .search_snippet{
16027Syaroslav@ivinco.com                    color:#000000;
16127Syaroslav@ivinco.com                    margin-left:0px;
16239Syaroslav@ivinco.com                    font-size: 13px;
16339Syaroslav@ivinco.com                }
16439Syaroslav@ivinco.com                div.dokuwiki .search_result{
16551Syaroslav@ivinco.com                    width:600px;
16639Syaroslav@ivinco.com                    float:left;
16739Syaroslav@ivinco.com                }
16850Syaroslav@ivinco.com                div.dokuwiki .search_result a.title{
16950Syaroslav@ivinco.com                    font:16px Arial,Helvetica,sans-serif;
17050Syaroslav@ivinco.com                }
17150Syaroslav@ivinco.com                div.dokuwiki .search_result span{
17251Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
17350Syaroslav@ivinco.com                }
17439Syaroslav@ivinco.com                div.dokuwiki .search_sidebar{
17550Syaroslav@ivinco.com                    width:300px;
17639Syaroslav@ivinco.com                    float:right;
17739Syaroslav@ivinco.com                    margin-right: 30px;
17839Syaroslav@ivinco.com                }
17939Syaroslav@ivinco.com                div.dokuwiki .search_result_row{
18039Syaroslav@ivinco.com                    color:#000000;
18139Syaroslav@ivinco.com                    margin-left:0px;
18250Syaroslav@ivinco.com                    width:600px;
18350Syaroslav@ivinco.com                    text-align:left;
18439Syaroslav@ivinco.com                }
18539Syaroslav@ivinco.com                div.dokuwiki .search_result_row_child{
18639Syaroslav@ivinco.com                    color:#000000;
18739Syaroslav@ivinco.com                    margin-left:30px;
18850Syaroslav@ivinco.com                    width:600px;
18950Syaroslav@ivinco.com                    text-align:left;
19050Syaroslav@ivinco.com                }
19150Syaroslav@ivinco.com                div.dokuwiki .hide{
19250Syaroslav@ivinco.com                    display:none;
19327Syaroslav@ivinco.com                }
19427Syaroslav@ivinco.com                div.dokuwiki .search_cnt{
19550Syaroslav@ivinco.com                    color:#909090;
19651Syaroslav@ivinco.com                    font:12px Arial,Helvetica,sans-serif;
19727Syaroslav@ivinco.com                }
19827Syaroslav@ivinco.com                div.dokuwiki .search_nmsp{
19927Syaroslav@ivinco.com                    font-size: 10px;
20027Syaroslav@ivinco.com                }
20139Syaroslav@ivinco.com                div.dokuwiki .sphinxsearch_nav{
20239Syaroslav@ivinco.com                    clear:both;
20339Syaroslav@ivinco.com                }
20427Syaroslav@ivinco.com                </style>
20550Syaroslav@ivinco.com                <script type="text/javascript">
20650Syaroslav@ivinco.comfunction sh(id)
20750Syaroslav@ivinco.com{
20850Syaroslav@ivinco.com    var e = document.getElementById(id);
20950Syaroslav@ivinco.com    if(e.style.display == "block")
21050Syaroslav@ivinco.com        e.style.display = "none";
21150Syaroslav@ivinco.com    else
21250Syaroslav@ivinco.com        e.style.display = "block";
21350Syaroslav@ivinco.com}
21451Syaroslav@ivinco.com</script>
21550Syaroslav@ivinco.com';
21627Syaroslav@ivinco.com
21752Syaroslav@ivinco.com            echo '<h2>Found '.$totalFound . ($totalFound == 1  ? ' match ' : ' matches ') . ' for query "' . hsc($query).'"</h2>';
21851Syaroslav@ivinco.com            echo '<div class="search">';
21927Syaroslav@ivinco.com            echo '<div class="search_result">';
22027Syaroslav@ivinco.com            // printout the results
22143Syaroslav@ivinco.com            $pageListGroupByPage = array();
22243Syaroslav@ivinco.com            foreach ($pagesList as $row) {
22327Syaroslav@ivinco.com                $page = $row['page'];
22443Syaroslav@ivinco.com                if(!isset ($pageListGroupByPage[$page])){
22543Syaroslav@ivinco.com                    $pageListGroupByPage[$page] = $row;
22627Syaroslav@ivinco.com                } else {
22743Syaroslav@ivinco.com                    $pageListGroupByPage[$page]['subpages'][] = $row;
22827Syaroslav@ivinco.com                }
22943Syaroslav@ivinco.com            }
23043Syaroslav@ivinco.com            foreach ($pageListGroupByPage as $row) {
23150Syaroslav@ivinco.com                $this->_showResult($row, $keywords, false);
23243Syaroslav@ivinco.com                if(!empty($row['subpages'])){
23350Syaroslav@ivinco.com                    echo '<div id="more'.$row['page'].'" class="hide">';
23443Syaroslav@ivinco.com                    foreach($row['subpages'] as $sub){
23549Syaroslav@ivinco.com                        $this->_showResult($sub, $keywords, true);
23627Syaroslav@ivinco.com                    }
23750Syaroslav@ivinco.com                    echo '</div>';
23827Syaroslav@ivinco.com                }
23943Syaroslav@ivinco.com
2404Syaroslav@ivinco.com            }
24127Syaroslav@ivinco.com            echo '</div>';
24253Syaroslav@ivinco.com            echo '<div class="search_sidebar">';
24375Syaroslav@ivinco.com            printNamespacesNew($this->_getMatchingPagenames($keywords, $categories));
24439Syaroslav@ivinco.com            echo '</div>';
24527Syaroslav@ivinco.com            echo '<div class="sphinxsearch_nav">';
24643Syaroslav@ivinco.com            if ($start > 1){
24743Syaroslav@ivinco.com                if(false !== strpos($prev, ',')){
24846Syaroslav@ivinco.com                    $prevArry = explode(",", $prev);
24946Syaroslav@ivinco.com                    $prevNum = $prevArry[count($prevArry)-1];
25046Syaroslav@ivinco.com                    unset($prevArry[count($prevArry)-1]);
25146Syaroslav@ivinco.com                    $prevString = implode(",", $prevArry);
25243Syaroslav@ivinco.com                } else {
25343Syaroslav@ivinco.com                    $prevNum = 0;
25443Syaroslav@ivinco.com                }
2554Syaroslav@ivinco.com
25646Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$prevNum, 'prev'=>$prevString),'false','&'),
25743Syaroslav@ivinco.com                                          'prev','wikilink1 gs_prev',$conf['target']['interwiki']);
25818Syaroslav@ivinco.com            }
25927Syaroslav@ivinco.com            echo ' ';
26043Syaroslav@ivinco.com
26139Syaroslav@ivinco.com            //if($start + $this->getConf('maxresults') < $totalFound){
26239Syaroslav@ivinco.com                //$next = $start + $this->getConf('maxresults');
26343Syaroslav@ivinco.com            if($start + $search->getOffset()< $totalFound){
26439Syaroslav@ivinco.com                $next = $start + $search->getOffset();
26545Syaroslav@ivinco.com                if($start > 1){
26646Syaroslav@ivinco.com                    $prevString = $prev.','.$start;
26745Syaroslav@ivinco.com                }
26846Syaroslav@ivinco.com                echo $this->external_link(wl('',array('do'=>'search','id'=>$query,'start'=>$next,'prev'=>$prevString),'false','&'),
26927Syaroslav@ivinco.com                                          'next','wikilink1 gs_next',$conf['target']['interwiki']);
27027Syaroslav@ivinco.com            }
27127Syaroslav@ivinco.com            echo '</div>';
272111Syaroslav@ivinco.com            echo '<a href="?do=search&ssplugininfo=1&id='.$query.'">Search help</a>. ';
273111Syaroslav@ivinco.com 	    echo 'DokuWiki Sphinx Search plugin (version '.$this->_versionNumber.') by <a href="http://www.ivinco.com/software/dokuwiki-sphinx-search-plugin/">Ivinco</a>.';
27451Syaroslav@ivinco.com            echo '</div>';
2750Syaroslav@ivinco.com        }
27651Syaroslav@ivinco.com
2770Syaroslav@ivinco.com
2780Syaroslav@ivinco.com    }
2790Syaroslav@ivinco.com
28049Syaroslav@ivinco.com    function _showResult($row, $keywords, $subpages = false)
28143Syaroslav@ivinco.com    {
28243Syaroslav@ivinco.com        $page = $row['page'];
28343Syaroslav@ivinco.com        $bodyExcerpt = $row['bodyExcerpt'];
28443Syaroslav@ivinco.com        $titleTextExcerpt = $row['titleTextExcerpt'];
28543Syaroslav@ivinco.com        $hid = $row['hid'];
28643Syaroslav@ivinco.com
28743Syaroslav@ivinco.com        $metaData = p_get_metadata($page);
28843Syaroslav@ivinco.com
28943Syaroslav@ivinco.com        if (!empty($titleTextExcerpt)){
29043Syaroslav@ivinco.com            $titleText = $titleTextExcerpt;
29143Syaroslav@ivinco.com        } elseif(!empty($row['title_text'])){
29243Syaroslav@ivinco.com            $titleText = $row['title_text'];
29343Syaroslav@ivinco.com        } elseif(!empty($metaData['title'])){
29443Syaroslav@ivinco.com            $titleText = hsc($metaData['title']);
29543Syaroslav@ivinco.com        } else {
29643Syaroslav@ivinco.com            $titleText = hsc($page);
29743Syaroslav@ivinco.com        }
29843Syaroslav@ivinco.com
29943Syaroslav@ivinco.com        $namespaces = getNsLinks($page, $keywords, $this->_search);
30043Syaroslav@ivinco.com        $href = !empty($hid) ? (wl($page).'#'.$hid) : wl($page);
30143Syaroslav@ivinco.com
30246Syaroslav@ivinco.com        if($subpages){
30346Syaroslav@ivinco.com            echo '<div class="search_result_row_child">';
30443Syaroslav@ivinco.com        } else {
30546Syaroslav@ivinco.com            echo '<div class="search_result_row">';
30643Syaroslav@ivinco.com        }
30743Syaroslav@ivinco.com
30850Syaroslav@ivinco.com        echo '<a class="wikilink1 title" href="'.$href.'" title="" >'.$titleText.'</a><br/>';
30943Syaroslav@ivinco.com        echo '<div class="search_snippet">';
31043Syaroslav@ivinco.com        echo strip_tags($bodyExcerpt, '<b>,<strong>');
31143Syaroslav@ivinco.com        echo '</div>';
31243Syaroslav@ivinco.com        $sep=':';
31343Syaroslav@ivinco.com        $i = 0;
31443Syaroslav@ivinco.com        echo '<span class="search_nmsp">';
31543Syaroslav@ivinco.com        foreach ($namespaces as $name){
31643Syaroslav@ivinco.com            $link = $name['link'];
31743Syaroslav@ivinco.com            $pageTitle = $name['title'];
31851Syaroslav@ivinco.com            tpl_link($link, $pageTitle);
31943Syaroslav@ivinco.com            if ($i++ < count($namespaces)-1){
32043Syaroslav@ivinco.com                echo $sep;
32143Syaroslav@ivinco.com            }
32243Syaroslav@ivinco.com        }
32343Syaroslav@ivinco.com        if (!empty($hid)){
32443Syaroslav@ivinco.com            echo '#'.$hid;
32543Syaroslav@ivinco.com        }
32643Syaroslav@ivinco.com        echo '</span>';
32757Syaroslav@ivinco.com
32857Syaroslav@ivinco.com        if (!empty($metaData['last_change']['date'])){
32957Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['last_change']['date']).'</span> ';
33057Syaroslav@ivinco.com        } else if (!empty($metaData['date']['created'])){
33157Syaroslav@ivinco.com            echo '<span class="search_cnt"> - Last modified '.date("Y-m-d H:i",$metaData['date']['created']).'</span> ';
33257Syaroslav@ivinco.com        }
33357Syaroslav@ivinco.com
33457Syaroslav@ivinco.com        if(!empty($metaData['last_change']['user'])){
33557Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['last_change']['user'].'</span> ';
33657Syaroslav@ivinco.com        } else if(!empty($metaData['creator'])){
33757Syaroslav@ivinco.com            echo '<span class="search_cnt">by '.$metaData['creator'].'</span> ';
33857Syaroslav@ivinco.com        }
33957Syaroslav@ivinco.com
34050Syaroslav@ivinco.com        if (!empty($row['subpages'])){
34150Syaroslav@ivinco.com            echo '<br />';
34251Syaroslav@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>';
34350Syaroslav@ivinco.com        }else {
34450Syaroslav@ivinco.com            echo '<br />';
34550Syaroslav@ivinco.com        }
34643Syaroslav@ivinco.com        echo '<br />';
34743Syaroslav@ivinco.com        echo '</div>';
34843Syaroslav@ivinco.com    }
34943Syaroslav@ivinco.com
35082Syaroslav@ivinco.com     function searchform()
35182Syaroslav@ivinco.com    {
3520Syaroslav@ivinco.com          global $lang;
3530Syaroslav@ivinco.com          global $ACT;
3540Syaroslav@ivinco.com          global $QUERY;
3550Syaroslav@ivinco.com
3560Syaroslav@ivinco.com          // don't print the search form if search action has been disabled
35727Syaroslav@ivinco.com          if (!actionOk('search')) return false;
3580Syaroslav@ivinco.com
3590Syaroslav@ivinco.com          print '<form action="'.wl().'" accept-charset="utf-8" class="search" id="dw__search"><div class="no">';
36027Syaroslav@ivinco.com          print '<input type="hidden" name="do" value="search" />';
3610Syaroslav@ivinco.com          print '<input type="text" ';
36227Syaroslav@ivinco.com          if($ACT == 'search') print 'value="'.htmlspecialchars($QUERY).'" ';
3630Syaroslav@ivinco.com          print 'id="qsearch__in" accesskey="f" name="id" class="edit" title="[ALT+F]" />';
3640Syaroslav@ivinco.com          print '<input type="submit" value="'.$lang['btn_search'].'" class="button" title="'.$lang['btn_search'].'" />';
3650Syaroslav@ivinco.com          print '</div></form>';
3660Syaroslav@ivinco.com          return true;
3670Syaroslav@ivinco.com    }
36815Syaroslav@ivinco.com
36915Syaroslav@ivinco.com    function _getCategories($query)
37015Syaroslav@ivinco.com    {
37115Syaroslav@ivinco.com        $categories = '';
37215Syaroslav@ivinco.com        $query = urldecode($query);
37382Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "@ns"))){;
37482Syaroslav@ivinco.com            $categories = substr($query, $pos + strlen("@ns"));
37515Syaroslav@ivinco.com        }
37615Syaroslav@ivinco.com        return trim($categories);
37715Syaroslav@ivinco.com    }
37815Syaroslav@ivinco.com
37915Syaroslav@ivinco.com    function _getKeywords($query)
38015Syaroslav@ivinco.com    {
38115Syaroslav@ivinco.com        $keywords = $query;
38215Syaroslav@ivinco.com        $query = urldecode($query);
38382Syaroslav@ivinco.com        if (false !== ($pos = strpos($query, "-@ns"))){;
38415Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
38582Syaroslav@ivinco.com        }else if (false !== ($pos = strpos($query, "@ns"))){;
38663Syaroslav@ivinco.com            $keywords = substr($keywords, 0, $pos);
38763Syaroslav@ivinco.com        }
38815Syaroslav@ivinco.com        return trim($keywords);
38915Syaroslav@ivinco.com    }
39069Syaroslav@ivinco.com
39170Syaroslav@ivinco.com    function _getMatchingPagenames($keywords, $categories)
39269Syaroslav@ivinco.com    {
39370Syaroslav@ivinco.com        $this->_search->setSearchCategoryQuery($keywords, $categories);
39480Syaroslav@ivinco.com        $this->_search->setNamespacePriority($this->getConf('mp_namespace_priority'));
39580Syaroslav@ivinco.com        $this->_search->setPagenamePriority($this->getConf('mp_pagename_priority'));
39680Syaroslav@ivinco.com
39777Syaroslav@ivinco.com        $res = $this->_search->search(0, 10);
39869Syaroslav@ivinco.com        if (!$res){
39969Syaroslav@ivinco.com            return false;
40069Syaroslav@ivinco.com        }
40169Syaroslav@ivinco.com        $pageIds = $this->_search->getPagesIds();
40269Syaroslav@ivinco.com
40369Syaroslav@ivinco.com        $matchPages = array();
40469Syaroslav@ivinco.com        foreach($pageIds as $page){
40577Syaroslav@ivinco.com            $matchPages[$page['page']] = $page['hid'];
40669Syaroslav@ivinco.com        }
40769Syaroslav@ivinco.com        return array_unique($matchPages);
40869Syaroslav@ivinco.com    }
4090Syaroslav@ivinco.com}
4100Syaroslav@ivinco.com
4110Syaroslav@ivinco.com?>
412