<?php
/*
 You may not change or alter any portion of this comment or credits
 of supporting developers from this source code or any supporting source code
 which is considered copyrighted (c) material of the original comment or credit authors.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

/**
 * XOOPS global search
 *
 * See the enclosed file license.txt for licensing information.
 * If you did not receive this file, get it at https://www.gnu.org/licenses/gpl-2.0.html
 *
 * @copyright       (c) 2000-2016 XOOPS Project (www.xoops.org)
 * @license             GNU GPL 2 or later (https://www.gnu.org/licenses/gpl-2.0.html)
 * @package             core
 * @since               2.0.0
 * @author              Kazumi Ono (AKA onokazu)
 * @author              Taiwen Jiang <phppp@users.sourceforge.net>
 * @todo                Modularize; Both search algorithms and interface will be redesigned
 */
include __DIR__ . '/mainfile.php';

xoops_loadLanguage('search');
/* @var XoopsConfigHandler $config_handler */
$config_handler    = xoops_getHandler('config');
$xoopsConfigSearch = $config_handler->getConfigsByCat(XOOPS_CONF_SEARCH);

if ($xoopsConfigSearch['enable_search'] != 1) {
    header('Location: ' . XOOPS_URL . '/index.php');
    exit();
}
$action = 'search';
if (!empty($_GET['action'])) {
    $action = trim(strip_tags($_GET['action']));
} elseif (!empty($_POST['action'])) {
    $action = trim(strip_tags($_POST['action']));
}
$query = '';
if (!empty($_GET['query'])) {
    $query = trim(strip_tags($_GET['query']));
} elseif (!empty($_POST['query'])) {
    $query = trim(strip_tags($_POST['query']));
}
$andor = 'AND';
if (!empty($_GET['andor'])) {
    $andor = trim(strip_tags($_GET['andor']));
} elseif (!empty($_POST['andor'])) {
    $andor = trim(strip_tags($_POST['andor']));
}
$mid = $uid = $start = 0;
if (!empty($_GET['mid'])) {
    $mid = (int)$_GET['mid'];
} elseif (!empty($_POST['mid'])) {
    $mid = (int)$_POST['mid'];
}
if (!empty($_GET['uid'])) {
    $uid = (int)$_GET['uid'];
} elseif (!empty($_POST['uid'])) {
    $uid = (int)$_POST['uid'];
}
if (!empty($_GET['start'])) {
    $start = (int)$_GET['start'];
} elseif (!empty($_POST['start'])) {
    $start = (int)$_POST['start'];
}

$queries = array();

if ($action === 'results') {
    if ($query == '') {
        redirect_header('search.php', 1, _SR_PLZENTER);
    }
} elseif ($action === 'showall') {
    if ($query == '' || empty($mid)) {
        redirect_header('search.php', 1, _SR_PLZENTER);
    }
} elseif ($action === 'showallbyuser') {
    if (empty($mid) || empty($uid)) {
        redirect_header('search.php', 1, _SR_PLZENTER);
    }
}
$GLOBALS['xoopsOption']['template_main'] = 'system_search.tpl';
$groups            = is_object($xoopsUser) ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
/* @var  XoopsGroupPermHandler $gperm_handler */
$gperm_handler     = xoops_getHandler('groupperm');
$available_modules = $gperm_handler->getItemIds('module_read', $groups);
if ($action === 'search') {
    include $GLOBALS['xoops']->path('header.php');
    include $GLOBALS['xoops']->path('include/searchform.php');
	$xoopsTpl->assign('form', $search_form->render());
    include $GLOBALS['xoops']->path('footer.php');
    exit();
}
if ($andor !== 'OR' && $andor !== 'exact' && $andor !== 'AND') {
    $andor = 'AND';
}

