charset"); $display_date = $lang['l_results']; if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != '') { $back_page = $_SERVER['HTTP_REFERER']; } else { $back_page = BASE.$phpiCal_config->default_view.'.php?cal='.$cal.'&getdate='.$getdate; } $query = ''; $search_valid = false; if (isset($_GET['query']) && $_GET['query'] != '') { $query = $_GET['query']; $search_valid = true; } $search_box = ''; $search_box .= '
'."\n". '
'."\n". ''."\n". ''."\n". ''."\n". ''."\n". ''."\n". '
'."\n". '
'; $search_started = getmicrotime(); if ($search_valid) { $format_search_arr = format_search($query); if (!$format_search_arr[0]) { $formatted_search = ''.$no_query_lang.''; } else { $formatted_search = $format_search_arr[0]; } if (isset($master_array) && is_array($master_array)) { foreach($master_array as $date_key_tmp => $date_tmp) { if (is_array($date_tmp)) { foreach($date_tmp as $time_tmp) { if (is_array($time_tmp)) { foreach ($time_tmp as $uid_tmp => $event_tmp) { if (is_array($event_tmp)) { if (!isset($the_arr[$uid_tmp]) || isset($event_tmp['exception'])) { #print_r($format_search_arr); #print_r($event_tmp); #echo "
this event:".$event_tmp['event_text']."
"; $results1 = false; $results2 = false; if (isset($event_tmp['event_text'])) { $results1 = search_boolean($format_search_arr,$event_tmp['event_text']); } if (!$results1 && isset($event_tmp['description'])) { $results2 = search_boolean($format_search_arr,$event_tmp['description']); } if ($results1 || $results2) { $event_tmp['date'] = $date_key_tmp; if (isset($event_tmp['recur'])) { $event_tmp['recur'] = format_recur($event_tmp['recur']); } if (isset($the_arr[$uid_tmp])) { $the_arr[$uid_tmp]['exceptions'][] = $event_tmp; } else { $the_arr[$uid_tmp] = $event_tmp; } } } } } } } } } } } else { $formatted_search = ''.$lang['l_no_query'].''; } $search_ended = getmicrotime(); $search_took = number_format(($search_ended-$search_started),3); // takes a boolean search and formats it into an array // use with sister function search_boolean() function format_search($search_str) { // init arrays $and_arr = array(); $or_arr = array(); $not_arr = array(); $or_str_arr = array(); $search_str = strtolower($search_str); if ($search_str == ' ') return array(false,$and_arr,$or_arr,$not_arr); // clean up search string $search_str = trim($search_str); $search_str = str_replace(' and ', ' ', $search_str); $search_str = str_replace(' - ', ' ', $search_str); $search_str = preg_replace('[[:space:]]+',' ', $search_str); $search_str = str_replace(' not ', ' -', $search_str); // start out with an AND array of all the items $and_arr = explode(' ', $search_str); $count = count($and_arr); $j = 0; // build an OR array from the items in AND for($i=0;$i<$count;$i++) { if ($i != 0 && $and_arr[$i] == 'or') { while ($and_arr[$i] == 'or') { $or_arr[$j][] = $and_arr[$i-1]; array_splice($and_arr,$i-1,2); $i--; } if (isset($and_arr[$i])) { $or_arr[$j][] = $and_arr[$i]; array_splice($and_arr,$i,1); } $or_str_arr[$j] = implode(' OR ', $or_arr[$j]); $j++; } } // build a NOT array from the items in AND foreach($and_arr as $key => $val) { if (substr($val,0,1) == '-') { $not_arr[] = substr($val,1); array_splice($and_arr,$key,1); } elseif(substr($val,0,1) == '+') { $and_arr[] = substr($val,1); array_splice($and_arr,$key,1); } } // prepare our formatted search string if (count($and_arr) > 1) { $final_str_arr[] = implode(' AND ', $and_arr); } elseif (isset($and_arr[0]) && $and_arr[0] != '') { $final_str_arr[] = $and_arr[0]; } if (count($or_str_arr) > 1) { $final_str_arr[] = implode(' AND ', $or_str_arr); } elseif (isset($or_str_arr[0]) && $or_str_arr[0] != '') { $final_str_arr[] = $or_str_arr[0]; } if (count($not_arr) > 1) { $final_str_arr[] = '-'.implode(' AND -', $not_arr); } elseif (isset($not_arr[0]) && $not_arr[0] != '') { $final_str_arr[] = '-'.$not_arr[0]; } if (count($final_str_arr) > 1) { $formatted_search = ''.implode(' AND ', $final_str_arr).''; } else { $formatted_search = ''.$final_str_arr[0].''; } return array($formatted_search, $and_arr, $or_arr, $not_arr); } // takes an array made by format_search() and checks to see if it // it matches against a string function search_boolean($needle_arr, $haystack) { // init arrays $and_arr = $needle_arr[1]; $or_arr = $needle_arr[2]; $not_arr = $needle_arr[3]; if (!$needle_arr[0]) return false; if ((sizeof($and_arr) == 0) && (sizeof($or_arr) == 0) && (sizeof($not_arr) == 0)) return false; // compare lowercase versions of the strings $haystack = strtolower($haystack); // check against the NOT foreach($not_arr as $s) { if (is_string(strstr($haystack,$s)) == true) { return false; } } // check against the AND foreach($and_arr as $s) { #echo "haystack: $haystack
needle: $s
"; if (is_string(strstr($haystack,$s)) == false) { return false; } } // check against the OR foreach($or_arr as $or) { $is_false = true; foreach($or as $s) { if (substr($s,0,1) == '-') { if (is_string(strstr($haystack,substr($s,1))) == false) { $is_false = false; break; } } elseif (is_string(strstr($haystack,$s)) == true) { $is_false = false; break; } } if ($is_false) return false; } // if we haven't returned false, then we return true # echo "return true
"; return true; } function format_recur($arr) { global $format_recur_lang, $monthsofyear_lang, $daysofweek_lang; $d = $format_recur_lang['delimiter']; $int = ''; $freq = ''; if (isset($arr['INTERVAL']) && isset($arr['FREQ'])) { $int = $arr['INTERVAL']; $tmp = (($int == '1') ? 0 : 1); $freq = $arr['FREQ']; $freq = $format_recur_lang[$freq][$tmp]; } if (isset($arr['COUNT'])) $for = str_replace('%int%',$arr['COUNT'],$format_recur_lang['count']); elseif (isset($arr['UNTIL'])) $for = str_replace('%date%',$arr['UNTIL'], $format_recur_lang['until']); else $for = ''; $print = $format_recur_lang['start']; $print = str_replace('%int%', $int, $print); $print = str_replace('%freq%', $freq, $print); $print = str_replace('%for%', $for, $print); if (isset($arr['BYMONTH'])) { $list = ''; $last = count($arr['BYMONTH']) - 1; foreach ($arr['BYMONTH'] as $key => $month) { if ($key == $last) $list .= $monthsofyear_lang[($month-1)]; else $list .= $monthsofyear_lang[($month-1)].$d; } $print .= '
'."\n"; $print .= str_replace('%list%', $list, $format_recur_lang['bymonth']); } if (isset($arr['BYMONTHDAY'])) { $list = ''; if ($arr['BYMONTHDAY'][(count($arr['BYMONTHDAY']) - 1)] == '0') unset($arr['BYMONTHDAY'][$last]); $last = count($arr['BYMONTHDAY']) - 1; foreach ($arr['BYMONTHDAY'] as $key => $day) { preg_match('/(-{0,1})([0-9]{1,2})/',$day,$regs); list($junk,$sign,$day) = $regs; if ($sign != '') $list .= $sign; if ($key == $last) $list .= $day; else $list .= $day.$d; } $print .= '
'."\n"; $print .= str_replace('%list%', $list, $format_recur_lang['bymonthday']); } if (isset($arr['BYDAY'])) { $list = ''; $last = count($arr['BYDAY']) - 1; foreach ($arr['BYDAY'] as $key => $day) { preg_match('/([-\+]{0,1})([0-9]{0,1})([A-Z]{2})/',$day,$regs); list($junk,$sign,$day_num,$day_txt) = $regs; $num = two2threeCharDays($day_txt,false); if ($sign != '') $list .= $sign; if ($day_num != '') $list .= $day_num.' '; if ($key == $last) $list .= $daysofweek_lang[$num]; else $list .= $daysofweek_lang[$num].$d; } $print .= '
'."\n"; $print .= str_replace('%list%', $list, $format_recur_lang['byday']); } return $print; } $page = new Page(BASE.'templates/'.$phpiCal_config->template.'/search.tpl'); $page->draw_search($page); $page->replace_files(array( 'header' => BASE.'templates/'.$phpiCal_config->template.'/header.tpl', 'footer' => BASE.'templates/'.$phpiCal_config->template.'/footer.tpl', 'sidebar' => BASE.'templates/'.$phpiCal_config->template.'/sidebar.tpl', 'event_js' => BASE.'functions/event.js', )); $page->replace_tags(array( 'version' => $phpiCal_config->phpicalendar_version, 'default_path' => $phpiCal_config->default_path, 'formatted_search' => $formatted_search, 'l_results' => $lang['l_results'], 'l_query' => $lang['l_query'], 'l_starting_on' => $lang['l_starting_on'], 'l_time' => $lang['l_time'], 'l_summary' => $lang['l_summary'], 'l_location' => $lang['l_location'], 'l_description' => $lang['l_description'], 'l_recurring_event' => $lang['l_recurring_event'], 'l_exception' => $lang['l_exception'], 'l_no_results' => $lang['l_no_results'], 'search_box' => $search_box, 'charset' => $phpiCal_config->charset, 'template' => $phpiCal_config->template, 'cal' => $cal, 'getdate' => $getdate, 'cpath' => $cpath, 'calendar_name' => $cal_displayname, 'display_date' => $display_date, 'rss_powered' => $rss_powered, 'rss_available' => '', 'rss_valid' => '', 'show_goto' => '', 'is_logged_in' => '', 'current_view' => $current_view, 'style_select' => '', 'l_goprint' => $lang['l_goprint'], 'l_preferences' => $lang['l_preferences'], 'l_calendar' => $lang['l_calendar'], 'l_legend' => $lang['l_legend'], 'l_tomorrows' => $lang['l_tomorrows'], 'l_jump' => $lang['l_jump'], 'l_todo' => $lang['l_todo'], 'l_day' => $lang['l_day'], 'l_week' => $lang['l_week'], 'l_month' => $lang['l_month'], 'l_year' => $lang['l_year'], 'l_subscribe' => $lang['l_subscribe'], 'l_download' => $lang['l_download'], 'l_this_months' => $lang['l_this_months'], 'l_powered_by' => $lang['l_powered_by'], 'l_this_site_is' => $lang['l_this_site_is'] )); $page->output(); #echo "
";
#print_r($the_arr);
#echo "
"; ?>