<%@ language="javascript" codepage="1252"%> <% /** check config file */ if (!file_exists("./config/db.asp") || !file_exists("./config/config.asp")) { header("Location: ./install.asp"); } /** include files */ include("./config/db.asp"); /** db config */ include("./config/config.asp"); /** global config */ %> <% if (!file_exists("./config/styles.asp")) { include("./data/styles.asp"); } else { include("./config/styles.asp"); } /** styles */ if (!file_exists("./config/stop_words.asp")) { include("./data/stop_words.asp"); } else { include("./config/stop_words.asp"); } /** stop words array */ /** connect to db */ $db_connect = database_connect($db.get("host"),$db.get("login"),$db.get("passwd")); $db_select = database_select_db($db.get("name"),$db_connect); if (!isset($_GET.get("p"))) $_GET.set("p", 1); if (!isset($_GET.get("w"))) $_GET.set("w", 0); /** result on page */ $num_array = new Array(10,20,30,50); if (isset($_GET.get("num")) && in_array($_GET.get("num"),$num_array, true)) $result_on_page = $_GET.get("num"); else $result_on_page = $config.get("result_on_page"); /** client ip address */ if (Request.ServerVariables("HTTP_X_FORWARDED_FOR").Item) { $ip_addr = Request.ServerVariables("REMOTE_ADDR")+":"+Request.ServerVariables("HTTP_X_FORWARDED_FOR"); } else if (getHostByAddr(Request.ServerVariables("REMOTE_ADDR").Item) != Request.ServerVariables("REMOTE_ADDR").Item) { $ip_addr = Request.ServerVariables("REMOTE_ADDR").Item+"("+getHostByAddr(Request.ServerVariables("REMOTE_ADDR").Item)+")"; } else { $ip_addr = Request.ServerVariables("REMOTE_ADDR").Item; } /** query constants */ var $as_q = "", $as_epq = "", $as_oq = "", $as_eq = ""; var $q = new Array(), $epq = new Array(), $oq = new Array(), $eq = new Array(); /** db tbl name */ $tbl_name = $system.get("prefix")+"_search"; /** result */ $print_result = false; $print_error = false; $print_min = false; /** check query from advanced search */ if (isset($_GET.get("q"))) { $as_q = trim($_GET.get("q")); } if (isset($_GET.get("epq")) && strlen(trim($_GET.get("epq"))) > 0) { $as_epq = "\""+$_GET.get("epq")+"\""; } if (isset($_GET.get("oq"))) { $oq_array = preg_split("/ +/",$_GET.get("oq")); $as_oq = join(" OR ",$oq_array); } if (isset($_GET.get("eq")) && strlen(trim($_GET.get("eq"))) > 0) { $eq_array = preg_split("/ +/",$_GET.get("eq")); //foreach ($eq_array as $eq_word) for(var i=0; i<$eq_array.length; ++i) { $as_eq += " -"+$eq_array[i]; } } /** query */ $form_query = $as_q+" "+$as_oq+" "+$as_epq+" "+$as_eq; $form_query = trim(preg_replace("/ +/"," ", $form_query)); $page_query = $form_query = str_replace("'","",stripslashes(stripslashes($form_query))); $query = preg_split("/( +)/s",stripslashes($form_query)); if (count($query) > 0) { /** opredelyaem peremennie */ var $epq_mode = 0, $epq_i = 0, $oq_mode = 0; /** reset array */ reset($query); /** while array */ for(var i=0; i<$query.length; ++i) { // while (list($i,$word) = each($query)) { /** epq */ if ($epq_mode != 1 && strlen($query[i]) <= $config.get("search_min")) { continue; } if ($epq_mode == 0) { /** esli est " v nachale stoki */ if (preg_match("/^\\\"/",$query[i])) { /** esli net " v konce stroki */ if (!preg_match("/\\\"$/",$query[i])) { $epq[$epq_i] = $query[i].toString().substr(1); $epq_mode = 1; continue; } else { $epq[$epq_i] = $query[i].toString().substr(1,strlen($query[i].toString())-2); $epq_i ++; continue; } } } else { /** esli est v konce " */ if (preg_match("/\\\"$/",$query[i])) { $epq[$epq_i] = $epq[$epq_i]+" "+$query[i].substr(0,(strlen($query[i])-1)); $epq_i ++; $epq_mode = 0; continue; } else { $epq[$epq_i] = $epq[$epq_i]+" "+$query[i]; continue; } } /** oq */ if ($oq_mode == 0) { /** esli sled OR */ if (isset($query[(i + 1)]) && $query[(i + 1)] == "OR") { $oq_mode = 1; $oq[$oq.length] = $query[i]; continue; } } else { if ($query[i] == "OR") continue; else { if (isset($query[(i + 1)]) && $query[(i + 1)] == "OR") { $oq[$oq.length] = $query[i]; continue; } else { $oq[$oq.length] = $query[i]; $oq_mode = 0; continue; } } } /** eq */ if (preg_match("/^(\\-)/",$query[i])) { $eq[$eq.length] = $query[i].substr(1); continue; } /** q */ $q[$q.length] = $query[i]; } } if (isset($_GET.get("q")) && strlen($form_query) < 3) { $print_min = true; } var $rules = new Assoc(); var $q_clean = new Array(), $oq_clean = new Array(), $eq_clean = new Array(); /** delaem zapros k db esli suschestvuet zapros na poisk */ if ($form_query && !$print_min) { $r_q = new Assoc(); $r_epq = new Assoc(); $r_oq = new Assoc(); $r_eq = new Assoc(); $count_q = count($q); $count_epq = count($epq); $count_oq = count($oq); $count_eq = count($eq); $rules_res = database_query("SELECT * FROM ["+$system.get("prefix")+"_rules] ORDER BY [rules]"); while ($rules_row = database_fetch_array($rules_res)) { $rules.set($rules_row.get("rules"), $rules_row.get("url")); } /** boolean query (so vsemi slovami) */ if ($count_q > 0) { /** ignore stop words && min symbols */ for(var i=0; i<$q.length; ++i) { // foreach ($q as $q_word) { if (!in_array($q[i],$stop_words,true) || strlen($q[i]) >= $config.get("search_min")) $q_clean[$q_clean.length] = $q[i]; if (isset($rules.get($q[i]))) { database_query("INSERT INTO ["+$system.get("prefix")+"_query] VALUES(getdate(),'"+tsql_escape($page_query)+"','1','"+Request.ServerVariables("HTTP_REFERER")+"','"+$ip_addr+"')"); if($rules.get($q[i]).toLowerCase().indexOf("http://") != 0) { header("Location: http://"+$rules.get($q[i])); } else { header("Location: "+$rules.get($q[i])); } } } /** check mysql version > 4.0.1 && on/off BOOLEAN MODE */ /* $boolean_mode = 0; $boolean_str = ""; $database_version = split("\.", database_get_server_info()); if ($database_version[0] == "4") { if ($database_version[1] == 0 && $database_version[2]{1} > 0) $boolean_mode = 1; if ($database_version[1] > 0) $boolean_mode = 1; } if ($database_version[0] > "4") $boolean_mode = 1; if ($boolean_mode == 1) $boolean_str = " IN BOOLEAN MODE"; */ $where_q = join(" ",$q_clean); $res_q = database_query("SELECT * FROM ["+$tbl_name+"] WHERE [ignore]='0' and [text] LIKE '%"+$where_q+"%'"); while ($row_q = database_fetch_array($res_q)) { $r_q.set($row_q.get("id"), $row_q); } } /** tochnoe sovpadenie (s tochnoy frazoy) */ if ($count_epq > 0) { if ($count_epq > 1) $where_epq = "("+join("|",$epq)+")"; else $where_epq = join("",$epq); $res_epq = database_query("SELECT * FROM ["+$tbl_name+"] WHERE [ignore]='0' and [text] LIKE '%"+$where_epq+"%'"); while ($row_epq = database_fetch_array($res_epq)) { $r_epq.set($row_epq.get("id"), $row_epq); } } /** zapros na OR (so lubim iz slov) */ if ($count_oq > 0) { // ignore stop words && min symbols for(var i=0; i<$oq.length; ++i) { // foreach ($oq as $oq_word) { if (!in_array($oq[i],$stop_words, true) || strlen($oq[i]) >= $config.get("search_min")) { $oq_clean[$oq_clean.length] = $oq[i]; } } var sSQL = "SELECT * FROM ["+$tbl_name+"] WHERE [ignore]='0' and ("; for(var i=0; i<$oq_clean.length; ++i) { if(i > 0) sSQL += "OR [text] LIKE '%"+tsql_escape($oq_clean[i])+"%' "; else sSQL += "[text] LIKE '%"+tsql_escape($oq_clean[i])+"%' "; } sSQL += ") "; $res_oq = database_query(sSQL); while ($row_oq = database_fetch_array($res_oq)) { $r_oq.set($row_oq.get("id"), $row_oq); } } /** zapros (bez slov) */ if ($count_eq > 0) { for(var i=0; i<$eq.length; ++i) { // foreach ($eq as $eq_word) { // ignore stop words && min symbols if (!in_array($eq[i],$stop_words,true) || strlen($eq[i]) >= $config.get("search_min")) { $eq_clean[$eq_clean.length] = $eq[i]; } } var sSQL = "SELECT * FROM ["+$tbl_name+"] WHERE [ignore]='0' AND "; for(var i=0; i<$eq_clean.length; ++i) { if(i > 0) sSQL += " AND [text] NOT LIKE '%"+tsql_escape($eq_clean[i])+"%'"; else sSQL += "[text] NOT LIKE '%"+tsql_escape($eq_clean[i])+"%'"; } $res_eq = database_query(sSQL); while ($row_eq = database_fetch_array($res_eq)) { $r_eq.set($row_eq.get("id"), $row_eq); } } /** opredelyaem result array */ var $result = new Assoc(); var $search_res = new Array(); /** all result array */ $all = $r_q.concat($r_epq).concat($r_oq).concat($r_eq); if (count($all) > 0) { reset ($all); /** validate result */ var $x = 0; var $y = 0; for(var $i=0; $i<$all.length; ++$i) { // while (list($i,$row) = each($all)) { $x = 0; $y = 0; if ($count_q > 0) { $x ++; if ($r_q.get($all.m_names[$i])) $y ++; } if ($count_epq > 0) { $x ++; if ($r_epq.get($all.m_names[$i])) $y ++; } if ($count_oq > 0) { $x ++; if ($r_oq.get($all.m_names[$i])) $y ++; } if ($count_eq > 0) { $x ++; if (isset($r_eq.get($all.m_names[$i]))) $y ++; } if ($x == $y) { $result.set($all.m_names[$i], $all.m_items[$i]); } } /** create pattern for preg */ if (count($epq) > 0) { $q[$q.length] = join(" ",$epq); } $pattern = join("|",$q); if (count($q) > 0 && count($oq) > 0) { $pattern += "|"; } if (count($oq)) $pattern = join("|",$oq); $pattern_match = "/("+$pattern+")/siU"; $pattern_replace = "/("+$pattern+")/siU"; reset($result); for(var i=0; i<$result.length; ++i) { // while (list(,$row) = each($result)) { $match = preg_match_all($pattern_match, $result.m_items[i].get("text")); $search_res[i] = new Assoc("rel", count($match[0]), "1", $result.m_items[i].get("title"), "2", "", "3", $result.m_items[i].get("url"), "4", preg_replace("/^(http\\:///)/siU","\\2",$result.m_items[i].get("url")), "5", $result.m_items[i].get("size"), "6", $result.m_items[i].get("date")); $text_array = split("\|",str_replace(" ","",$result.m_items[i].get("text"))); $w = 0; for(var j=0; j<$text_array.length; ++j) { // foreach ($text_array as $string) { if (preg_match($pattern_match, $text_array[j])) { $w ++; if ($w > $config.get("result_count_str")) { continue; } $search_res[i].set(2, $search_res[i].get(2) + " "+preg_replace($pattern_replace,"\\1",$text_array[j])+" "); } } $search_res[i].set(2, trim($search_res[i].get(2))); } /** check isset result */ if (count($search_res) > 0) { /** sort by relevantnost */ function relevance($a, $b) { return strcmp($b.get("rel"),$a.get("rel")); } //usort($search_res, "relevance"); $count_result = count($search_res); $print_result = 1; } else $print_error = 1; } else { /** no found result */ $print_error = 1; } } /** read header and footer */ $header_tpl = "./tpl/header.tpl"; $footer_tpl = "./tpl/footer.tpl"; if(file_exists($header_tpl)) { $fp_header = fopen($header_tpl, "r"); $header_content = fread($fp_header, -1); fclose($fp_header); } else { $header_content = ""; } if(file_exists($footer_tpl)) { $fp_footer = fopen($footer_tpl, "r"); $footer_content = fread($fp_footer, -1); fclose($fp_footer); } else { $footer_content = ""; } /** url */ $search_url = $config.get("site_addr")+String.fromCharCode(47)+$config.get("folder")+String.fromCharCode(47); /** print header */ Response.Write($header_content); /** include and print quick search form */ include("./form.asp"); /** if isset error -> print error */ if ($print_error == 1) { $count_result = 0; Response.Write("

"+$config.get("label_error_found")+Server.HTMLEncode(" \""+$page_query+"\"")+"

