<?
/*
NOTE: I'm leaving this in the comments here, full disclosure, because I don't want
anyone thinking I'm pulling something over on them. What I'm doing here is collecting
statistics on which search features are used the most by users of the UniSearcher. Yes,
it collects your IP address, but that's only used to pigeonhole the queries when it's
reporting. It'll never be used to identify someone. I don't need to know what you're
searching for or why or even who you are; I'm just curious about what features are
used the most and for doing what. It's all an attempt to improve the UniSearcher's
functionality, usefulness, coolness, and general overall appeal... nothing more. So
below are my design notes to myself during the creation of this logging subsystem,
just so you know exactly what it does.

BTW... just after the first few MOMENTS of having this up, I can already tell you
that blog-filler bots and exploit spiders are doing all KINDS of nasty things to
this app via POST variables, trying to crack into it or something, I don't even
know what. And I had no idea until now they were doing it. But it's withstanding
the onslaught nicely. Wouldn't it be nice if more people used their powers for good
than for evil, like I do?

----------------------------------------------------------------------------------------

I want to capture queries. Add a function that all the *_search functions call which
log what was searched for, in which field, and a table to hold them...

create table searches (
    id int not null auto_increment primary key,
    field varchar(255),
    query varchar(255),
    ip varchar(16),
    stamp int,
    index idx1 (ip),
    index idx2 (stamp)
);

A function to do the actual log entry...

function LogQuery($field, $string) {
    $string=SQuote($string);
    $time=time();
    $sq="insert into searches values (0, '".SQuote($field)."', '$string', '{$_SERVER['REMOTE_ADDR']}', $time)";
    dosql($sq);
    return TRUE;
}

Code to use to log something:
  LogQuery("Shift-JIS Hex Code", $shiftjis);

And that's it. I'll use direct SQL queries to collate results, like, for all my own:
  select distinct field from searches where ip='127.0.0.1';
  delete from searches where ip='127.0.0.1';
  delete from searches where ip like '10.1.%';

Or to get rid of those ridiculous bots' entries:
  delete from searches where query like '%http://%';

I doubt I'll ever bother making a web UI to get reports on anything.
I did, though, eventually. I like graphs. Graphs are pretty. Where's pill lady?
*/

require_once("functions.phps");
session_start();
//print_r($G); die;

if (!isset($_SESSION['contents'])) $_SESSION['contents']=array();
$contents=$_SESSION['contents'];
foreach(array(
'page''subpage''codeblock''dosearch''shiftjis''hilite''unihex',
        
'unidecimal''utf8hex''utf8''desctext''deftext''prontext''glyph') as $v) {
    if (isset(
$G[$v])) $$v=$G[$v];
}
?>
<html>
<head>
<? require("meta.phps"); ?>
<title><?=TITLE?></title>
<link rel="stylesheet" href="style.css" type="text/css">
<script language="Javascript" src="inc.js"></script>
<script language="Javascript" src="hints.js"></script>
<?
$allblocks
=loadblocks();

if (isset(
$codeblock)) {
    list(
$page$subpage)=CodepointToPages($codeblock '00');
}
?>
<script language="Javascript">
var HINTS_CFG = {
    'top'        : 10,        // a vertical offset of a hint from mouse pointer
    'left'       : 10,        // a horizontal offset of a hint from mouse pointer
    'css'        : 'hint_text',    // a style class name for all hints, TD object
    'show_delay' : 50,        // a delay between object mouseover and hint appearing
    'hide_delay' : 0,        // a delay between hint appearing and hint hiding
    'wise'       : true,        // forces tip popup to be all on the screen.
    'follow'     : true,        // makes tip popup follow mouse while open.
    'z-index'    : 0        // a z-index for all hint layers
};

var HINTS_ITEMS = new Array();
<?
// The key for each description is the decimal value of the codepoint. Like:
//    HINTS_ITEMS[11872]='<table, etc>This is a glyph\'s popup text.</table>';
// $alldescs[hexcode] holds the (php) description for each codepoint.
// $hexcode is VERY case-sensitive. Carriage returns (\n) are handled gracefully though.
  
if (!IsSearchPage()) { // We don't need these hints on a search results page.
    
$Dstart=hexdec($page $subpage "00");
    
$Dend=hexdec($page $subpage "FF");
    
$alldescs=$allprons=$alldefs=$allcodes=array();
    
loadpage($Dstart$Dend);
    for (
$i=$Dstart$i<=$Dend$i++) {
      
$hex=hexpad(dechex($i));
      
$tmp="";
      if (
trim($alldescs[$hex])) { $tmp .= "<strong>" html_entity_decode($alldescs[$hex]) . "</strong><BR>"; }
      if (
trim($allprons[$hex])) { $tmp .= html_entity_decode($allprons[$hex]) . "<BR>"; }
      if (
trim($alldefs[$hex]))  { $tmp .= "<B>" html_entity_decode($alldefs[$hex]) . "</B><BR>"; }
      if (
$tmp=="") continue; // Reduces output size for unneeded, empty characters
      
$tmp=substr($tmp0, -4);
      echo 
"HINTS_ITEMS[$i]='" jsquote($tmp) . "';\n";
    }
  }
  include(
'navhints.phps');
?>

