<? /* Jorge - frontend for mod_logdb - ejabberd server-side message archive module. Copyright (C) 2009 Zbigniew Zolkiewski This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ require_once("headers.php"); $search_phase = $_POST['query']; $next_link = $_GET['a']; // for pagination $predefined = $_GET['b']; // for predefined if ($predefined) { if($enc->decrypt_url($predefined) === true) { $search_phase = "from:".$enc->jid; } else { unset($search_phase); unset($predefined); } } if ($next_link) { if($enc->decrypt_url($next_link) === true) { $tslice_next = $enc->tslice; $search_phase = $enc->search_phase; $offset_arch = $enc->offset_arch; $offset_day = $enc->offset_day; $tag_count = $enc->tag_count; } else { unset ($next_link); unset ($search_phase); } } if ($tag_count=="t") { $start_from = $offset_day; } else{ $start_from = null; } $plain_phase = $search_phase; // fix me require_once("upper.php"); //need to initialize counter here $r=0; // Check if user have set up OwnName $db->get_own_name(); if ($db->result->own_name) { $own_name = $db->result->own_name; } else{ $own_name = false; } // we need to rewrite this part internaly... if ($search_phase!="") { // check if we are using parametrized search or not $qquery = is_query_from($search_phase); // parametric search if ($qquery[from] == "t") { $user_chat_search = "1"; // temp hack unset($search_phase); list($user_name, $server) = split("@", $qquery[talker]); $db->get_user_id($user_name); $user_name = $db->result->user_id; $db->get_server_id($server); $server = $db->result->server_id; $search_phase=$qquery[query]; } if ($search_phase) { if ($db->create_search_results_table() === false) { $html->alert_message($oper_fail[$lang]); } else { $score="score"; } } //main table if ($time2_start AND $time2_end) { $html->status_message($search_warn[$lang].': '.$time2_start.' - '.$time2_end); } else { $time2_start = null; $time2_end = null; } $html->set_overview('<h2>'.$search_res[$lang].'</h2><table align="center" border="0" cellspacing="0" class="ff"> <tr class="header"><td width="150">'.$time_t[$lang].'</td><td>'.$talks[$lang].'</td><td>'.$thread[$lang].'</td><td>'.$score.'</td></tr> <tr class="spacer"><td colspan="4"></td></tr>' ); if ($offset_arch) { $type_p="6"; } else { $type_p="1"; } // run optimized query in specyfic conditions if ($qquery[words]=="t" AND $qquery[from]=="t") { $type_p="8"; } if ($type_p==="1" OR $type_p==="8") { $db->get_uniq_chat_dates($time2_start, $time2_end, false, $offset_arch, $user_name,$server); } elseif($type_p==="6") { $db->get_uniq_chat_dates($time2_start, $time2_end, true, $offset_arch, $user_name,$server); } debug(DEBUG,"Selected search type: $type_p (first stage)"); $result = $db->result; // query offsets init for calculations: $arch_table = count($result); $external=0; $internal = $offset_day; // set string for searching if ($search_phase) { $db->set_user_query($search_phase); } foreach($result as $entry) { $external++; $time_slice = $entry["at"]; // sub query if ($search_phase) { $type="4"; } if ($user_chat_search) { if ($qquery['words']=="t") { $type="5"; } elseif($qquery['words'] == "f") { $type="7"; } } $a++; if ($type==="4") { $db->search_query($time_slice); } elseif($type==="5") { $db->search_query_in_user_chat($user_name,$server,$time_slice,$start_from); } elseif($type==="7") { $db-> search_query_chat_stream($user_name,$server,$time_slice,$start_from); } debug(DEBUG,"Selected search type: $type (second stage)"); $search_result = $db->result; $num_rows = count($search_result); $day_mark=0; if ($num_rows!="0") { foreach ($search_result as $results) { // if there is no "from:" clausule perform normal search if ($type!="7") { $body = base64_encode($results[body]); if ($db->insert_data_to_result_table ( $results[ts], $time_slice, $results[peer_name_id], $results[peer_server_id], $results[direction], $body, $results[score], $results[ext] ) === false ) { $html->alert_message($oper_fail[$lang]); } } else { $internal++; $day_mark++; // we like colors dont we? if ($results["direction"] == "to") { $col="e0e9f7"; } else { $col="e8eef7"; } $to_user = $results["peer_name_id"]; $to_server=$results["peer_server_id"]; // let's make a link $to_base = $enc->crypt_url("tslice=$time_slice&peer_name_id=$to_user&peer_server_id=$to_server"); // time calc $pass_to_next = $results["ts"]; $new_d = $results["ts"]; $time_diff = abs((strtotime("$old_d") - strtotime(date("$new_d")))); $old_d = $pass_to_next; // split line if ($time_diff>$split_line AND $day_mark>1 AND $type!="4") { $in_minutes = round(($time_diff/60),0); $html->set_body('<tr class="splitl"> <td colspan="5" style="font-size: 10px;">'.verbose_split_line($in_minutes,$verb_h[$lang],$in_min[$lang]).'<hr size="1" noshade="noshade" style="color: #cccccc;"></td></tr>'); } // talker and server names $db->get_user_name($results[peer_name_id]); $talk = $db->result->username; $db->get_server_name($results[peer_server_id]); $sname = $db->result->server_name; // cleaning username $jid = htmlspecialchars($talk); $html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'" style="cursor: pointer;" bgcolor="'.$col.'" onclick="window.open(\''.$view_type.'?a='.$to_base.'\');" onMouseOver="this.bgColor=\'c3d9ff\';" onMouseOut="this.bgColor=\'#'.$col.'\';"> <td width="120" style="text-align: center;">'.$results["ts"].'</td> '); // username from user roster $talk = query_nick_name($ejabberd_roster,$talk,$sname); // if there is no user in roster - advise that if ($talk=="f") { $talk=$not_in_r[$lang]; } // threaded view if ($results["direction"] == "from") { $out=$talk; $tt=$tt+1; $aa=0; } else { $out = TOKEN; $aa=$aa+1; $tt=0; } if ($aa<2 AND $tt<2) { $html->set_body('<td style="text-align: left;"> '); if ($out === TOKEN) { if ($own_name !== false) { $html->set_body(cut_nick(htmlspecialchars($own_name))); } else{ $html->set_body(cut_nick(htmlspecialchars($out))); } } else { $html->set_body(cut_nick(htmlspecialchars($out))); } $html->set_body(' </td>'); } else { $html->set_body('<td style="text-align: right;"> -</td>'); } // end threaded view // message body $body_message=wordwrap(str_replace("\n","<br>",htmlspecialchars($results["body"])),107,"<br>",true); $html->set_body('<td width="700">'.$body_message.'</td>'); // run pagination code only if search contains from: clausule /* The pagination code havent been changed after upgrade to search_engine_v2 - it work well so if one want to improve it f.e. by adding "back" button be my guest...current code is nightmare :/ */ $r=$r+1; debug(DEBUG,"all: $r, num_r: $num_rows, internal: $internal"); if ($r==$num_search_results) { if ($num_rows>$internal) { debug(DEBUG,"-->more results in this day...$entry[at] offset: $internal"); $tag_count="t"; } $next_r=$external+$offset_arch; debug(DEBUG,"before cutdown: $next_r"); // back to one day and continue with offset if ($tag_count=="t") { $next_r=$next_r-1; } debug(DEBUG,"after cutdown: $next_r"); debug(DEBUG,"Internal: $internal, offset: $offset_day, is_tag: $s_variables[tag_count]"); // if the same day - we increase offset if ($internal==$offset_day AND $s_variables[tag_count] == "t") { $internal=$internal+$offset_day; debug(DEBUG,"Increasing offset..."); } // hack if ($qquery[from] == "t") { $plain_phase=str_replace("@","//",$plain_phase); } $trange = $enc->crypt_url("time_start=$time2_start&time_end=$time2_end"); $lnk_n = $enc->crypt_url("tslice=$entry[at]&offset_arch=$next_r&offset_day=$internal&search_phase=$plain_phase&tag_count=$tag_count"); $html->set_body('<tr class="spacer"><td colspan="4"></td></tr> <tr class="maint" style="background-image: url(img/bar_new.png); background-repeat:repeat-x; font-weight: bold; color: #fff;"> <td colspan="2" style="text-align: left;"> <a href="search_v2.php?a='.$lnk_p.'"></a></td> <td colspan="2" style="text-align: right;"> <a href="search_v2.php?a='.$lnk_n.'&c='.$trange.'">'.$search_next[$lang].'</a></td></tr> '); break 2; } } } } else{ // if we haven't found anything increase counter by one... $b++; } $start_from = null; // reset... $internal=0; $day_mark=1; if ($num_rows!=0 AND $type=="7") { if ($arch_table == $external) { $html->set_body('<tr height="6" class="spacerb"><td colspan="3" style="text-align: center;"><small>'.$no_more[$lang].'</small></td></tr>'); } elseif($type=="7") { $html->set_body('<tr height="6" class="spacer"><td colspan="3" style="text-align: center;"><small>'.$nx_dy[$lang].'</small></td></tr>'); // initialize thread $aa="0"; $tt="0"; } } // end of main loop } // if normal search: if ($type!="7" AND $type!==NULL) { $db->get_search_results(); $result = $db->result; $num_results = count($result); $html->set_body('<tr class="maint"><td colspan="4" style="text-align: center; font-weight: normal;">'.$search_tip[$lang].' <b>'.$num_results.'</b>'.$search_why[$lang].'</td></tr> <tr class="spacerb"><td colspan="5"></td></tr>'); foreach ($result as $dat) { //building link: $to_base = $enc->crypt_url("tslice=$dat[time_slice]&peer_name_id=$dat[peer_name_id]&peer_server_id=$dat[peer_server_id]"); // get the name of user that we was talking to $db->get_user_name($dat[peer_name_id]); $talk = $db->result->username; // get it's server name $db->get_server_name($dat[peer_server_id]); $sname = $db->result->server_name; // cleanup jid $jid = htmlspecialchars($talk); // color every second line... if ($col=="e0e9f7") { $col="e8eef7"; } else { $col="e0e9f7"; } // get username from user roster: $talk = query_nick_name($ejabberd_roster,$talk,$sname); // if user is not in list, advise about that if ($talk === "" ) { $talk=$not_in_r[$lang]; } // now we want to know who was talking to who... if ($dat["direction"] == "to") { $fr=$to_u[$lang]; } else { $fr=$from_u[$lang]; } // ... and what was talking, and format that ... $body_talk = wordwrap(str_replace("\n","<br>",htmlspecialchars(base64_decode($dat["body"]))),107,"<br>",true); // advise user if chat is deleted. Extension=1 stands for "Chat temporary deleted" or "Chat awaiting deletion" if ($dat[ext] == 1) { $html->set_body('<tr bgcolor="b5b5b5"><td colspan="4" style="text-align: center; font-weight: bold;">'.$marked_as_d[$lang].'</td></tr>'); } // opening line if ($dat[ext]!=1) { $html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'" style="cursor: pointer;" bgcolor="'.$col.'" onclick="window.location=\''.$view_type.'?a='.$to_base.'\'" onMouseOver="this.bgColor=\'c3d9ff\';" onMouseOut="this.bgColor=\'#'.$col.'\';">'); } else { $html->set_body('<tr id="pretty" title="'.$jid.'@'.htmlspecialchars($sname).'" style="cursor: pointer;" bgcolor="b5b5b5" onclick="window.location=\'trash.php\'">'); } // content $html->set_body('<td width="120" style="text-align: center;">'.$dat["ts"].'</td> <td style="text-align: left;">'.$fr.' '.cut_nick($talk).' </td> <td width="700">'.$body_talk.'</td> <td style="text-align: center;">'.round($dat[score],2).'</td> </tr>' ); } $html->set_body('<tr class="spacer" height="1px"><td colspan="5"></td></tr><tr class="foot" height="15px"><td colspan="5"></td></tr>'); } if($a==$b) { $html->set_body('<tr><td colspan="4" style="text-align: center;"><b>'.$no_result[$lang].'</b></td></tr>'); } $html->set_body('</table>'); } else { // if user input is empty: $html->set_body('<br><br><center><b>'.$search1[$lang].'</b></center><br><br><br><br>'); } require_once("footer.php"); ?>