"); } else if ($print_min == 1) { $count_result = 0; Response.Write("

"+$config.get("label_error_min")+"

"); } /** pishem v db zapros */ if ($_GET.get("w") == "0" && isset($_GET.get("q"))) { database_query("INSERT INTO ["+$system.get("prefix")+"_query] VALUES(getdate(),'"+tsql_escape($page_query)+"','"+tsql_escape($count_result)+"','"+Request.ServerVariables("HTTP_REFERER")+"','"+$ip_addr+"')"); } /** if isset result -> print result */ if ($print_result == 1) { Response.Write("


"); var $rec = record_on_page($count_result, $result_on_page, $_GET.get("p")); // reset($search_res); /** print result */ for(var $i=$rec.get("recstart"); $i<$rec.get("recstart") + $rec.get("reclimit"); ++$i) { if(!$search_res[$i]) { continue; } // while (list(, $value) = each($search_res)) { Response.Write("

"); if ($sp_style.get("result_title") == "1") { $link = ""+$search_res[$i].get("1")+""; } else { $link = $link = ""+$search_res[$i].get("1")+""; } if ($sp_style.get("result_titletop") == "1") { Response.Write($link+"
"); } if ($search_res[$i].get("2")) { Response.Write(""+$search_res[$i].get("2")+""); } $details = new Array(); if ($sp_style.get("result_url") == "1" || $sp_style.get("result_date") == "1" || $sp_style.get("result_date") == "1") { if ($sp_style.get("result_url") == "1") { $details[$details.length] = $search_res[$i].get("4"); } if ($sp_style.get("result_size") == "1") { $details[$details.length] = $search_res[$i].get("5"); } if ($sp_style.get("result_date") == "1") { $details[$details.length] = $search_res[$i].get("6"); } Response.Write("
"+join(" - ", $details)+""); } if ($sp_style.get("result_titletop") == "0") { Response.Write("
"+$link); } } /** esli bolshe chem 1 starnica */ if ($rec.get("reclimit") < $count_result) { Response.Write(echo_on_page($rec, $search_url+"?q="+Server.URLEncode($page_query)+"&w=1&num="+$result_on_page+"&p=")); } } /** print footer */ Response.Write($footer_content); %>