全国版住所検索システムを作る その4くらいか?

元のデータから、整形して、MySQLに登録するまでを、一つのwebアプリでやってしまうように
作ってみた。
http://www.kitagawa.tv/zipjis/ZIPJIS9B.lzh
の中身のデータを、テキストエリアにペーストして、変換する
(その時間は不明。マシンによって差があるかも。俺の20分?わすれた。)
あとは、適当にデータベースにアクセスして、データを登録する(こっちは数時間)

この説明だけで、動かせるられる人なんていないだろうな?
もしいるなら、こんなふうには、作らないよな?!
だから、「ゴミ箱」だ〜ね。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="ja">

<head>
  <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
  <meta http-equiv="Content-Script-Type" content="text/javascript">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title>日本郵便辞書データ変換&MySQL登録用webアプリ</title>

  <style type="text/css">
    body { background-color:#888 }
    textarea { width:100%; }
    #result {
      border: 2px inset;
      margin: 1em;
      padding: 1ex;
      white-space: pre;
    }
  </style>
</head>

<body>

<form action="#" name="ConvertForm">
  <p>
    変換するテキスト
    <input type="button" value="変換実行" id="btn21"><br>
    <textarea cols="80" rows="30" name="" id="t1"></textarea>
  </p>

  <hr>

  <ol>
    <li>
      <input type="button" value="接続確認" id="btn0">
    </li>
    <li><input type="button" value="データベースの表示" id="btn1"></li>
    <li>
      データベース名:<input type="text" value="myData" id="db_name">
      <input type="button" value="新規作成" id="btn2">
      <input type="button" value="削除する" id="btn4">
    </li>
    <li><input type="button" value="テーブルの一覧" id="btn5"></li>
    <li>
      テーブル名:<input type="text" value="japan_zip" id="tb_name">
      <input type="button" value="新規作成" id="btn6">
      <input type="button" value="構造を見る" id="btn7">
      <input type="button" value="表を部分表示(10件)" id="btn8">
      <input type="button" value="削除する" id="btn9">
    </li>
    <li>
      <input type="button" value="登録する" id="btn10">
    </li>
  </ol>

  <hr>

  <textarea id="result" cols="80" rows="25">実行した結果が表示されます。</textarea><br>
  Counter : <input type="text" id="counter">登録件数<br>

</form>


<script type="text/javascript"><!--
//@cc_on

//クリックイベント処理
document./*@if( @_jscript ) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/
  'click', (function ( $V ) {
    return function ( evt ) {
      var e  = evt./*@if( @_jscript ) srcElement @else@*/ target /*@end@*/;
      
      switch( e.id ) {
        case 'btn0': // 接続確認
          connect();
          break;

        case 'btn1': // 登録されているデータベースの一覧
          connect( 'SHOW DATABASES' );
          break;

        case 'btn2': // 新規にデータベースを作成
          connect( 'CREATE DATABASE ' + $V('db_name') + ' CHARACTER SET utf8' );
          break;

        case 'btn4': // データベースを削除
          connect( 'DROP DATABASE ' + $V('db_name') );
          break;

        case 'btn5': // 指定のデータベースのテーブルの一覧表示
          connect( 'USE ' + $V('db_name') + '; \x1f SHOW TABLES' );
          break;

        case 'btn6': // 新規テーブルの作成
          connect(
            'CREATE TABLE ' + $V('db_name') + '.' + $V('tb_name') + ' (' +
              'ID INT(30) UNSIGNED NOT NULL AUTO_INCREMENT, ' +
              'ZIP_CODE VARCHAR(30) DEFAULT NULL, ' +
              'ADDRESS1 VARCHAR(240) DEFAULT NULL, ' +
              'ADDRESS2 VARCHAR(240) DEFAULT NULL, ' +
              'TEL VARCHAR(36) DEFAULT NULL, ' +
              'ROMAN TINYTEXT DEFAULT NULL, ' +
              'PRIMARY KEY (ID) ' +
            ') ENGINE = MyISAM DEFAULT CHARSET = utf8' );
          break;

        case 'btn7': // テーブルの作成時の構造を表示
          connect( 'SHOW CREATE TABLE ' + $V('db_name') + '.' + $V('tb_name') );
          break;

        case 'btn8': // テーブルの登録内容を10件だけ表示
          connect( 'SELECT * FROM ' + $V('db_name') + '.' + $V('tb_name') + ' LIMIT 10');
          break;

        case 'btn9': // テーブルを削除する
          connect( 'DROP TABLE ' + $V('db_name') + '.' + $V('tb_name') );
          break;

        case 'btn10': // 登録
          regist();
          break;
        
        case 'btn21': //変換
          convert();
          break;

        default:
      }
    };
  })( function ( id ) { return document.getElementById( id ).value; })
  , false );