$myts = MyTextSanitizer::getInstance();
if ($action !== 'showallbyuser') {
    if ($andor !== 'exact') {
        $ignored_queries = array(); // holds kewords that are shorter than allowed minmum length
        $temp_queries    = preg_split('/[\s,]+/', $query);
        foreach ($temp_queries as $q) {
            $q = trim($q);
            if (strlen($q) >= $xoopsConfigSearch['keyword_min']) {
                $queries[] = $myts->addSlashes($q);
            } else {
                $ignored_queries[] = $myts->addSlashes($q);
            }
        }
        if (count($queries) == 0) {
            redirect_header('search.php', 2, sprintf(_SR_KEYTOOSHORT, $xoopsConfigSearch['keyword_min']));
        }
    } else {
        $query = trim($query);
        if (strlen($query) < $xoopsConfigSearch['keyword_min']) {
            redirect_header('search.php', 2, sprintf(_SR_KEYTOOSHORT, $xoopsConfigSearch['keyword_min']));
        }
        $queries = array($myts->addSlashes($query));
    }
}
switch ($action) {
    case 'results':
        /* @var XoopsModuleHandler $module_handler */
        $module_handler = xoops_getHandler('module');
        $criteria       = new CriteriaCompo(new Criteria('hassearch', 1));
        $criteria->add(new Criteria('isactive', 1));
        $criteria->add(new Criteria('mid', '(' . implode(',', $available_modules) . ')', 'IN'));
        $modules = $module_handler->getObjects($criteria, true);
        $mids    = isset($_REQUEST['mids']) ? $_REQUEST['mids'] : array();
        if (empty($mids) || !is_array($mids)) {
            unset($mids);
            $mids = array_keys($modules);
        }
        $xoopsOption['xoops_pagetitle'] = _SR_SEARCHRESULTS . ': ' . implode(' ', $queries);
        include $GLOBALS['xoops']->path('header.php');
		$xoopsTpl->assign('results', true);
        $nomatch = true;
		$keywords = '';
		$error_length = '';
		$error_keywords = '';
        if ($andor !== 'exact') {
            foreach ($queries as $q) {
				$keywords .= htmlspecialchars(stripslashes($q)) . ' ';
            }
            if (!empty($ignored_queries)) {
				$error_length = sprintf(_SR_IGNOREDWORDS, $xoopsConfigSearch['keyword_min']);
                foreach ($ignored_queries as $q) {
					$error_keywords .= htmlspecialchars(stripslashes($q)) . ' ';
                }
            }
        } else {
			$keywords .= '"' . htmlspecialchars(stripslashes($queries[0])) . '"';
        }
		$xoopsTpl->assign('keywords', $keywords);
		$xoopsTpl->assign('error_length', $error_length);
		$xoopsTpl->assign('error_keywords', $error_keywords);
		$results_arr = array();
        foreach ($mids as $mid) {
            $mid = (int)$mid;			
            if (in_array($mid, $available_modules)) {
                $module  = $modules[$mid];
                $results = $module->search($queries, $andor, 5, 0);
				if (empty($results)){
					$count = 0;
                } else {
					$count = count($results);
				}
                if (is_array($results) && $count > 0) {
                    $nomatch = false;
					$module_name = $module->getVar('name');					
                    for ($i = 0; $i < $count; ++$i) {
                        if (isset($results[$i]['image']) && $results[$i]['image'] != '') {
							$results_arr[$i]['image_link'] = 'modules/' . $module->getVar('dirname') . '/' . $results[$i]['image'];
                        } else {
							$results_arr[$i]['image_link'] = 'images/icons/posticon2.gif';							
                        }
						$results_arr[$i]['image_title'] = $module->getVar('name');
                        if (!preg_match("/^http[s]*:\/\//i", $results[$i]['link'])) {
                            $results[$i]['link'] = 'modules/' . $module->getVar('dirname') . '/' . $results[$i]['link']; 
                        }
						$results_arr[$i]['link'] = $results[$i]['link'];
						$results_arr[$i]['link_title'] = $myts->htmlSpecialChars($results[$i]['title']);
						
                        $results[$i]['uid'] = @(int)$results[$i]['uid'];
                        if (!empty($results[$i]['uid'])) {
                            $uname = XoopsUser::getUnameFromId($results[$i]['uid']);
							$results_arr[$i]['uname'] = $uname;
							$results_arr[$i]['uname_link'] = XOOPS_URL . '/userinfo.php?uid=' . $results[$i]['uid'];
                        }
						if (!empty($results[$i]['time'])){
							$results_arr[$i]['time'] = formatTimestamp((int)$results[$i]['time']);
						}
                    }
                    if ($count >= 5) {
                        $search_url = XOOPS_URL . '/search.php?query=' . urlencode(stripslashes(implode(' ', $queries)));
                        $search_url .= "&mid={$mid}&action=showall&andor={$andor}";
						$search_arr['module_show_all'] = htmlspecialchars($search_url);
                    }
					$search_arr['module_name'] = $module_name;
					$search_arr['module_data'] = $results_arr;
					$xoopsTpl->append_by_ref('search', $search_arr);
					unset($results_arr, $search_arr);
                }
            }			
            unset($results, $module, $module_name);
        }
		
        if ($nomatch) {
			$xoopsTpl->assign('nomatch', _SR_NOMATCH);
        }
        include $GLOBALS['xoops']->path('include/searchform.php');
		$xoopsTpl->assign('form', $search_form->render());
        break;

    case 'showall':
    case 'showallbyuser':
        include $GLOBALS['xoops']->path('header.php');
		$xoopsTpl->assign('showallbyuser', true);
    /* @var XoopsModuleHandler $module_handler */
		$module_handler = xoops_getHandler('module');
        $module         = $module_handler->get($mid);
        $results        = $module->search($queries, $andor, 20, $start, $uid);
        $count          = count($results);
        if (is_array($results) && $count > 0) {
            $next_results = $module->search($queries, $andor, 1, $start + 20, $uid);
            $next_count   = count($next_results);
            $has_next     = false;
            if (is_array($next_results) && $next_count == 1) {
                $has_next = true;
            }
            if ($action === 'showall') {
				$xoopsTpl->assign('showall', true);
				$keywords = '';
                if ($andor !== 'exact') {
                    foreach ($queries as $q) {
						$keywords .= htmlspecialchars(stripslashes($q));
                    }
                } else {
					$keywords .= htmlspecialchars(stripslashes($queries[0]));
                }
				$xoopsTpl->assign('keywords', $keywords);
            }
			$xoopsTpl->assign('showing', sprintf(_SR_SHOWING, $start + 1, $start + $count));
			$xoopsTpl->assign('module_name', $module->getVar('name'));
			$results_arr = array();
            for ($i = 0; $i < $count; ++$i) {
                if (isset($results[$i]['image']) && $results[$i]['image'] != '') {
					$results_arr['image_link'] = 'modules/' . $module->getVar('dirname') . '/' . $results[$i]['image'];
                } else {
					$results_arr['image_link'] = 'images/icons/posticon2.gif';
                }
				$results_arr['image_title'] = $module->getVar('name');
                if (!preg_match("/^http[s]*:\/\//i", $results[$i]['link'])) {
                    $results[$i]['link'] = 'modules/' . $module->getVar('dirname') . '/' . $results[$i]['link'];
                }
				$results_arr['link'] = $results[$i]['link'];
				$results_arr['link_title'] = $myts->htmlSpecialChars($results[$i]['title']);
                $results['uid'] = @(int)$results[$i]['uid'];
                if (!empty($results[$i]['uid'])) {
                    $uname = XoopsUser::getUnameFromId($results[$i]['uid']);
					$results_arr['uname'] = $uname;
					$results_arr['uname_link'] = XOOPS_URL . '/userinfo.php?uid=' . $results[$i]['uid'];
                }
				if (!empty($results[$i]['time'])){
					$results_arr['time'] = formatTimestamp((int)$results[$i]['time']);
				}
				$xoopsTpl->append_by_ref('results_arr', $results_arr);
				unset($results_arr);
            }
            $search_url = XOOPS_URL . '/search.php?query=' . urlencode(stripslashes(implode(' ', $queries)));
            $search_url .= "&mid={$mid}&action={$action}&andor={$andor}";
            if ($action === 'showallbyuser') {
                $search_url .= "&uid={$uid}";
            }
            if ($start > 0) {
                $prev = $start - 20;				
                $search_url_prev = $search_url . "&start={$prev}";
				$xoopsTpl->assign('previous', htmlspecialchars($search_url_prev));
            }
            if (false !== $has_next) {
                $next            = $start + 20;
                $search_url_next = $search_url . "&start={$next}";
				$xoopsTpl->assign('next', htmlspecialchars($search_url_next));
            }
        } else {
			$xoopsTpl->assign('nomatch', true);
        }
        include $GLOBALS['xoops']->path('include/searchform.php');
        $search_form->display();
        break;
}
include $GLOBALS['xoops']->path('footer.php');