var myHint = new THints (HINTS_CFG, HINTS_ITEMS);

</script>
</head>

<?
$Gchanged
=FALSE;
if (
$glyph) {
  
// $glyph is a hex string. Make sure page/subpage match it.
  
list($page$subpage)=CodepointToPages($glyph);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
  
$Gchanged=TRUE;
}

///// HERE is where to do the actual searching, so we can get page/subpage set right BEFORE creating the page nav...

$Report='';
$RPT=FALSE;
ob_start();

$glyph=ass(trim($glyph));
if (
$glyph) {
  
$RPT=TRUE;
  list(
$page$subpage)=CodepointToPages($glyph);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
  
$gx=hexpad($glyph);
  
show_glyph($gx);
}

$shiftjis=ass(trim($shiftjis));
if (
$shiftjis) {
  
$RPT=TRUE;
  
LogQuery("Shift-JIS Hex Code"$shiftjis);
  
$k=sjis_search(hexpad($shiftjis));
  if (
$k=="") {
    echo 
"<I>No glyphs found with the Shift-JIS hex code \"$shiftjis\".</I>\n";
  } else {
    list(
$page$subpage)=CodepointToPages($k);
    
$_GET['page']=$G['page']=$page;
    
$_GET['subpage']=$G['subpage']=$subpage;
    
show_glyph($k);
  }
}

$unihex=ass(trim(HexOnly($unihex)));
if (
$unihex) {
  
$RPT=TRUE;
  
LogQuery("Hex Codepoint"$unihex);
  list(
$page$subpage)=CodepointToPages($unihex);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
  
$gx=hexpad($unihex);
  
show_glyph($gx);
}

$unidecimal=ass(trim($unidecimal));
if (
$unidecimal) {
  
$RPT=TRUE;
  
LogQuery("Decimal Codepoint"$unidecimal);
  list(
$page$subpage)=CodepointToPages(dechex($unidecimal));
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
  
$gx=hexpad(dechex($unidecimal));
  
show_glyph($gx);
}

$utf8=ass(trim($utf8));
if (
$utf8) {
  
$RPT=TRUE;
  
LogQuery("UTF8 String"$utf8);
  
// Convert the characters, one by one, into codepoints and glyph 'em.
  
$glyph=array();
  
$decarr=Utf8StringToCodepoints($utf8);
  foreach (
$decarr as $dec) {
    
$glyph[]=hexpad(dechex($dec));
  }
  list(
$page$subpage)=CodepointToPages($glyph[0]);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
  
show_glyph($glyph);
}

$utf8hex=ass(trim($utf8hex));
if (
$utf8hex) {
  
$RPT=TRUE;
  
LogQuery("UTF8 Hex String"$utf8hex);
  
$hex=Utf8toCodepoint($utf8hex);
  if (
$hex) {
    list(
$page$subpage)=CodepointToPages($hex[0]);
    
$_GET['page']=$G['page']=$page;
    
$_GET['subpage']=$G['subpage']=$subpage;
    
show_glyph($hex);
  } else echo 
"<h3>Invalid UTF8 hex code ($utf8hex).</h3>";
}

$desctext=ass(trim($desctext));
if (
$desctext) {
  
$RPT=TRUE;
  
LogQuery("Description"$desctext);
  
$desctext=ss($desctext);
  echo 
"<I>Search results for</I> \"$desctext\":<P>\n";
  
flush();
  
descr_search($desctext);
  list(
$page$subpage)=CodepointToPages(FIRST_RESULT);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
}

$deftext=ass(trim($deftext));
if (
$deftext) {
  
$RPT=TRUE;
  
LogQuery("Definition"$deftext);
  
$deftext=ss($deftext);
  echo 
"<I>Search results for</I> \"$deftext\":<P>\n";
  
flush();
  
def_search($deftext);
  list(
$page$subpage)=CodepointToPages(FIRST_RESULT);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
}

$prontext=ass(trim($prontext));
if (
$prontext) {
  
$RPT=TRUE;
  
LogQuery("Pronunciation"$prontext);
  
$prontext=ss($prontext);
  echo 
"<I>Search results for</I> \"$prontext\":<P>\n";
  
flush();
  
pron_search($prontext);
  list(
$page$subpage)=CodepointToPages(FIRST_RESULT);
  
$_GET['page']=$G['page']=$page;
  
$_GET['subpage']=$G['subpage']=$subpage;
}