//___________________________
//テキストエリアのデータを、整形する
//
var convert = (function ( ) {
  var reg = /((.+?))|(\(.+?\))|(")|(他に掲載がない場合)|(タニケイサイガナイバアイ)/g;
  var cut = /\r\n|\n|\r/g;
  var fmt = /^(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)$/;
  return function ( ) {
    var tgt = document.getElementById( 't1' );
    var dat = tgt.value.replace( reg, '' ).split( cut );
    var val, cnt, o, rec, t;
    var rst = [ ];
    
    for( cnt = 0; o = dat[ cnt ]; cnt++) {
      rec = o.split( ',' );
      if( rec.length > 1) {
        t = toRoman(rec[5] + ' ' + rec[6] + ' ' + rec[7] + ' ' + rec[8]);
        rst.push( rec[0]+'\t'+rec[2]+'\t'+rec[3]+'\t'+rec[9]+'\t'+ t );
      }
    }
    tgt.value = rst.join( '\n' );
  };
})();


//___________________________
//文字列をローマ字表記にする
//
var toRoman = (function( ) {

  var roman = {

    '1':'1', '2':'2', '3':'3', '4':'4', '5':'5', '6':'6', '7':'7', '8':'8', '9':'9', '0':'0',
    '!':'!', '”':'"', '#':'#', '$':'$', '%':'%', '&':'&', '’':"'", '(':'(', ')':')', '=':'=',
    '〜':'~', '|':'|', '@':'@', '‘':'`', '+':'+', '*':'*', ';':";", ':':':', '<':'<', '>':'>',
    '、':',', '。':'.', '/':'/', '?':'?', '_':'_', '・':'・', '「':'[', '」':']', '{':'{', '}':'}',
    '¥':'\\', '^':'^',
    
    'ふぁ':'fa', 'ふぃ':'fi', 'ふぇ':'fe', 'ふぉ':'fo',

    'きゃ':'kya', 'きゅ':'kyu', 'きょ':'kyo',
    'しゃ':'sha', 'しゅ':'shu', 'しょ':'sho',
    'ちゃ':'tya', 'ちゅ':'tyu', 'ちょ':'tyo',
    'にゃ':'nya', 'にゅ':'nyu', 'にょ':'nyo',
    'ひゃ':'hya', 'ひゅ':'hyu', 'ひょ':'hyo',
    'みゃ':'mya', 'みゅ':'myu', 'みょ':'myo',
    'りゃ':'rya', 'りゅ':'ryu', 'りょ':'ryo',

    'ふゃ':'fya', 'ふゅ':'fyu', 'ふょ':'fyo',
    'ぴゃ':'pya', 'ぴゅ':'pyu', 'ぴょ':'pyo',
    'びゃ':'bya', 'びゅ':'byu', 'びょ':'byo',
    'ぢゃ':'dya', 'ぢゅ':'dyu', 'ぢょ':'dyo',
    'じゃ':'ja',  'じゅ':'ju',  'じょ':'jo',
    'ぎゃ':'gya', 'ぎゅ':'gyu', 'ぎょ':'gyo',

    'ぱ':'pa', 'ぴ':'pi', 'ぷ':'pu', 'ぺ':'pe', 'ぽ':'po',
    'ば':'ba', 'び':'bi', 'ぶ':'bu', 'べ':'be', 'ぼ':'bo',
    'だ':'da', 'ぢ':'di', 'づ':'du', 'で':'de', 'ど':'do',
    'ざ':'za', 'じ':'zi', 'ず':'zu', 'ぜ':'ze', 'ぞ':'zo',
    'が':'ga', 'ぎ':'gi', 'ぐ':'gu', 'げ':'ge', 'ご':'go',

    'わ':'wa', 'ゐ':'wi', 'う':'wu', 'ゑ':'we', 'を':'wo',
    'ら':'ra', 'り':'ri', 'る':'ru', 'れ':'re', 'ろ':'ro',
    'や':'ya',            'ゆ':'yu',            'よ':'yo',
    'ま':'ma', 'み':'mi', 'む':'mu', 'め':'me', 'も':'mo',
    'は':'ha', 'ひ':'hi', 'ふ':'hu', 'へ':'he', 'ほ':'ho',
    'な':'na', 'に':'ni', 'ぬ':'nu', 'ね':'ne', 'の':'no',
    'た':'ta', 'ち':'ti', 'つ':'tu', 'て':'te', 'と':'to',
    'さ':'sa', 'し':'si', 'す':'su', 'せ':'se', 'そ':'so',
    'か':'ka', 'き':'ki', 'く':'ku', 'け':'ke', 'こ':'ko',
    'あ':'a', 'い':'i', 'う':'u', 'え':'e', 'お':'o',
    'ぁ':'la', 'ぃ':'li', 'ぅ':'lu', 'ぇ':'le', 'ぉ':'lo',

    'ヶ':'ke', 'ヵ':'ka',
    'ん':'n',  'ー':'-', ' ':' ',

//___________

    'ファ':'fa', 'フィ':'fi', 'フェ':'fe', 'フォ':'fo',
    'キャ':'kya', 'キュ':'kyu', 'キョ':'kyo',
    'シャ':'sha', 'シュ':'shu', 'ショ':'sho',
    'チャ':'tya', 'チュ':'tyu', 'チョ':'tyo',
    'ニャ':'nya', 'ニュ':'nyu', 'ニョ':'nyo',
    'ヒャ':'hya', 'ヒュ':'hyu', 'ヒョ':'hyo',
    'ミャ':'mya', 'ミュ':'myu', 'ミョ':'myo',
    'リャ':'rya', 'リュ':'ryu', 'リョ':'ryo',
    'フャ':'fya', 'フュ':'fyu', 'フョ':'fyo',
    'ピャ':'pya', 'ピュ':'pyu', 'ピョ':'pyo',
    'ビャ':'bya', 'ビュ':'byu', 'ビョ':'byo',
    'ヂャ':'dya', 'ヂュ':'dyu', 'ヂョ':'dyo',
    'ジャ':'ja',  'ジュ':'ju',  'ジョ':'jo',
    'ギャ':'gya', 'ギュ':'gyu', 'ギョ':'gyo',
    'パ':'pa', 'ピ':'pi', 'プ':'pu', 'ペ':'pe', 'ポ':'po',
    'バ':'ba', 'ビ':'bi', 'ブ':'bu', 'ベ':'be', 'ボ':'bo',
    'ダ':'da', 'ヂ':'di', 'ヅ':'du', 'デ':'de', 'ド':'do',
    'ザ':'za', 'ジ':'zi', 'ズ':'zu', 'ゼ':'ze', 'ゾ':'zo',
    'ガ':'ga', 'ギ':'gi', 'グ':'gu', 'ゲ':'ge', 'ゴ':'go',
    'ワ':'wa', 'ウィ':'wi', 'ウェ':'we', 'ヲ':'wo',
    'ラ':'ra', 'リ':'ri', 'ル':'ru', 'レ':'re', 'ロ':'ro',
    'ヤ':'ya',           'ユ':'yu',           'ヨ':'yo',
    'マ':'ma', 'ミ':'mi', 'ム':'mu', 'メ':'me', 'モ':'mo',
    'ハ':'ha', 'ヒ':'hi', 'フ':'hu', 'ヘ':'he', 'ホ':'ho',
    'ナ':'na', 'ニ':'ni', 'ヌ':'nu', 'ネ':'ne', 'ノ':'no',
    'タ':'ta', 'チ':'ti', 'ツ':'tu', 'テ':'te', 'ト':'to',
    'サ':'sa', 'シ':'si', 'ス':'su', 'セ':'se', 'ソ':'so',
    'カ':'ka', 'キ':'ki', 'ク':'ku', 'ケ':'ke', 'コ':'ko',
    'ア':'a', 'イ':'i', 'ウ':'u', 'エ':'e', 'オ':'o',
    'ァ':'la', 'ィ':'li', 'ゥ':'lu', 'ェ':'le', 'ォ':'lo',
    'ン':'n',  'ー':'-',  '・':'.', '、':','

  };
  var reg_tu  = /[っッ]([bcdfghijklmnopqrstuvwyz])/gm;
  var reg_xtu = /っ|ッ/gm;

  return function ( str ) {
    var pnt = 0;
    var max = str.length;
    var s, r;
    var txt = '';
    
    while( pnt <= max ) {
      if( r = roman[ str.substring( pnt, pnt + 3 ) ] ) {
        txt += r;
        pnt += 3;
      } else if( r = roman[ str.substring( pnt, pnt + 2 ) ] ) {
        txt += r;
        pnt += 2;
      } else {
        txt += ( r = roman[ s = str.substring( pnt, pnt + 1 ) ] ) ? r: s;
        pnt += 1;
      }
    }
    txt = txt.replace( reg_tu, '$1$1' );
    txt = txt.replace( reg_xtu, 'xtu' );
    return txt;
  };
})();


var connect = (function ( result ) {
  return function ( cmnd ) {
    sendRequest( result, { 'cmnd': cmnd || '' }, 'POST', 'sql.php', true, true );
  };
})(
    function ( o ) {
      var text = o.responseText;

      if( /^Erroe/.test( text ) ) return alert('Error');
      if( text ) text = text.replace( /\x1e/g, '\n' ).replace( /\x1f/g, ', ' );
      document.getElementById( 'result' ).value = text;
    }
  );


//MySQLに登録する 経過を表示するため手抜きでグローバル変数にする
var data = [ ], counter, timerId = null;

var regist = function( ) {
  if( timerId ) return;
  counter = 0;
  data = document.getElementById( 't1' ).value.split( /\r\n|\r|\n/g );
  timerId = setInterval( function () { document.getElementById( 'counter' ).value = counter; }, 1000 );

  (function ( ) {
    
    if( ! data[ counter ] ) {
      clearInterval( timerId );
      timerId = null;
      return;
    };
    
    sendRequest(
      function ( o ) { //登録ミスを記録
        var res = o.responseText;

        if( /^Error/.test( res ) )
          document.getElementById( 'result' ).value += data[ counter ] + "\n";

      },

      { 'cmnd': 'INSERT INTO '+ //挿入SQL
                  document.getElementById('db_name').value + '.' +
                  document.getElementById('tb_name').value +
                  ' ( ZIP_CODE, ADDRESS1, ADDRESS2, TEL, ROMAN ) VALUES ' +
                  ' ( "' + data[ counter ].replace( /\t/g, '","' ) + '")'
      },

      'POST', 'sql.php', true, true );
      ++counter;

    return setTimeout( arguments.callee, 50 ); // X mm秒後に再呼び出し
  })();
};


//_Ajax___________
var sendRequest = (function( create, setEncHeader, uriEncode ) {
  return function (callback, data, method, url, async, sload, user, password) {
    var oj = create( );
    if(! oj) return null;
    if( sload ) url += ((url.indexOf('?') == -1) ? '?': '&') + 't=' + (new Date).getTime();

    var f = 'object' === typeof callback;
    var callback_onload = f ? callback.onload: callback;
    var callback_onbeforsetheader = f ? callback.onbeforsetheader: null;

    /*@if( @_jscript )
      oj.onreadystatechange = function () { if( 4 == oj.readyState ) callback_onload( oj ), oj.abort()}
    @else@*/
      oj.onload = function () { callback_onload(oj); oj.abort() } /*@end@*/;

    data = uriEncode( data, url );
    if( 'GET' == method.toUpperCase() ) url += (url.indexOf('?')==-1 ? '?': data=='' ? '': '&') + data;
    oj.open ( method, url, async, user, password );
    if( callback_onbeforsetheader ) callback_onbeforsetheader( oj );

    setEncHeader( oj );
    oj.send( data );
    return oj;
  };
})(
    function ( ) {
      try { return new XMLHttpRequest } catch(e1) {
        try { return new ActiveXObject( 'Msxml2.XMLHTTP.6.0' ) } catch(e2) { /*
          try { return new ActiveXObject( 'Msxml2.XMLHTTP.3.0' ) } catch(e3) { */
            return null; } } // }
    },
    
   function ( o ) {
     if( !window.opera || 'function' === typeof o.setRequestHeader )
       o.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8' );
     return o;
   },
    
   function ( data, url ) {
     var d = [ ], i, enc = encodeURIComponent;

     switch( typeof data ) {
       case 'object': for( i in data ) d.push( enc(i) + '=' + enc(data[i]) ); break;
       case 'string':
         if( '' == data ) return '';
         if( data.charAt(0) == '&' ) data = data.substring( 1, data.length );
         var datas = data.split( '&' );
         for( i = 0; i < datas.length; i++ ) {
           var dataq = datas[i].split( '=' );
           d.push( enc( dataq[0] ) + '=' + enc( dataq[1] ) );
         }
       default:
     }
     return d.join( '&' );
   }
);

//-->
</script>

Ajaxのお相手となるPHPのプログラム
パスワードとかは適当に。

<?php

define( '_CHAR_CODE', 'UTF-8' ); // 文字コード
define( '_RS', chr(30) );        // レコードの区切文字
define( '_US', chr(31) );        // フィールドの区切り文字
define( '_HOST', 'localhost' );  // MySQLの設定を参照
define( '_USER', 'root' );       // MySQLの設定を参照
define( '_PASS', '' );   // MySQLの設定を参照
define( '_REFERER', 'http://' ); //ささやかなURLのチェック

mb_language( 'Japanese' );
mb_http_output( _CHAR_CODE );
mb_internal_encoding( _CHAR_CODE );
header ( 'Content-Type: text/html; charset=utf-8' );
ob_start( 'mb_output_handler');


//呼び出し元を確認
$pos = strpos( $_SERVER[ HTTP_REFERER ], _REFERER );
if( false === $pos || 0 < $pos )
 exit( 'Error!!'._RS.'Intercepted access.' );

//接続確認
if( !$d = mysql_connect( _HOST, _USER, _PASS ) ) 
  exit( 'Error!!'._RS.' No connect.' );

//SQLコマンドの読み出し
$cmnd = $_POST[ 'cmnd' ];
if( !$cmnd ) exit( 'Connected MySQL' ); //SQLが無い場合は接続確認

//複数のSQLを切り分け実行
$sqls = split( _US, $cmnd );
for( $c = 0 ; $sql = $sqls[ $c++ ]; )
  if(! $r = mysql_query( $sql, $d ) )
    exit( 'Error!! SQLが実行できません。'._RS.$sql._RS.mysql_error( $d ) );

//最後のSQL文の結果だけを返す
while( $row = mysql_fetch_array( $r, MYSQL_NUM ) )
  $b[ ] = join( _US, $row );

echo $b ? join( _RS, $b ): '';

そして、検索用のWebアプリのHTMLがこれ

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="ja">

<head>
  <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
  <meta http-equiv="Content-Script-Type" content="text/javascript">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <link rel="stylesheet" type="text/css" href="style.css">
  <title>全国住所検索システム</title>
</head>

<body>
  <div id="header">
    住所検索(全国版):
    <input type="text" size="50" id="key" title="郵便番号や地名の一部を空白で区切って入力します" class="blur"> /
    表示
    <select id="SearchMax" name="SearchMax" title="一度に表示する行数を指定します">
      <option value="5">  5</option>
      <option value="10"> 10</option>
      <option value="15"> 15</option>
      <option value="20" selected="selected"> 20</option>
      <option value="30"> 30</option>
      <option value="50"> 50</option>
      <option value="100">100</option>
      <option value="500">500</option>
    </select></div>

  <div id="list">
    <div id="help">
      <h3>利用可能な機能</h3>
      <dt>郵便番号で検索する</dt>
        <dd>数値(0〜9)とハイフン(-)で入力すると自動で検索されます</dd>
      <dt>電話の市外局番で検索する</dt>
        <dd>"TEL"を入力してから、数値キーで検索が行われます</dd>
      <dt>住所の名称で検索する</dt>
        <dd>半角アルファベット文字で入力すると検索が行われます</dd>
      <dt>データをコピーする</dt>
        <dd>表示されたデータを、クリックすると自動でクリップボードにコピーされます</dd>
    </div>
  </div>

  <script type="text/javascript" src="./pipi.js"></script>
  <script type="text/javascript" src="./script.js"></script>

</body>
</html>

それが呼び出す、Javascript (script.js)

  (function ( ) {
    var _WAIT_TIME = 350; //mille second


    var Page = {
        
      'list': (function ( makeList ) {
          var sql_select = "SELECT ID, ZIP_CODE, ADDRESS1, ADDRESS2, TEL FROM myData.japan_zip WHERE ";
          var buf;
          
          return function ( str ) {
            var e = document.getElementById( 'key' );
            var w = (str || e.value).replace( /^\s+|\s+$/g, '' );
            var m = document.getElementsByName( 'SearchMax' )[0].value;
            var p = document.getElementById( 'list' );

            w = w.replace( /^([0-9]{3})([0-9]+)$/, '$1-$2' );
            e.value = w;

            if( w == buf ) return; else buf = w;
            while( p.hasChildNodes( ) ) p.removeChild( p.lastChild );

            if( w ) {
              if( t = w.match( /^(post(\s+|)|)([0-9\-]+)/i ) ) {
                w = " ZIP_CODE LIKE '" + t[3] + "%'";
              } else if( t = w.match( /^tel(\s+|)(.*)$/i ) ) {
                w = " TEL LIKE '" + t[2] + "%'";
              } else {
                w = w.replace( /(.+?)(\s+|$)/g, " ROMAN LIKE '%$1%' AND").replace( /AND$/, '');
              }
              Page.sendSQL( sql_select + w + ' LIMIT ' + m, makeList );
            }

          };
        })(
            function ( obj ) {
              var dt = obj.responseText;
              document.getElementById( 'list' ).innerHTML = dt ? /^Error!/.test( dt ) ?
                dt.replace( /\x1f|\x1e/g, '<hr>' ):
                '<table border="1"><tr>' + 'ID,郵便番号,住所,住所2,市外局番,'.replace( /(.+?)(,|$)/g, '<th>$1' ) +
                  dt.replace( /(.+?)(\x1e|$)/g, '\n<tr>$1</tr>').replace( /(<tr>|)(.*?)(\x1f|(<\/tr>))/g, '$1<td>$2</td>$4'):
                'No Data.';
            }
          ),


      'sendSQL': (function ( ) {
          return function ( sql, func ) {
            sql && sendRequest( func || function ( ) { ; }, { 'cmnd': sql }, 'POST', 'sql.php', true, true );
          };
        })()
   };


    var option = getLocation ( );


    var Listener = (function ( getCellsValue, opt ) {
      var timerId = null;
      var before  = null;
      var table   = {
        '@ID': 0, '@ZIPCODE': 1, '@ADDRESS1': 2, '@ADDRESS2': 3,
        '@TEL': 4,'@SAGAWA': 5, '@PERIKAN': 6, '@MEITETU': 7
      };
      
      return function ( evt ) {
        var e  = evt./*@if( @_jscript ) srcElement @else@*/ target /*@end@*/;
        var t, p, c;

        switch( evt.type ) {
          case 'keyup':
            if( 'key' == e.id ) {
              clearTimeout( timerId );
              timerId = setTimeout( Page.list, _WAIT_TIME );
            }
            break;
          
          case 'mouseover':
            before && ( before = ( before.className = '', null ) );
            if( 'TD' === e.nodeName ) {
              before = e.parentNode;
              before.className = 'TargetColor';
            }
            break;
          
          case 'click':
            'key' == e.id && e.select();
            if( 'TD' === e.nodeName ) {
              c = getCellsValue( p = e.parentNode );
              t = '〒 ' + c[1] + '\n' + c[2] + ' ' + c[3] + '\n TEL: ' + c[4] + '-';
              /*@ clipboardData.setData( 'Text', t); @*/

              var w = window.opener, k, e, t, v;
              if( w ) {
                for( k in opt ) {
                  if( !/^key$/i.test( k ) && !opt.hasOwnProperty( key ) ) {
                    e = w.document.getElementsByName( k );
                    if(! e.length ) e = [ w.document.getElementById( k ) ];

                    t = table[ opt[k] ];
                    if( 'number' == typeof t )
                      for( var i = 0, o; o = e[ i++ ]; )
                        o.value = c[t];
                  }
                }
                window.close();
              }
            }
            break;
          default:
        }
      };})(
          function ( tr, n ) {
            var node = tr.childNodes, val = [ ], cnt, obj;
            for( cnt = 0; obj = node[ cnt++ ]; )
              if( /TD|TH/.test( obj.nodeName ) )
                val.push( obj./*@if( @_jscript ) innerText @else@*/ textContent /*@end@*/ );
            return val;
          },
          option
        );

    addEvent( document, 'keyup', Listener );
    addEvent( document, 'click', Listener );
    addEvent( document, 'mouseover', Listener );

    formElementKeeper( 100, 'SearchMax', 'ziportel' );
    AutoFocus( document, 'blur focus' );
    
    if( option.key ) Page.list( option.key );

  })();

もうひとつ pipi.js

//_汎用関数_(Library)__________________________________________________
//@cc_on

function getParent ( node, type, val ) {
  return node ? ( val == node[type] ) ? node: arguments.callee( node.parentNode, type, val): null;
}

function addEvent( tgt, evt, eventHandler, flag ) {
	tgt./*@if(1) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/ evt, eventHandler, flag );
}

function getLocation ( ) {
  var par = location.search.substring(1).split( '&' );
  var cnt, pac, nv, ret = { };

  for( cnt = 0; pac = par[ cnt++ ]; ) {
    nv = pac.split( '=' );
    ret[ decodeURIComponent( nv[0] ) ] = decodeURIComponent( nv[1] );
  }
  return ret;
}


//_Ajax___________
var sendRequest = (function( create, setEncHeader, uriEncode ) {
  return function (callback, data, method, url, async, sload, user, password) {
    var oj = create( );
    if(! oj) return null;
    if( sload ) url += ((url.indexOf('?') == -1) ? '?': '&') + 't=' + (new Date).getTime();

    var f = 'object' === typeof callback;
    var callback_onload = f ? callback.onload: callback;
    var callback_onbeforsetheader = f ? callback.onbeforsetheader: null;

    /*@if( @_jscript )
      oj.onreadystatechange = function () { if( 4 == oj.readyState ) callback_onload( oj ), oj.abort()}
    @else@*/
      oj.onload = function () { callback_onload(oj); oj.abort() } /*@end@*/;

    data = uriEncode( data, url );
    if( 'GET' == method.toUpperCase() ) url += (url.indexOf('?')==-1 ? '?': data=='' ? '': '&') + data;
    oj.open ( method, url, async, user, password );
    if( callback_onbeforsetheader ) callback_onbeforsetheader( oj );

    setEncHeader( oj );
    oj.send( data );
    return oj;
  };
})(
    function ( ) {
      try { return new XMLHttpRequest } catch(e1) {
        try { return new ActiveXObject( 'Msxml2.XMLHTTP.6.0' ) } catch(e2) { /*
          try { return new ActiveXObject( 'Msxml2.XMLHTTP.3.0' ) } catch(e3) { */
            return null; } } // }
    },
    
   function ( o ) {
     if( !window.opera || 'function' === typeof o.setRequestHeader )
       o.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8' );
     return o;
   },
    
   function ( data, url ) {
     var d = [ ], i, enc = encodeURIComponent;

     switch( typeof data ) {
       case 'object': for( i in data ) d.push( enc(i) + '=' + enc(data[i]) ); break;
       case 'string':
         if( '' == data ) return '';
         if( data.charAt(0) == '&' ) data = data.substring( 1, data.length );
         var datas = data.split( '&' );
         for( i = 0; i < datas.length; i++ ) {
           var dataq = datas[i].split( '=' );
           d.push( enc( dataq[0] ) + '=' + enc( dataq[1] ) );
         }
       default:
     }
     return d.join( '&' );
   }
);




