PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/phpical2/search.php

https://gitlab.com/endomorphosis/fusenews
PHP | 356 lines | 289 code | 44 blank | 23 comment | 82 complexity | 424d02e3694f2b5996707269cada651a MD5 | raw file
  1. <?php
  2. define('BASE','./');
  3. $current_view = 'search';
  4. require_once(BASE.'functions/ical_parser.php');
  5. require_once(BASE.'functions/list_functions.php');
  6. require_once(BASE.'functions/template.php');
  7. header("Content-Type: text/html; charset=$phpiCal_config->charset");
  8. $display_date = $lang['l_results'];
  9. if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != '') {
  10. $back_page = $_SERVER['HTTP_REFERER'];
  11. } else {
  12. $back_page = BASE.$default_view.'.php?cal='.$cal.'&amp;getdate='.$getdate;
  13. }
  14. $search_valid = false;
  15. if (isset($_GET['query']) && $_GET['query'] != '') {
  16. $query = $_GET['query'];
  17. $search_valid = true;
  18. }
  19. $search_box = '';
  20. $search_box .=
  21. '<form action="search.php" method="get">'."\n".
  22. '<input type="hidden" name="cpath" value="'.$cpath.'">'."\n".
  23. '<input type="hidden" name="cal" value="'.$cal.'">'."\n".
  24. '<input type="hidden" name="getdate" value="'.$getdate.'">'."\n".
  25. '<input type="text" size="15" name="query" value="'.$query.'">'."\n".
  26. '<INPUT type="image" src="templates/'.$phpiCal_config->template.'/images/search.gif" border=0 height="19" width="18" name="submit" value="Search">'."\n".
  27. '</form>';
  28. $search_started = getmicrotime();
  29. if ($search_valid) {
  30. $format_search_arr = format_search($query);
  31. if (!$format_search_arr[0]) {
  32. $formatted_search = '<b>'.$no_query_lang.'</b>';
  33. } else {
  34. $formatted_search = $format_search_arr[0];
  35. }
  36. if (isset($master_array) && is_array($master_array)) {
  37. foreach($master_array as $date_key_tmp => $date_tmp) {
  38. if (is_array($date_tmp)) {
  39. foreach($date_tmp as $time_tmp) {
  40. if (is_array($time_tmp)) {
  41. foreach ($time_tmp as $uid_tmp => $event_tmp) {
  42. if (is_array($event_tmp)) {
  43. if (!isset($the_arr[$uid_tmp]) || isset($event_tmp['exception'])) {
  44. #print_r($format_search_arr);
  45. #echo "<br>this event:".$event_tmp['event_text']."<br>";
  46. $results1 = search_boolean($format_search_arr,$event_tmp['event_text']);
  47. if (!$results1) {
  48. $results2 = search_boolean($format_search_arr,$event_tmp['description']);
  49. }
  50. if ($results1 || $results2) {
  51. $event_tmp['date'] = $date_key_tmp;
  52. if (isset($event_tmp['recur'])) {
  53. $event_tmp['recur'] = format_recur($event_tmp['recur']);
  54. }
  55. if (isset($the_arr[$uid_tmp])) {
  56. $the_arr[$uid_tmp]['exceptions'][] = $event_tmp;
  57. } else {
  58. $the_arr[$uid_tmp] = $event_tmp;
  59. }
  60. }
  61. }
  62. }
  63. }
  64. }
  65. }
  66. }
  67. }
  68. }
  69. } else {
  70. $formatted_search = '<b>'.$no_query_lang.'</b>';
  71. }
  72. $search_ended = getmicrotime();
  73. $search_took = number_format(($search_ended-$search_started),3);
  74. // takes a boolean search and formats it into an array
  75. // use with sister function search_boolean()
  76. function format_search($search_str) {
  77. // init arrays
  78. $and_arr = array();
  79. $or_arr = array();
  80. $not_arr = array();
  81. $or_str_arr = array();
  82. $search_str = strtolower($search_str);
  83. if ($search_str == ' ') return array(false,$and_arr,$or_arr,$not_arr);
  84. // clean up search string
  85. $search_str = trim($search_str);
  86. $search_str = str_replace(' and ', ' ', $search_str);
  87. $search_str = str_replace(' - ', ' ', $search_str);
  88. $search_str = ereg_replace('[[:space:]]+',' ', $search_str);
  89. $search_str = str_replace(' not ', ' -', $search_str);
  90. // start out with an AND array of all the items
  91. $and_arr = explode(' ', $search_str);
  92. $count = count($and_arr);
  93. $j = 0;
  94. // build an OR array from the items in AND
  95. for($i=0;$i<$count;$i++) {
  96. if ($i != 0 && $and_arr[$i] == 'or') {
  97. while ($and_arr[$i] == 'or') {
  98. $or_arr[$j][] = $and_arr[$i-1];
  99. array_splice($and_arr,$i-1,2);
  100. $i--;
  101. }
  102. if (isset($and_arr[$i])) {
  103. $or_arr[$j][] = $and_arr[$i];
  104. array_splice($and_arr,$i,1);
  105. }
  106. $or_str_arr[$j] = implode('</b> OR <b>', $or_arr[$j]);
  107. $j++;
  108. }
  109. }
  110. // build a NOT array from the items in AND
  111. foreach($and_arr as $key => $val) {
  112. if (substr($val,0,1) == '-') {
  113. $not_arr[] = substr($val,1);
  114. array_splice($and_arr,$key,1);
  115. } elseif(substr($val,0,1) == '+') {
  116. $and_arr[] = substr($val,1);
  117. array_splice($and_arr,$key,1);
  118. }
  119. }
  120. // prepare our formatted search string
  121. if (count($and_arr) > 1) {
  122. $final_str_arr[] = implode('</b> AND <b>', $and_arr);
  123. } elseif (isset($and_arr[0]) && $and_arr[0] != '') {
  124. $final_str_arr[] = $and_arr[0];
  125. }
  126. if (count($or_str_arr) > 1) {
  127. $final_str_arr[] = implode('</b> AND <b>', $or_str_arr);
  128. } elseif (isset($or_str_arr[0]) && $or_str_arr[0] != '') {
  129. $final_str_arr[] = $or_str_arr[0];
  130. }
  131. if (count($not_arr) > 1) {
  132. $final_str_arr[] = '-'.implode('</b> AND <b>-', $not_arr);
  133. } elseif (isset($not_arr[0]) && $not_arr[0] != '') {
  134. $final_str_arr[] = '-'.$not_arr[0];
  135. }
  136. if (count($final_str_arr) > 1) {
  137. $formatted_search = '<b>'.implode('</b> AND <b>', $final_str_arr).'</b>';
  138. } else {
  139. $formatted_search = '<b>'.$final_str_arr[0].'</b>';
  140. }
  141. return array($formatted_search, $and_arr, $or_arr, $not_arr);
  142. }
  143. // takes an array made by format_search() and checks to see if it
  144. // it matches against a string
  145. function search_boolean($needle_arr, $haystack) {
  146. // init arrays
  147. $and_arr = $needle_arr[1];
  148. $or_arr = $needle_arr[2];
  149. $not_arr = $needle_arr[3];
  150. if (!$needle_arr[0]) return false;
  151. if ((sizeof($and_arr) == 0) &&
  152. (sizeof($or_arr) == 0) &&
  153. (sizeof($not_arr) == 0)) return false;
  154. // compare lowercase versions of the strings
  155. $haystack = strtolower($haystack);
  156. // check against the NOT
  157. foreach($not_arr as $s) {
  158. if (is_string(strstr($haystack,$s)) == true) {
  159. return false;
  160. }
  161. }
  162. // check against the AND
  163. foreach($and_arr as $s) {
  164. #echo "haystack: $haystack<br>needle: $s<br>";
  165. if (is_string(strstr($haystack,$s)) == false) {
  166. return false;
  167. }
  168. }
  169. // check against the OR
  170. foreach($or_arr as $or) {
  171. $is_false = true;
  172. foreach($or as $s) {
  173. if (substr($s,0,1) == '-') {
  174. if (is_string(strstr($haystack,substr($s,1))) == false) {
  175. $is_false = false;
  176. break;
  177. }
  178. } elseif (is_string(strstr($haystack,$s)) == true) {
  179. $is_false = false;
  180. break;
  181. }
  182. }
  183. if ($is_false) return false;
  184. }
  185. // if we haven't returned false, then we return true
  186. # echo "return true<br>";
  187. return true;
  188. }
  189. function format_recur($arr) {
  190. global $format_recur_lang, $monthsofyear_lang, $daysofweek_lang;
  191. $d = $format_recur_lang['delimiter'];
  192. $int = $arr['INTERVAL'];
  193. $tmp = (($int == '1') ? 0 : 1);
  194. $freq = $arr['FREQ'];
  195. $freq = $format_recur_lang[$freq][$tmp];
  196. if (isset($arr['COUNT'])) $for = str_replace('%int%',$arr['COUNT'],$format_recur_lang['count']);
  197. elseif (isset($arr['UNTIL'])) $for = str_replace('%date%',$arr['UNTIL'], $format_recur_lang['until']);
  198. else $for = '';
  199. $print = $format_recur_lang['start'];
  200. $print = str_replace('%int%', $int, $print);
  201. $print = str_replace('%freq%', $freq, $print);
  202. $print = str_replace('%for%', $for, $print);
  203. if (isset($arr['BYMONTH'])) {
  204. $list = '';
  205. $last = count($arr['BYMONTH']) - 1;
  206. foreach ($arr['BYMONTH'] as $key => $month) {
  207. if ($key == $last) $list .= $monthsofyear_lang[($month-1)];
  208. else $list .= $monthsofyear_lang[($month-1)].$d;
  209. }
  210. $print .= '<br />'."\n";
  211. $print .= str_replace('%list%', $list, $format_recur_lang['bymonth']);
  212. }
  213. if (isset($arr['BYMONTHDAY'])) {
  214. $list = '';
  215. if ($arr['BYMONTHDAY'][(count($arr['BYMONTHDAY']) - 1)] == '0') unset($arr['BYMONTHDAY'][$last]);
  216. $last = count($arr['BYMONTHDAY']) - 1;
  217. foreach ($arr['BYMONTHDAY'] as $key => $day) {
  218. ereg('(-{0,1})([0-9]{1,2})',$day,$regs);
  219. list($junk,$sign,$day) = $regs;
  220. if ($sign != '') $list .= $sign;
  221. if ($key == $last) $list .= $day;
  222. else $list .= $day.$d;
  223. }
  224. $print .= '<br />'."\n";
  225. $print .= str_replace('%list%', $list, $format_recur_lang['bymonthday']);
  226. }
  227. if (isset($arr['BYDAY'])) {
  228. $list = '';
  229. $last = count($arr['BYDAY']) - 1;
  230. foreach ($arr['BYDAY'] as $key => $day) {
  231. ereg('([-\+]{0,1})([0-9]{0,1})([A-Z]{2})',$day,$regs);
  232. list($junk,$sign,$day_num,$day_txt) = $regs;
  233. $num = two2threeCharDays($day_txt,false);
  234. if ($sign != '') $list .= $sign;
  235. if ($day_num != '') $list .= $day_num.' ';
  236. if ($key == $last) $list .= $daysofweek_lang[$num];
  237. else $list .= $daysofweek_lang[$num].$d;
  238. }
  239. $print .= '<br />'."\n";
  240. $print .= str_replace('%list%', $list, $format_recur_lang['byday']);
  241. }
  242. return $print;
  243. }
  244. $page = new Page(BASE.'templates/'.$phpiCal_config->template.'/search.tpl');
  245. $page->draw_search($page);
  246. $page->replace_files(array(
  247. 'header' => BASE.'templates/'.$phpiCal_config->template.'/header.tpl',
  248. 'footer' => BASE.'templates/'.$phpiCal_config->template.'/footer.tpl',
  249. 'sidebar' => BASE.'templates/'.$phpiCal_config->template.'/sidebar.tpl',
  250. 'event_js' => BASE.'functions/event.js',
  251. ));
  252. $page->replace_tags(array(
  253. 'version' => $phpiCal_config->phpicalendar_version,
  254. 'default_path' => $phpiCal_config->default_path,
  255. 'formatted_search' => $formatted_search,
  256. 'l_results' => $lang['l_results'],
  257. 'l_query' => $lang['l_query'],
  258. 'l_starting_on' => $lang['l_starting_on'],
  259. 'l_time' => $lang['l_time'],
  260. 'l_summary' => $lang['l_summary'],
  261. 'l_location' => $lang['l_location'],
  262. 'l_description' => $lang['l_description'],
  263. 'l_recurring_event' => $lang['l_recurring_event'],
  264. 'l_exception' => $lang['l_exception'],
  265. 'l_no_results' => $lang['l_no_results'],
  266. 'search_box' => $search_box,
  267. 'charset' => $phpiCal_config->charset,
  268. 'template' => $phpiCal_config->template,
  269. 'cal' => $cal,
  270. 'getdate' => $getdate,
  271. 'cpath' => $cpath,
  272. 'calendar_name' => $cal_displayname,
  273. 'display_date' => $display_date,
  274. 'rss_powered' => $rss_powered,
  275. 'rss_available' => '',
  276. 'rss_valid' => '',
  277. 'show_search' => $show_search,
  278. 'next_month' => $next_month,
  279. 'prev_month' => $prev_month,
  280. 'show_goto' => '',
  281. 'is_logged_in' => '',
  282. 'list_jumps' => $list_jumps,
  283. 'list_icals' => $list_icals,
  284. 'list_years' => $list_years,
  285. 'list_months' => $list_months,
  286. 'list_weeks' => $list_weeks,
  287. 'legend' => $list_calcolors,
  288. 'current_view' => $current_view,
  289. 'style_select' => $style_select,
  290. 'sidebar_date' => $sidebar_date,
  291. 'l_goprint' => $lang['l_goprint'],
  292. 'l_preferences' => $lang['l_preferences'],
  293. 'l_calendar' => $lang['l_calendar'],
  294. 'l_legend' => $lang['l_legend'],
  295. 'l_tomorrows' => $lang['l_tomorrows'],
  296. 'l_jump' => $lang['l_jump'],
  297. 'l_todo' => $lang['l_todo'],
  298. 'l_day' => $lang['l_day'],
  299. 'l_week' => $lang['l_week'],
  300. 'l_month' => $lang['l_month'],
  301. 'l_year' => $lang['l_year'],
  302. 'l_subscribe' => $lang['l_subscribe'],
  303. 'l_download' => $lang['l_download'],
  304. 'l_this_months' => $lang['l_this_months'],
  305. 'l_powered_by' => $lang['l_powered_by'],
  306. 'l_this_site_is' => $lang['l_this_site_is']
  307. ));
  308. $page->output();
  309. #echo "<pre>";
  310. #print_r($the_arr);
  311. #echo "</pre>";
  312. ?>