<!--
var server_poll_period = 60000; // delay for polling server for get lines
var server_poll_abort_timeout = server_poll_period - 100; // delay for aborting server poll
var client_poll_period = 1000; // delay for polling client for put line
var display_period = 1000; // delay for displaying next line
var showing_since_period = 1000; // delay for updating "since" field
var gm_timeout = 30000; // timeout for get messages
var web_search_period = 3600000; // refresh web search every 1 hour
var recent_searches_period = 10000; // refresh recent searches every 10 secs
var video_trailer_period = 15000; // how much of video to show

// array of lines received from server
// each element is new Array(lval, sval, linkval, lidval, tval, tagval, rval, relevancy);
var lines_from_server = new Array();

// indices of lines processed for dislaying
var display_lines_processing_start_index = 0;
var display_lines_processing_end_index = 0;

var start_time = ""; // time at which session should start
var stop_time = ""; // time at which session should stop
var save_session_times = 0; // whether to save start and stop times
var server_time_difference = 24*3600000; // estimated time difference
var earliest_line_count = 1000000000000000; // earliest line at client
var latest_line_count = 0; // latest line at client
var get_earlier_page = true; // not all lines after start time examined
var get_later_page = true; // not all lines before stop time examined

var search_history = new Array(); // user's search history

var current_search_start_time = new Date();
var current_search_lines_followed = 0;

var display_scroll = true; // whether display scrolls

var auto_scroll_flag = 1; // whether user wants auto scroll
var show_summary_flag = 1;
var show_chat_flag = 0;
var more_matches_flag = 0;
var show_web_search_flag = 1;
var ignore_common_words_flag = 1;
var match_prefixes_flag = 0;

var search_type = "keyword"; // or regexp
var page_size = 5000; // number of lines in a partial result

var language = 'English';
var option_changed = false;

var language_list = new Array(); // list of languages from server

var glxhr = false; // xhr for get lines
var clxhr = false; // xhr for check lines
var cdxhr = false; // xhr for chart data
var plxhr = false; // xhr for put lines
var wsxhr = false; // xhr for web search
var rsxhr = false; // xhr for recent searches
var llxhr = false; // xhr for language list
var gmxhr = false; // xhr for get messages
var psxhr = false; // xhr for page sponsor messages

var gm_commands = new Array(); // array of pending get message commands
var gm_busy = false; // are we in the middle of getting messages?

var glrto = null; // timeout for aborting getlines response
var glto = null; // timeout for aborting getlines
var sto = null; // timeout for reshowing after search input changes
var gmto = null; // timeout for getmessages response
var wsto = null; // timeout for next web search
var rsto = null; // timeout for next recent searches query
var vtto = null; // timeout for next video trailer

var filter = ""; // user's search filter
var ignored_tags = ""; // tags ignored by server
var lines_displayed = 0; // number of lines displayed

// clm is an array of check line messages received from server with
// (valid, dback, go_back_more, nlines, lines, showed)

var clm = new Array(false, 0, true, 0, "", false);

var advanced_options_open = true;
var categories_open = true;
var about_open = true;
var lines_open = true;

var chart_handle_low = 0;
var chart_handle_high = 0;
var chart_handle_increment = 0;
var chart_handle_multiple = 0; // hours per increment
var chart_handle_collate = 0; // how many samples to add up per data point
var chart_handle = 0;
var chart_x_label = '';
var chart_data = new Array();
// chart_data (
//   (handle1 (n1, n2, n3), (v11, v12, v13)), = earliest
//   (handle2 (n1, n2, n3), (v21, v22, v23)),
//   ...
// )
var videos = new Array();
// (title, id)
var current_video = 0;

function get_chart_data(sdback, ndays) {

  cdxhr.abort();

  if (trim(filter) == "")
    return;

  chart_handle_multiple = 24; // hrs
  chart_handle_collate = 24/chart_handle_multiple;
  chart_handle_low = sdback*chart_handle_collate;
  chart_handle_high = (sdback + ndays)*chart_handle_collate;
  chart_handle_increment = 1;
  chart_handle = sdback*chart_handle_collate + Number(chart_handle_increment);
  chart_x_label = 'days back';
  chart_data = new Array();

  get_chart_subdata();
}

function get_chart_subdata() {

  var url = "getchartdata.php";

  params = "tags="+encodeURIComponent(filter);
  params += "&shback="+chart_handle*chart_handle_multiple;
  params += "&nhrs="+chart_handle_multiple;

  cdxhr.open("POST", url, true);
  cdxhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  cdxhr.setRequestHeader("Content-length", params.length);
  cdxhr.setRequestHeader("Connection", "close");

  cdxhr.onreadystatechange = store_chart_data_from_server;
  cdxhr.send(params);
}

function store_chart_data_from_server() {

  if (cdxhr.readyState == 4 && cdxhr.status == 200) {

    document.getElementById("chart").style.display = "block";

    var i;
    var names = new Array();
    var values = new Array();

    var name_tag = cdxhr.responseXML.getElementsByTagName("name");
    for(i = 0; i < name_tag.length; i++)
      if (name_tag[i].childNodes.length > 0)
	names.push(name_tag[i].childNodes[0].nodeValue);

    var value_tag = cdxhr.responseXML.getElementsByTagName("value");
    for(i = 0; i < value_tag.length; i++)
      if (value_tag[i].childNodes.length > 0)
	values.push(trim(value_tag[i].childNodes[0].nodeValue).split(' '));

    if (names.length == 0 || names.length != values.length)
      return;

    chart_data.unshift(new Array(chart_handle, names, values));

    paint_chart();

    chart_handle += Number(chart_handle_increment);
    if (chart_handle <= chart_handle_high)
      get_chart_subdata();
  }
}

function color(j) {
  var color = new Array(
			'#75a6ff',
			'#ff75a6',
			'#8975ff',
			'#75eaff',
			'#ff8975',
			'#75ff89',
			'#ffcf75',
			'#75ffcf',
			'#666666');
  if (j < 8)
    return color[j];
  return '#666666';
}

function paint_chart() {

  var X = document.getElementById("chart").offsetWidth;
  var Y = document.getElementById("chart").offsetHeight - 32;

  var N = chart_data.length;
  if (N < 1 || N%chart_handle_collate != 0)
    return;
  var D = N/chart_handle_collate;
  var M = chart_data[0][1].length;

  var i, j, k, x, y, h;
  var za = new Array();
  for(i=0; i<M; i++)
    za.push(0);
  var cd = new Array();
  var maxy = -999999999999;

  for(j=0; j<D; j++) {
    h = (chart_data[(Number(j)+1)*chart_handle_collate-1][0]-chart_handle_increment)/(chart_handle_collate) + Number(1);
    x = chart_data[j*chart_handle_collate][1];
    if (x.length != M)
      return;
    cd.push(new Array(h, x.slice(0), za.slice(0)));
    for(k=0; k<chart_handle_collate; k++) {
      y = chart_data[j*chart_handle_collate+Number(k)][2];
      if (y.length != M)
        return;
      for(i=0; i<M; i++)
        cd[j][2][i] += Number(y[i]);
    }
    for(i=0; i<M; i++)
      if (cd[j][2][i] > Number(maxy))
        maxy = cd[j][2][i];
  }

  var sdback = cd[D-1][0] - 1;
  maxy = Math.ceil(maxy/10)*10;
  miny = 0;

  var s = '';
  var t = '';

  var c, xcoord, ycoord, prevx, prevy;

  s += '<div class=chart_label style="right: 0px;'
    + 'bottom: -14px;">' + chart_x_label + '</div>';

  s += '<div class=chart_label style="left: 0px;'
    + 'bottom: -14px;"><a href=# onClick="get_chart_data('
    + sdback + ', 7);" title="Refresh Chart">refresh</a></div>';

  s += '<div class=chart_label style="bottom: ' + (Y + Number(16)) + 'px;'
    + 'left: 0px;">' + maxy + '</div>';

  s += '<div class=chart_label style="bottom: ' + 16 + 'px;'
    + 'left: 0px;">' + miny + '</div>';

  s += '<div class=chart_label style="'
    + 'bottom: ' + (Math.round(Y/2) + Number(16)) + 'px;'
    + 'left: 0px;"><a style="font-size: 10pt; font-style: bold;" href=# onClick="get_chart_data('
    + (Number(sdback) + 7) + ', 7);" title="Week Back">&laquo;</a></div>';

  if (sdback > 0)
    s += '<div class=chart_label style="'
      + 'bottom: ' + (Math.round(Y/2) + Number(16)) + 'px;'
      + 'right: 0px;"><a style="font-size: 10pt; font-style: bold;" href=# onClick="get_chart_data('
      + Math.max(0, Number(sdback) - 7) + ', 7);" title="Week Forward">&raquo;</a></div>';

  for(i=0; i<D; i++) {
    xcoord = Math.round(X*(2*i + Number(1))/(2*D));
    if (i > 0)
      s += '<div class=chart_grid style="'
	+ 'left: ' + Math.round(xcoord - X/(2*D)) + 'px;'
	+ 'width: ' + Math.round(X/(2*D))+ 'px;'
	+ 'height: ' + (Y + Number(32))+ 'px;"></div>';
    s += '<div class=chart_label style="left:' + xcoord + 'px;'
      + 'bottom: 0px;">' + cd[i][0] + '</div>';
  }

  for(j=0; j<M; j++) {
    label = cd[0][1][j];
    c = color(j);

    for(i=0; i<D; i++) {
      xcoord = Math.round(X*(2*i + Number(1))/(2*D));
      y = cd[i][2][j];
      ycoord = (maxy == miny) ? 0 : Math.round(Y*(y - miny)/(maxy - miny));
      ycoord += Number(20);
      if (y > 0)
        var gcl = ' cursor: hand;" onClick="get_chart_lines(\''
	  + escape(label) + '\', \'' + (Number(sdback) + (7 - i))
	  + ' 0:0:0\', \'' + (Number(sdback) + (6 - i)) + ' 0:0:0\')"';
      else
	var gcl = '"';
      s += '<div class=chart_data_point style="background-color:' + c + ';'
	+ 'left:' +  xcoord + 'px;'
	+ 'bottom:' + ycoord + 'px;'
	+ 'width: 7px; height: 7px;'
	+ gcl
	+ 'title="' + label + ': ' + y + ' lines '
	+ cd[i][0] + ' ' + chart_x_label + '"'
	+ '></div>';
      if (i > 0) {
	t += draw_line(c, prevx, prevy, xcoord, ycoord);
      }
      prevx = xcoord;
      prevy = ycoord;
    }
  }
  document.getElementById("chart").innerHTML = t+s;
}

function draw_line(color, x1, y1, x2, y2) {
  var m = 3; // > 0
  var xincr, yincr, N;
  if (Math.abs(x2 - x1) <= m) {
    xincr = 0;
    yincr = 1;
    N = Math.round(Math.abs(y2 - y1)/m);
  } else {
    xincr = (x2 > x1) ? m : -m;
    yincr = Math.round(m*(y2 - y1)/(x2 - x1));
    N = Math.round(Math.abs(x2 - x1)/m);
  }
  var t = '';
  var i;
  for(i=0; Math.abs(x2 - x1) >= m && i < N; i++, x1 += Number(xincr), y1 += Number(yincr)) {
    t += '<div class=chart_line style="background-color:' + color + ';'
      + 'left: ' + (x1 + Number(1)) + 'px;'
      + 'bottom: ' + (y1 + Number(1)) + 'px;'
      + 'width: ' + 2 + 'px; height: ' + 2 + 'px;></div>';
  }
  return t;
}

function get_chart_lines(tags, from, to) {
  start_time = date2string(date_lag(new Date(), from));
  stop_time = date2string(date_lag(new Date(), to));
  set_search_input(tags);
  get_chart_data(Math.max(0,(to.split(' ')[0] - 3)), 7);
}

function put_line() {

  var url = "putline.php"

  var l = document.getElementById("line_input");
  var line = trim(l.value);

  if (line != "") {

    var params = "line=" + encodeURIComponent(line);
    l.value = "";

    var summary = document.getElementById("summary_input");
    params += "&summary=" + encodeURIComponent(trim(summary.value));
    summary.value = "";

    var link = document.getElementById("link_input");
    var linkval = trim(link.value);
    if (linkval != "") {
      var re = new RegExp("^http\:\/\/", "i");
      if (!re.test(linkval))
	linkval = "http://"+linkval;
    }
    link.value = "";

    if (linkval != "")
      params += "&link=" + encodeURIComponent(linkval);

    url += "?" + params;
    plxhr.open("POST", url, true);
    plxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    plxhr.setRequestHeader("Content-length", params.length);
    plxhr.setRequestHeader("Connection", "close");
    plxhr.onreadystatechange = put_line_result;
    plxhr.send(params);
  }
  l.focus();
}

function put_line_result () {
  if (plxhr.readyState == 4 && plxhr.status == 200) {
    get_lines_default();
    alert("Your line was sent successfully.\n" 
	  + "Tune into something in your line to see it in Line Spout.");
  }
}