$tmp=ob_get_clean();
if (
$RPT$Report=$tmp;
if (!
is_hex($page)) $_GET['page']=$G['page']=$page='00';
if (isset(
$subpage) && !is_hex($subpage)) $_GET['subpage']=$G['subpage']=$subpage='00';
?>
<body bgcolor="#eeddff" link="#0000ee" vlink="#0000ee" alink="#ff0000">

<table border="0" cellpadding="0" cellspacing="0">
<form method="POST" action="<?=$PHP_SELF?>">
<input type="hidden" name="dosearch" value="y">
<input type="hidden" name="page" value="<?=$page?>">
<input type="hidden" name="subpage" value="<?=$subpage?>">
<tr><td valign="middle" colspan="2">

<table border="0" cellspacing="3" cellpadding="0">
<tr><td align="left" colspan="17">
<?=block_menu()?>
&nbsp;<a target="_blank" href="help.php">Unisearcher Help</a>
&nbsp;|&nbsp; <a target="_blank" href="allchars1.php">Every Character by Codepoint</a>
&nbsp;|&nbsp; <a target="_blank" href="allchars2.php">Every Character by Block</a>
&nbsp;|&nbsp; <B>Searches</B> <I>(<B>one</B> at a time)</I>:
</td></tr>

<tr>
<th align="center">Shift-JIS&nbsp;(hex)</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">Codepoint&nbsp;(hex)</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">Codepoint&nbsp;(dec)</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">UTF8 Hex Code</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">UTF8 String</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">Description</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">Eng.&nbsp;Definition</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th align="center">Pronunciation</th>
<td rowspan="2" bgcolor="#<?=$hrcolor?>"><img src="spacer.gif" width="1" border="0"></td>
<th rowspan="2" valign="middle"><input type="submit" value="Go"></th>
</tr>
<tr>
<td align="center" valign="top"><input type="text" name="shiftjis" size="5" maxlength="5" onMouseOver="myHint.show(-3);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="unihex" size="5" maxlength="5" onMouseOver="myHint.show(-1);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="unidecimal" size="7" maxlength="7" onMouseOver="myHint.show(-2);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="utf8hex" size="12" maxlength="255" onMouseOver="myHint.show(-4);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="utf8" size="12" maxlength="255" onMouseOver="myHint.show(-5);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="desctext" size="15" onMouseOver="myHint.show(-6);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="deftext" size="15" onMouseOver="myHint.show(-7);" onMouseOut="myHint.hide();"></td>
<td align="center" valign="top"><input type="text" name="prontext" size="15" onMouseOver="myHint.show(-8);" onMouseOut="myHint.hide();"></td>
</tr>
</table>

</td><td>&nbsp;</td></tr>

<tr><td width="95%" valign="top" align="right" colspan="2" style="padding-right: 6px">
<?
if (IsSearchPage()) {
    
$rpturl=MakeQuerystring();
    echo 
"(<a href=\"$rpturl\">URL to the results below</a>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
}
?>
<font size="3"><I><B>Glyph Entry Key:</B></font>&nbsp;<BR>
<hr noshade size="1">
"Top-level" is the first Hex digit of the desired chunk. "Next-level" is the second Hex digit. "Last-level" is the third.<BR>
Put "00" after that and you have the starting point in Hex; e.g.: 1C800 through 1C8FF if Top, Next, and Last are 1, C, and 8.<BR>
Characters in <font color="#CC0000">RED</font> have been combined with another character because they're combining forms.
</td>
<td align="center" class="code" bgcolor="#ddffff" style="padding: 3px;">
<font style="font-size: 8pt">
Unicode&nbsp;Hex<BR>
UTF-8&nbsp;Hex<BR>
Shift-JIS&nbsp;Hex<BR>
Decimal&nbsp;Code<BR>
</font><b>X</b>
</td></tr>
</form>
</table>

<table border="0" cellpadding="0" cellspacing="0">
<?
show_upag
();
show_pag();
show_sub();
?>
</table>

<P>
<?
flush
();

if (
$RPT) {
    echo 
$Report;
    
footer();
}

if (isset(
$page) && isset($subpage)) {
  
show_chart();
  echo 
'<table border="0" cellpadding="0" cellspacing="0">';
  
show_upag();
  
show_pag();
  
show_sub();
  echo 
"</table>\n";
} else {
  echo 
"<I>Nothing will appear here until you've picked a Top-, Next-, &amp; Last-level value, or performed " .
    
"a search operation. Play with it. Go wild.</I>\n";
}
echo 
"</P>\n";
footer();
?>