var formElementKeeper = (function ( getCookie, setCookie, setValue ) {
  return function ( day ) {
    var cnt, cnt2, o, es, e, v;

    for( cnt = 1; o = arguments[ cnt++ ]; ) {
      v = getCookie( o );
      setValue( o, v );
      setCookie( o, v, day );
      
      es = document.getElementsByName( o );
      if( 0 == es.length )
        es = [ document.getElementById( o ) ];

      for( cnt2 = 0; e = es[ cnt2++ ]; ) {
        e./*@if(1) attachEvent( 'on' + @else@*/ addEventListener( /*@end@*/
          'change', (function( day, set ) {
            return function ( evt ) {
              var e  = evt./*@if(1) srcElement @else@*/ target /*@end@*/;
              var nm = e.name || e.id;
              if( nm ) set( nm, e.value, day);
            };})( day, setCookie ), true );
      }
    }
  };
})(
    function ( name ) {
      name = encodeURIComponent( name ).replace( /([.*()]) /g, '\\$1' );
      var value = document.cookie.match( RegExp( name + '\\s*=\\s*(.*?)(?:[\\s;,]|$)' ) );
      return value ? decodeURIComponent( value[1] ): '';
    },

    function ( name, value, day, path, domain ) {
      return document.cookie = encodeURIComponent( name ) + '=' + encodeURIComponent( value ) +
        '; ' + 'expires=' + new Date( ( new Date ) - 86400000 * -day ).toUTCString( ) +
        '; ' + ( path ? 'path=' + encodeURI( path ) + '; ': '' ) +
        (domain ? 'domain=' + encodeURI ( domain ) + '; ': '' );
    },

    function ( n, v ) {
      var objs = document.getElementsByName( n );
      var i, j, o, p;
      
      if( 0 === objs.length ) objs = [ document.getElementById( n ) ];
      for (i = 0; p = objs[ i++ ];) {
        switch( p.type ) {
          case 'text' : case 'textarea': case 'button':
          case 'reset' : case 'submit': case 'hidden': p.value = v; break;
          case 'checkbox': p.checked = v; break;
          case 'radio' : p.checked = p.value == v; break;
          case 'select-one': case 'select-multiple':
            for( j = 0; o = p.options[ j++ ]; ) o.selected = o.value == v; break;
        }
      }
    }
  );