function check_lines() {

  var days_back = 1;

  if (trim(filter) == "")
    return;

  var url = "checklines.php";

  params = "tags="+encodeURIComponent(filter);

  var dback = clm[1];

  params += "&to="+dback+" 0:0:0";

  dback = dback + Number(days_back);

  params += "&from="+dback+" 0:0:0";

  clm[1] = dback;

  clxhr.open("POST", url, true);
  clxhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  clxhr.setRequestHeader("Content-length", params.length);
  clxhr.setRequestHeader("Connection", "close");

  clxhr.onreadystatechange = check_lines_from_server;
  clxhr.send(params);
}

function check_lines_from_server () {

  if (clxhr.readyState == 4 && clxhr.status == 200) {

    var nlines_tag = clxhr.responseXML.getElementsByTagName("nlines");
    if (nlines_tag && nlines_tag.length > 0
	&& nlines_tag[0].childNodes.length > 0)
      var nlines = nlines_tag[0].childNodes[0].nodeValue;
    else
      var nlines = 0;

    clm[3] += Number(nlines);

    var lines_tag = clxhr.responseXML.getElementsByTagName("lines");
    if (lines_tag && lines_tag.length > 0
	&& lines_tag[0].childNodes.length > 0)
      var lines = lines_tag[0].childNodes[0].nodeValue;
    else
      var lines = '';

    clm[4] += lines+' ';

    var gbm_tag = clxhr.responseXML.getElementsByTagName("gbm");
    if (gbm_tag && gbm_tag.length > 0
	&& gbm_tag[0].childNodes.length > 0)
      var gbm = gbm_tag[0].childNodes[0].nodeValue;
    else
      var gbm = 0;

    if (gbm == 0)
      clm[2] = false;

    if (clm[2] && /* clm[3] == 0 && */ clm[1] < 30)
      check_lines();
  }
}

function get_checked_lines() {

  clm[5] = true;

  glxhr.abort();

  var url = "getcheckedlines.php";

  params = "lines="+clm[4]+"&igts="+ignored_tags;

  glxhr.open("POST", url, true);
  glxhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  glxhr.setRequestHeader("Content-length", params.length);
  glxhr.setRequestHeader("Connection", "close");

  glxhr.onreadystatechange = store_lines_from_server;
  glxhr.send(params);
}

function get_lines(from, count) {

  clearTimeout(glto);
  clearTimeout(glrto);

  if (trim(filter) == "")
    return;

  var url = "getlines.php";

  var params = "from="+from+"&count="+count;
  params += "&since="+encodeURIComponent(time_lag(string2date(start_time)));
  if (stop_time != "")
    params += "&upto="+encodeURIComponent(time_lag(string2date(stop_time)));
  else
    params += "&upto=";
  params += "&threshold="+more_matches_flag;
  params += "&tags="+encodeURIComponent(filter);
  params += "&ignore_tags="+ignore_common_words_flag;
  params += "&auto_complete_tags="+match_prefixes_flag;
  params += "&language="+language;
  params += "&search_type="+search_type;

  glxhr.open("POST", url, true);
  glxhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  glxhr.setRequestHeader("Content-length", params.length);
  glxhr.setRequestHeader("Connection", "close");

  glxhr.onreadystatechange = store_lines_from_server;
  glxhr.send(params);

  glto = setTimeout("get_lines_default();", server_poll_period);
  glrto = setTimeout("glxhr.abort(); get_lines_default();",
		     server_poll_abort_timeout);
}

function get_lines_default () {
  if (get_earlier_page) {
    var x = Number(earliest_line_count) - Number(page_size);
    if (x <= 0)
      get_lines (0, Math.max(0, Number(earliest_line_count) - Number(1)));
    else
      get_lines (x, page_size);
  } else if (get_later_page)
    get_lines (Number(latest_line_count) + Number(1), page_size);
  else
    ; // nothing
}

function get_lines_initial () {
  get_earlier_page = true;
  get_later_page = stop_time == "" ? true : false;
  earliest_line_count = 1000000000000000;
  latest_line_count = 0;
  lines_from_server = new Array();
  display_lines_processing_start_index = 0;
  display_lines_processing_end_index = 0;
  lines_displayed = 0;
  get_lines(-1*page_size, page_size);
  get_page_sponsor_message();
}

function get_page_sponsor_message() {
  var url = "pagead.php";
  var params = "tags="+encodeURIComponent(filter);
  psxhr.open("POST", url, true);
  psxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  psxhr.setRequestHeader("Content-length", params.length);
  psxhr.setRequestHeader("Connection", "close");
  psxhr.onreadystatechange = display_page_sponsor;
  psxhr.send(params);
}

function web_search () {
  clearTimeout(wsto);
  var url = "websearch.php";
  var params = "tags="+encodeURIComponent(filter.replace(/\|/g, ' '));
  params += "&web=1&video=1";
  if (stop_time == "")
    params += "&news=1";
  else
    params += "&news=0";
  wsxhr.open("POST", url, true);
  wsxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  wsxhr.setRequestHeader("Content-length", params.length);
  wsxhr.setRequestHeader("Connection", "close");
  wsxhr.onreadystatechange = store_lines_from_web_search;
  wsxhr.send(params);
}

function get_language_list () {
  var url = "languages.php";
  var params = "";
  llxhr.open("POST", url, true);
  llxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  llxhr.setRequestHeader("Content-length", params.length);
  llxhr.setRequestHeader("Connection", "close");
  llxhr.onreadystatechange = set_language_list;
  llxhr.send(params);
}

function set_language_list () {
  if (llxhr.readyState == 4 && llxhr.status == 200) {
    var s = document.getElementById("language_select");
    language_list.push('Any');
    var opt = document.createElement("option");
    opt.text = 'Any';
    try {
      s.add(opt, null);
    } catch(ex) {
      s.add(opt);
    }
    if (language == 'Any')
      s.selectedIndex = 0;
    var lang_tag = llxhr.responseXML.getElementsByTagName("language");
    if (lang_tag) {
      for (var i=0; i < lang_tag.length; i++) {
	if (lang_tag[i]
	    && lang_tag[i].childNodes
	    && lang_tag[i].childNodes.length > 0) {
	  var lang
	    = trim(Utf8.decode(unescape(lang_tag[i].childNodes[0].nodeValue)));
	  language_list.push(lang);
	  var opt = document.createElement("option");
	  opt.text = lang;
	  try {
	    s.add(opt, null);
	  } catch(ex) {
	    s.add(opt);
	  }
	  if (language == lang)
	    s.selectedIndex = Number(i) + 1;
	}
      }
    }
  }
}

function get_recent_searches () {
  clearTimeout(rsto);
  rsxhr.abort();
  var url = "recent.php";
  var params = "since="+encodeURIComponent(time_lag(string2date(start_time)));
  if (stop_time == "")
    params += "&upto=";
  else
    params += "&upto="+encodeURIComponent(time_lag(string2date(stop_time)));
  rsxhr.open("POST", url, true);
  rsxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  rsxhr.setRequestHeader("Content-length", params.length);
  rsxhr.setRequestHeader("Connection", "close");
  rsxhr.onreadystatechange = paint_recent_searches;
  rsxhr.send(params);
  rsto = setTimeout("get_recent_searches()", recent_searches_period);
}

function store_lines_from_server () {

  if (glxhr.readyState == 4 && glxhr.status == 200) {

    clearTimeout(glrto);

    try {
      var ignored_tag = glxhr.responseXML.getElementsByTagName("ignored");
      if (ignored_tag && ignored_tag.length > 0
	  && ignored_tag[0].childNodes.length > 0)
	ignored_tags = ignored_tag[0].childNodes[0].nodeValue;
      else
	ignored_tags = "";
    } catch (ex) {
      if (lines_displayed == 0)
	alert("Server too busy.  Try again later.");
      return;
    }

    var glerror_tag = glxhr.responseXML.getElementsByTagName("glerror");
    if (glerror_tag && glerror_tag.length > 0
	&& glerror_tag[0].childNodes.length > 0) {
      var msg = glerror_tag[0].childNodes[0].nodeValue;
      if (msg != "tags_ignored")
	alert("Server too busy.  Try again later. (" + msg + ")");
      get_earlier_page = false;
      get_later_page = false;
      return;
    }

    var glerror = "";

    var from_tag = glxhr.responseXML.getElementsByTagName("from");
    if (from_tag && from_tag.length > 0 && from_tag[0].childNodes.length > 0) {
      var from = from_tag[0].childNodes[0].nodeValue;
      if (from < 0)
	glerror += 2;
    } else
      glerror += 1;

    var count_tag = glxhr.responseXML.getElementsByTagName("count");
    if (count_tag && count_tag.length > 0
	&& count_tag[0].childNodes.length > 0) {
      var count = count_tag[0].childNodes[0].nodeValue;
      if (count < 0)
	glerror += 4;
    } else
      glerror += 3;

    var gep_tag = glxhr.responseXML.getElementsByTagName("get_earlier_page");
    if (gep_tag && gep_tag.length > 0 && gep_tag[0].childNodes.length > 0) {
      if (gep_tag[0].childNodes[0].nodeValue == 0)
	get_earlier_page = false;
    } else
      glerror += 5;

    if (glerror != "") {
      // alert("Server too busy.  Try again later. (" + glerror + ")");
      get_lines_default();
      return;
    }

    if (Number(from) < Number(earliest_line_count)) {
      earliest_line_count = from;
      var dir = "earlier";
    } else
      var dir = "later";

    if (Number(latest_line_count) < Number(from) + Number(count) - Number(1)) {
      latest_line_count = Number(from) + Number(count) - Number(1);
    }

    var row_tag = glxhr.responseXML.getElementsByTagName("row");
    if (row_tag && row_tag.length > 0)
      store_lines(row_tag, dir);

    var served_tag = glxhr.responseXML.getElementsByTagName("served");
    if (served_tag && served_tag.length > 0
	&& served_tag[0].childNodes.length > 0) {
      var lines_served = served_tag[0].childNodes[0].nodeValue;
      document.getElementById("stats").innerHTML
        = " | Total lines spouted: " + format_number(lines_served) + " ";
    }

    if (get_earlier_page)
      get_lines_default();

    setTimeout("paint_line_density();", 2000);
  }
}

function paint_line_density () {

  /*
  if (lines_from_server.length == 0) {
    document.getElementById("graph").innerHTML = "";
    return;
  }
  */

  var H = 20;
  var N = 24;
  var t1 = (new Date()).getTime();
  var t2 = -1;

  var graph = new Array(N);
  var i;
  for(i=0; i<N; i++)
    graph[i] = 0;
  var t, k;
  var m = lines_from_server.length;
  var total = 0;
  for(i=0; i<m; i++) {
    t = Number(string2date(lines_from_server[i][4]).getTime())
              + Number(server_time_difference);
    if (t > t2)
      t2 = t;
    if (t < t1)
      t1 = t;
  }

  var T1 = string2date(start_time).getTime();
  var T2 = (stop_time == "") ? (new Date()).getTime()
                             : string2date(stop_time).getTime();

  if (T1 <= t1 && T2 >= t2) {
    t1 = T1;
    t2 = T2;
  }

  var delta = t2 - t1;
  if (delta == 0)
    return;

  for(i=0; i<m; i++) {
    t = Number(string2date(lines_from_server[i][4]).getTime())
              + Number(server_time_difference);
    k = Math.min(N-1, Math.floor((N*(t-t1))/delta));
    if (k < 0)
      k = 0;
    graph[k] += Number(1);
    total += Number(1);
  }
  var s = "";
  var id;
  var w = Math.floor(document.getElementById("graph").offsetWidth/N) - 2;
  //  w = navigator.appName == "Microsoft Internet Explorer" ? w - 1 : w - 3;
  var rt = 0;
  for(i=0; i<N; i++) {
    var g = graph[i];
    rt += Number(g);
    if (g <= 0)
      id = "foo";
    else if (g > H)
      id = "baz";
    else
      id = "bar";
    if (g > H)
      g = H;
    g += Number(2);
    if (id == "baz")
      g += Number(2);
//  var b = navigator.appName == "Microsoft Internet Explorer" ? g - 2 : g - 1;
    var b = g - 2;
    var time = ((new Date()).getTime() - t1 - Number(delta)*i/N)/(1000*60*60);
    if (time > 48)
      var display_time = Math.floor(time/24) + " days ";
    else if (time > 24)
      var display_time = Math.floor(time/24) + " day ";
    else
      var display_time = "";

    if (Math.floor(time%24) > 1)
      display_time += Math.floor(time%24) + " hours";
    else if (Math.floor(time%24) > 0)
      display_time += "1 hour";
    else if (Math.round((time%24)*60) > 0)
      display_time += Math.round((time%24)*60) + " minutes";
    else
      ; // nothing

    var l = (graph[i] == 1) ? " line ": " lines ";

    s += '<div class=' + id + ' style="height: '
         + g + 'px; bottom: ' + b + 'px; width: ' + w
         + 'px;" onClick="scrollLines('
         + document.getElementById("lines").scrollHeight*(total - rt)/total 
         + ')" title="' + graph[i] + l + display_time + ' ago"></div>';
  }
  document.getElementById("graph").innerHTML = s;
}

