<?php
/*******************************************************
If 'Suggestion' is enabled ($min_sug_chars > 0),
this script takes over to fetch the suggestion from Sphider-plus databases.
If 'Media only' is selected in Search form, only Media keywords will be suggested.
Query input will be delivered via the JavaScript file 'scriptaculous.js' .
Suggestions will be placed into <div id='auto_suggest' /> by AJAX functionality,
performed again via the JavaScript file 'scriptaculous.js' .
***********************************************************/
//error_reporting(0); // suppress PHP messages
define("_SECURE",1); // define secure constant
$values = array();
$settings_dir = "../settings";
$language_dir = "../languages";
require_once("$settings_dir/database.php");
// retrieve the variables passed by AJAX framework
$keyword = trim(substr($_POST['query'], 0, 255));
$media_only = trim(substr($_POST['media_only'], 0, 1));
$type = trim(substr($_POST['type'], 0,6));
$catid = trim(substr($_POST['catid'], 0, 20));
$category = trim(substr($_POST['category'], 0, 20));
$db = trim(substr($_POST['db'], 0, 1));
$prefix = trim(substr($_POST['prefix'], 0, 20));
/*
//$keyword = "referent andrew";
//$keyword = "Referent Andrew";
//$keyword = "tischflä";
$keyword = "alla";
//$keyword = "Îλλα βίνÏεο";
//$keyword = "Îλλα";
$media_only = "";
$category = "-1";
$catid = "";
$type = "and";
*/
if (get_magic_quotes_gpc()==1) {
$keyword = stripslashes($keyword);
}
/*
echo "<br />keyword: $keyword<br />";
echo "<br />media_only: $media_only<br />";
echo "<br />type: $type<br />";
echo "<br />catid: $catid<br />";
echo "<br />category: $category<br />";
echo "<br />db: $db<br />";
echo "<br />prefix: $prefix<br />";
*/
// if requested by Search-form, overwrite default db number
if ($db > 0 && $db <= 5) {
$dbu_act = $db;
}
// if requested by Search-form, overwrite default table prefix
if ($prefix != 0 ) {
$mysql_table_prefix = $prefix;
}
// get active database
if ($dbu_act == '1') {
$db_con = db1_connect() ;
$success = @mysql_select_db ($database1, $db_con);
$mysql_table_prefix = $mysql_table_prefix1;
}
if ($dbu_act == '2') {
$db_con = db2_connect() ;
$success = @mysql_select_db ($database2, $db_con);
$mysql_table_prefix = $mysql_table_prefix2;
}
if ($dbu_act == '3') {
$db_con = db3_connect() ;
$success = @mysql_select_db ($database3, $db_con);
$mysql_table_prefix = $mysql_table_prefix3;
}
if ($dbu_act == '4') {
$db_con = db4_connect() ;
$success = @mysql_select_db ($database4, $db_con);
$mysql_table_prefix = $mysql_table_prefix4;
}
if ($dbu_act == '5') {
$db_con = db5_connect() ;
$success = @mysql_select_db ($database5, $db_con);
$mysql_table_prefix = $mysql_table_prefix5;
}
$plus_nr = '';
@include "".$settings_dir."/db".$dbu_act."/conf_".$mysql_table_prefix.".php"; // get configuration for this application
if (!$plus_nr) {
include "/admin/settings/backup/Sphider-plus_default-configuration.php";
}
$home_charset = strtoupper($home_charset);
// try to get the currently valid language
include "$language_dir/$language-language.php";
if ($auto_lng == 1) { // if enabled in Admin settings get country code
if ( isset ( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
$cc = substr( htmlspecialchars($_SERVER['HTTP_ACCEPT_LANGUAGE']), 0, 2);
$handle = @fopen ("$language_dir/$cc-language.php","r");
if ($handle) {
$language = $cc; // if available set language to users slang
include "$language_dir/$language-language.php";
@fclose($handle);
}
}
}
$sug_typ = '';
if ($show_media == '1') {
$sug_typ = $sph_messages["text"];
if ($media_only == '1') { // Text or Media suggestions
$sug_typ = $sph_messages["media"];
}
}
$keyword = addslashes($keyword);
if ($case_sensitive == 0) {
$keyword = lower_ent($keyword);
$keyword = lower_case($keyword);
}
if ($translit_el && $media_only) {
$keyword = translit_el($keyword);
}
if (strlen($keyword)< $min_sug_chars) { // if search string too small, do not search for keywords/phrases
$suggest_phrases = false;
$suggest_keywords = false;
}
$keyword = str_replace ("%20", " ", $keyword); // replace 'blank'
if (!strpos($keyword,' ')) { //check if search string is phrase
//$suggest_phrases = false;
}
// remove control character
$keyword = preg_replace("/!|\"|\*/", "",$keyword);
// convert all single quotes into standard quote
if ($quotes == '1') {
$all_quotes = array
(
"‘" => "\'",
"‘" => "\'",
"’" => "\'",
"’" => "\'",
"′" => "\'",
"′" => "\'",
"â" => "\'",
"â" => "\'",
"´" => "\'",
"`" => "\'"
);
reset($all_quotes);
while ($char = each($all_quotes)) {
$keyword = preg_replace("/".$char[0]."/i", $char[1], $keyword);
}
}
// convert all double quotes into standard quotations
if ($dup_quotes == '1') {
$all_quotes = array
(
"â" => "\"",
"â" => "\"",
"â" => "\""
);
reset($all_quotes);
while ($char = each($all_quotes)) {
$file = preg_replace("/".$char[0]."/i", $char[1], $file);
}
}
if(strlen($keyword) >= $min_sug_chars) {
// ***** enter here for media suggestions
if ($media_only =='1') {
$q1 = $keyword;
if ($keyword == '') $q1 = ' '; // prevent blank results for media search
if ($keyword == 'media:') $q1 = ''; // search for all media files in database /category
// get results from all involved databases
$media_results = array();
if ($db1_slv == 1) {
$db_con = db1_connect() ;
$success = @mysql_select_db ($database1, $db_con);
$mysql_table_prefix = $mysql_table_prefix1;
if ($category != '-1') {
// find all valid link_id's for a given category
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$media_results = get_mediasuggests($mysql_table_prefix, $q1, $category, $catid);
}
if ($db2_slv == 1) {
$db_con = db2_connect() ;
$success = @mysql_select_db ($database2, $db_con);
$mysql_table_prefix = $mysql_table_prefix2;
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$media_results2 = get_mediasuggests($mysql_table_prefix, $q1, $category, $catid);
$media_results = array_merge($media_results, $media_results2);
}
if ($db3_slv == 1) {
$db_con = db3_connect() ;
$success = @mysql_select_db ($database3, $db_con);
$mysql_table_prefix = $mysql_table_prefix3;
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$media_results3 = get_mediasuggests($mysql_table_prefix, $q1, $category, $catid);
$media_results = array_merge($media_results, $media_results3);
}
if ($db4_slv == 1) {
$db_con = db4_connect() ;
$success = @mysql_select_db ($database4, $db_con);
$mysql_table_prefix = $mysql_table_prefix4;
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$media_results4 = get_mediasuggests($mysql_table_prefix, $q1, $category, $catid);
$values = array_merge($media_results, $media_results4);
}
if ($db5_slv == 1) {
$db_con = db5_connect() ;
$success = @mysql_select_db ($database5, $db_con);
$mysql_table_prefix = $mysql_table_prefix5;
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$media_results5 = get_mediasuggests($mysql_table_prefix, $q1, $category, $catid);
$media_results = array_merge($media_results, $media_results5);
}
if ($media_results) {
echo '<ul>'; // send 'start' tag
foreach ($media_results as $_key => $_val) {
$etc = '';
if (strlen($_val[5]) > 35 && !stristr($_SERVER['HTTP_USER_AGENT'],'MSIE')) {
$etc = '<br />'; // no additional LF for IE
}
$count = $sph_messages["match"];
if ($home_charset == 'UTF-8') { // build suggestion content and send it
if ($show_hits == 'for_future_release') {
echo '<li><small><b>'. $_val[5] .'</b><span class="informal"> ( '.$sug_typ.' '.$count.')</small></span></li>'.$etc.'';
} else {
echo '<li><small><b>'. $_val[5] .'</small></b></li>'.$etc.'';
}
} else {
if ($show_hits == 'for_future_release') {
//echo '<li><small><b>'. utf8_encode($_val[5]) .'</b><span class="informal"> ('.$sug_typ.' '.$count.')</small></span></li>'.$etc.'';
echo '<li><small><b>'. $_val[5] .'</b><span class="informal"> ('.$sug_typ.' '.$count.')</small></span></li>'.$etc.'';
} else {
//echo '<li><small><b>'. utf8_encode($_val[5]) .'</b></small></li>'.$etc.'';
echo '<li><small><b>'. $_val[5] .'</b></small></li>'.$etc.'';
}
}
}
echo '</ul>'; // send 'end' tag
}
} else {
// ******** enter here for text suggestions
// get results from all involved databases
$values = array();
if ($db1_slv == 1) {
$db_con = db1_connect() ;
if ($prefix > '0' ) { // if requested by Search-form, overwrite default table prefix
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix1;
}
if ($category != '-1') {
// find all valid link_id's for a given category
$category_list = getcat_links ($category, $mysql_table_prefix);
}
if (!isset($category_list)) {
$category_list = array();
}
$values = get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix);
}
if ($db2_slv == 1) {
$db_con = db2_connect() ;
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix2;
}
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$values2 = get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix);
$values = array_merge($values, $values2);
}
if ($db3_slv == 1) {
$db_con = db3_connect() ;
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix3;
}
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$values3 = get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix);
$values = array_merge($values, $values3);
}
if ($db4_slv == 1) {
$db_con = db4_connect() ;
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix4;
}
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$values4 = get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix);
$values = array_merge($values, $values4);
}
if ($db5_slv == 1) {
$db_con = db5_connect() ;
if ($prefix > '0' ) {
$mysql_table_prefix = $prefix;
} else {
$mysql_table_prefix = $mysql_table_prefix5;
}
if ($category != '-1') {
$category_list = getcat_links ($category, $mysql_table_prefix);
}
$values5 = get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix);
$values = array_merge($values, $values5);
}
if ($min_sug_chars != '0' && is_array($values)) { // if we do have results, loop through them and add them to the output . Max. = $suggest_rows
arsort($values);
$sug_array = array_slice($values, 0, $suggest_rows);
echo '<ul>'; // send 'start' tag
foreach ($sug_array as $_key => $_val) {
if ($_val > 1) {
$count = $sph_messages["matches"];
if ($type == 'phrase') {
$phr = $sph_messages["phraseSearch"];
$count = "$count, $phr"; // display "results from phrase search"
}
} else {
$count = $sph_messages["match"];
if ($type == 'phrase') {
$phr = $sph_messages["phraseSearch"];
$count = "$count, $phr"; // display "results from phrase search"
}
}
// build suggestion content and send it
if ($show_hits == '1') {
echo '<li><b>'. $_key .'</b><span class="informal"><small> ('. $_val.' '.$sug_typ.' '.$count.')</small></span></li>';
} else {
echo '<li><b>'. $_key .'</b></li>';
}
}
echo '</ul>'; // send 'end' tag
}
}
unset ($result);
}
exit() ;
// Database1 connection
function db1_connect() {
global $mysql_host1, $mysql_user1, $mysql_password1, $database1;
$db_con1 = @mysql_pconnect ($mysql_host1, $mysql_user1, $mysql_password1);
if (!$db_con1) {
echo "<p><span class='red'> Mysql Server for database '$database1' not available! <br /></font></p>
<p><span class='blue sml'> Trying to reconnect to database . . .<br /> Cannot connect to database.<br /></p>";
} else {
$success1 = @mysql_select_db ($database1, $db_con1);
if (!$success1) {
echo "<p><span class='blue sml'><br /> Cannot choose database 1.<br /></p>";
} else {
return ($db_con1);
}
}
}
// Database2 connection
function db2_connect() {
global $mysql_host2, $mysql_user2, $mysql_password2, $database2;
$db_con2 = @mysql_pconnect ($mysql_host2, $mysql_user2, $mysql_password2);
if (!$db_con2) {
echo "<p><span class='red'> Mysql Server for database '$database2' not available! <br /></font></p>
<p><span class='blue sml'> Trying to reconnect to database . . .<br /> Cannot connect to database.<br /></p>";
} else {
$success2 = @mysql_select_db ($database2, $db_con2);
if (!$success2) {
echo "<p><span class='blue sml'><br /> Cannot choose database 2.<br /></p>";
} else {
return ($db_con2);
}
}
}
// Database3 connection
function db3_connect() {
global $mysql_host3, $mysql_user3, $mysql_password3, $database3;
$db_con3 = @mysql_pconnect ($mysql_host3, $mysql_user3, $mysql_password3);
if (!$db_con3) {
echo "<p><span class='red'> Mysql Server for database '$database3' not available! <br /></font></p>
<p><span class='blue sml'> Trying to reconnect to database . . .<br /> Cannot connect to database.<br /></p>";
} else {
$success3 = @mysql_select_db ($database3, $db_con3);
if (!$success3) {
echo "<p><span class='blue sml'><br /> Cannot choose database 3.<br /></p>";
} else {
return ($db_con3);
}
}
}
// Database4 connection
function db4_connect() {
global $mysql_host4, $mysql_user4, $mysql_password4, $database4;
$db_con4 = @mysql_pconnect ($mysql_host4, $mysql_user4, $mysql_password4);
if (!$db_con4) {
echo "<p><span class='red'> Mysql Server for database '$database4' not available! <br /></font></p>
<p><span class='blue sml'> Trying to reconnect to database . . .<br /> Cannot connect to database.<br /></p>";
} else {
$success4 = @mysql_select_db ($database4, $db_con4);
if (!$success4) {
echo "<p><span class='blue sml'><br /> Cannot choose database 4.<br /></p>";
} else {
return ($db_con4);
}
}
}
// Database5 connection
function db5_connect() {
global $mysql_host5, $mysql_user5, $mysql_password5, $database5;
$db_con5 = @mysql_pconnect ($mysql_host5, $mysql_user5, $mysql_password5);
if (!$db_con5) {
echo "<p><span class='red'> Mysql Server for database '$database5' not available! <br /></font></p>
<p><span class='blue sml'> Trying to reconnect to database . . .<br /> Cannot connect to database.<br /></p>";
} else {
$success5 = @mysql_select_db ($database5, $db_con5);
if (!$success5) {
echo "<p><span class='blue sml'><br /> Cannot choose database 5.<br /></p>";
} else {
return ($db_con5);
}
}
}
// find valid link_id's for preselected category
function getcat_links($category, $mysql_table_prefix) {
global $debug;
$allcats = get_catids($category, $mysql_table_prefix);
$catlist = implode(",", $allcats);
$query1 = "select link_id from ".$mysql_table_prefix."links, ".$mysql_table_prefix."sites, ".$mysql_table_prefix."categories, ".$mysql_table_prefix."site_category where ".$mysql_table_prefix."links.site_id = ".$mysql_table_prefix."sites.site_id and ".$mysql_table_prefix."sites.site_id = ".$mysql_table_prefix."site_category.site_id and ".$mysql_table_prefix."site_category.category_id in ($catlist)";
$result = mysql_query($query1);
if ($debug > '0') echo mysql_error();
$num_rows = mysql_num_rows($result);
if ($num_rows == 0) {
$possible_to_find = 0;
}
while ($row = mysql_fetch_row($result)) {
$category_list[$row[0]] = 1;
}
return ($category_list);
}
// convert ISO-8859-x entities into their lower case equivalents
function lower_ent($string) {
$ent = array
(
"Ä" => "Ä",
"Ä" => "Ä",
"Ä" => "Ä",
"Ľ" => "ľ",
"Å" => "Å",
"Å" => "Å",
"Å " => "Å¡",
"Ť" => "ť",
"Ž" => "ž",
"Ã" => "ä",
"Ã" => "ö",
"Ã" => "ü",
"Ä" => "ä",
"Ä" => "ä",
"Ö" => "ö",
"Ö" => "ö",
"Ü" => "ü",
"Ü" => "ü",
"Ã" => "Ã ",
"Ã" => "è",
"Ã" => "ì",
"Ã" => "ò",
"Ã" => "ù",
"Ã" => "é",
"Ã" => "Ã",
"Ã" => "ó",
"Ã" => "ú",
"Ã" => "ã",
"Ã" => "ñ",
"Ã" => "õ",
"Ũ" => "ũ",
"Ã" => "â",
"Ã" => "ê",
"Ã" => "î",
"Ã" => "ô",
"Ã" => "û",
"Ã
" => "Ã¥",
"Ů" => "ů",
"Ã" => "æ",
"Ã" => "ç",
"Ã" => "ø",
"Ã" => "ë",
"Ã" => "ï",
"Ä" => "Ä",
"İ" => "ı",
"Å" => "Å",
"Ħ" => "ħ",
"Ĥ" => "ĥ",
"Ĵ" => "ĵ",
"Ż" => "ż",
"Ä" => "Ä",
"Ä" => "Ä",
"Ŭ" => "Å",
"Å" => "Å",
"Ä" => "Ä",
"Å" => "Å",
"Ĺ" => "ĺ",
"Ä" => "Ä",
"Ű" => "ű",
"Å¢" => "Å£",
"Å" => "Å",
"Ä" => "Ä",
"Å" => "Å",
"Ã" => "á",
"Å" => "Å",
"Ź" => "ź",
"Å" => "Å",
"Ë" => "Ë",
"ĸ" => "Ë",
"Å" => "Å",
"Į" => "į",
"Ä" => "Ä",
"Ä" => "Ä",
"Ã" => "ð",
"Å
" => "Å",
"Å" => "Å",
"Ų" => "ų",
"Ã" => "ý",
"Ã" => "þ",
"Ä" => "Ä
",
"Ä" => "Ä",
"Ä¢" => "Ä£",
"Ī" => "ī",
"Ĩ" => "ĩ",
"Ķ" => "ķ",
"Ļ" => "ļ",
"Ŧ" => "ŧ",
"Ū" => "ū",
"Å" => "Å",
"Ä" => "Ä",
"á¸" => "á¸",
"á¸" => "á¸",
"áº" => "áº",
"áº" => "áº",
"Ṡ" => "ṡ",
"á¸" => "á¸",
"á¹" => "á¹",
"á¹" => "á¹",
"áº" => "áº
",
"Ŵ" => "ŵ",
"Ṫ" => "ṫ",
"Ŷ" => "ŷ"
);
reset($ent);
while ($char = each($ent)) {
$string = preg_replace("/".$char[0]."/i", $char[1], $string);
}
return ($string);
}
function lower_case($string) {
global $charSet, $home_charset, $greek, $cyrillic;
if ($charSet =='') {
$charSet = $home_charset;
}
$charSet = strtoupper($charSet);
// if required, convert Greek charset into lower case
if ($greek == '1' && ($charSet == 'UTF-8' || $charSet == 'ISO-8859-7' || $charSet == 'WINDOWS-1253')) {
$lower = array
(
"Î" => "α",
"Î" => "β",
"Î" => "γ",
"Î" => "δ",
"Î" => "ε",
"Î" => "ζ",
"Î" => "η",
"Î" => "θ",
"Î" => "ι",
"Î" => "κ",
"Î" => "λ",
"Î" => "μ",
"Î" => "ν",
"Î" => "ξ",
"Î" => "ο",
"Î " => "Ï",
"Ρ" => "Ï",
"Σ" => "Ï",
"Τ" => "Ï",
"Î¥" => "Ï
",
"Φ" => "Ï",
"Χ" => "Ï",
"ΨÏ" => "",
"Ω" => "Ï"
);
reset($lower);
while ($char = each($lower)) {
$string = preg_replace("/".$char[0]."/i", $char[1], $string);
}
}
// if required, convert Cyrillic charset into lower case
if ($cyrillic == '1' && ($charSet == 'UTF-8' || $charSet == 'ISO-8859-5' || $charSet == 'WINDOWS-1251' || $charSet == 'CP855')) {
$lower = array
(
"Ð" => "а", // basic Cyrillian alphabet
"Ð" => "б",
"Ð" => "в",
"Ð" => "г",
"Ò" => "Ò",
"Ð" => "Ñ",
"Ð" => "д",
"Ð" => "Ñ",
"Ð" => "е",
"Ð" => "Ñ",
"Ð" => "Ñ",
"Ð" => "ж",
"Ð" => "з",
"Ð
" => "Ñ",
"Ð" => "и",
"Ð" => "Ñ",
"Ð" => "Ñ",
"Ð" => "й",
"Ð" => "Ñ",
"Ð" => "к",
"Ð" => "Ñ",
"Ð" => "л",
"Ð" => "Ñ",
"Ð" => "м",
"Ð" => "н",
"Ð" => "Ñ",
"Ð" => "о",
"Ð" => "п",
"Ð " => "Ñ",
"С" => "Ñ",
"Т" => "Ñ",
"Ð" => "Ñ",
"У" => "Ñ",
"Ð" => "Ñ",
"Ф" => "Ñ",
"Ð¥" => "Ñ
",
"Ñ " => "Ñ¡", // ex Greek 'OMEGA'
"Ц" => "Ñ",
"Ч" => "Ñ",
"Ð" => "Ñ",
"Ш" => "Ñ",
"Щ" => "Ñ",
"Ъ" => "Ñ",
"Ы" => "Ñ",
"Ь" => "Ñ",
"Ы" => "Ñ",
"Ð" => "Ñ",
"Ю" => "Ñ",
"Я" => "Ñ",
"Ð" => "Ñ",
"Ð" => "Ñ",
"Ð" => "Ñ",
"Ð" => "Ñ",
"Ѥ" => "ѥ", // extended Cyrillic
"Ѧ" => "ѧ",
"Ѫ" => "ѫ",
"Ѩ" => "ѩ",
"Ѭ" => "Ñ",
"Ѯ" => "ѯ",
"Ѱ" => "ѱ",
"Ѳ" => "ѳ",
"Ѵ" => "ѵ",
"Ã" => "ë",
"Ä" => "Ä",
"Ǵ" => "ǵ",
"Ã" => "ê",
"áº" => "áº",
"Ã" => "ì",
"Ã" => "ï",
"JË" => "ǰ",
"LÌ" => "lÌ",
"NÌ" => "nÌ",
"Ä" => "Ä",
"Ḱ" => "ḱ",
"Ŭ" => "Å",
"DÌ" => "dÌ",
"Å" => "Å",
"Ã" => "û",
"Ã" => "â",
"GÌ" => "g",
"Ä" => "Ä",
"GÌ" => "g",
"Ä " => "Ä¡",
"Ä" => "Ä",
"Ž̦" => "ž",
"Ķ" => "ķ",
"KÌ" => "kÌ",
"á¹" => "á¹",
"á¹" => "á¹
",
"á¹" => "á¹",
"Ã" => "ò",
"Ã" => "ç",
"Å¢" => "Å£",
"Ã" => "ù",
"U" => "u",
"Ḩ" => "ḩ",
"CÌ" => "cÌ",
"Ḥ" => "ḥ",
"CÌ" => "cÌ",
"ÃÌ" => "çÌ",
"ZÌ" => "zÌ",
"Ã" => "ç",
"Ä" => "Ä",
"Ã" => "ä",
"Ä" => "Ä",
"ZÌ" => "zÌ",
"ZÌ" => "zÌ",
"Ź" => "ź",
"Ã" => "î",
"Ã" => "ö",
"Ã" => "ô",
"Ã" => "ü",
"Ű" => "ű",
"CÌ" => "cÌ",
"Ÿ" => "ÿ",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò" => "Ò",
"Ò " => "Ò¡",
"Ò¢" => "Ò£",
"Ò¤" => "Ò¥",
"Ò¦" => "Ò§",
"Ò¨" => "Ò©",
"Òª" => "Ò«",
"Ò¬" => "Ò",
"Ò®" => "Ò¯",
"Ò°" => "Ò±",
"Ò²" => "Ò³",
"Ò´" => "Òµ",
"Ò¶" => "Ò·",
"Ò¸" => "Ò¹",
"Òº" => "Ò»",
"Ò¼" => "Ò½",
"Ò¾" => "Ò¿",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó
" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó" => "Ó",
"Ó " => "Ó¡",
"Ó¢" => "Ó£",
"Ó¤" => "Ó¥",
"Ó¦" => "Ó§",
"Ó¨" => "Ó©",
"Óª" => "Ó«",
"Ó¬" => "Ó",
"Ó®" => "Ó¯",
"Ó°" => "Ó±",
"Ó²" => "Ó³",
"Ó´" => "Óµ",
"Ó¶" => "Ó·",
"Ó¸" => "Ó¹",
"Ó¼" => "Ó½",
"Ó¾" => "Ó¿",
"Ñ " => "Ñ¡", // historical Cyrillic
"Ñ¢" => "Ñ£",
"Ѥ" => "ѥ",
"Ѧ" => "ѧ",
"Ѩ" => "ѩ",
"Ѫ" => "ѫ",
"Ѭ" => "Ñ",
"Ѯ" => "ѯ",
"Ѱ" => "ѱ",
"Ѳ" => "ѳ",
"Ѵ" => "ѵ",
"Ѷ" => "ѷ",
"Ѹ" => "ѹ",
"Ѻ" => "ѻ",
"Ѽ" => "ѽ",
"Ѿ" => "ѿ",
"Ò" => "Ò",
"Ç" => "Ç",
"FÌ" => "fÌ",
"Ỳ" => "ỳ",
"�" => "ð",
"̉" => "̱",
"Ãâ" => "ò",
"Ãâ" => "ó",
"̉" => "̫",
"Ãâ¢" => "õ",
"̉" => "̦",
"Ãâ" => "÷",
"ÃË" => "ø",
"Ãâ¢" => "ù",
"ÃÅ¡" => "ú",
"Ãâº" => "û",
"ÃÅ" => "ý",
"Þ" => "þ",
"ß" => "ÿ",
"à" => "Ãâ¬",
"á" => "�",
"̢" => "̉",
"̣" => "̮",
"ä" => "Ãâ",
"ÃÂ¥" => "Ãâ¦",
"æ" => "Ãâ ",
"ç" => "Ãâ¡",
"è" => "ÃË",
"é" => "Ãâ°",
"̻" => "́ ",
"ë" => "Ãâ¹",
"ì" => "ÃÅ",
"ÃÂ" => "Ã?",
"î" => "Î",
"ï" => "�",
"Ã?" => "Ãâ",
"Ãâ" => "Ãâ",
"ÃÆ" => "Ãâ",
"Ãâ" => "Ãâ",
"Ãâ¦" => "Ãâ¢",
"Ãâ " => "Ãâ",
"Ãâ¡" => "Ãâ",
"ÃË" => "ÃË",
"Ãâ°" => "Ãâ¢",
"ÃÅ " => "ÃÅ¡",
"Ãâ¹" => "Ãâº",
"ÃÅ" => "ÃÅ",
"Î" => "Þ",
"�" => "ß"
);
reset($lower);
while ($char = each($lower)) {
$string = preg_replace("/".$char[0]."/i", $char[1], $string);
}
}
return (strtr($string, "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"abcdefghijklmnopqrstuvwxyz"));
}
// extract all parent cat_id's
function get_catids($parent, $mysql_table_prefix) {
global $debug;
$query = "SELECT * FROM ".$mysql_table_prefix."categories WHERE parent_num=$parent";
$result = mysql_query($query);
if ($debug > '0') echo mysql_error();
$arr[] = $parent;
if (mysql_num_rows($result) <> '') {
while ($row = mysql_fetch_array($result)) {
$id = $row[category_id];
$arr = sum_arrays($arr, get_catids($id));
}
}
return $arr;
}
function translit_el($string) {
// 1. replace Latin 's' at the end of multiple query words with the Greek 'Ï'
if(strstr($string, " ")){
$str_array = explode(" ", $string); // build an intermediate array
foreach ($str_array as $this_word) {
if (strrpos($this_word, "s") == strlen($this_word)-1) { // if 's' is last letter of this word
$str_array2[] = substr_replace($this_word, "Ï", strlen($this_word)-1);
} else {
$str_array2[] = $this_word; // no 's' as last letter was found, just use the input word
}
}
$string = implode(" ", $str_array2); // rebuild the string
} else {
// replace Latin 's' at the end of a single query word with the Greek 'Ï'
if (strrpos($string, "s") == strlen($string)-1) {
$string = substr_replace($string, "Ï", strlen($string)-1);
}
}
// 2. translit some specialities
$string = preg_replace('/TH/', "Î", $string);
$string = preg_replace('/th/', "θ", $string);
$string = preg_replace('/CH/', "Χ", $string);
$string = preg_replace('/ch/', "Ï", $string);
$string = preg_replace('/PS/', "Ψ", $string);
$string = preg_replace('/ps/', "Ï", $string);
$string = preg_replace('/PH/', "Φ", $string);
$string = preg_replace('/ph/', "Ï", $string);
// 3. translit upper case letters
$en = array("A","V","C","G","D","E","F","Z","I","K","L","M","N","X","O","P","Q","R","S","T","W","Y");
$el = array("Î","Î","Î","Î","Î","Î","Φ","Î","Î","Î","Î","Î","Î","Î","Î","Î ","Î","Ρ","Σ","Τ","Ω","Ψ");
//$el = array("Î","Î","Î","Î","Î","Î","Î","Î","Î","Î","Î","Î","Χ","Î","Î ","Î","Ρ","Σ","Τ","Î¥","Ω","Φ","Î","Ψ","Î");
$string = str_replace($en, $el, $string);
// 4. translit lower case letters
$en = array("a","b","v","c","g","d","e","f","h","z","i","k","l","m","n","x","o","p","q","r","s","t","u","w","y","Ä«");
$el = array("α","β","β","ε","γ","δ","ε","Ï","η","ζ","ι","κ","λ","μ","ν","ε","ο","Ï","θ","Ï","Ï","Ï","Ï
","Ï","Ï","η");
//$el = array("α","β","ξ","δ","ε","γ","η","ι","κ","λ","μ","ν","ο","Ï","θ","Ï","Ï","Ï","Ï
","Ï","Ï","Ï","Ï","ζ");
$string = str_replace($en, $el, $string);
return $string;
}
function remove_acc($string) {
global $type;
$acct_a = array("a;", "à ", "â", "Ã¥", "â", "ÃÆÃ¤", "ä", "ÃÆ\"ž", "Ãâ", "Ã", "ä", "á", "à ",
"à", "á", "á", "Ã", "À", "Ã", "Á");
$base_a = array("a", "a", "a", "a", "a", "a", "a", "A", "A", "A", "a", "a", "a",
"a", "a", "a", "A", "A", "A", "A");
$string = str_ireplace($acct_a, $base_a, $string);
$acct_c = array("Ä", "ç", "ç", "ç", "Ç", "Ä");
$base_c = array("c", "c", "c", "c", "C", "C");
$string = str_ireplace($acct_c, $base_c, $string);
$acct_e = array("Ä", "ê", "è", "ê", "é", "è", "è", "é", "é", "Ã", "È", "Ã", "É", "ÃË", "Ãâ°", "Ä");
$base_e = array("e", "e", "e", "e", "e", "e", "e", "e", "e", "E", "E", "E", "E", "E", "E", "E");
$string = str_ireplace($acct_e, $base_e, $string);
$acct_i = array("î", "ì", "ì", "Ã", "í","Ì", "Ã", "Í",
"ñ", "á", "Ã'", "ÿ" ); // "Ã" removed, because replaces the letter à => I
$base_i = array("i", "i", "i", "i", "i","I", "I", "I",
"ñ", "¡", "Ã", "¿");
$string = str_ireplace($acct_i, $base_i, $string);
$acct_o = array("ô", "ø", "Ã", "ô", "ó", "ò", "õ", "Ãâ", "̮̦", "ö", "ã¶", "ö",
"ó", "ò","ò", "ó", "ó", "Ã", "Ò", "Ã", "Ó");
$base_o = array("o", "o", "O", "o", "o", "o", "o", "O", "o", "o", "o", "o",
"O", "o", "O", "o", "o", "O", "O", "O", "O");
$string = str_ireplace($acct_o, $base_o, $string);
$acct_u = array("ÃÅ", "Å", "û", "ù", "ú", "û", "ÃÆÃ¼", "ü", "ÃÆÃ
\â", "ÃÅ", "Ã", "ü", "ú",
"ù", "ù", "ú", "ú", "Ã", "Ù", "Ã", "Ú");
$base_u = array("u", "u", "u", "u", "u", "u", "u", "u", "U", "U", "U", "u", "u",
"u", "u", "u", "u", "U", "U", "U", "U");
$string = str_ireplace($acct_u, $base_u, $string);
if ($type == "phrase" || $type == "tol"){ // make tolerant by replacing vowels with %
$string = rep_latvowels($string);
}
return $string;
}
// replace Greek accents with their pure vowels
function remove_acc_el($string) {
global $type;
$string = preg_replace('/α|á¼|á¼|á¼|á¼|á¼|á¼
|á¼|á¼|á½°|á½±|á½±|á¾|á¾|á¾|á¾|á¾|á¾
|á¾|á¾|á¾°|á¾±|á¾²|á¾³|á¾´|á¾¶|á¾·|ά|Ä/', "α", $string);
$string = preg_replace('/Î|á¼|á¼|á¼|á¼|á¼|á¼|á¼|á¼|Ὰ|á¾»|á¾»|á¾|á¾|á¾|á¾|á¾|á¾|á¾|á¾|Ᾰ|á¾¹|á¾¼|Î/', "Î", $string);
$string = preg_replace('/ε|á¼|á¼|á¼|á¼|á¼|á¼|á½²|á½³|á½³|Î|Ä/', "ε", $string);
$string = preg_replace('/Î|á¼|á¼|á¼|á¼|á¼|á¼|á¿|á¿|á¿|Î/', "Î", $string);
$string = preg_replace('/η|ή|á¼ |ἡ|á¼£|á¼£|ἤ|á¼¥|ἦ|á¼§|á½´|á½µ|á½µ|á¾|á¾|á¾|á¾|á¾|á¾|á¾|á¾|á¿|á¿|á¿|á¿|á¿/', "η", $string);
$string = preg_replace('/Î|Ἠ|Ἡ|Ἢ|Ἣ|Ἤ|á¼|á¼®|Ἧ|á¿|á¿|á¿|á¾|á¾|á¾|á¾|á¾|á¾|á¾|á¾|á¿/', "Î", $string);
$string = preg_replace('/ι|á¼°|á¼±|á¼²|á¼³|á¼´|á¼µ|á¼¶|á¼·|á½¶|á½·|á½·|á¿|á¿|á¿|Ï|á¿|á¿|á¿|á¿|ί|Î/', "ι", $string);
$string = preg_replace('/Ἰ|á¼¹|Ἲ|á¼»|á¼¼|á¼½|á¼¾|Ἷ|á¿|á¿|á¿|á¿|á¿/', "Ἰ", $string);
$string = preg_replace('/Ï|á½ |ὡ|á½¢|á½£|ὤ|á½¥|ὦ|á½§|á½¼|á½½|á½½|á¾ |ᾡ|á¾¢|á¾£|ᾤ|á¾¥|ᾦ|á¾§|ῲ|ῳ|á¿´|á¿¶|á¿·|Ï/', "Ï", $string);
$string = preg_replace('/Ω|Ὠ|Ὡ|Ὢ|Ὣ|Ὤ|á½|á½®|Ὧ|Ὼ|á¿»|á¿»|ᾨ|ᾩ|ᾪ|ᾫ|ᾬ|á¾|á¾®|ᾯ|ῼ/', "Ω", $string);
$string = preg_replace('/ο|á½|á½|á½|á½|á½|á½
|ὸ|á½¹|á½¹|Ï|ò|ô|Å/', "ο", $string);
$string = preg_replace('/Î|á½|á½|á½|á½|á½|á½|Ὸ|Ό|Ό/', "Î", $string);
$string = preg_replace('/Ï
|á½|á½|á½|á½|á½|á½|á½|á½|ὺ|á½»|á½»|ῦ|á¿ |á¿¡|Ï|á¿¢|á¿£|á¿£|á¿§|Ï/', "Ï
", $string);
$string = preg_replace('/Î¥|á½|á½|á½|á½|Ὺ|á¿« |á¿«|Ῠ|á¿©/', "Î¥", $string);
$string = preg_replace('/Ï|ῤ|á¿¥/', "Ï", $string);
$string = preg_replace('/Ρ|Ῥ/', "Ρ", $string);
if ($type == "tol"){ // make tolerant by replacing vowels with %
$string = rep_elvowels($string);
}
return $string;
}
// replace Latin vowels with a (MySQL) wildcard
function rep_latvowels($string) {
$get = array("a", "c", "e", "i", "o", "u");
$out = array("%", "%", "%", "%", "%", "%");
$string = str_ireplace($get, $out, $string);
return $string;
}
// replace Greek vowels with a (MySQL) wildcard
function rep_elvowels($string) {
$get = array("α", "ε", "η", "ι", "Ï", "ο", "Ï
", "Ï
");
$out = array("%", "%", "%", "%", "%", "%", "%", "%");
$string = str_ireplace($get, $out, $string);
return $string;
}
// replace UNICODE charset with MySQL equivalent
function conv_mysql($string) {
$get = array(
"utf-8",
"big-5",
"iso-8859-1",
"iso-8859-2",
"iso-8859-7",
"ISO-8859-8",
"ISO-8859-9",
"iso-8859-13",
"koi8-r",
"koi8-u",
"iso-646-se",
"us-ascii",
"euc-jp",
"shift-jis",
"cp-1251",
"euc_kr",
"gb-2312",
"windows-1250",
"ucs-2",
"cp-852",
"cp-866",
"cp-1256",
"cp-932",
"euc-jp"
);
$out = array(
"utf8",
"big5",
"latin1",
"latin2",
"greek",
"hebrew",
"latin7",
"latin5",
"koi8r",
"koi8u",
"swe7",
"ascii",
"ujis",
"sjis",
"cp1251",
"euckr",
"gb2312",
"cp1250",
"ucs2",
"cp852",
"cp866",
"cp1256",
"cp932",
"eucjpms"
);
$mysql = str_ireplace($get, $out, $string);
if ($mysql == $string) {
$mysql = "utf8";
}
return $mysql;
}
function get_mediasuggests($mysql_table_prefix, $q1, $category, $catid){
global $suggest_id3, $case_sensitive, $suggest_rows, $debug, $home_charset, $delim;
$all_media = array();
$media_results = array();
if ($suggest_id3 == '1') { // find suggestions also in ID3 tags
if ($case_sensitive =='0') {
$result = mysql_query("select * from ".$mysql_table_prefix."media
where LOWER(title) like '%".(mysql_real_escape_string($q1))."%'
OR LOWER(id3) like '%".(mysql_real_escape_string($q1))."%'
order by title, id3 ");
} else {
// distinct results for UTF-8
$result = mysql_query("select * from ".$mysql_table_prefix."media
where title like CONVERT(('%".(mysql_real_escape_string($q1))."%')USING utf8)
or id3 like CONVERT(('%".(mysql_real_escape_string($q1))."%')USING utf8)
order by title, id3 ");
}
} else {
if ($case_sensitive =='0') {
$result = mysql_query("select * from ".$mysql_table_prefix."media
where CONVERT(LOWER(title)USING utf8) like '%".(mysql_real_escape_string($q1))."%'
order by title, id3 ");
} else {
// distinct results for UTF-8
$result = mysql_query("select * from ".$mysql_table_prefix."media
where title like CONVERT(('%".(mysql_real_escape_string($q1))."%')USING utf8)
order by title, id3 ");
}
}
// collect all results
while ($row = mysql_fetch_row($result)) {
$row[5] = substr($row[5], 0, strpos($row[5], $delim));
$all_media[] = $row;
}
// if necessary, reduce to category valid links
if ($category != '-1') {
while (list($key, $value) = each($all_media)) {
// get site_id corresponding to this page
$result = mysql_query("select site_id from ".$mysql_table_prefix."links
where url = '$value[2]'");
if ($debug > '0') echo mysql_error();
$site_id = mysql_fetch_row($result);
// check for valid catid
$result = mysql_query("select * from ".$mysql_table_prefix."site_category
where site_id = '$site_id[0]' AND category_id ='$catid'");
if ($debug > '0') echo mysql_error();
// add valid link to result array
if (mysql_num_rows($result) == '1' ) {
$media_results[] = $value;
}
}
} else {
$media_results = $all_media; // no category search
}
$media_results = array_slice($media_results, 0, $suggest_rows); // limit number of suggestions
return $media_results;
}
function get_textsuggests($keyword, $type, $category, $category_list, $mysql_table_prefix){
global $suggest_history, $suggest_rows, $suggest_phrases, $case_sensitive, $suggest_keywords, $home_charset;
global $vowels, $noacc_el, $translit_el;
$values = array(); // will contain all suggested keywords
if ($suggest_history == '1') {
$result = mysql_query($sql = "SELECT query as keyword, max(results) as results
FROM {$mysql_table_prefix}query_log
WHERE results > 0 AND (query LIKE '$keyword%' OR query LIKE '\"$keyword%')
GROUP BY query ORDER BY results DESC
LIMIT $suggest_rows");
if($result && mysql_num_rows($result)){
while($row = mysql_fetch_array($result))
{
$values[$row['keyword']] = $row['result'];
}
}
}
$mysql_charset = conv_mysql($home_charset);
// ****** for 'phrase' search enter here
if ($suggest_phrases && $type == 'phrase') {
$values = fetch_phrasuggests($keyword, $category, $mysql_table_prefix, $mysql_charset);
/*
if ($translit_el == '1'){ // try to find a keyword transliterated into Greek
$el_values = array();
$keyword = translit_el($keyword);
$el_values = fetch_phrasuggests($keyword, $category, $mysql_table_prefix);
if (is_array($el_values)) {
$values = array_merge($values, $el_values);
}
}
*/
} elseif ($suggest_keywords) {
// ******** for single keyword search enter here
$values = fetch_txtsuggests($keyword, $category, $mysql_table_prefix);
if ($vowels == '1'){ // try to find a keyword without accents
$acc_values = array();
$keyword = remove_acc($keyword);
$acc_values = fetch_txtsuggests($keyword, $category, $mysql_table_prefix);
if ($values && $acc_values) {
$values = array_merge($values, $acc_values);
} else {
$values = $acc_values;
}
}
if ($noacc_el == '1'){ // try to find a keyword without Greek accents
$nel_values = array();
$keyword = remove_acc_el($keyword);
$nel_values = fetch_txtsuggests($keyword, $category, $mysql_table_prefix);
if ($nel_values) {
$values = array_merge($values, $nel_values);
}
}
if ($translit_el == '1'){ // try to find a keyword transliterated into Greek
if (!is_array($values)) { //if nothing found up to now
$values = array();
}
$el_values = array();
$keyword = translit_el($keyword);
$el_values = fetch_txtsuggests($keyword, $category, $mysql_table_prefix);
if (is_array($el_values)) {
$values = array_merge($values, $el_values);
}
}
}
return $values;
}
function fetch_txtsuggests($keyword, $category, $mysql_table_prefix) {
global $case_sensitive, $suggest_rows;
for ($i=0;$i<=15; $i++) {
$char = dechex($i);
$result = mysql_query($sql = "SELECT *, count(keyword) as results
FROM {$mysql_table_prefix}keywords INNER JOIN {$mysql_table_prefix}link_keyword$char USING (keyword_id)
WHERE keyword LIKE '$keyword%'
GROUP BY keyword
ORDER BY results desc
LIMIT $suggest_rows");
if($result && mysql_num_rows($result)) {
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
if ($category != '-1') { // if category, limit results
if ($category_list[$row['link_id']] == 1) {
$values[$row['keyword']] = $row['results'];
}
} else {
$values[$row['keyword']] = $row['results'];
}
}
}
}
return $values;
}
function fetch_phrasuggests($keyword, $category, $mysql_table_prefix, $mysql_charset) {
global $case_sensitive, $suggest_rows;
$_words = substr_count($keyword,' ') + 1;
// first try to find a phrase in full text
if ($case_sensitive == '0') {
$result = mysql_query($sql = "SELECT count(link_id) as results, SUBSTRING_INDEX(SUBSTRING(fulltxt,LOCATE('$keyword',CONVERT(LOWER(fulltxt)USING utf8))), ' ', '$_words') as keyword FROM {$mysql_table_prefix}links where CONVERT(LOWER(fulltxt)USING utf8) like '%$keyword%'
GROUP BY SUBSTRING_INDEX( SUBSTRING( CONVERT(LOWER(fulltxt)USING utf8), LOCATE( '$keyword', CONVERT(LOWER(fulltxt)USING utf8) ) ) , ' ', '$_words' ) LIMIT $suggest_rows");
} else {
$result = mysql_query($sql = "SELECT count(link_id) as results, SUBSTRING_INDEX(SUBSTRING(fulltxt,LOCATE('$keyword', fulltxt)), ' ', '$_words') as keyword FROM {$mysql_table_prefix}links where fulltxt like '%$keyword%'
GROUP BY SUBSTRING_INDEX( SUBSTRING( fulltxt, LOCATE( '$keyword', fulltxt ) ) , ' ', '$_words' ) LIMIT $suggest_rows");
}
if($result && mysql_num_rows($result)) {
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
if ($category != '-1') { // if category, limit results
if ($category_list[$row['link_id']] == 1) {
if ($row['keyword']) {
$values[$row['keyword']] = $row['results'];
}
}
} else {
$values[$row['keyword']] = $row['results'];
}
}
}
// additionally try to find the phrase in title tag
if ($case_sensitive == '0') {
$result = mysql_query($sql = "SELECT count(link_id) as results, SUBSTRING_INDEX(SUBSTRING(title,LOCATE('$keyword',CONVERT(LOWER(title)USING utf8))), ' ', '$_words') as keyword FROM {$mysql_table_prefix}links where CONVERT(LOWER(title)USING utf8) like '%$keyword%'
GROUP BY SUBSTRING_INDEX( SUBSTRING( LOWER(title), LOCATE( '$keyword', LOWER(title) ) ) , ' ', '$_words' ) LIMIT $suggest_rows");
} else {
$result = mysql_query($sql = "SELECT count(link_id) as results, SUBSTRING_INDEX(SUBSTRING(title,LOCATE('$keyword',title))), ' ', '$_words') as keyword FROM {$mysql_table_prefix}links where title like '%$keyword%'
GROUP BY SUBSTRING_INDEX( SUBSTRING( CONVERT((title)USING utf8), LOCATE( '$keyword', title ) ) ) , ' ', '$_words' ) LIMIT $suggest_rows");
}
if($result && mysql_num_rows($result)) {
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
if ($category != '-1') { // if category, limit results
if ($category_list[$row['link_id']] == 1) {
if ($row['keyword']) {
$values[$row['keyword']] = $row['results'];
}
}
} else {
$values[$row['keyword']] = $row['results'];
}
}
}
return $values;
}
function sum_arrays($arr1, $arr2) {
foreach ($arr2 as $elem) {
$arr1[] = $elem;
}
return $arr1;
}
?>