var TokenList = (function ( cut, has, join ) {
  return function ( type ) {
 
    return {
 
      'contains':
        function ( e, name ) {
          if( !has( e[ type ], name ) ) {
            var keys = cut( name );
            var cnt, key;

            for( cnt = 0; key = keys[ cnt++ ];  )
              if( has( e[ type ], key ) ) return false;
          }
          return true;
        },


      'add':
        function ( e, name ) {
          var keys = cut( name );
          var buf = [ ], cnt, key;
          
          for( cnt = 0; key = keys[ cnt++ ];  )
            has( e[ type ], key ) && buf.push( key );

            e[ type ] = ( e[ type ] ? '\u0020': '' ) + join( buf );

          return buf;
        },


      'remove':
        function ( e, name ) {
          var keys = cut( name );
          var buf = [ ], cnt, key;
          
          for( cnt = 0; key = keys[ cnt++ ];  )
            ! has( e[ type ], key ) && buf.push( key );

          e[ type ] = join( buf );

          return buf;
        },


      'toggle':
        function ( e, name ) {
          var keys = cut( name );
          var aBuf = [ ], dBuf = [ ];
          var key, cnt;

          for( cnt = 0; key = keys[ cnt++ ];  ) {
            has( e[ type ], key ) ?
              dBuf.push( key ): aBuf.push( key );
          }

          e[ type ] = join( dBuf );

          if( aBuf.length )
            this.remove( e, join( aBuf ) );

          return e[ type ];
        },


      'length':
        function ( e ) {
          return cut( e[ type ] ).length;
        },


      'item':
        function ( e, num ) {
          var a = cut( e[ type ] ) || [];
          return 'undefined' === typeof num ? a: a[ num ];
        }
    };
  };
})(
    function (s) { return ('' + s).split( /\u0020+/ ); },
    function (s, n) { return -1 < ( '\u0020' + s +'\u0020' ).indexOf( '\u0020' + n + '\u0020' ); },
    function (a) { return a.join( '\u0020' ); }
  );