function scrollLines(f) {
  document.getElementById("lines").scrollTop = f;
}

function display_web_search (tag, type, ws) {
  if (tag && tag.length > 0) {
    ws.innerHTML += "<span id=typein>" + type + " Spout</span>";
    for (var i = 0; i < tag.length; i++) {
      var line = tag[i].getElementsByTagName("line");
      if (!line || line.length <= 0
	  || line[0].childNodes.length <= 0
	  || line[0].childNodes[0].nodeValue == "")
	continue;
      var lval
	= trim(Utf8.decode(unescape(line[0].childNodes[0].nodeValue)));
      
      var summary = tag[i].getElementsByTagName("summary");
      if (summary && summary.length > 0 && summary[0].childNodes.length > 0)
	var sval
	  = trim(Utf8.decode(unescape(summary[0].childNodes[0].nodeValue)));
      else
	var sval = "";

      var link = tag[i].getElementsByTagName("link");
      if (link && link.length > 0 && link[0].childNodes.length > 0
	  && link[0].childNodes[0].nodeValue != "")
	var linkval
	  = trim(Utf8.decode(unescape(link[0].childNodes[0].nodeValue)));
      else
	var linkval = "";

      if (linkval != "") {
	lval
	  = '<a href="' + linkval + '" target=_blank>' + lval + '</a>';
      }
      
      if (sval != "") {
	var d = show_summary_flag != 0 ? '' : 'style="display:none"';
	lval += ' <span id="summary" ' + d + '>' + sval + ' </span>';
      }

      ws.innerHTML += '<li><span id=line>' + lval + '</span>';
    }
  }
}

function store_videos (tag) {
  videos = new Array();
  current_video = 0;
  if (tag && tag.length > 0) {
    for (var i = 0; i < tag.length; i++) {
      var line = tag[i].getElementsByTagName("line");
      if (!line || line.length <= 0
          || line[0].childNodes.length <= 0
          || line[0].childNodes[0].nodeValue == "")
        continue;
      var lval = trim(Utf8.decode(unescape(line[0].childNodes[0].nodeValue)));

      var link = tag[i].getElementsByTagName("link");
      if (!link || link.length <= 0
          || link[0].childNodes.length <= 0
	  || link[0].childNodes[0].nodeValue == "")
        continue;
      var linkval
        = trim(Utf8.decode(unescape(link[0].childNodes[0].nodeValue)));

      videos.unshift(new Array(lval, linkval));
    }
  }

  if (videos.length > 0) {
    document.getElementById("video").style.display = "block";
    var s = "<span id='typein'>Video Spout</span>";
    s += '<li>';
    for (var j = 0; j < videos.length; j++)
      s += ' <a href=# onClick = "play_video(' + j + '); return false;" title="' + videos[j][0] + '">' + j + '</a>';
    document.getElementById("video_links").innerHTML = s;
  }
}

function play_video (v) {
  if (v < 0 || v >= videos.length)
    return;
  var t = document.getElementById("video_title");
  var p = document.getElementById("video_player");
  p.stopVideo();
  p.clearVideo();
  t.innerHTML = '<a href="' + videos[v][1] + '" target=_blank>'
                + v + ': ' + videos[v][0]
                + '</a>';
  p.loadVideoByUrl(videos[v][1], 0);
}

function store_lines_from_web_search () {
  if (wsxhr.readyState == 4 && wsxhr.status == 200) {
    var ws = document.getElementById("web_search");
    ws.innerHTML = "";
    if (show_web_search_flag == 1)
      ws.style.display = "block";

    var video_tag = wsxhr.responseXML.getElementsByTagName("video");
    store_videos(video_tag);

    var web_tag = wsxhr.responseXML.getElementsByTagName("web");
    display_web_search(web_tag, "Web", ws);

    ws.innerHTML += '<p>';

    var news_tag = wsxhr.responseXML.getElementsByTagName("news");
    display_web_search(news_tag, "News", ws);

    if (filter != "")
      wsto = setTimeout("web_search()", web_search_period);

    resize();
  }
}

function display_page_sponsor() {

  if (psxhr.readyState == 4 && psxhr.status == 200) {

    var tag = psxhr.responseXML.getElementsByTagName("sponsor");

    document.getElementById("page_sponsor").style.display = "block";

    if (!tag || tag.length <= 0)
      return;

    var adid = tag[0].getElementsByTagName("adid");
    if (!adid || adid.length <= 0
	|| adid[0].childNodes.length <= 0
	|| adid[0].childNodes[0].nodeValue == "")
      return;
    var aval = trim(Utf8.decode(unescape(adid[0].childNodes[0].nodeValue)));
      
    var line = tag[0].getElementsByTagName("line");
    if (!line || line.length <= 0
	|| line[0].childNodes.length <= 0
	|| line[0].childNodes[0].nodeValue == "")
      return;
    var lval = trim(Utf8.decode(unescape(line[0].childNodes[0].nodeValue)));
      
    var link = tag[0].getElementsByTagName("link");
    if (!link || link.length <= 0
	|| link[0].childNodes.length <= 0
	|| link[0].childNodes[0].nodeValue == "")
      return;
    var linkval = trim(Utf8.decode(unescape(link[0].childNodes[0].nodeValue)));
      
    var summary = tag[0].getElementsByTagName("summary");
    if (!summary || summary.length <= 0
	|| summary[0].childNodes.length <= 0)
      var sval = "";
    else
      var sval
	= trim(Utf8.decode(unescape(summary[0].childNodes[0].nodeValue)));
      
    var cb = tag[0].getElementsByTagName("clickbid");
    if (!cb || cb.length <= 0
	|| cb[0].childNodes.length <= 0
	|| cb[0].childNodes[0].nodeValue == "")
      return;
    var cbval = trim(Utf8.decode(unescape(cb[0].childNodes[0].nodeValue)));

    var s = "<span id=typein>Ad Spout</span>";
    s += "<ul><li><a href=# onClick=\"follow_ad(" + aval + ", '"
             + escape(linkval) + "',"  + cbval + ")\">" + lval + "</a>";
    s += " <span id=summary>" + sval + "</span></ul>";
    // s += "<span id=disclaimer>Disclaimer: views independent of advertiser</span>";

    document.getElementById("page_sponsor").innerHTML = s;
  }
}

function paint_recent_searches () {
  if (rsxhr.readyState == 4 && rsxhr.status == 200) {
    clearTimeout(rsto);

    var t1 = time_since(string2date(start_time)) + " ago";
    if (stop_time == "") {
      var t2 = "now";
    } else {
      var t2 = time_since(string2date(stop_time)) + " ago";
    }

    var item_tag = rsxhr.responseXML.getElementsByTagName("recent");
    var c = "";
    if (item_tag) {
      for (var i=0; i < item_tag.length; i++) {
	if (item_tag[i]
	    && item_tag[i].childNodes
	    && item_tag[i].childNodes.length > 0) {
	  var tag
	    = trim(Utf8.decode(unescape(item_tag[i].childNodes[0].nodeValue)));
	  c += "<div class=trend_item><a href=# onClick=\"change_search_input('"
	        + escape(tag) + "'); return false;\">" + tag + "</a></div>";
	}
      }
    }
    // c = c.substring(0, c.lastIndexOf("&bull"));
    if (c != "")
      c = "<div class=trend_heading>Most active channels "
	  + t1 + " to " + t2 + "</div>" + c;

    var item_tag = rsxhr.responseXML.getElementsByTagName("category");
    var e = "";
    if (item_tag) {
      for (var i=0; i < item_tag.length; i++) {
	if (item_tag[i]
	    && item_tag[i].childNodes
	    && item_tag[i].childNodes.length > 0) {
	  var tag
	    = trim(Utf8.decode(unescape(item_tag[i].childNodes[0].nodeValue)));
	  e += "<div class=trend_item><a href=# onClick=\"change_search_input('"
	        + escape(tag) + "'); return false;\">" + tag + "</a></div>";
	}
      }
    }
    // e = e.substring(0, e.lastIndexOf("&bull"));
    if (e != "")
      e = "<div class=trend_heading>Tags with most followed lines</div>" + e;

    var f = "";

/*
    var f += "<div class=trend_heading><span id=typein>Common Categories</span></div>";
    f += "Focus your results by adding relevant categories to your channel.<p>";

    f += "<div class=trend_category><a href=# onClick=\"add_search_input('arts'); return false;\">arts</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('business'); return false;\">business</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('economy'); return false;\">economy</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('entertainment'); return false;\">entertainment</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('environment'); return false;\">environment</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('finance'); return false;\">finance</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('food'); return false;\">food</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('health'); return false;\">health</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('home'); return false;\">home</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('lifestyle'); return false;\">lifestyle</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('management'); return false;\">management</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('news'); return false;\">news</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('opinion'); return false;\">opinion</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('other'); return false;\">other</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('politics'); return false;\">politics</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('property'); return false;\">property</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('religion'); return false;\">religion</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('science'); return false;\">science</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('society'); return false;\">society</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('spirituality'); return false;\">spirituality</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('sports'); return false;\">sports</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('technology'); return false;\">technology</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('travel'); return false;\">travel</a></div>";
    f += "<div class=trend_category><a href=# onClick=\"add_search_input('work'); return false;\">work</a></div>";
*/

    if (c + e + f == "")
      c = "No recent trends<br>";

    document.getElementById("categories").innerHTML
      = "<div class=trend_list>" + c + "</div>" +
        "<div class=trend_list>" + e + "</div>" +
        "<div class=trend_list>" + f + "</div>";

    resize();
    rsto = setTimeout("get_recent_searches()", recent_searches_period);
  }
}

