function MTEntrySearch (arg) {

	// private fields
	var list_file = arg['listFile'];
	var list      = false;
	var cache     = new Array(); // strings already searched

	// public method
	this.search = search;

	_initialize();

	function search(str) {
		if (str == '')  return '';
		if (cache[str]) return cache[str];

		var result = new Array();
		var regexp = new RegExp(_quoteMetaChar(str), 'i');

		for (var i = 0; i < list.length; i++) {
			var cols = list[i].split('<>');

			if (regexp.exec(cols[1])) {
				result.push(list[i]);
			}
		}

		cache[str] = result;
		return result;
	}

	function _quoteMetaChar(str) {
		return str.replace(/(\W)/, '\\$1');
	}

	function _initialize() {
		var xmlHttpRequest = _createXmlHttpObject();

		xmlHttpRequest.open('GET', list_file, true);
		xmlHttpRequest.onreadystatechange = function() {
			if (xmlHttpRequest.readyState == 4) {
				var text = xmlHttpRequest.responseText;
				list = text.split("\n");
			}
		}

		xmlHttpRequest.send(null);
	}

	function _createXmlHttpObject() {
		var xmlHttpRequest = false;

		try {
			xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
		} catch (e) {
			try {
				xmlHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
			} catch (E) {
				xmlHttpRequest = false;
			}
		}

		if (!xmlHttpRequest && typeof XMLHttpRequest != 'undefined') {
			xmlHttpRequest = new XMLHttpRequest();
		}

		return xmlHttpRequest;
	}
}

/*

=head1 NAME

MTEntrySearch - Search the Movale Type entries incrementally

=head1 SYNOPSIS

  <!--
      Entries list should be formatted like this:
          [entry URI]<>[entry title]<>[entry date]
  -->

  <script type="text/javascript" src="MTEntrySearch.js"></script>
  <script type="text/javascript">
  <!--
      var targetId = 'result';
      var ES = new MTEntrySearch({
          'listFile':'entries_list.txt'
      });

      function search(str) {
          var lists = '';
          var result = ES.search(str);

          for (var i = 0; i < result.length; i++) {
              var cols = result[i].split('<>');
              lists += '<li><a href="' + cols[0] + '">' + cols[1] + ' - ' + cols[2] + '</li>\n';
          }

          var targetNode = document.getElementById(targetId);
          targetNode.innerHTML = lists;
      }
  -->
  </script>

  ...

  <input type="text" value="" onkeyup="search(this.value);" />
  <ul id="result"></ul>

=head1 CONSTRUCTOR

=head2 MTEntrySearch ( Array )

=over 4

  var ES = new MTEntrySearch({
      'listFile':'entries_list.txt'
  });

Creates and returns a MTEntrySearch object.

=back

=head1 METHODS

=head2 search ( String )

=over 4

  var result = ES.search(str);

Returns search results as array.

=back

=head1 AUTHOR

Kentaro Kuribayashi, E<lt>kentarok@gmail.comE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2005 by Kentaro Kuribayashi

This library is free software; you can redistribute it and/or modify it under the modified BSD License.

=cut

*/