var AutoFocus = (function ( createListener ) {
  return function ( target, css ) {
    var listener = createListener( css );
  
    target./*@if( @_jscript ) attachEvent('on' + @else@*/ addEventListener(/*@end@*/
      /*@if( @_jscript ) 'focusin' @else@*/ 'focus' /*@end@*/, listener, true );
      
    target./*@if( @_jscript ) attachEvent('on' + @else@*/ addEventListener(/*@end@*/
      /*@if( @_jscript ) 'focusout' @else@*/ 'blur' /*@end@*/, listener, true );
  };
})(
    (function ( classList ) {
      return function ( css ) {
        return function ( evt ) {
          var e  = evt./*@if( @_jscript ) srcElement @else@*/ target /*@end@*/;
          if ( /INPUT|TEXTAREA/.test( e.nodeName ) && ! /checkbox|radio|button/.test( e.type ) ) {
            classList.toggle( e, css );
          }
        };
      };
    })( TokenList( 'className' ) ) 
  );

あと、スタイルシート

body {
  background      : #fff url(./japan.gif) repeat-y top left;
  margin          : 0;
}

#header {
  color           : #448;
  font            : normal 14px/100% 'Arial';
  background      : #eee url(./bar.gif);
  height          : 28px;
  padding         : 4px 0 0 8px;
  border-bottom   : 2px #999 solid;
  white-space     : nowrap;
}

#list table {
  border          : 3px #aaa double;
  border-collapse : collapse;
  border-spacing  : 0;
  width           : 100%;
}

#list td,
#list th {
  border-top      : none;
  border-left     : none;
  border-right    : 1px #ccc dotted;
  border-bottom   : 1px #ccc solid;
  color           : #333;
  padding         : .5ex 1ex 0 1ex;
  white-space     : nowrap;
}

#list th {
  background-color: #464;
  color           : #ff8;
  font-weight     : normal;
}

#key {
  ime-mode        : disabled;
  margin          : 0;
}

.TargetColor {
  background-color: #ccf !important;
}

.focus {
  background-color: #ffd;
  color           : #800;
  font-weight     : bold;
}
.blur {
  background-color: #f8f8f8;
  color           : #333;
}

#help {
  margin: 1em 2em;
}

#help h3 {
  color: #adf;
}

#help dt {
  font-weight: bold;
  color: #ccc;
}

#help dd {
  color: #aaa;
  margin-bottom: 1ex;
}