function store_lines (row_tag, dir) {
  var i;
  var incr;
  if (dir == "later") {
    i = 0;
    incr = 1;
  } else {
    i = row_tag.length - 1;
    incr = -1;
  }
  for(; i >= 0 && i < row_tag.length; i = i + incr) {
    var lineid = row_tag[i].getElementsByTagName("lineid");
    var line = row_tag[i].getElementsByTagName("line");
    var summary = row_tag[i].getElementsByTagName("summary");
    var time = row_tag[i].getElementsByTagName("time");
    var link = row_tag[i].getElementsByTagName("link");
    var rating = row_tag[i].getElementsByTagName("rating");
    var ftags = row_tag[i].getElementsByTagName("tags");
    var relevancy = row_tag[i].getElementsByTagName("relevancy");

    if (line && line.length > 0
	&& line[0].childNodes.length > 0
	&& line[0].childNodes[0].nodeValue != "") {

      var lval
        = trim(Utf8.decode(unescape(line[0].childNodes[0].nodeValue)));

      if (summary && summary.length > 0 && summary[0].childNodes.length > 0)
        var sval
          = trim(Utf8.decode(unescape(summary[0].childNodes[0].nodeValue)));
      else
        var sval = "";

      lval = lval.replace(/&amp;/g, "&");
      lval = lval.replace(/&#39;/g, "'");
      lval = lval.replace(/&#8211;/g, "-");
      lval = lval.replace(/&#8212;/g, "--");
      lval = lval.replace(/&#8216;/g, "`");
      lval = lval.replace(/&#8217;/g, "'");
      lval = lval.replace(/&#8218;/g, ",");
      lval = lval.replace(/&#8220;/g, "\"");
      lval = lval.replace(/&#8221;/g, "\"");
      lval = lval.replace(/&#8222;/g, "\"");
      lval = lval.replace(/&#8249;/g, "<");
      lval = lval.replace(/&#8250;/g, ">");
      // lval = lval.replace(/&?#\w+;/g, "");

      sval = sval.replace(/&amp;/g, "&");
      sval = sval.replace(/&#39;/g, "'");
      sval = sval.replace(/&#8211;/g, "-");
      sval = sval.replace(/&#8212;/g, "--");
      sval = sval.replace(/&#8216;/g, "`");
      sval = sval.replace(/&#8217;/g, "'");
      sval = sval.replace(/&#8218;/g, ",");
      sval = sval.replace(/&#8220;/g, "\"");
      sval = sval.replace(/&#8221;/g, "\"");
      sval = sval.replace(/&#8222;/g, "\"");
      sval = sval.replace(/&#8249;/g, "<");
      sval = sval.replace(/&#8250;/g, ">");
      // sval = sval.replace(/&?#\w+;/g, "");

      var lidval = lineid[0].childNodes[0].nodeValue;
      var tval = time[0].childNodes[0].nodeValue;

      if (ftags && ftags.length > 0 && ftags[0].childNodes.length > 0)
        var tagval
	  = trim(Utf8.decode(unescape(ftags[0].childNodes[0].nodeValue)));
      else
        var tagval = "";

      if (rating && rating.length > 0 && rating[0].childNodes.length > 0)
        var rval = rating[0].childNodes[0].nodeValue.split(",");
      else
        var rval = "0,0".split(",");

      if (link && link.length > 0 && link[0].childNodes.length > 0
            && link[0].childNodes[0].nodeValue != "")
        var linkval
          = trim(Utf8.decode(unescape(link[0].childNodes[0].nodeValue)));
      else
        var linkval = "";

      var relval = relevancy[0].childNodes[0].nodeValue;

      var li
	= new Array(lval, sval, linkval, lidval, tval, tagval, rval, relval);

      var std = (new Date()).getTime() - string2date(tval).getTime();
      if (std < server_time_difference)
	server_time_difference = std;

      if (dir == "later")
        lines_from_server.push(li);
      else {
	lines_from_server.unshift(li);
	display_lines_processing_start_index += Number(1);
	display_lines_processing_end_index += Number(1);
      }
    }
  }
}

function display_lines_to_user () {

  var i = 0;
  var burst = 20;

  while (display_lines_processing_start_index > 0
	 && i < burst) {
    display_lines_processing_start_index -= Number(1);
    paint_line(display_line(lines_from_server,
		 display_lines_processing_start_index), "bottom");
    i += Number(1);
  }

  while (display_lines_processing_end_index < lines_from_server.length
	 && i < burst) {
    paint_line(display_line(lines_from_server,
		 display_lines_processing_end_index), "top");
    display_lines_processing_end_index += Number(1);
    i += Number(1);
  }

  var still_processing
    = get_earlier_page
      || display_lines_processing_start_index > 0
      || display_lines_processing_end_index < lines_from_server.length;

  if (filter != "") {

    if (lines_displayed == 0 && !still_processing && !clm[0]) {
      clm[0] = true;
      check_lines();
    }

    if (lines_displayed == 0 && still_processing) {
      /*
      document.getElementById("nomatch").innerHTML += " .";
      resize();
      */
    } else {
      if (still_processing)
	document.getElementById("still_searching").innerHTML
	  = " . . . still searching";
      else
	document.getElementById("still_searching").innerHTML = "";
      var t = 'Channel for <span style="color: #31b269; font-weight: bold;">' + filter + '</span> ';
      if (ignored_tags != "")
	t += ' (ignored: <span id=ignored_tags><a href=# title="Change Options to include term" onClick="advanced_options(); return false;">' + ignored_tags + '</a></span>) ';
      t += '&mdash; ';
      if (lines_displayed == 0)
        t += "no matching lines";
      else if (lines_displayed == 1)
	t += "1 matching line";
      else
	t += lines_displayed + " matching lines";

      if (clm[5]) {
	var t1 = new Date();
	t1.setDate(t1.getDate() - clm[1]);
	t += " since " + display_date(t1) + ".";
      } else {
	if (language != 'Any')
	  t += " in " + language;

	if (search_type != 'keyword')
	  t += " using pattern search";

	var t1 = time_since(string2date(start_time)) + " ago";
	if (stop_time == "") {
	  var t2 = "now";
	} else {
	  var t2 = time_since(string2date(stop_time)) + " ago";
	}
	t += " from " + t1 + " to " + t2;

	if (more_matches_flag) {
	  if (more_matches_flag == 100)
	    t += " with " + more_matches_flag + "% yes votes";
	  else
	    t += " with at least " + more_matches_flag + "% yes votes";
	}
	t += ".";

        if (lines_displayed == 0) {
	  var t1 = new Date();
	  t1.setDate(t1.getDate() - clm[1]);
          t += "<br>Searching back since " + display_date(t1) + ".";
	  if (clm[3] == 0)
	    if (clm[1] == 1)
	      t += "  No matching lines for last one day.";
	    else
	      t += "  No matching lines for last " + clm[1] + " days.";
	  else if (clm[3] == 1)
	    t += "  Found a matching line.";
	  else
	    t += " Found " + clm[3] + " matching lines.";
	  if (clm[3] > 0)
	    t += "  <a href=# onClick='get_checked_lines()'>Show</a>.";
	}
        // else
        //   t += "<br><a href=# onClick='back_one_day()'>Back one day</a>.";
      }
      document.getElementById("nomatch").innerHTML = t;

      if (lines_displayed == 0 && !still_processing)
	document.getElementById("lines").innerHTML = "";

      resize();
    }
  }

  if (i == burst)
    setTimeout("display_lines_to_user()", 100); // yield
  else
    setTimeout("display_lines_to_user()", display_period);
}

function back_one_day() {
  start_time = date2string(date_lag(string2date(start_time), "1 0:0:0"));
  return false;
}

function display_line (lines_array, index) {

  if (index >= lines_array.length || index < 0)
    return null;

  var l = lines_array[index];
  var line = l[0];
  var summary = l[1];
  var link = l[2];
  var line_index = l[3];
  var timestamp = l[4];
  var line_tags = l[5];
  var line_feed_rating = l[6];
  var mwt = l[7];

  var li = document.createElement("li");
  var linespan = document.createElement("span");
  linespan.setAttribute("id", "line");
  var ratingspan = document.createElement("span");
  ratingspan.setAttribute("id", "rating");
  var timestampspan = document.createElement("span");
  timestampspan.setAttribute("id", "timestamp");

  line = line.replace(/^([^\s]*:)/,"<span id=linename>$1</span>");

  var mtags = word_intersection(filter, line_tags);
  // var words = filter + " " + line + " " + summary;
  var words = filter + " " + line;

  if (link != "") {
    line
      = '<a id=line' + line_index + ' href="#" title="'
         + link + " " + timestamp + '"'
         + ' onClick="follow('
         + '\'' + line_index + '\'' + ', '
         + '\'' + escape(link) + '\'' + ', '
         + '\'' + timestamp + '\'' + ', '
         + '\'' + escape(words) + '\'' + ', '
         + '\'' + escape(line_tags) + '\'' + ', '
         + '\'' + escape(mtags) + '\'' + ', '
         + '\'' + line_feed_rating + '\''
         + '); return false;">'
         + line + '</a>';
  }

  if (summary != "") {
    var d = show_summary_flag != 0 ? '' : 'style="display:none"';
    line += ' <span id="summary" ' + d + '>' + summary + ' </span>';
  }

    rval = line_feed_rating[0] > 0 ?
      '<sup style="color: #999999">' + line_feed_rating[0] + '</sup> ' : '';
  for(--mwt; mwt>0; mwt--)
    rval += "*";
  linespan.innerHTML = line;
  timestampspan.innerHTML = timestamp;
  ratingspan.innerHTML = rval;

  li.appendChild(ratingspan);
  li.appendChild(linespan);
  //  li.appendChild(timestampspan);
  return li;
}

function follow (index, link, timestamp, words,
		 line_tags, matching_tags, feed_rating) {

  link = unescape(link);

  var d = document.getElementById("line"+index+"details");
  if (d) {
    if (d.style.display != "none") {
      d.style.display = "none";
      return;
    } else {
      d.style.display = "block";
      return;
    }
  } else {
    register_click(index, link);
    vote('up', index, matching_tags);
    var d = document.createElement("div");
    d.setAttribute("id", "line"+index+"details");
    var din = document.createElement("div");
    din.setAttribute("id", "line_details");

    var s = '';

    s += '<a href="' + link + '" title="' + link + '" target="_blank">'
           + 'Article</a> scanned at ' + timestamp + ' server local time';

    s += '<br><a href=# title ="Rating of this line\'s source feed and its tags based on user feedback" onClick="return false;">Rating</a>=';

    feed_rating = feed_rating.split(",");
    s += feed_rating[0] + '<span id=up>+</span>,';
    s += feed_rating[1] + '<span id=down>-</span> ';
    line_tags = unescape(line_tags);
    if (trim(line_tags) != "") {
      line_tags = trim(line_tags).split(" ");
      var i;
      for (i=0; i<line_tags.length; i++) {
	line_tags[i] = line_tags[i].split("-");
	line_tags[i][1] = line_tags[i][1].split(",");
	s += '&nbsp;' + line_tags[i][0] + '=';
	s += line_tags[i][1][0] + '<span id=up>+</span>,';
	s += line_tags[i][1][1] + '<span id=down>-</span> ';
      }
    }

    s += '<br>';

    s += '<span id="vote' + index + '"><a href=# title="Your feedback helps improve Line Spout for all users" onClick="return false;">Feedback</a>: this line is&nbsp;&nbsp;&nbsp;';
    s += '<a href="#" onClick="document.getElementById(\'vote' + index + '\').style.display = \'none\'; document.getElementById(\'thanks' + index + '\').style.display = \'block\'; return false;">good</a><span id=up>+</span>&nbsp;&nbsp;&nbsp;';
    s += '<a href="#" onClick="vote(\'dn\', ' + index + ', \'' + matching_tags + '\'); document.getElementById(\'vote' + index + '\').style.display = \'none\'; document.getElementById(\'thanks' + index + '\').style.display = \'block\'; return false;">not relevant</a><span id=down>-</span>&nbsp;&nbsp;&nbsp;';
    s += '<a href="#" onClick="vote(\'na\', ' + index + ', \'' + matching_tags + '\'); document.getElementById(\'vote' + index + '\').style.display = \'none\'; document.getElementById(\'thanks' + index + '\').style.display = \'block\'; return false;">not appropriate</a><span id=down>-</span>&nbsp;&nbsp;&nbsp;';
    s += '</span>';
    s += '<span id="thanks' + index + '" style="display:none"><i>Thank you for your feedback.</i></span>';

    document.getElementById("line"+index).parentNode.appendChild(d);
    d.appendChild(din);

    dleft = document.createElement("div");
    dleft.setAttribute("id", "lineinfoleft");
    din.appendChild(dleft);

    dright = document.createElement("div");
    dright.setAttribute("id", "lineinforight");
    din.appendChild(dright);

    dbot = document.createElement("div");
    dbot.setAttribute("id", "lineinfobottom");
    din.appendChild(dbot);

    dinfo = document.createElement("div");
    dinfo.setAttribute("id", "line"+index+"info");
    dleft.appendChild(dinfo);

    dinfo.innerHTML = s;

    dsponsors = document.createElement("div");
    dsponsors.setAttribute("id", "line"+index+"sponsors");
    dright.appendChild(dsponsors);

    dsearch = document.createElement("div");
    dsearch.setAttribute("id", "line"+index+"search");
    dbot.appendChild(dsearch);

    get_messages(index, words);

    window.open(lassi(link));
    current_search_lines_followed += 1;
  }
}

function lassi (link) {
  return link;
  /*
  var i;
  var j = Math.min(search_history.length, 3);
  var l = "";
  for (i=1; i<=j; i++)
    l += "&_mls" + i + "="
         + encodeURIComponent(search_history[search_history.length - i]);
  var re = new RegExp("\\?", "i");
  if (re.test(link))
    l = link + l;
  else
    l = link + "?" + l.substring(1, l.length);

  return l;
  */
}

function get_messages (index, words) {
  gm_commands.push(new Array(index, words));
  gm_dispatch();
}

function gm_dispatch () {
  if (gm_busy || gm_commands.length == 0)
    return;
  gm_busy = true;
  var url = "getmessages.php";
  var command = gm_commands.shift();
  var params = "index="+encodeURIComponent(command[0]);
  params += "&tags="+encodeURIComponent(unescape(command[1]));
  gmxhr.open("POST", url, true);
  gmxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  gmxhr.setRequestHeader("Content-length", params.length);
  gmxhr.setRequestHeader("Connection", "close");

  gmto = setTimeout(function() {gmxhr.abort(); gm_busy=false; gm_dispatch();},
		    gm_timeout);

  gmxhr.onreadystatechange = display_messages;
  gmxhr.send(params);
}

function display_messages () {
  if (gmxhr.readyState == 4 && gmxhr.status == 200) {
    clearTimeout(gmto);
    gm_busy = false;
    var index_tag = gmxhr.responseXML.getElementsByTagName("index");
    if (!index_tag
	|| index_tag.length <= 0
	|| index_tag[0].childNodes.length <=0)
      return;
    var index = index_tag[0].childNodes[0].nodeValue;

    var s = "";
    var row_tag = gmxhr.responseXML.getElementsByTagName("row");
    if (row_tag
	&& row_tag.length > 0
	&& row_tag[0].childNodes.length > 0) {
      s += "<span id=typein>Web Search</span><br>";
      var i;
      for (i=0; i<row_tag.length; i++) {
	var line = row_tag[i].getElementsByTagName("line");
	if (line && line.length > 0 && line[0].childNodes.length > 0)
	  var lval = Utf8.decode(unescape(line[0].childNodes[0].nodeValue));
	else
	  continue;
	var link = row_tag[i].getElementsByTagName("link");
	if (link && link.length > 0 && link[0].childNodes.length > 0)
	  var linkval = Utf8.decode(unescape(link[0].childNodes[0].nodeValue));
	else
	  continue;
	var summary = row_tag[i].getElementsByTagName("summary");
	if (summary && summary.length > 0 && summary[0].childNodes.length > 0)
	  var sval = Utf8.decode(unescape(summary[0].childNodes[0].nodeValue));
	else
	  var sval = "";
	s += "<span id=related><a href=\"";
	s += linkval + "\" target=\"_blank\">";
	s += lval + "</a><br>" + sval + "</span>";
      }
    }
    var d = document.getElementById("line"+index+"search");
    if (d && s != "")
      d.innerHTML = s;

    s = "";
    var ad_tag = gmxhr.responseXML.getElementsByTagName("ad");
    if (ad_tag
	&& ad_tag.length > 0
	&& ad_tag[0].childNodes.length > 0) {
      if (ad_tag.length == 1)
	s += "<span id=typein>Ad Spout</span><br>";
      else
	s += "<span id=typein>Ad Spout</span><br>";
      var i;
      for (i=0; i<ad_tag.length; i++) {
	var adid = ad_tag[i].getElementsByTagName("adid");
	if (adid && adid.length > 0 && adid[0].childNodes.length > 0)
	  var aval = Utf8.decode(unescape(adid[0].childNodes[0].nodeValue));
	else
	  continue;
	var line = ad_tag[i].getElementsByTagName("line");
	if (line && line.length > 0 && line[0].childNodes.length > 0)
	  var lval = Utf8.decode(unescape(line[0].childNodes[0].nodeValue));
	else
	  continue;
	var link = ad_tag[i].getElementsByTagName("link");
	if (link && link.length > 0 && link[0].childNodes.length > 0)
	  var linkval = Utf8.decode(unescape(link[0].childNodes[0].nodeValue));
	else
	  continue;
	var summary = ad_tag[i].getElementsByTagName("summary");
	if (summary && summary.length > 0 && summary[0].childNodes.length > 0)
	  var sval = Utf8.decode(unescape(summary[0].childNodes[0].nodeValue));
	else
	  var sval = "";
	var cb = ad_tag[i].getElementsByTagName("clickbid");
	if (cb && cb.length > 0 && cb[0].childNodes.length > 0)
	  var cbval = Utf8.decode(unescape(cb[0].childNodes[0].nodeValue));
	else
	  var cbval = 0;
	s += "<span id=sponsor><a href=# onClick=\"follow_ad(";
	s += aval + ",'" + escape(linkval) + "', " + cbval + ")\">";
	s += lval + "</a> " + sval + "</span>";
      }
      // s += "<span id=disclaimer>Disclaimer: views independent of advertiser</span>";
    }

    var d = document.getElementById("line"+index+"sponsors");
    if (d)
      d.innerHTML = s;

    gm_dispatch();
  }
}

function follow_ad(adid, link, clickbid) {
  link = unescape(link);

  var url = "followad.php";
  var params = "adid="+adid+"&link="+link+"&clickbid="+clickbid;
  var axhr = get_xhr();

  axhr.open("POST", url, true);
  axhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  axhr.setRequestHeader("Content-length", params.length);
  axhr.setRequestHeader("Connection", "close");
  axhr.onreadystatechange = function() {};
  axhr.send(params);

  window.open(lassi(link));
}

function paint_line(line, tb) {
  if (filter == "") // display session has been reset by user
    return;
  if (line == null)
    return;
  var line_display_area = document.getElementById("lines");
  if (lines_displayed == 0)
    line_display_area.innerHTML = "";
  if (tb == "top") {
    var first_line = line_display_area.firstChild;
    line_display_area.insertBefore(line, first_line);
    if (auto_scroll_flag == 1 && display_scroll)
      line_display_area.scrollTop = 0;
    else
      line_display_area.scrollTop
	+= line_display_area.firstChild.offsetHeight;
  } else {
    line_display_area.appendChild(line);
  }
  lines_displayed += 1;
  if (show_web_search_flag == 1)
    document.getElementById("web_search").style.display = "block";
  resize();
}

function advanced_options() {

  hide_categories();
  hide_about();
  hide_lines();

  document.getElementById("advanced_options").style.display = "block";
  document.getElementById("optionstab").style.borderTop = "1px solid #cccccc";
  document.getElementById("optionstab").style.borderBottom = "0px solid #cccccc";
  document.getElementById("optionstab").style.borderLeft = "1px solid #cccccc";
  document.getElementById("optionstab").style.borderRight = "1px solid #cccccc";

  document.getElementById("tags_input").value = filter;

  var s = document.getElementById("search_history_select");
  while (s.length > 0)
    s.remove(0);
  var opt = document.createElement("option");
  opt.text = "-- Channel History --";
  try {
    s.add(opt, null);
  } catch(ex) {
    s.add(opt);
  }
  var i;
  for(i=search_history.length-1; i>=0; i--) {
    var opt = document.createElement("option");
    opt.text = search_history[i];
    try {
      s.add(opt, null);
    } catch(ex) {
      s.add(opt);
    }
  }

  document.getElementById("start_date_input").value = start_time;
  document.getElementById("stop_date_input").value = stop_time;

  var m = more_matches_flag;
  document.getElementById("threshold_select").selectedIndex =
    m == 100 ? 4 : m == 75 ? 3 : m == 50 ? 2 : m == 25 ? 1 : 0;

  if (auto_scroll_flag == 1)
    document.getElementById("enable_scroll_radio").checked = true;
  else
    document.getElementById("disable_scroll_radio").checked = true;
  if (show_summary_flag == 1)
    document.getElementById("show_summary_radio").checked = true;
  else
    document.getElementById("hide_summary_radio").checked = true;
  if (show_chat_flag == 1)
    document.getElementById("enable_chat_radio").checked = true;
  else
    document.getElementById("disable_chat_radio").checked = true;
  if (show_web_search_flag == 1)
    document.getElementById("show_web_search_radio").checked = true;
  else
    document.getElementById("hide_web_search_radio").checked = true;
  if (ignore_common_words_flag == 1)
    document.getElementById("ignore_radio").checked = true;
  else
    document.getElementById("dont_ignore_radio").checked = true;
  if (match_prefixes_flag == 1)
    document.getElementById("prefix_radio").checked = true;
  else
    document.getElementById("whole_word_radio").checked = true;
  if (search_type == "keyword")
    document.getElementById("keyword_search_radio").checked = true;
  else
    document.getElementById("regexp_search_radio").checked = true;

  resize();

  advanced_options_open = true;
}

function advanced_example(txt) {
  var t = document.getElementById("tags_input");
  t.value = txt;  
}

function advanced_select_search_history_item() {
  var t = document.getElementById("tags_input");
  var s = document.getElementById("search_history_select");
  if (s.selectedIndex > 0)
    t.value = search_history[search_history.length - s.selectedIndex];
}

function advanced_now (s) {
  document.getElementById(s+"_date_input").value = date2string(new Date());
}

function advanced_clear (s) {
  document.getElementById(s+"_date_input").value = "";
}

function advanced_nhour (n, s) {
  var d = new Date();
  d.setHours(d.getHours() - Number(n));
  document.getElementById(s+"_date_input").value = date2string(d);
}

function advanced_nday (n, s) {
  var d = new Date();
  d.setDate(d.getDate() - Number(n));
  document.getElementById(s+"_date_input").value = date2string(d);
}

function advanced_nmonth (n, s) {
  var d = new Date();
  d.setMonth(d.getMonth() - Number(n));
  document.getElementById(s+"_date_input").value = date2string(d);
}

function advanced_previous (s) {
  var t = (s == "start") ? start_time : stop_time;
  document.getElementById(s+"_date_input").value = t;
}

function advanced_select_threshold_item() {
  var t = document.getElementById("threshold_select");
  var s = t.selectedIndex;
  more_matches_flag =
    s == 0 ? 0 : s == 1 ? 25 : s == 2 ? 50 : s == 3 ? 75 : 100;
  option_changed = true;
}

function advanced_select_language() {
  var t = document.getElementById("language_select");
  var s = t.selectedIndex;
  language = language_list[s];
  option_changed = true;
}

function close_advanced_options() {
  if (advanced_options_open == false)
    return;
  document.getElementById("advanced_options").style.display = "none";
  document.getElementById("optionstab").style.borderTop = "0px solid #cccccc";
  document.getElementById("optionstab").style.borderBottom = "1px solid #cccccc";
  document.getElementById("optionstab").style.borderLeft = "0px solid #cccccc";
  document.getElementById("optionstab").style.borderRight = "0px solid #cccccc";
  advanced_options_open = false;
  option_changed = false;
  show_lines();
  resize();
}

function save_advanced_options() {
  var dstr = trim(document.getElementById("start_date_input").value);
  var lagtime1 = string2date(dstr);
  if (lagtime1 == null) {
    alert("Invalid start date.");
    return false;
  }
  dstr = trim(document.getElementById("stop_date_input").value);
  if (dstr == "")
    lagtime2 = dstr;
  else {
    var lagtime2 = string2date(dstr);
    if (lagtime2 == null) {
      alert("Invalid stop date.");
      return false;
    }
    if (lagtime1.getTime() > lagtime2.getTime()) {
      alert("Start time is after Stop time.");
      return false;
    }
  }

  var changed = false;

  var tags = trim(document.getElementById("tags_input").value);
  //  tags = tags.split("\n").join(" ");
  if (tags != filter) {
    var vsi = valid_search_input(tags);
    if (vsi != "") {
      alert("Invalid input: " + vsi);
      return false;
    }
    changed = true;
  }

  var new_start_time = date2string(lagtime1);
  if (new_start_time != start_time) {
    start_time = new_start_time;
    save_session_times = 1;
    changed = true;
  }

  if (lagtime2 == "")
    var new_stop_time = lagtime2;
  else
    var new_stop_time = date2string(lagtime2);
  if (new_stop_time != stop_time) {
    stop_time = new_stop_time;
    save_session_times = 1;
    changed = true;
  }

  if (changed || option_changed)
    change_search_input(tags);

  option_changed = false;
  show_lines();

  resize();

  return false;
}

function set_search_input(tags) {
  tags = trim(unescape(tags)).replace(/\+/g, " ");
  report_search();
  document.getElementById("q").value = tags;
  filter = tags;
  if (tags != "") {
    var a = new Array();
    var i;
    for(i=0; i<search_history.length; i++)
      if(tags != search_history[i])
	a.push(search_history[i]);
    search_history = a;
    search_history.push(tags);
  }
  reset_display_session();
}

function change_search_input(tags) {
  tags = trim(unescape(tags));
  report_search();
  var h = "index.php?q=" + encodeURIComponent(tags.replace(/\s+/g, "+"));
  document.location.href = h;
}

function add_search_input(tag) {
  var q = document.getElementById("q");
  q.value = trim(q.value + ' ' + trim(unescape(tag)));
  q.focus();
}

function report_search () {
  var d = new Date();

  if (filter != "") {
    var diff =   d.getTime() - current_search_start_time.getTime();
    var url = "searchstat.php"
      var params = "search=" + encodeURIComponent(filter);
    params += "&time=" + encodeURIComponent(diff);
    params += "&displayed=" + encodeURIComponent(lines_displayed);
    params += "&followed=" + encodeURIComponent(current_search_lines_followed);
    if (get_earlier_page && lines_displayed == 0)
      params += "&abandoned=1";
    else
      params += "&abandoned=0";

    url += "?" + params;
    var rsxhr = get_xhr();
    rsxhr.open("POST", url, true);
    rsxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    rsxhr.setRequestHeader("Content-length", params.length);
    rsxhr.setRequestHeader("Connection", "close");
    rsxhr.onreadystatechange = function() {};
    rsxhr.send(params);
  }

  current_search_start_time = d;
  current_search_lines_followed = 0;
}

function display_showing_since () {
  var s1 = time_since(string2date(start_time));
  if (stop_time == "") {
    document.getElementById("since").innerHTML
      = "From " + s1 + " ago to now ";
  } else {
    var s2 = time_since(string2date(stop_time));
    document.getElementById("since").innerHTML
      = "From " + s1 + " ago to " + s2 + " ago ";
  }
  setTimeout("display_showing_since()", showing_since_period);
}

function search_input_changed () {
  var tags = trim(document.getElementById("q").value);
  if (filter == tags)
    return;
  var vsi = valid_search_input(tags);
  if (vsi != "") {
    alert("Invalid input: " + vsi);
    return false;
  }
  change_search_input(tags);
}

function valid_search_input (t) {
  t = t.split(",");
  var i;
  for (i=0; i<t.length; i++) {
    t[i] = t[i].split(" ");
    var j;
    for (j = 0; j<t[i].length; j++) {
      try {
	var re = new RegExp("\\b"+t[i][j], "i");
	re.test("test");
      } catch (e) {
	return t[i][j];
      }
    }
  }
  return "";
}

function show_categories () {

  close_advanced_options();
  hide_about();
  hide_lines();

  document.getElementById("categories").style.display = "block";
  document.getElementById("trendstab").style.borderTop = "1px solid #cccccc";
  document.getElementById("trendstab").style.borderBottom = "0px solid #cccccc";
  document.getElementById("trendstab").style.borderLeft = "1px solid #cccccc";
  document.getElementById("trendstab").style.borderRight = "1px solid #cccccc";
  categories_open = true;
  resize();
}

function hide_categories () {
  if (categories_open == false)
    return;
  document.getElementById("categories").style.display = "none";
  document.getElementById("trendstab").style.borderTop = "0px solid #cccccc";
  document.getElementById("trendstab").style.borderBottom = "1px solid #cccccc";
  document.getElementById("trendstab").style.borderLeft = "0px solid #cccccc";
  document.getElementById("trendstab").style.borderRight = "0px solid #cccccc";
  categories_open = false;
  show_lines();
  resize();
}

function show_lines () {
  hide_categories();
  close_advanced_options();
  hide_about();

  document.getElementById("page_sponsor").style.display = "block";
  document.getElementById("showlines").style.display = "block";
  document.getElementById("linestab").style.borderTop = "1px solid #cccccc";
  document.getElementById("linestab").style.borderBottom = "0px solid #cccccc";
  document.getElementById("linestab").style.borderLeft = "1px solid #cccccc";
  document.getElementById("linestab").style.borderRight = "1px solid #cccccc";
  lines_open = true;
} 

function hide_lines () {
  document.getElementById("page_sponsor").style.display = "none";
  document.getElementById("showlines").style.display = "none";
  document.getElementById("linestab").style.borderTop = "0px solid #cccccc";
  document.getElementById("linestab").style.borderBottom = "1px solid #cccccc";
  document.getElementById("linestab").style.borderLeft = "0px solid #cccccc";
  document.getElementById("linestab").style.borderRight = "0px solid #cccccc";
  lines_open = false;
}

function show_about () {

  hide_categories();
  close_advanced_options();
  hide_lines();

  document.getElementById("about").style.display = "block";
  document.getElementById("abouttab").style.borderTop = "1px solid #cccccc";
  document.getElementById("abouttab").style.borderBottom = "0px solid #cccccc";
  document.getElementById("abouttab").style.borderLeft = "1px solid #cccccc";
  document.getElementById("abouttab").style.borderRight = "1px solid #cccccc";
  about_open = true;
  resize();
}

function hide_about () {
  if (about_open == false)
    return;
  document.getElementById("about").style.display = "none";
  document.getElementById("abouttab").style.borderTop = "0px solid #cccccc";
  document.getElementById("abouttab").style.borderBottom = "1px solid #cccccc";
  document.getElementById("abouttab").style.borderLeft = "0px solid #cccccc";
  document.getElementById("abouttab").style.borderRight = "0px solid #cccccc";
  about_open = false;
  show_lines();
  resize();
}

function show_more_features () {
  document.getElementById("optionstab").style.display = "inline";
  document.getElementById("publishtab").style.display = "inline";
  document.getElementById("advertisetab").style.display = "inline";
  document.getElementById("plugintab").style.display = "inline";
  document.getElementById("moretab").style.display = "none";
}

function about_learn_more() {
  document.getElementById("about_more").style.display = "block";
  document.getElementById("about_more_link").style.display = "none";
}

function reset_display_session () {
  paint_search_history();
  document.getElementById("lines").innerHTML = "";
  document.getElementById("nomatch").style.display = "block";
  document.getElementById("video").style.display = "none";
  document.getElementById("web_search").style.display = "none";
  document.getElementById("page_sponsor").style.display = "none";
  document.getElementById("page_sponsor").innerHTML = "";
  document.getElementById("chart").style.display = "none";
  document.getElementById("chart").innerHTML = "";
  document.getElementById("stats").innerHTML = "";
  document.getElementById("still_searching").innerHTML = "";
  if (filter == "") {
    clearTimeout(wsto);
    document.getElementById("nomatch").innerHTML = "";
    document.getElementById("q").focus();
  } else {
    document.getElementById("nomatch").innerHTML
      = 'Creating channel for <span style="color: #31b269; font-weight: bold;">' + filter + '</span> ';
    if (more_matches_flag) {
      if (more_matches_flag == 100)
	document.getElementById("nomatch").innerHTML
	  += " with " + more_matches_flag + "% yes votes";
      else
	document.getElementById("nomatch").innerHTML
	  += " with at least " + more_matches_flag + "% yes votes";
    }
    document.getElementById("nomatch").innerHTML += " . . .";
    document.getElementById("lines").innerHTML
      = "<img src=wait.gif height=48 width=48>";
    clm = new Array(false, 0, true, 0, "", false);
    hide_about();
    get_lines_initial();
    web_search();
    get_chart_data(0, 7);
    document.getElementById("lines").focus();
  }
  show_lines();
  document.getElementById("graph").innerHTML = "";
  resize();
}

function paint_search_history () {
  var sh = document.getElementById("search_history");
  sh.innerHTML = "";
  var w = document.getElementById("tags").offsetWidth;
  sh.style.width = w + "px";
  var i;
  var j =  (filter == "") ? 0 : 1;
  var t = "";
  for(i=search_history.length-1-j; i>=0 && i>=search_history.length-10-j; i--)
    t += "<a href=# onClick=set_search_input_from_history("
           + i + "); return false;>"
           + search_history[i] + "</a> &bull; ";
  t = t.substring(0, t.lastIndexOf("&bull"));
  sh.innerHTML = t;
}

function set_search_input_from_history(i) {
  change_search_input(search_history[i]);
}

function match_all_tags(tags, words) {
  if (trim(tags) == "")
    return false;
  var tarr = trim(tags).split(" ");
  var i;
  for (i=0; i<tarr.length; i++) {
    try {
      var re = new RegExp("\\b"+tarr[i], "i"); // start at word boundary
      if (!re.test(words))
	return false;
    } catch (e) {
      return false;
    }
  }
  return true;
}

function match(tags, l, s, t, fr, threshold) {

  // tags = search input dnf
  // l = line
  // s = summary
  // t = line tags - tag-up,down tag-up,down ...
  // fr = feed rating for line's source feed - up,down
  // threshold - user's threshold for accepting lines

  if (trim(tags) == "")
    return 0;

  threshold = Number(threshold);

  var i;
  var words = (l+" "+s);

  if (t != "") {
    t = t.split(" ");
    for(i=0; i<t.length; i++) {
      t[i] = t[i].split("-");
      t[i][1] = t[i][1].split(",");
      var p = 100*(t[i][1][1] == 0 ? 1
		   : (t[i][1][0]/(Number(t[i][1][0])+Number(t[i][1][1]))));
      if (p >= threshold)
	words += " " + t[i][0]; // only match tags above threshold
      else
	fr[1] -= Number(t[i][1][1]); // remove tag's -ve votes from fr
    }
  }

  var r = 100*(fr[0] == 0 ? 0 : (fr[0]/(Number(fr[0])+Number(fr[1]))));
  if (r < threshold)
    return 0;

  var mwt = 1;
  while ((r -= 25) >= 0)
    mwt++;

  tarr = tags.split(",");
  for(i=0; i<tarr.length; i++)
    if (match_all_tags(tarr[i], words))
      return mwt;
  return 0;
}

function word_intersection(t1, t2) {
  var t1arr = t1.split(" ");
  var i;
  var ret = "";
  for (i=0; i<t1arr.length; i++) {
    var re = new RegExp("\\b"+t1arr[i], "i");
    if (re.test(t2)) {
      ret += " "+t1arr[i];
    }
  }
  return trim(ret);
}

function vote(updn, id, tags) {
  var url = "vote.php";
  var params = "updn="+updn;
  params += "&id="+id;
  params += "&tags="+encodeURIComponent(unescape(tags));
  var vxhr = get_xhr();

  vxhr.open("POST", url, true);
  vxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  vxhr.setRequestHeader("Content-length", params.length);
  vxhr.setRequestHeader("Connection", "close");
  vxhr.onreadystatechange = function() {};
  vxhr.send(params);
}

function register_click(index, link) {
  var url = "follow.php";
  var params = "index="+index+"&link="+link;
  var cxhr = get_xhr();

  cxhr.open("POST", url, true);
  cxhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  cxhr.setRequestHeader("Content-length", params.length);
  cxhr.setRequestHeader("Connection", "close");
  cxhr.onreadystatechange = function() {};
  cxhr.send(params);
}

function trim(s) {
  return s.replace(/^\s+|\s+$/g, "");
}

function resize() {
  var h = 64;
  h += Number(document.getElementById("top").offsetHeight);
  h += Number(document.getElementById("tabs").offsetHeight);
  h += Math.max(Number(document.getElementById("nomatch").offsetHeight),
		Number(document.getElementById("graph").offsetHeight));
  h += Number(document.getElementById("chat").offsetHeight);

  h = Math.max(document.body.offsetHeight - Number(h), 0);

  document.getElementById("lines").style.height = h;

  h -= Number(document.getElementById("page_sponsor").offsetHeight);
  h -= Number(document.getElementById("chart").offsetHeight);
  h -= Number(document.getElementById("video").offsetHeight);

  document.getElementById("web_search").style.height = Math.max(0, h - 25);

  document.getElementById("aboutleft").style.width
    = Math.max(0, document.body.offsetWidth
                    - document.getElementById("aboutright").offsetWidth
                    - 150);
}

function get_xhrs() {
  glxhr = get_xhr();
  clxhr = get_xhr();
  cdxhr = get_xhr();
  plxhr = get_xhr();
  wsxhr = get_xhr();
  rsxhr = get_xhr();
  llxhr = get_xhr();
  gmxhr = get_xhr();
  psxhr = get_xhr();
}

function set_cookie(name, value, expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate() + expiredays);
  document.cookie =
    name + "=" + escape(value) +
    ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
}

function get_cookie(name) {
  if (document.cookie.length>0) {
    var start = document.cookie.indexOf(name + "=");
    if (start!=-1) { 
      start = start + name.length + 1; 
      var end = document.cookie.indexOf(";",start);
      if (end == -1)
        end = document.cookie.length;
      return unescape(document.cookie.substring(start, end));
    } 
  }
  return "";
}

function delete_cookie(name) {
  if (get_cookie(name) != "")
    document.cookie = name + "=value"; expires="Thu, 01-Jan-70 00:00:01 GMT";
}

function display_date(date) {
  var y = date.getFullYear();
  var m = date.getMonth();
  var d = date.getDate();
  var months = new Array('Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.','Oct.', 'Nov.', 'Dec.');
  return months[m] + ' ' + d + ', ' + y;
}

function date2string(date) {
  var y = date.getFullYear();
  var m = date.getMonth()+1;
  if (m < 10) m = "0"+m;
  var d = date.getDate();
  if (d < 10) d = "0"+d;
  var h = date.getHours();
  if (h < 10) h = "0"+h;
  var min = date.getMinutes();
  if (min < 10) min = "0"+min;
  var s = date.getSeconds();
  if (s < 10) s = "0"+s;
  return (y+"-"+m+"-"+d+" "+h+":"+min+":"+s);
}

function string2date(dstr) {
  dstr = dstr.split(/\s+/);
  if (dstr.length == 1)
    dstr.push("0:0:0");
  if (dstr.length != 2)
    return null;
  dstr[0] = dstr[0].split(/-|\/|\./);
  if (dstr[0].length != 3)
    return null;
  dstr[1] = dstr[1].split(/:|-|\.|\//);
  if (dstr[1].length != 3)
    return null;
  if (isNaN(dstr[0][0]) || isNaN(dstr[0][1]) || isNaN(dstr[0][2])
      || isNaN(dstr[0][0]) || isNaN(dstr[0][1]) || isNaN(dstr[0][2]))
    return null;

  return (new Date(dstr[0][0], dstr[0][1]-1, dstr[0][2],
               dstr[1][0], dstr[1][1], dstr[1][2]));
}

function date_lag (date, lag) {
  lag = lag.split(' ');
  lag[1] = lag[1].split(':');
  var mslag = lag[0]*24*60*60*1000;
  mslag += Number(lag[1][0]*60*60*1000);
  mslag += Number(lag[1][1]*60*1000);
  mslag += Number(lag[1][2]*1000);

  date.setTime(date.getTime() - mslag);
  return date;
}

function time_lag (date) {
  var curtime = new Date();
  var mslag = curtime.getTime() - date.getTime();
  var dlag = Math.floor(mslag/(1000*60*60*24));
  mslag -= dlag*1000*60*60*24;
  var hlag = Math.floor(mslag/(1000*60*60));
  mslag -= hlag*1000*60*60;
  var mlag = Math.floor(mslag/(1000*60));
  mslag -= mlag*1000*60;
  var slag = Math.floor(mslag/1000);
  return (dlag+" "+hlag+":"+mlag+":"+slag);
}

function time_since (date) {
  var ret = "";
  var curtime = new Date();
  var mslag = curtime.getTime() - date.getTime();
  var dlag = Math.floor(mslag/(1000*60*60*24));
  if (dlag > 0)
    ret += dlag+"d ";
  mslag -= dlag*1000*60*60*24;
  var hlag = Math.floor(mslag/(1000*60*60));
  if (hlag > 0)
    ret += hlag+"h ";
  mslag -= hlag*1000*60*60;
  var mlag = Math.floor(mslag/(1000*60));
  if (mlag > 0)
    ret += mlag+"m ";
  mslag -= mlag*1000*60;
  var slag = Math.floor(mslag/1000);
  if (slag > 0)
    ret += slag+"s ";
  return trim(ret);
}

// UTF-8 data encode / decode 
// http://www.webtoolkit.info/ 

var Utf8 = { 

// public method for url encoding 
  encode : function (string) { 
    string = string.replace(/\r\n/g,"\n"); 
    var utftext = ""; 
    for (var n = 0; n < string.length; n++) { 
      var c = string.charCodeAt(n); 
      if (c < 128) { 
        utftext += String.fromCharCode(c); 
      } else if((c > 127) && (c < 2048)) { 
        utftext += String.fromCharCode((c >> 6) | 192); 
        utftext += String.fromCharCode((c & 63) | 128); 
      } else { 
        utftext += String.fromCharCode((c >> 12) | 224); 
        utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
        utftext += String.fromCharCode((c & 63) | 128); 
      } 
    } 
    return utftext; 
  }, 

// public method for url decoding 
  decode : function (utftext) { 
    var string = ""; 
    var i = 0; 
    var c = c1 = c2 = 0; 
    while ( i < utftext.length ) { 
      c = utftext.charCodeAt(i); 
      if (c < 128) { 
        string += String.fromCharCode(c); 
        i++; 
      } else if((c > 191) && (c < 224)) { 
        c2 = utftext.charCodeAt(i+1); 
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
        i += 2; 
      } else { 
        c2 = utftext.charCodeAt(i+1); 
        c3 = utftext.charCodeAt(i+2); 
        string += String.fromCharCode(((c & 15) << 12)
                                       | ((c2 & 63) << 6) | (c3 & 63)); 
        i += 3; 
      } 
    } 
    return string; 
  }
} 

function format_number(nStr)
{
        nStr += '';
        x = nStr.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1)) {
               x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
}

function get_xhr() {
  try {
    xhr = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e2) {
      xhr = false;
    }
  }

  if (!xhr && typeof XMLHttpRequest != 'undefined') {
    xhr = new XMLHttpRequest();
  }

  return xhr;
}

function stop_scrolling() {
  display_scroll = false;
}

function start_scrolling() {
  display_scroll = true;
}

function set_summary_display(d) {
  var s = document.getElementsByTagName("span");
  var i;
  for(i=0; i<s.length; i++) {
    if (s[i].getAttribute("id") == "summary")
      s[i].style.display = d;
  }
}

function enable_scroll() {
  auto_scroll_flag = 1;
  document.getElementById("enable_scroll_radio").checked = true;
}

function disable_scroll() {
  auto_scroll_flag = 0;
  document.getElementById("disable_scroll_radio").checked = true;
}

function show_summary() {
  show_summary_flag = 1;
  set_summary_display("block");
  document.getElementById("show_summary_radio").checked = true;
}

function hide_summary() {
  show_summary_flag = 0;
  set_summary_display("none");
  document.getElementById("hide_summary_radio").checked = true;
}

function enable_chat() {
  show_chat_flag = 1;
  document.getElementById("chat").style.display = "block";
  document.getElementById("enable_chat_radio").checked = true;
  resize();
}

function disable_chat() {
  show_chat_flag = 0;
  document.getElementById("chat").style.display = "none";
  document.getElementById("disable_chat_radio").checked = true;
  resize();
}

function more_matches() {
  if (more_matches_flag <= 0) {
    more_matches_flag = 0;
    return;
  }
  more_matches_flag -= 1;
  document.getElementById("more_matches_label").innerHTML = more_matches_flag;
  search_input_changed();
}

function less_matches() {
  more_matches_flag += 1;
  document.getElementById("more_matches_label").innerHTML = more_matches_flag;
  search_input_changed();
}

function show_web_search() {
  show_web_search_flag = 1;
  document.getElementById("web_search").style.display = "block";
  document.getElementById("show_web_search_radio").checked = true;
}

function hide_web_search() {
  show_web_search_flag = 0;
  document.getElementById("web_search").style.display = "none";
  document.getElementById("hide_web_search_radio").checked = true;
}

function ignore_common_words() {
  if (ignore_common_words_flag != 1) {
    ignore_common_words_flag = 1;
    option_changed = true;
  }
  document.getElementById("ignore_radio").checked = true;
}

function dont_ignore_common_words() {
  if (ignore_common_words_flag != 0) {
    ignore_common_words_flag = 0;
    option_changed = true;
  }
  document.getElementById("dont_ignore_radio").checked = true;
}

function match_whole_words() {
  if (match_prefixes_flag != 0) {
    match_prefixes_flag = 0;
    option_changed = true;
  }
  document.getElementById("whole_word_radio").checked = true;
}

function match_prefixes() {
  if (match_prefixes_flag != 1) {
    match_prefixes_flag = 1;
    option_changed = true;
  }
  document.getElementById("prefix_radio").checked = true;
}

function keyword_search_type() {
  if (search_type != "keyword") {
    search_type = "keyword";
    option_changed = true;
  }
  document.getElementById("keyword_search_radio").checked = true;
  document.getElementById("pattern_help").style.display = 'none';
}

function regexp_search_type() {
  if (search_type != "regexp") {
    search_type = "regexp";
    option_changed = true;
  }
  document.getElementById("regexp_search_radio").checked = true;
  document.getElementById("pattern_help").style.display = 'block';
}

function tags_search (since) {
  var d = new Date();
  d.setFullYear(d.getFullYear() - Number(since[0]));
  d.setMonth(d.getMonth() - Number(since[1]));
  d.setDate(d.getDate() - Number(since[2]));
  d.setHours(d.getHours() - Number(since[3]));
  d.setMinutes(d.getMinutes() - Number(since[4]));
  d.setSeconds(d.getSeconds() - Number(since[5]));
  start_time = date2string(d);
  reset_display_session();
}

function embed_video_player() {
  var params = { allowScriptAccess: "always" };
  var atts = { id: "video_player" };
  swfobject.embedSWF(
    "http://www.youtube.com/apiplayer?enablejsapi=1",
    "video_player", "290", "120", "8", "#ffffff", null, params, atts);
}

function onYouTubePlayerReady (id) {
  var p = document.getElementById("video_player");
  // p.mute();
}

function onload_init() {

  filter = "";
  document.getElementById("q").value = filter;

  var revisit = 1;

  var sh = get_cookie("search_history");
  if (trim(sh) != "")
    search_history = sh.split("////");
  else
    revisit = 0;

  var sst = get_cookie("save_session_times");
  if (sst == 1) {
    start_time = get_cookie("start_time");
    stop_time = get_cookie("stop_time");
  } else {
    var d = new Date();
    d.setDate(d.getDate() - Number(1));
    start_time = date2string(d);
    stop_time = "";
  }

  var asf = get_cookie("auto_scroll");
  if (asf == "" || isNaN(asf))
    auto_scroll_flag = Number("1");
  else
    auto_scroll_flag = Number(asf);
  
  var ssf = get_cookie("show_summary");
  if (ssf == "" || isNaN(ssf))
    show_summary_flag = Number("1");
  else
    show_summary_flag = Number(ssf);
  
  var scf = get_cookie("show_chat");
  if (scf == "" || isNaN(scf))
    show_chat_flag = Number("0");
  else
    show_chat_flag = Number(scf);
  if (show_chat_flag == 1)
    document.getElementById("chat").style.display = "block";
  
  var mm = get_cookie("more_matches");
  if (mm == "" || isNaN(mm))
    more_matches_flag = Number("0");
  else
    more_matches_flag = Number(mm);

  var sws = get_cookie("show_web_search");
  if (sws == "" || isNaN(sws))
    show_web_search_flag = Number("1");
  else
    show_web_search_flag = Number(sws);
  if (show_web_search_flag == 0)
    document.getElementById("web_search").style.display = "none";

  var ig = get_cookie("ignore_common_words");
  if (ig == "" || isNaN(ig))
    ignore_common_words_flag = Number("1");
  else
    ignore_common_words_flag = Number(ig);
  
  language = trim(get_cookie("language"));
  if (language == "")
    language = 'English';

  search_type = trim(get_cookie("search_type"));
  if (search_type == "")
    search_type = 'keyword';

  embed_video_player();
  get_xhrs();
  reset_display_session();
  get_language_list();
  get_recent_searches();
  display_lines_to_user();
  display_showing_since();

  fill_in_stuff();

  if (revisit == 1)
    show_lines();
  else
    show_about();

  if (navigator.appName == "Microsoft Internet Explorer")
    document.getElementById("tags").style.width = "290px";

  paint_chart(chart_data);
}

function onunload_exit() {
  report_search();
  set_cookie("search_history", search_history.join("////"), 7);
  set_cookie("save_session_times", save_session_times, 7);
  set_cookie("start_time", start_time, 7)
  set_cookie("stop_time", stop_time, 7)
  set_cookie("auto_scroll", auto_scroll_flag, 7);
  set_cookie("show_summary", show_summary_flag, 7);
  set_cookie("show_chat", show_chat_flag, 7);
  set_cookie("more_matches", more_matches_flag, 7);
  set_cookie("show_web_search", show_web_search_flag, 7);
  set_cookie("ignore_common_words", ignore_common_words_flag, 7);
  set_cookie("language", language, 7);
  set_cookie("search_type", search_type, 7);
}

function fill_in_stuff() {
  fill_in_name();
  fill_in_about_right();
  fill_in_about_left();
  fill_in_advanced_options();
  fill_in_motto();
}

function fill_in_about_right() {
  var s = "";
  s += '&nbsp;<br><span id=heading>&nbsp;</span>\n';
  // s += '"Line Spout has really simplified my search."&mdash;Valerie\n<p>';
  s += '<a href=# onClick=\'window.external.AddSearchProvider("http://www.linespout.com/linespoutsearch.xml"); return false;\'>Add Line Spout as a search provider</a>\n';
  s += '<br>\n';
  s += '<a href=addfeed.html>Publish your content on Line Spout</a>\n';
  s += '<br>\n';
  s += '<a href=admanage.php?activity=new>Advertise on Ad Spout</a> (Free!)\n';
  s += '<p>';
  s += 'Common categories of information on Line Spout:\n';
  s += '<br>';
  s += '<a href=# onClick="change_search_input(\'arts\'); return false;">arts</a>\n';
  s += '<a href=# onClick="change_search_input(\'business\'); return false;">business</a>\n';
  s += '<a href=# onClick="change_search_input(\'economy\'); return false;">economy</a>\n';
  s += '<a href=# onClick="change_search_input(\'entertainment\'); return false;">entertainment</a>\n';
  s += '<a href=# onClick="change_search_input(\'environment\'); return false;">environment</a>\n';
  s += '<a href=# onClick="change_search_input(\'finance\'); return false;">finance</a>\n';
  s += '<a href=# onClick="change_search_input(\'food\'); return false;">food</a>\n';
  s += '<a href=# onClick="change_search_input(\'health\'); return false;">health</a>\n';
  s += '<a href=# onClick="change_search_input(\'home\'); return false;">home</a>\n';
  s += '<a href=# onClick="change_search_input(\'lifestyle\'); return false;">lifestyle</a>\n';
  s += '<a href=# onClick="change_search_input(\'management\'); return false;">management</a>\n';
  s += '<a href=# onClick="change_search_input(\'news\'); return false;">news</a>\n';
  s += '<a href=# onClick="change_search_input(\'opinion\'); return false;">opinion</a>\n';
  s += '<a href=# onClick="change_search_input(\'politics\'); return false;">politics</a>\n';
  s += '<a href=# onClick="change_search_input(\'property\'); return false;">property</a>\n';
  s += '<a href=# onClick="change_search_input(\'religion\'); return false;">religion</a>\n';
  s += '<a href=# onClick="change_search_input(\'science\'); return false;">science</a>\n';
  s += '<a href=# onClick="change_search_input(\'society\'); return false;">society</a>\n';
  s += '<a href=# onClick="change_search_input(\'spirituality\'); return false;">spirituality</a>\n';
  s += '<a href=# onClick="change_search_input(\'sports\'); return false;">sports</a>\n';
  s += '<a href=# onClick="change_search_input(\'technology\'); return false;">technology</a>\n';
  s += '<a href=# onClick="change_search_input(\'travel\'); return false;">travel</a>\n';
  s += '<a href=# onClick="change_search_input(\'work\'); return false;">work</a>\n';

  document.getElementById("aboutright").innerHTML = s;
}

function fill_in_about_left() {
  var s = "";
  s += '&nbsp;<br>\n';
  s += '\n';
  s += '<span id=heading>Real Time Search</span>\n';
  s += '\n';
  s += 'Real time information shapes business decision making\n';
  s += 'and consumer behavior in diverse segments such as\n';
  s += 'finance, technology, sports, and entertainment.\n';
  s += 'Line Spout is the only real time search engine with powerful\n';
  s += 'algorithms that cut through spam and trivia to deliver\n';
  s += 'highly relevant results.\n';
  s += '<ul>\n';
  s += '<li> Crawls, indexes, and searches real time content\n';
  s += '<li> Uses advanced relevancy algorithms tuned for real time search\n';
  s += '<li> Uses social ranking to improve relevancy and reliability\n';
  s += '<li> Presents a live stream of matching lines\n';
  s += '<li> Graphs search results over time\n';
  s += '<li> Compares multiple search terms\n';
  s += '<li> Shows search <a href=# title="Show popular channels" onClick="show_categories(); return false;">\n';
  s += 'trends</a>.\n';
  s += '<li> Provides advanced search <a href=# title="Show\n';
  s += 'advanced features to control Line Spout" id=advanced\n';
  s += 'onclick="advanced_options(); return false;">options</a> for pattern matching, setting search time windows, social filtering, and multilingual results\n';
  s += '</ul>\n';
  s += 'Additional features include <a href=admanage.php?activity=new>Ad Spout</a>,\n';
  s += 'Video Spout, Chat Spout, News Spout, and Web Spout.\n';

  document.getElementById("aboutleft").innerHTML = s;
}

function fill_in_advanced_options() {
  var s = "";
  s += '<table><tr><td>\n';
  s += '<form name=prefsform onSubmit="return save_advanced_options();">\n';
  s += '<fieldset><legend>Options</legend>\n';
  s += '<table cellpadding=5 cellspacing=0>\n';
  s += '<tr>\n';
  s += '<td align=right>Channel:\n';
  s += '<td colspan=4><input type=text name=tags_input id=tags_input size=50>&nbsp;&nbsp;\n';
  s += '<select name=search_history_select id=search_history_select onChange="advanced_select_search_history_item()"></select>\n';
  s += '<tr>\n';
  s += '<td align=right valign=top><!--Eg.:-->\n';
  s += '<td colspan=4 valign=top>\n';
  s += '<!--\n';
  s += '<a href=# onClick="advanced_example(\'real\'); return false;">real</a>\n';
  s += ' matches <i>real</i>.\n';
  s += '<br>\n';
  s += '-->\n';
  s += '<a href=# onClick="advanced_example(\'real estate\'); return false;">real\n';
  s += 'estate</a> matches <i>real</i> and <i>estate</i> (space = and)\n';
  s += '<br>\n';
  s += '<a href=# onClick="advanced_example(\'real estate, mortgage rate\');\n';
  s += 'return false;">real estate, mortgage rate</a> matches <i>real estate</i>\n';
  s += 'or <i>mortgage rate</i> (comma = or)\n';
  s += '<!--\n';
  s += '<tr><td><td colspan=4>Use keyword search for performance or regular expression search for control.\n';
  s += '-->\n';
  s += '<tr>\n';
  s += '<td>\n';
  s += '<td><input type=radio id=keyword_search_radio name=rsearch value=keyword onClick="keyword_search_type()">\n';
  s += '<td><a href=# onClick="keyword_search_type(); return false;">Keyword&nbsp;Match</a>\n';
  s += '<td><input type=radio id=regexp_search_radio name=rsearch value=regexp onClick="regexp_search_type()">\n';
  s += '<td><a href=# onClick="regexp_search_type(); return false;">Pattern&nbsp;Match</a>\n';
  s += '<tr>\n';
  s += '<td><td><td><td>\n';
  s += '<td id=pattern_help style=\'display: none;\' valign=top>\n';
  s += 'Each term like <a href=# onClick="advanced_example(\'real\'); return false;">real</a> is treated as a pattern &mdash;\n';
  s += 'click <a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Regular_Expressions#Writing_a_Regular_Expression_Pattern" target=_blank>here</a> for more information\n';
  s += '<br>\n';
  s += 'For example, <a href=# onClick="advanced_example(\'real\'); regexp_search_type(); return false;">real</a> matches <i>real</i>, <i>reality</i>, <i>unreal</i>, etc., and <a href=# onClick="advanced_example(\'-real\'); regexp_search_type(); return false;">-real</a> rejects them\n';
  s += '\n';
  s += '<!--\n';
  s += '<tr><td><td colspan=4>Specify whether or not to ignore common words like <i>the</i> and <i>for</i> while searching.\n';
  s += '-->\n';
  s += '<tr>\n';
  s += '<td>\n';
  s += '<td><input type=radio id=ignore_radio name=rignore value=1 onClick="ignore_common_words()">\n';
  s += '<td><a href=# onClick="ignore_common_words(); return false;">Ignore&nbsp;Common&nbsp;Words</a>\n';
  s += '<td><input type=radio id=dont_ignore_radio name=rignore value=0 onClick="dont_ignore_common_words()">\n';
  s += '<td><a href=# onClick="dont_ignore_common_words(); return false;">Don\'t&nbsp;Ignore&nbsp;Common&nbsp;Words</a>&nbsp;like&nbsp;<i>the</i>&nbsp;and&nbsp;<i>for</i>\n';
  s += '<tr style="display: none"><td><td colspan=4>Specify whether to match whole words only or also to match word prefixes.<br>\n';
  s += 'For example, <a href=# onClick="advanced_example(\'tech\'); return false;">tech</a> will match <i>technology</i> if Match Prefixes Also is set.\n';
  s += '<tr style="display: none">\n';
  s += '<td>\n';
  s += '<td><input type=radio id=whole_word_radio name=rword value=1 onClick="match_whole_words()">\n';
  s += '<td><a href=# onClick="match_whole_words(); return false;">Match&nbsp;Whole&nbsp;Words&nbsp;Only</a>\n';
  s += '<td><input type=radio id=prefix_radio name=rword value=0 onClick="match_prefixes()">\n';
  s += '<td><a href=# onClick="match_prefixes(); return false;">Match&nbsp;Prefixes&nbsp;Also</a>\n';
  s += '<tr><td>&nbsp;\n';
  s += '<tr>\n';
  s += '<td align=right>Start:\n';
  s += '<td colspan=4><input type=text name=start_date_input id=start_date_input size=20>&nbsp;&nbsp;<a href=# onClick="advanced_now(\'start\'); return false;">Now</a>&nbsp;&nbsp;<a href=# onClick="advanced_nhour(1, \'start\'); return false;">1h</a>&nbsp;&nbsp;<a href=# onClick="advanced_nhour(6, \'start\'); return false;">6h</a>&nbsp;&nbsp;<a href=# onClick="advanced_nhour(12, \'start\'); return false;">12h</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(1, \'start\'); return false;">1d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(2, \'start\'); return false;">2d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(3, \'start\'); return false;">3d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(7, \'start\'); return false;">1w</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(14, \'start\'); return false;">2w</a>&nbsp;&nbsp;<a href=# onClick="advanced_nmonth(1, \'start\'); return false;">1m</a>&nbsp;&nbsp;<a href=# id=advanced_previous onClick="advanced_previous(\'start\'); return false;">Reset</a>\n';
  s += '<tr>\n';
  s += '<td align=right>Stop:\n';
  s += '<td colspan=4><input type=text name=stop_date_input id=stop_date_input size=20>&nbsp;&nbsp;<a href=# onClick="advanced_clear(\'stop\'); return false;">Do not stop</a>&nbsp;&nbsp;<a href=# onClick="advanced_now(\'stop\'); return false;">Now</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(1, \'stop\'); return false;">1d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(2, \'stop\'); return false;">2d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(3, \'stop\'); return false;">3d</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(7, \'stop\'); return false;">1w</a>&nbsp;&nbsp;<a href=# onClick="advanced_nday(14, \'stop\'); return false;">2w</a>&nbsp;&nbsp;<a href=# onClick="advanced_nmonth(1, \'stop\'); return false;">1m</a>&nbsp;&nbsp;<a href=# id=advanced_previous onClick="advanced_previous(\'stop\'); return false;">Reset</a>\n';
  s += '<!--\n';
  s += '<tr><td><td colspan=4>\n';
  s += 'Search will return matching lines from the start time to the stop time.<br>\n';
  s += 'If no stop time is specified, new matching lines will automatically<br>\n';
  s += 'appear at the top of your results.  Line Spout accounts for the<br>\n';
  s += 'difference between your local time and Line Spout server local time.<br>\n';
  s += 'Set the Auto Scroll option to control how new lines become visible.    \n';
  s += '-->\n';
  s += '<tr><td>&nbsp;\n';
  s += '<tr>\n';
  s += '<td align=right>Filter:\n';
  s += '<td colspan=4><select name=threshold_select id=threshold_select onChange="advanced_select_threshold_item()">\n';
  s += '<option selected>Show all matching lines</option>\n';
  s += '<option>Show matching lines with at least 25% yes votes *</option>\n';
  s += '<option>Show matching lines with at least 50% yes votes **</option>\n';
  s += '<option>Show matching lines with at least 75% yes votes ***</option>\n';
  s += '<option>Show matching lines with 100% yes votes ****</option>\n';
  s += '</select>\n';
  s += '<!--\n';
  s += '<tr><td><td colspan=4>\n';
  s += 'Take advantage of the feedback provided by the Line Spout user community.<br>\n';
  s += 'A filter with a higher yes votes ratio will give you fewer, more relevant results.<br>\n';
  s += 'Your filter choice is used to select line sources as well as their tags.<br>\n';
  s += '-->\n';
  s += '<tr><td align=right>Language:\n';
  s += '<td colspan=4>\n';
  s += '<select name=language_select id=language_select onChange="advanced_select_language()">\n';
  s += '</select>\n';
  s += '<!--\n';
  s += '<tr><td><td colspan=4>Show results in the selected language.\n';
  s += '-->\n';
  s += '<tr><td>&nbsp;\n';
  s += '<tr>\n';
  s += '<td align=right>View:\n';
  s += '<td><input type=radio id=enable_scroll_radio name=rscroll value=1 onClick="enable_scroll()">\n';
  s += '<td><a href=# onClick="enable_scroll(); return false;">Enable&nbsp;Auto&nbsp;Scroll</a>\n';
  s += '<td><input type=radio id=disable_scroll_radio name=rscroll value=0 onClick="disable_scroll()">\n';
  s += '<td><a href=# onClick="disable_scroll(); return false;">Disable&nbsp;Auto&nbsp;Scroll</a>\n';
  s += '<tr>\n';
  s += '<td>\n';
  s += '<td><input type=radio id=show_summary_radio name=rsummary value=1 onClick="show_summary()">\n';
  s += '<td><a href=# onClick="show_summary(); return false;">Show&nbsp;Summary</a>\n';
  s += '<td><input type=radio id=hide_summary_radio name=rsummary value=0 onClick="hide_summary()">\n';
  s += '<td><a href=# onClick="hide_summary(); return false;">Hide&nbsp;Summary</a>\n';
  s += '<tr>\n';
  s += '<td>\n';
  s += '<td><input type=radio id=show_web_search_radio name=rweb_search value=1 onClick="show_web_search()">\n';
  s += '<td><a href=# onClick="show_web_search(); return false;">Show&nbsp;Web&nbsp;Search</a>\n';
  s += '<td><input type=radio id=hide_web_search_radio name=rweb_search value=0 onClick="hide_web_search()">\n';
  s += '<td><a href=# onClick="hide_web_search(); return false;">Hide&nbsp;Web&nbsp;Search</a>\n';
  s += '<tr><td>&nbsp;\n';
  s += '<tr>\n';
  s += '<td align=right>Share:\n';
  s += '<td><input type=radio id=enable_chat_radio name=rchat value=1 onClick="enable_chat()">\n';
  s += '<td><a href=# onClick="enable_chat(); return false;">Enable&nbsp;Chat&nbsp;Spout</a>\n';
  s += '<td><input type=radio id=disable_chat_radio name=rchat value=0 onClick="disable_chat()">\n';
  s += '<td><a href=# onClick="disable_chat(); return false;">Disable&nbsp;Chat&nbsp;Spout</a>\n';
  s += '<tr><td><td colspan=4>Create your own lines and send them to all Line Spout users.\n';
  s += '<tr><td>&nbsp;\n';
  s += '<tr><td><td colspan=4>\n';
  s += '<button name=show id=show value="Show" onClick="return save_advanced_options();">Show</button>&nbsp;&nbsp;<a href=# onClick="close_advanced_options(); return false;">Close</a>\n';
  s += '</table>\n';
  s += '</fieldset>\n';
  s += '</form>\n';
  s += '</table>\n';

  document.getElementById("advanced_options").innerHTML = s;
}

function fill_in_motto() {
  document.getElementById("motto").innerHTML = "Create channel for:";
}

function fill_in_name() {
  document.getElementById("name").innerHTML =
    '<span id=logo><a href=index.php title="Line Spout Home Page">Line&nbsp;Spout<!--<img src=lslogo.jpg>--></a>&nbsp;</span><span id=beta><a href=# title="About Line Spout" onClick="show_about(); return false;">Real&nbsp;Time&nbsp;Search</a>&nbsp;&nbsp;</span>';
}

-->
